[java-gnome] 01/11: Imported Upstream version 4.1.3

Tony Mancill tmancill at moszumanska.debian.org
Tue Sep 9 05:44:54 UTC 2014


This is an automated email from the git hooks/post-receive script.

tmancill pushed a commit to branch master
in repository java-gnome.

commit 9be2dd092dde3d400a1ea30324e9a8158edc0640
Author: tony mancill <tmancill at debian.org>
Date:   Tue Aug 26 10:09:04 2014 -0700

    Imported Upstream version 4.1.3
---
 .cdtproject                                        |   69 +
 .classpath                                         |   14 +
 .cproject                                          |   79 +
 .externalToolBuilders/java-gnome Builder.launch    |   12 +
 .project                                           |   30 +
 .settings/org.eclipse.cdt.core.prefs               |    3 +
 .settings/org.eclipse.jdt.core.prefs               |  295 +
 .settings/org.eclipse.jdt.ui.prefs                 |    8 +
 AUTHORS.markdown                                   |   72 +
 COPYING                                            |  339 ++
 HACKING.markdown                                   |  155 +
 LICENCE.markdown                                   |   98 +
 Makefile                                           |  153 +
 NEWS.markdown                                      | 3212 ++++++++++
 README.markdown                                    |  350 ++
 build/faster                                       |  743 +++
 configure                                          | 2305 +++++++
 doc/design/1a-Homework.txt                         |  266 +
 doc/design/1b-AllAboutJNI.txt                      |  113 +
 doc/design/2a-ObjectiveAndAudience.txt             |  184 +
 doc/design/2b-DesignConstraints.txt                |  293 +
 doc/design/3a-PackageNames.txt                     |  131 +
 doc/design/3b-VersionNumbers.txt                   |   79 +
 doc/design/4a-TreeViewAndTreeModel.txt             |  112 +
 doc/design/4b-ObjectProperties.txt                 |  246 +
 doc/design/5a-Architecture.txt                     |  381 ++
 doc/design/START                                   |  150 +
 doc/design/TheGreatOwenThread.html                 | 1796 ++++++
 doc/examples/START                                 |  166 +
 doc/examples/button/ExampleDocumentationLink.java  |  122 +
 doc/examples/button/ExamplePressMe.java            |  162 +
 doc/examples/button/ExampleRadioButton.java        |  158 +
 doc/examples/cairo/ExampleDrawingGradients.java    |  115 +
 doc/examples/cairo/ExampleDrawingPenguins.java     |   80 +
 doc/examples/cairo/ExampleDrawingText.java         |  122 +
 doc/examples/cairo/ExampleLinedPaper.java          |  222 +
 doc/examples/cairo/incoming-sketch.png             |  Bin 0 -> 253223 bytes
 doc/examples/entry/ExampleLoginPrompt.java         |  313 +
 doc/examples/entry/ExampleSearchSomeone.java       |  209 +
 doc/examples/i18n/ExampleTranslation.java          |   79 +
 doc/examples/keyboard/ExampleSnooping.java         |   96 +
 doc/examples/menu/ExampleSimpleMenu.java           |  273 +
 doc/examples/menu/ExampleToolbar.java              |  187 +
 doc/examples/notify/ExampleLowBattery.java         |  105 +
 doc/examples/sourceview/ExampleEditor.java         |  210 +
 doc/examples/textview/ExampleFontHeights.java      |  119 +
 doc/examples/textview/ExampleInstantMessenger.java |  394 ++
 doc/examples/textview/LoremIpsum.java              |   92 +
 doc/examples/textview/face-smile.png               |  Bin 0 -> 1181 bytes
 doc/examples/tooltip/ExampleCustomTooltip.java     |  130 +
 doc/examples/tooltip/ExampleTooltip.java           |   91 +
 doc/examples/tooltip/ExampleTreeViewTooltips.java  |  190 +
 doc/examples/treeview/ExampleTrailHeads.java       |  231 +
 doc/examples/unique/ExampleBasicApplication.java   |  109 +
 doc/po/es.po                                       |   39 +
 doc/po/pt.po                                       |   41 +
 doc/style/CodeFormat.txt                           |   85 +
 doc/style/CommitMessages.txt                       |  147 +
 doc/style/Documentation.txt                        |  128 +
 doc/style/MARKUP                                   |  121 +
 java-gnome.doap                                    |   24 +
 src/bindings/java-gnome_Icon.png                   |  Bin 0 -> 4017 bytes
 .../bindings/BlacklistedMethodError.java           |   59 +
 .../org/freedesktop/bindings/Constant.java         |  107 +
 src/bindings/org/freedesktop/bindings/Debug.java   |   71 +
 .../org/freedesktop/bindings/DoubleConstant.java   |   61 +
 .../org/freedesktop/bindings/Environment.c         |  186 +
 .../org/freedesktop/bindings/Environment.java      |  151 +
 src/bindings/org/freedesktop/bindings/FIXME.java   |   56 +
 .../org/freedesktop/bindings/FatalError.java       |   65 +
 src/bindings/org/freedesktop/bindings/Flag.java    |  108 +
 .../freedesktop/bindings/Internationalization.c    |  188 +
 .../freedesktop/bindings/Internationalization.java |  557 ++
 src/bindings/org/freedesktop/bindings/Plumbing.c   |  109 +
 .../org/freedesktop/bindings/Plumbing.java         |  555 ++
 src/bindings/org/freedesktop/bindings/Pointer.java |  105 +
 src/bindings/org/freedesktop/bindings/Proxy.java   |   65 +
 src/bindings/org/freedesktop/bindings/Time.c       |  166 +
 src/bindings/org/freedesktop/bindings/Time.java    |  197 +
 src/bindings/org/freedesktop/bindings/Version.java |   79 +
 src/bindings/org/freedesktop/cairo/Antialias.java  |   91 +
 .../org/freedesktop/cairo/CairoMatrixOverride.c    |   78 +
 .../org/freedesktop/cairo/CairoMatrixOverride.java |   57 +
 .../org/freedesktop/cairo/CairoPatternOverride.c   |   68 +
 .../freedesktop/cairo/CairoPatternOverride.java    |   64 +
 .../org/freedesktop/cairo/CairoSurfaceOverride.c   |  142 +
 .../freedesktop/cairo/CairoSurfaceOverride.java    |   60 +
 src/bindings/org/freedesktop/cairo/Content.java    |   66 +
 src/bindings/org/freedesktop/cairo/Context.java    |  922 +++
 src/bindings/org/freedesktop/cairo/Entity.java     |   68 +
 src/bindings/org/freedesktop/cairo/Extend.java     |   84 +
 src/bindings/org/freedesktop/cairo/FatalError.java |   53 +
 src/bindings/org/freedesktop/cairo/FillRule.java   |   64 +
 src/bindings/org/freedesktop/cairo/Filter.java     |   86 +
 .../org/freedesktop/cairo/FontOptions.java         |   98 +
 src/bindings/org/freedesktop/cairo/Format.java     |   75 +
 .../org/freedesktop/cairo/GdkCairoSupport.c        |  133 +
 .../org/freedesktop/cairo/GdkCairoSupport.java     |   96 +
 .../org/freedesktop/cairo/HintMetrics.java         |   81 +
 src/bindings/org/freedesktop/cairo/HintStyle.java  |   94 +
 .../org/freedesktop/cairo/ImageSurface.java        |   88 +
 .../org/freedesktop/cairo/LinearPattern.java       |   74 +
 src/bindings/org/freedesktop/cairo/Matrix.java     |  164 +
 src/bindings/org/freedesktop/cairo/MimeType.java   |   87 +
 src/bindings/org/freedesktop/cairo/Operator.java   |  269 +
 src/bindings/org/freedesktop/cairo/Pattern.java    |  130 +
 src/bindings/org/freedesktop/cairo/PdfSurface.java |  115 +
 src/bindings/org/freedesktop/cairo/Plumbing.c      |  225 +
 src/bindings/org/freedesktop/cairo/Plumbing.java   |  100 +
 .../org/freedesktop/cairo/RadialPattern.java       |   83 +
 .../org/freedesktop/cairo/RecordingSurface.java    |   45 +
 .../org/freedesktop/cairo/SolidPattern.java        |   58 +
 src/bindings/org/freedesktop/cairo/Status.java     |  102 +
 src/bindings/org/freedesktop/cairo/Surface.java    |  254 +
 .../org/freedesktop/cairo/SurfacePattern.java      |   61 +
 src/bindings/org/freedesktop/cairo/SvgSurface.java |   84 +
 .../org/freedesktop/cairo/UnknownSurface.java      |   55 +
 .../org/freedesktop/cairo/XlibSurface.java         |  130 +
 src/bindings/org/freedesktop/cairo/package.html    |   35 +
 src/bindings/org/freedesktop/enchant/Broker.java   |   52 +
 .../org/freedesktop/enchant/Dictionary.java        |  133 +
 src/bindings/org/freedesktop/enchant/Enchant.java  |  225 +
 .../freedesktop/enchant/EnchantBrokerOverride.c    |  139 +
 .../freedesktop/enchant/EnchantBrokerOverride.java |   57 +
 src/bindings/org/freedesktop/enchant/Entity.java   |   48 +
 src/bindings/org/freedesktop/enchant/Plumbing.java |   77 +
 src/bindings/org/freedesktop/icons/ActionIcon.java |  253 +
 .../org/freedesktop/icons/ApplicationIcon.java     |  110 +
 .../org/freedesktop/icons/CategoryIcon.java        |   87 +
 src/bindings/org/freedesktop/icons/DeviceIcon.java |  105 +
 src/bindings/org/freedesktop/icons/EmblemIcon.java |   82 +
 src/bindings/org/freedesktop/icons/FaceIcon.java   |   92 +
 src/bindings/org/freedesktop/icons/Helper.java     |   76 +
 src/bindings/org/freedesktop/icons/Icon.java       |  106 +
 src/bindings/org/freedesktop/icons/MimeIcon.java   |   93 +
 src/bindings/org/freedesktop/icons/PlaceIcon.java  |   81 +
 src/bindings/org/freedesktop/icons/StateIcon.java  |  191 +
 src/bindings/org/gnome/atk/Action.java             |   45 +
 src/bindings/org/gnome/atk/Component.java          |   45 +
 src/bindings/org/gnome/atk/CoordType.java          |   50 +
 src/bindings/org/gnome/atk/Document.java           |   45 +
 src/bindings/org/gnome/atk/EditableText.java       |   45 +
 src/bindings/org/gnome/atk/GObjectAccessible.java  |   48 +
 src/bindings/org/gnome/atk/Hyperlink.java          |   50 +
 src/bindings/org/gnome/atk/HyperlinkImpl.java      |   45 +
 .../org/gnome/atk/HyperlinkStateFlags.java         |   50 +
 src/bindings/org/gnome/atk/Hypertext.java          |   45 +
 src/bindings/org/gnome/atk/Image.java              |   45 +
 src/bindings/org/gnome/atk/ImplementorIface.java   |   45 +
 src/bindings/org/gnome/atk/KeyEventType.java       |   50 +
 src/bindings/org/gnome/atk/Layer.java              |   50 +
 src/bindings/org/gnome/atk/NoOpObject.java         |   48 +
 src/bindings/org/gnome/atk/NoOpObjectFactory.java  |   48 +
 src/bindings/org/gnome/atk/Object.java             |   50 +
 src/bindings/org/gnome/atk/ObjectFactory.java      |   50 +
 src/bindings/org/gnome/atk/Plumbing.java           |   42 +
 src/bindings/org/gnome/atk/Rectangle.java          |   58 +
 src/bindings/org/gnome/atk/Registry.java           |   50 +
 src/bindings/org/gnome/atk/Relation.java           |   50 +
 src/bindings/org/gnome/atk/RelationSet.java        |   50 +
 src/bindings/org/gnome/atk/RelationType.java       |   50 +
 src/bindings/org/gnome/atk/Role.java               |   50 +
 src/bindings/org/gnome/atk/Selection.java          |   45 +
 src/bindings/org/gnome/atk/StateSet.java           |   50 +
 src/bindings/org/gnome/atk/StateType.java          |   50 +
 src/bindings/org/gnome/atk/StreamableContent.java  |   45 +
 src/bindings/org/gnome/atk/Table.java              |   45 +
 src/bindings/org/gnome/atk/Text.java               |   45 +
 src/bindings/org/gnome/atk/TextAttribute.java      |   50 +
 src/bindings/org/gnome/atk/TextBoundary.java       |   50 +
 src/bindings/org/gnome/atk/TextClipType.java       |   50 +
 src/bindings/org/gnome/atk/TextRange.java          |   58 +
 src/bindings/org/gnome/atk/TextRectangle.java      |   58 +
 src/bindings/org/gnome/atk/Util.java               |   50 +
 src/bindings/org/gnome/atk/Value.java              |   45 +
 src/bindings/org/gnome/atk/package.html            |   41 +
 src/bindings/org/gnome/gdk/AxisUse.java            |   50 +
 src/bindings/org/gnome/gdk/CapStyle.java           |   50 +
 src/bindings/org/gnome/gdk/Colorspace.java         |   50 +
 src/bindings/org/gnome/gdk/CrossingMode.java       |   89 +
 src/bindings/org/gnome/gdk/Cursor.java             |  190 +
 src/bindings/org/gnome/gdk/CursorType.java         |  197 +
 src/bindings/org/gnome/gdk/Device.java             |   50 +
 src/bindings/org/gnome/gdk/Display.java            |   57 +
 src/bindings/org/gnome/gdk/DisplayManager.java     |   50 +
 src/bindings/org/gnome/gdk/DragAction.java         |   50 +
 src/bindings/org/gnome/gdk/DragContext.java        |   50 +
 src/bindings/org/gnome/gdk/DragProtocol.java       |   50 +
 src/bindings/org/gnome/gdk/Event.java              |   80 +
 src/bindings/org/gnome/gdk/EventAny.java           |   53 +
 src/bindings/org/gnome/gdk/EventButton.java        |   94 +
 src/bindings/org/gnome/gdk/EventConfigure.java     |   89 +
 src/bindings/org/gnome/gdk/EventCrossing.java      |   74 +
 src/bindings/org/gnome/gdk/EventDragAndDrop.java   |   48 +
 src/bindings/org/gnome/gdk/EventFocus.java         |   48 +
 src/bindings/org/gnome/gdk/EventKey.java           |   86 +
 src/bindings/org/gnome/gdk/EventMask.java          |  190 +
 src/bindings/org/gnome/gdk/EventMotion.java        |   70 +
 src/bindings/org/gnome/gdk/EventOwnerChange.java   |   55 +
 src/bindings/org/gnome/gdk/EventProperty.java      |   51 +
 src/bindings/org/gnome/gdk/EventProximity.java     |   48 +
 src/bindings/org/gnome/gdk/EventScroll.java        |   69 +
 src/bindings/org/gnome/gdk/EventSelection.java     |   48 +
 src/bindings/org/gnome/gdk/EventType.java          |  304 +
 src/bindings/org/gnome/gdk/EventVisibility.java    |   59 +
 src/bindings/org/gnome/gdk/EventWindowState.java   |   48 +
 src/bindings/org/gnome/gdk/ExtensionMode.java      |   50 +
 src/bindings/org/gnome/gdk/Fill.java               |   50 +
 src/bindings/org/gnome/gdk/FillRule.java           |   50 +
 src/bindings/org/gnome/gdk/FilterReturn.java       |   50 +
 src/bindings/org/gnome/gdk/Function.java           |   50 +
 src/bindings/org/gnome/gdk/Gdk.java                |  136 +
 src/bindings/org/gnome/gdk/GdkColorOverride.c      |   68 +
 src/bindings/org/gnome/gdk/GdkColorOverride.java   |   49 +
 src/bindings/org/gnome/gdk/GdkKeyvalOverride.java  |   75 +
 .../org/gnome/gdk/GdkMouseButtonOverride.java      |   42 +
 src/bindings/org/gnome/gdk/GdkPixbufOverride.c     |  245 +
 src/bindings/org/gnome/gdk/GdkPixbufOverride.java  |   86 +
 src/bindings/org/gnome/gdk/GdkRGBAOverride.c       |   70 +
 src/bindings/org/gnome/gdk/GdkRGBAOverride.java    |   48 +
 src/bindings/org/gnome/gdk/GdkRectangleOverride.c  |  104 +
 .../org/gnome/gdk/GdkRectangleOverride.java        |   69 +
 src/bindings/org/gnome/gdk/Geometry.java           |   58 +
 src/bindings/org/gnome/gdk/GrabStatus.java         |   50 +
 src/bindings/org/gnome/gdk/Gravity.java            |  124 +
 src/bindings/org/gnome/gdk/InputMode.java          |   50 +
 src/bindings/org/gnome/gdk/InputSource.java        |   50 +
 src/bindings/org/gnome/gdk/InterpType.java         |  107 +
 src/bindings/org/gnome/gdk/JoinStyle.java          |   50 +
 src/bindings/org/gnome/gdk/Keymap.java             |   50 +
 src/bindings/org/gnome/gdk/KeymapKey.java          |   58 +
 src/bindings/org/gnome/gdk/KeypadKeyval.java       |  123 +
 src/bindings/org/gnome/gdk/Keyval.java             |  509 ++
 src/bindings/org/gnome/gdk/LineStyle.java          |   50 +
 src/bindings/org/gnome/gdk/ModifierType.java       |  296 +
 src/bindings/org/gnome/gdk/MouseButton.java        |  109 +
 src/bindings/org/gnome/gdk/NotifyType.java         |   83 +
 src/bindings/org/gnome/gdk/OverlapType.java        |   50 +
 src/bindings/org/gnome/gdk/OwnerChange.java        |   59 +
 src/bindings/org/gnome/gdk/PangoRenderer.java      |   50 +
 src/bindings/org/gnome/gdk/Pixbuf.java             |  401 ++
 src/bindings/org/gnome/gdk/PixbufAlphaMode.java    |   50 +
 src/bindings/org/gnome/gdk/PixbufAnimation.java    |   50 +
 .../org/gnome/gdk/PixbufAnimationIter.java         |   50 +
 src/bindings/org/gnome/gdk/PixbufError.java        |   50 +
 src/bindings/org/gnome/gdk/PixbufFormat.java       |   98 +
 src/bindings/org/gnome/gdk/PixbufLoader.java       |   50 +
 src/bindings/org/gnome/gdk/PixbufRotation.java     |   50 +
 src/bindings/org/gnome/gdk/PixbufSimpleAnim.java   |   48 +
 .../org/gnome/gdk/PixbufSimpleAnimIter.java        |   48 +
 src/bindings/org/gnome/gdk/Plumbing.c              |   65 +
 src/bindings/org/gnome/gdk/Plumbing.java           |  180 +
 src/bindings/org/gnome/gdk/Point.java              |   58 +
 src/bindings/org/gnome/gdk/PropMode.java           |   50 +
 src/bindings/org/gnome/gdk/PropertyState.java      |   50 +
 src/bindings/org/gnome/gdk/RGBA.java               |  145 +
 src/bindings/org/gnome/gdk/Rectangle.java          |  115 +
 src/bindings/org/gnome/gdk/RgbCmap.java            |   58 +
 src/bindings/org/gnome/gdk/RgbDither.java          |   50 +
 src/bindings/org/gnome/gdk/Screen.java             |  106 +
 src/bindings/org/gnome/gdk/ScrollDirection.java    |   71 +
 src/bindings/org/gnome/gdk/Segment.java            |   58 +
 src/bindings/org/gnome/gdk/SettingAction.java      |   50 +
 src/bindings/org/gnome/gdk/SubwindowMode.java      |   50 +
 src/bindings/org/gnome/gdk/Trapezoid.java          |   58 +
 src/bindings/org/gnome/gdk/VisibilityState.java    |   75 +
 src/bindings/org/gnome/gdk/Visual.java             |   58 +
 src/bindings/org/gnome/gdk/VisualType.java         |   50 +
 src/bindings/org/gnome/gdk/Window.java             |  256 +
 src/bindings/org/gnome/gdk/WindowAttr.java         |   58 +
 .../org/gnome/gdk/WindowAttributesType.java        |   50 +
 src/bindings/org/gnome/gdk/WindowClass.java        |   50 +
 src/bindings/org/gnome/gdk/WindowEdge.java         |   50 +
 src/bindings/org/gnome/gdk/WindowHints.java        |   50 +
 src/bindings/org/gnome/gdk/WindowState.java        |   76 +
 src/bindings/org/gnome/gdk/WindowType.java         |   50 +
 src/bindings/org/gnome/gdk/WindowTypeHint.java     |  102 +
 src/bindings/org/gnome/gdk/package.html            |   38 +
 src/bindings/org/gnome/glib/Application.java       |  350 ++
 .../org/gnome/glib/ApplicationCommandLine.java     |  109 +
 src/bindings/org/gnome/glib/ApplicationFlags.java  |  119 +
 src/bindings/org/gnome/glib/Boxed.java             |   69 +
 src/bindings/org/gnome/glib/FatalError.java        |   82 +
 src/bindings/org/gnome/glib/File.java              |   64 +
 src/bindings/org/gnome/glib/FormatSizeFlags.java   |   71 +
 .../org/gnome/glib/GApplicationOverride.java       |   52 +
 src/bindings/org/gnome/glib/GBoxed.c               |   49 +
 src/bindings/org/gnome/glib/GBoxed.java            |   42 +
 src/bindings/org/gnome/glib/GMain.c                |  125 +
 src/bindings/org/gnome/glib/GMain.java             |   47 +
 src/bindings/org/gnome/glib/GObject.c              |  308 +
 src/bindings/org/gnome/glib/GObject.java           |  140 +
 src/bindings/org/gnome/glib/GValue.c               |  806 +++
 src/bindings/org/gnome/glib/GValue.java            |  259 +
 src/bindings/org/gnome/glib/Glib.java              |  325 +
 src/bindings/org/gnome/glib/GlibException.java     |   83 +
 src/bindings/org/gnome/glib/Handler.java           |   50 +
 src/bindings/org/gnome/glib/Object.java            |  266 +
 src/bindings/org/gnome/glib/Plumbing.c             |   64 +
 src/bindings/org/gnome/glib/Plumbing.java          |  400 ++
 src/bindings/org/gnome/glib/Signal.java            |   59 +
 src/bindings/org/gnome/glib/UserDirectory.java     |   98 +
 src/bindings/org/gnome/glib/Value.java             |  204 +
 src/bindings/org/gnome/glib/package.html           |   34 +
 src/bindings/org/gnome/gtk/AboutDialog.java        |  333 +
 src/bindings/org/gnome/gtk/AccelFlags.java         |   50 +
 src/bindings/org/gnome/gtk/AccelKey.java           |   58 +
 src/bindings/org/gnome/gtk/AccelLabel.java         |   48 +
 src/bindings/org/gnome/gtk/AccelMap.java           |   50 +
 src/bindings/org/gnome/gtk/AcceleratorGroup.java   |  121 +
 src/bindings/org/gnome/gtk/Accessible.java         |   50 +
 src/bindings/org/gnome/gtk/Action.java             |  507 ++
 src/bindings/org/gnome/gtk/ActionGroup.java        |  129 +
 src/bindings/org/gnome/gtk/Activatable.java        |   60 +
 src/bindings/org/gnome/gtk/Adjustment.java         |  291 +
 src/bindings/org/gnome/gtk/Align.java              |   78 +
 src/bindings/org/gnome/gtk/Alignment.java          |  262 +
 src/bindings/org/gnome/gtk/Allocation.java         |  105 +
 src/bindings/org/gnome/gtk/AnchorType.java         |   50 +
 src/bindings/org/gnome/gtk/Application.java        |  389 ++
 .../org/gnome/gtk/ApplicationInhibitFlags.java     |   95 +
 src/bindings/org/gnome/gtk/Arrow.java              |  125 +
 src/bindings/org/gnome/gtk/ArrowType.java          |   81 +
 src/bindings/org/gnome/gtk/AspectFrame.java        |   48 +
 src/bindings/org/gnome/gtk/Assistant.java          |  493 ++
 src/bindings/org/gnome/gtk/AssistantPageType.java  |   88 +
 src/bindings/org/gnome/gtk/AttachOptions.java      |   90 +
 src/bindings/org/gnome/gtk/Bin.java                |   55 +
 src/bindings/org/gnome/gtk/Border.java             |   58 +
 src/bindings/org/gnome/gtk/Box.java                |  169 +
 src/bindings/org/gnome/gtk/Builder.java            |  139 +
 src/bindings/org/gnome/gtk/Button.java             |  384 ++
 src/bindings/org/gnome/gtk/ButtonBox.java          |  137 +
 src/bindings/org/gnome/gtk/ButtonBoxStyle.java     |   88 +
 src/bindings/org/gnome/gtk/ButtonsType.java        |  106 +
 src/bindings/org/gnome/gtk/Calendar.java           |  231 +
 .../org/gnome/gtk/CalendarDisplayOptions.java      |   97 +
 src/bindings/org/gnome/gtk/CellEditable.java       |   43 +
 src/bindings/org/gnome/gtk/CellLayout.java         |   45 +
 src/bindings/org/gnome/gtk/CellRenderer.java       |  181 +
 src/bindings/org/gnome/gtk/CellRendererAccel.java  |   59 +
 .../org/gnome/gtk/CellRendererAccelMode.java       |   50 +
 src/bindings/org/gnome/gtk/CellRendererCombo.java  |   48 +
 src/bindings/org/gnome/gtk/CellRendererMode.java   |   50 +
 src/bindings/org/gnome/gtk/CellRendererPixbuf.java |   80 +
 .../org/gnome/gtk/CellRendererProgress.java        |   83 +
 src/bindings/org/gnome/gtk/CellRendererSpin.java   |   48 +
 .../org/gnome/gtk/CellRendererSpinner.java         |   48 +
 src/bindings/org/gnome/gtk/CellRendererState.java  |   50 +
 src/bindings/org/gnome/gtk/CellRendererText.java   |  252 +
 src/bindings/org/gnome/gtk/CellRendererToggle.java |  180 +
 src/bindings/org/gnome/gtk/CellType.java           |   50 +
 src/bindings/org/gnome/gtk/CellView.java           |   56 +
 src/bindings/org/gnome/gtk/CheckButton.java        |   83 +
 src/bindings/org/gnome/gtk/CheckMenuItem.java      |  194 +
 src/bindings/org/gnome/gtk/Clipboard.java          |  188 +
 src/bindings/org/gnome/gtk/ColorButton.java        |  125 +
 src/bindings/org/gnome/gtk/ColorSelection.java     |   48 +
 .../org/gnome/gtk/ColorSelectionDialog.java        |   48 +
 src/bindings/org/gnome/gtk/ComboBox.java           |  256 +
 src/bindings/org/gnome/gtk/ComboBoxText.java       |  144 +
 src/bindings/org/gnome/gtk/Container.java          |  173 +
 src/bindings/org/gnome/gtk/CornerType.java         |   50 +
 src/bindings/org/gnome/gtk/CurveType.java          |   50 +
 src/bindings/org/gnome/gtk/CustomPaperSize.java    |  100 +
 src/bindings/org/gnome/gtk/DataColumn.java         |  206 +
 src/bindings/org/gnome/gtk/DataColumnBoolean.java  |   53 +
 src/bindings/org/gnome/gtk/DataColumnIcon.java     |   52 +
 src/bindings/org/gnome/gtk/DataColumnInteger.java  |   65 +
 src/bindings/org/gnome/gtk/DataColumnLong.java     |   52 +
 src/bindings/org/gnome/gtk/DataColumnPixbuf.java   |   49 +
 .../org/gnome/gtk/DataColumnReference.java         |   74 +
 src/bindings/org/gnome/gtk/DataColumnStock.java    |   50 +
 src/bindings/org/gnome/gtk/DataColumnString.java   |   60 +
 src/bindings/org/gnome/gtk/DebugFlag.java          |   50 +
 src/bindings/org/gnome/gtk/DeleteType.java         |   50 +
 src/bindings/org/gnome/gtk/DestDefaults.java       |   50 +
 src/bindings/org/gnome/gtk/Dialog.java             |  371 ++
 src/bindings/org/gnome/gtk/DialogFlags.java        |   57 +
 src/bindings/org/gnome/gtk/DirectionType.java      |   50 +
 src/bindings/org/gnome/gtk/DrawingArea.java        |   66 +
 src/bindings/org/gnome/gtk/Editable.java           |  123 +
 src/bindings/org/gnome/gtk/Entry.java              |  691 +++
 src/bindings/org/gnome/gtk/EntryBuffer.java        |   50 +
 src/bindings/org/gnome/gtk/EntryCompletion.java    |  647 ++
 src/bindings/org/gnome/gtk/EntryIconPosition.java  |   62 +
 src/bindings/org/gnome/gtk/ErrorMessageDialog.java |   57 +
 src/bindings/org/gnome/gtk/EventBox.java           |  102 +
 src/bindings/org/gnome/gtk/Expander.java           |  107 +
 src/bindings/org/gnome/gtk/ExpanderStyle.java      |   50 +
 src/bindings/org/gnome/gtk/FatalError.java         |   53 +
 src/bindings/org/gnome/gtk/FileChooser.java        |  206 +
 src/bindings/org/gnome/gtk/FileChooserAction.java  |   79 +
 src/bindings/org/gnome/gtk/FileChooserButton.java  |  156 +
 .../org/gnome/gtk/FileChooserConfirmation.java     |   50 +
 src/bindings/org/gnome/gtk/FileChooserDialog.java  |  162 +
 src/bindings/org/gnome/gtk/FileChooserError.java   |   50 +
 src/bindings/org/gnome/gtk/FileChooserWidget.java  |  112 +
 src/bindings/org/gnome/gtk/FileFilter.java         |  163 +
 src/bindings/org/gnome/gtk/FileFilterFlags.java    |   50 +
 src/bindings/org/gnome/gtk/FileFolder.java         |   45 +
 src/bindings/org/gnome/gtk/FileInfo.java           |   58 +
 src/bindings/org/gnome/gtk/FileInfoType.java       |   50 +
 src/bindings/org/gnome/gtk/FilePath.java           |   58 +
 src/bindings/org/gnome/gtk/FileSystem.java         |   45 +
 src/bindings/org/gnome/gtk/FileSystemError.java    |   50 +
 src/bindings/org/gnome/gtk/FileSystemHandle.java   |   50 +
 src/bindings/org/gnome/gtk/Fixed.java              |  141 +
 src/bindings/org/gnome/gtk/FontButton.java         |  104 +
 src/bindings/org/gnome/gtk/FontSelection.java      |   48 +
 .../org/gnome/gtk/FontSelectionDialog.java         |   48 +
 src/bindings/org/gnome/gtk/Frame.java              |  139 +
 src/bindings/org/gnome/gtk/Grid.java               |  106 +
 src/bindings/org/gnome/gtk/Gtk.java                |  276 +
 src/bindings/org/gnome/gtk/GtkAllocationOverride.c |   74 +
 .../org/gnome/gtk/GtkAllocationOverride.java       |   57 +
 src/bindings/org/gnome/gtk/GtkAssistantOverride.c  |  127 +
 .../org/gnome/gtk/GtkAssistantOverride.java        |   60 +
 src/bindings/org/gnome/gtk/GtkClipboardOverride.c  |   51 +
 .../org/gnome/gtk/GtkClipboardOverride.java        |   53 +
 .../org/gnome/gtk/GtkEntryCompletionOverride.c     |  133 +
 .../org/gnome/gtk/GtkEntryCompletionOverride.java  |   61 +
 src/bindings/org/gnome/gtk/GtkEntryOverride.c      |   71 +
 src/bindings/org/gnome/gtk/GtkEntryOverride.java   |   47 +
 src/bindings/org/gnome/gtk/GtkMain.c               |  251 +
 src/bindings/org/gnome/gtk/GtkMain.java            |  158 +
 src/bindings/org/gnome/gtk/GtkMenuOverride.c       |  168 +
 src/bindings/org/gnome/gtk/GtkMenuOverride.java    |   75 +
 .../org/gnome/gtk/GtkRequisitionOverride.c         |   74 +
 .../org/gnome/gtk/GtkRequisitionOverride.java      |   57 +
 .../org/gnome/gtk/GtkResponseTypeOverride.java     |   57 +
 .../org/gnome/gtk/GtkStyleContextOverride.c        |  157 +
 .../org/gnome/gtk/GtkStyleContextOverride.java     |   91 +
 src/bindings/org/gnome/gtk/GtkSwitchOverride.c     |   84 +
 src/bindings/org/gnome/gtk/GtkSwitchOverride.java  |   51 +
 src/bindings/org/gnome/gtk/GtkTextBufferOverride.c |   63 +
 .../org/gnome/gtk/GtkTextBufferOverride.java       |   77 +
 src/bindings/org/gnome/gtk/GtkTextIterOverride.c   |   61 +
 .../org/gnome/gtk/GtkTextIterOverride.java         |   51 +
 src/bindings/org/gnome/gtk/GtkTextTagOverride.java |   58 +
 src/bindings/org/gnome/gtk/GtkTreeIterOverride.c   |   65 +
 .../org/gnome/gtk/GtkTreeIterOverride.java         |   54 +
 .../org/gnome/gtk/GtkTreeModelFilterOverride.c     |  121 +
 .../org/gnome/gtk/GtkTreeModelFilterOverride.java  |   51 +
 src/bindings/org/gnome/gtk/GtkTreeModelOverride.c  |  292 +
 .../org/gnome/gtk/GtkTreeModelOverride.java        |  127 +
 src/bindings/org/gnome/gtk/GtkWidgetOverride.c     |  158 +
 src/bindings/org/gnome/gtk/GtkWidgetOverride.java  |   97 +
 src/bindings/org/gnome/gtk/GtkWindowOverride.c     |  196 +
 src/bindings/org/gnome/gtk/GtkWindowOverride.java  |   52 +
 src/bindings/org/gnome/gtk/HBox.java               |   67 +
 src/bindings/org/gnome/gtk/HButtonBox.java         |   57 +
 src/bindings/org/gnome/gtk/HPaned.java             |   69 +
 src/bindings/org/gnome/gtk/HScale.java             |   68 +
 src/bindings/org/gnome/gtk/HScrollbar.java         |   59 +
 src/bindings/org/gnome/gtk/HSeparator.java         |   56 +
 src/bindings/org/gnome/gtk/HandleBox.java          |   48 +
 src/bindings/org/gnome/gtk/IMPreeditStyle.java     |   50 +
 src/bindings/org/gnome/gtk/IMStatusStyle.java      |   50 +
 src/bindings/org/gnome/gtk/IconFactory.java        |   50 +
 src/bindings/org/gnome/gtk/IconInfo.java           |   58 +
 src/bindings/org/gnome/gtk/IconLookupFlags.java    |   50 +
 src/bindings/org/gnome/gtk/IconSet.java            |   58 +
 src/bindings/org/gnome/gtk/IconSize.java           |   90 +
 src/bindings/org/gnome/gtk/IconSource.java         |   58 +
 src/bindings/org/gnome/gtk/IconTheme.java          |   50 +
 src/bindings/org/gnome/gtk/IconThemeError.java     |   50 +
 src/bindings/org/gnome/gtk/IconView.java           |  371 ++
 .../org/gnome/gtk/IconViewDropPosition.java        |   50 +
 src/bindings/org/gnome/gtk/Image.java              |  175 +
 src/bindings/org/gnome/gtk/ImageMenuItem.java      |  161 +
 src/bindings/org/gnome/gtk/ImageType.java          |   83 +
 src/bindings/org/gnome/gtk/InfoBar.java            |  220 +
 src/bindings/org/gnome/gtk/InfoMessageDialog.java  |   74 +
 src/bindings/org/gnome/gtk/InputMethod.java        |  135 +
 .../org/gnome/gtk/InternationalPaperSize.java      |   65 +
 src/bindings/org/gnome/gtk/JunctionSides.java      |   98 +
 src/bindings/org/gnome/gtk/Justification.java      |   75 +
 src/bindings/org/gnome/gtk/Label.java              |  365 ++
 src/bindings/org/gnome/gtk/Layout.java             |  133 +
 src/bindings/org/gnome/gtk/License.java            |   93 +
 src/bindings/org/gnome/gtk/LinkButton.java         |  117 +
 src/bindings/org/gnome/gtk/ListStore.java          |  195 +
 src/bindings/org/gnome/gtk/Menu.java               |  149 +
 src/bindings/org/gnome/gtk/MenuBar.java            |   67 +
 src/bindings/org/gnome/gtk/MenuDirectionType.java  |   50 +
 src/bindings/org/gnome/gtk/MenuItem.java           |  206 +
 src/bindings/org/gnome/gtk/MenuShell.java          |  113 +
 src/bindings/org/gnome/gtk/MenuToolButton.java     |  121 +
 src/bindings/org/gnome/gtk/MessageDialog.java      |  207 +
 src/bindings/org/gnome/gtk/MessageType.java        |  130 +
 src/bindings/org/gnome/gtk/MetricType.java         |   50 +
 src/bindings/org/gnome/gtk/Misc.java               |  136 +
 src/bindings/org/gnome/gtk/MovementStep.java       |   83 +
 .../org/gnome/gtk/MulticontextInputMethod.java     |   69 +
 .../org/gnome/gtk/NorthAmericanPaperSize.java      |   62 +
 src/bindings/org/gnome/gtk/Notebook.java           |  313 +
 src/bindings/org/gnome/gtk/NotebookTab.java        |   50 +
 src/bindings/org/gnome/gtk/OffscreenWindow.java    |   46 +
 src/bindings/org/gnome/gtk/Orientable.java         |   56 +
 src/bindings/org/gnome/gtk/Orientation.java        |   60 +
 src/bindings/org/gnome/gtk/PackDirection.java      |   50 +
 src/bindings/org/gnome/gtk/PackType.java           |   50 +
 src/bindings/org/gnome/gtk/PageOrientation.java    |   50 +
 src/bindings/org/gnome/gtk/PageSet.java            |   50 +
 src/bindings/org/gnome/gtk/PageSetup.java          |   50 +
 src/bindings/org/gnome/gtk/Paned.java              |  194 +
 src/bindings/org/gnome/gtk/PaperSize.java          |  186 +
 src/bindings/org/gnome/gtk/PathPriorityType.java   |   50 +
 src/bindings/org/gnome/gtk/PathType.java           |   50 +
 src/bindings/org/gnome/gtk/Plug.java               |   48 +
 src/bindings/org/gnome/gtk/Plumbing.java           |   38 +
 src/bindings/org/gnome/gtk/PolicyType.java         |   68 +
 src/bindings/org/gnome/gtk/PositionType.java       |   72 +
 src/bindings/org/gnome/gtk/PrintContext.java       |   50 +
 src/bindings/org/gnome/gtk/PrintDuplex.java        |   50 +
 src/bindings/org/gnome/gtk/PrintError.java         |   50 +
 src/bindings/org/gnome/gtk/PrintOperation.java     |   50 +
 .../org/gnome/gtk/PrintOperationAction.java        |   50 +
 .../org/gnome/gtk/PrintOperationPreview.java       |   45 +
 .../org/gnome/gtk/PrintOperationResult.java        |   50 +
 src/bindings/org/gnome/gtk/PrintPages.java         |   50 +
 src/bindings/org/gnome/gtk/PrintQuality.java       |   50 +
 src/bindings/org/gnome/gtk/PrintSettings.java      |   50 +
 src/bindings/org/gnome/gtk/PrintStatus.java        |   50 +
 src/bindings/org/gnome/gtk/PrivateFlags.java       |   50 +
 src/bindings/org/gnome/gtk/ProgressBar.java        |  203 +
 .../org/gnome/gtk/ProgressBarOrientation.java      |   74 +
 .../org/gnome/gtk/QuestionMessageDialog.java       |   85 +
 src/bindings/org/gnome/gtk/RadioAction.java        |  177 +
 src/bindings/org/gnome/gtk/RadioButton.java        |  151 +
 src/bindings/org/gnome/gtk/RadioGroup.java         |  253 +
 src/bindings/org/gnome/gtk/RadioMenuItem.java      |  102 +
 src/bindings/org/gnome/gtk/RadioToolButton.java    |  110 +
 src/bindings/org/gnome/gtk/Range.java              |  128 +
 src/bindings/org/gnome/gtk/RcFlags.java            |   50 +
 src/bindings/org/gnome/gtk/RcStyle.java            |   50 +
 src/bindings/org/gnome/gtk/RcTokenType.java        |   50 +
 src/bindings/org/gnome/gtk/RecentAction.java       |   48 +
 src/bindings/org/gnome/gtk/RecentChooser.java      |   45 +
 .../org/gnome/gtk/RecentChooserDialog.java         |   48 +
 src/bindings/org/gnome/gtk/RecentChooserError.java |   50 +
 src/bindings/org/gnome/gtk/RecentChooserMenu.java  |   48 +
 .../org/gnome/gtk/RecentChooserWidget.java         |   48 +
 src/bindings/org/gnome/gtk/RecentFilter.java       |   50 +
 src/bindings/org/gnome/gtk/RecentFilterFlags.java  |   50 +
 src/bindings/org/gnome/gtk/RecentInfo.java         |   58 +
 src/bindings/org/gnome/gtk/RecentManager.java      |   50 +
 src/bindings/org/gnome/gtk/RecentManagerError.java |   50 +
 src/bindings/org/gnome/gtk/RecentSortType.java     |   50 +
 src/bindings/org/gnome/gtk/RegionFlags.java        |   80 +
 src/bindings/org/gnome/gtk/ReliefStyle.java        |   76 +
 src/bindings/org/gnome/gtk/Requisition.java        |  113 +
 src/bindings/org/gnome/gtk/ResizeMode.java         |   50 +
 src/bindings/org/gnome/gtk/ResponseType.java       |  208 +
 src/bindings/org/gnome/gtk/Scale.java              |  111 +
 src/bindings/org/gnome/gtk/ScaleButton.java        |   48 +
 src/bindings/org/gnome/gtk/ScrollStep.java         |   75 +
 src/bindings/org/gnome/gtk/ScrollType.java         |   67 +
 src/bindings/org/gnome/gtk/Scrollbar.java          |   62 +
 src/bindings/org/gnome/gtk/ScrolledWindow.java     |  215 +
 src/bindings/org/gnome/gtk/SelectionData.java      |   58 +
 src/bindings/org/gnome/gtk/SelectionMode.java      |   84 +
 src/bindings/org/gnome/gtk/SensitivityType.java    |   50 +
 src/bindings/org/gnome/gtk/Separator.java          |   65 +
 src/bindings/org/gnome/gtk/SeparatorMenuItem.java  |   63 +
 src/bindings/org/gnome/gtk/SeparatorToolItem.java  |   82 +
 src/bindings/org/gnome/gtk/Settings.java           |  179 +
 src/bindings/org/gnome/gtk/ShadowType.java         |   76 +
 src/bindings/org/gnome/gtk/SignalRunType.java      |   50 +
 src/bindings/org/gnome/gtk/SimpleInputMethod.java  |   68 +
 src/bindings/org/gnome/gtk/SizeGroup.java          |  103 +
 src/bindings/org/gnome/gtk/SizeGroupMode.java      |   72 +
 src/bindings/org/gnome/gtk/SizeRequestMode.java    |   53 +
 src/bindings/org/gnome/gtk/Socket.java             |   48 +
 src/bindings/org/gnome/gtk/SortType.java           |   73 +
 src/bindings/org/gnome/gtk/Spell.java              |  124 +
 src/bindings/org/gnome/gtk/SpinButton.java         |  155 +
 .../org/gnome/gtk/SpinButtonUpdatePolicy.java      |   50 +
 src/bindings/org/gnome/gtk/SpinType.java           |   50 +
 src/bindings/org/gnome/gtk/Spinner.java            |   75 +
 src/bindings/org/gnome/gtk/StateFlags.java         |   91 +
 src/bindings/org/gnome/gtk/StatusIcon.java         |  356 ++
 src/bindings/org/gnome/gtk/Statusbar.java          |  158 +
 src/bindings/org/gnome/gtk/Stock.java              |  362 ++
 src/bindings/org/gnome/gtk/Style.java              |   75 +
 src/bindings/org/gnome/gtk/StyleClass.java         |  257 +
 src/bindings/org/gnome/gtk/StyleContext.java       |  226 +
 src/bindings/org/gnome/gtk/StyleProperty.java      |  103 +
 src/bindings/org/gnome/gtk/StyleRegion.java        |   67 +
 src/bindings/org/gnome/gtk/Switch.java             |  116 +
 src/bindings/org/gnome/gtk/Table.java              |  194 +
 src/bindings/org/gnome/gtk/TargetFlags.java        |   50 +
 src/bindings/org/gnome/gtk/TearoffMenuItem.java    |   48 +
 src/bindings/org/gnome/gtk/Test.java               |  113 +
 src/bindings/org/gnome/gtk/TextAppearance.java     |   58 +
 src/bindings/org/gnome/gtk/TextAttributes.java     |   58 +
 src/bindings/org/gnome/gtk/TextBuffer.java         | 1234 ++++
 .../org/gnome/gtk/TextBufferTargetInfo.java        |   50 +
 src/bindings/org/gnome/gtk/TextChildAnchor.java    |   48 +
 src/bindings/org/gnome/gtk/TextDirection.java      |   63 +
 src/bindings/org/gnome/gtk/TextIter.java           |  736 +++
 src/bindings/org/gnome/gtk/TextMark.java           |  124 +
 src/bindings/org/gnome/gtk/TextSearchFlags.java    |   50 +
 src/bindings/org/gnome/gtk/TextTag.java            |  608 ++
 src/bindings/org/gnome/gtk/TextTagTable.java       |   67 +
 src/bindings/org/gnome/gtk/TextView.java           | 1091 ++++
 src/bindings/org/gnome/gtk/TextWindowType.java     |  133 +
 src/bindings/org/gnome/gtk/ToggleAction.java       |  224 +
 src/bindings/org/gnome/gtk/ToggleButton.java       |  110 +
 src/bindings/org/gnome/gtk/ToggleToolButton.java   |  125 +
 src/bindings/org/gnome/gtk/ToolButton.java         |  175 +
 src/bindings/org/gnome/gtk/ToolItem.java           |  100 +
 src/bindings/org/gnome/gtk/ToolItemGroup.java      |   48 +
 src/bindings/org/gnome/gtk/ToolPalette.java        |   48 +
 .../org/gnome/gtk/ToolPaletteDragTargets.java      |   50 +
 src/bindings/org/gnome/gtk/Toolbar.java            |  147 +
 src/bindings/org/gnome/gtk/ToolbarSpaceStyle.java  |   50 +
 src/bindings/org/gnome/gtk/ToolbarStyle.java       |   73 +
 src/bindings/org/gnome/gtk/Tooltip.java            |  146 +
 src/bindings/org/gnome/gtk/TreeDragDest.java       |   45 +
 src/bindings/org/gnome/gtk/TreeDragSource.java     |   45 +
 src/bindings/org/gnome/gtk/TreeIter.java           |  149 +
 src/bindings/org/gnome/gtk/TreeModel.java          |  561 ++
 src/bindings/org/gnome/gtk/TreeModelFilter.java    |  291 +
 src/bindings/org/gnome/gtk/TreeModelFlags.java     |   50 +
 src/bindings/org/gnome/gtk/TreeModelSort.java      |  208 +
 src/bindings/org/gnome/gtk/TreePath.java           |  172 +
 src/bindings/org/gnome/gtk/TreeRowReference.java   |   98 +
 src/bindings/org/gnome/gtk/TreeSelection.java      |  259 +
 src/bindings/org/gnome/gtk/TreeSortable.java       |   55 +
 src/bindings/org/gnome/gtk/TreeStore.java          |  309 +
 src/bindings/org/gnome/gtk/TreeView.java           | 1096 ++++
 src/bindings/org/gnome/gtk/TreeViewColumn.java     |  328 +
 .../org/gnome/gtk/TreeViewColumnSizing.java        |   79 +
 .../org/gnome/gtk/TreeViewDropPosition.java        |   50 +
 src/bindings/org/gnome/gtk/TreeViewGridLines.java  |   50 +
 src/bindings/org/gnome/gtk/TreeViewMode.java       |   50 +
 src/bindings/org/gnome/gtk/UIManager.java          |   50 +
 src/bindings/org/gnome/gtk/UIManagerItemType.java  |   50 +
 src/bindings/org/gnome/gtk/Unit.java               |   89 +
 src/bindings/org/gnome/gtk/VBox.java               |   73 +
 src/bindings/org/gnome/gtk/VButtonBox.java         |   51 +
 src/bindings/org/gnome/gtk/VPaned.java             |   69 +
 src/bindings/org/gnome/gtk/VScale.java             |   57 +
 src/bindings/org/gnome/gtk/VScrollbar.java         |   59 +
 src/bindings/org/gnome/gtk/VSeparator.java         |   56 +
 src/bindings/org/gnome/gtk/Value.java              |  134 +
 src/bindings/org/gnome/gtk/Viewport.java           |  111 +
 .../org/gnome/gtk/WarningMessageDialog.java        |   78 +
 src/bindings/org/gnome/gtk/Widget.java             | 1854 ++++++
 src/bindings/org/gnome/gtk/WidgetHelpType.java     |   50 +
 src/bindings/org/gnome/gtk/Window.java             |  912 +++
 src/bindings/org/gnome/gtk/WindowGroup.java        |   50 +
 src/bindings/org/gnome/gtk/WindowPosition.java     |   79 +
 src/bindings/org/gnome/gtk/WindowType.java         |   75 +
 src/bindings/org/gnome/gtk/WrapMode.java           |   79 +
 src/bindings/org/gnome/gtk/package.html            |   51 +
 src/bindings/org/gnome/notify/Notification.java    |  324 +
 src/bindings/org/gnome/notify/Notify.java          |  133 +
 src/bindings/org/gnome/notify/NotifyMainOverride.c |   94 +
 .../org/gnome/notify/NotifyMainOverride.java       |   50 +
 .../org/gnome/notify/NotifyNotificationOverride.c  |  227 +
 .../gnome/notify/NotifyNotificationOverride.java   |   95 +
 src/bindings/org/gnome/notify/Plumbing.java        |   42 +
 src/bindings/org/gnome/notify/Urgency.java         |   63 +
 src/bindings/org/gnome/pango/Alignment.java        |   68 +
 src/bindings/org/gnome/pango/Analysis.java         |   58 +
 src/bindings/org/gnome/pango/AttrIterator.java     |   58 +
 src/bindings/org/gnome/pango/AttrType.java         |   50 +
 src/bindings/org/gnome/pango/Attribute.java        |  167 +
 src/bindings/org/gnome/pango/AttributeList.java    |  194 +
 .../org/gnome/pango/BackgroundColorAttribute.java  |   53 +
 src/bindings/org/gnome/pango/Color.java            |   58 +
 src/bindings/org/gnome/pango/Context.java          |  109 +
 src/bindings/org/gnome/pango/CoverageLevel.java    |   50 +
 src/bindings/org/gnome/pango/Direction.java        |   50 +
 src/bindings/org/gnome/pango/EllipsizeMode.java    |   71 +
 src/bindings/org/gnome/pango/Engine.java           |   50 +
 src/bindings/org/gnome/pango/EngineLang.java       |   48 +
 src/bindings/org/gnome/pango/EngineShape.java      |   48 +
 .../org/gnome/pango/FallbackAttribute.java         |   54 +
 src/bindings/org/gnome/pango/Font.java             |   92 +
 src/bindings/org/gnome/pango/FontDescription.java  |  335 +
 .../org/gnome/pango/FontDescriptionAttribute.java  |   53 +
 src/bindings/org/gnome/pango/FontFace.java         |   50 +
 src/bindings/org/gnome/pango/FontFamily.java       |   50 +
 src/bindings/org/gnome/pango/FontMap.java          |   50 +
 src/bindings/org/gnome/pango/FontMask.java         |   50 +
 src/bindings/org/gnome/pango/FontMetrics.java      |   58 +
 src/bindings/org/gnome/pango/Fontset.java          |   50 +
 src/bindings/org/gnome/pango/FontsetSimple.java    |   48 +
 .../org/gnome/pango/ForegroundColorAttribute.java  |   57 +
 src/bindings/org/gnome/pango/GlyphGeometry.java    |   58 +
 src/bindings/org/gnome/pango/GlyphInfo.java        |   58 +
 src/bindings/org/gnome/pango/GlyphString.java      |   58 +
 src/bindings/org/gnome/pango/Gravity.java          |   50 +
 src/bindings/org/gnome/pango/GravityHint.java      |   50 +
 src/bindings/org/gnome/pango/Item.java             |   58 +
 src/bindings/org/gnome/pango/Language.java         |   58 +
 src/bindings/org/gnome/pango/Layout.java           |  557 ++
 src/bindings/org/gnome/pango/LayoutIter.java       |   58 +
 src/bindings/org/gnome/pango/LayoutLine.java       |  173 +
 src/bindings/org/gnome/pango/Matrix.java           |   58 +
 src/bindings/org/gnome/pango/Pango.java            |   60 +
 .../org/gnome/pango/PangoAttributeOverride.c       |  108 +
 .../org/gnome/pango/PangoAttributeOverride.java    |   56 +
 .../org/gnome/pango/PangoLayoutLineOverride.c      |  166 +
 .../org/gnome/pango/PangoLayoutLineOverride.java   |   73 +
 .../org/gnome/pango/PangoRectangleOverride.c       |   78 +
 .../org/gnome/pango/PangoRectangleOverride.java    |   57 +
 src/bindings/org/gnome/pango/Plumbing.java         |   42 +
 src/bindings/org/gnome/pango/Rectangle.java        |  135 +
 src/bindings/org/gnome/pango/RenderPart.java       |   50 +
 src/bindings/org/gnome/pango/Renderer.java         |   50 +
 src/bindings/org/gnome/pango/RiseAttribute.java    |   55 +
 src/bindings/org/gnome/pango/Scale.java            |   86 +
 src/bindings/org/gnome/pango/Script.java           |   50 +
 src/bindings/org/gnome/pango/SizeAttribute.java    |   61 +
 src/bindings/org/gnome/pango/Stretch.java          |   50 +
 src/bindings/org/gnome/pango/Style.java            |   71 +
 src/bindings/org/gnome/pango/StyleAttribute.java   |   64 +
 src/bindings/org/gnome/pango/TabAlign.java         |   50 +
 src/bindings/org/gnome/pango/TabArray.java         |   58 +
 src/bindings/org/gnome/pango/Underline.java        |   82 +
 .../org/gnome/pango/UnderlineAttribute.java        |   57 +
 .../org/gnome/pango/UnderlineColorAttribute.java   |   53 +
 src/bindings/org/gnome/pango/Variant.java          |   64 +
 src/bindings/org/gnome/pango/VariantAttribute.java |   54 +
 src/bindings/org/gnome/pango/Weight.java           |  143 +
 src/bindings/org/gnome/pango/WeightAttribute.java  |   52 +
 src/bindings/org/gnome/pango/WrapMode.java         |   77 +
 src/bindings/org/gnome/pango/package.html          |   36 +
 src/bindings/org/gnome/rsvg/DimensionData.java     |   78 +
 src/bindings/org/gnome/rsvg/Handle.java            |  202 +
 src/bindings/org/gnome/rsvg/Plumbing.java          |   38 +
 src/bindings/org/gnome/rsvg/Rsvg.java              |   55 +
 .../org/gnome/rsvg/RsvgDimensionDataOverride.c     |   54 +
 .../org/gnome/rsvg/RsvgDimensionDataOverride.java  |   37 +
 src/bindings/org/gnome/screenshot/Capture.java     |   37 +
 src/bindings/org/gnome/screenshot/Plumbing.java    |   42 +
 src/bindings/org/gnome/screenshot/Screenshot.java  |   94 +
 .../org/gnome/sourceview/DrawSpacesFlags.java      |   50 +
 src/bindings/org/gnome/sourceview/Language.java    |   69 +
 .../org/gnome/sourceview/LanguageManager.java      |   85 +
 src/bindings/org/gnome/sourceview/Mark.java        |   50 +
 src/bindings/org/gnome/sourceview/Plumbing.java    |   42 +
 .../org/gnome/sourceview/PrintCompositor.java      |   50 +
 src/bindings/org/gnome/sourceview/SearchFlags.java |   50 +
 .../org/gnome/sourceview/SmartHomeEndType.java     |   50 +
 .../org/gnome/sourceview/SourceBuffer.java         |  230 +
 src/bindings/org/gnome/sourceview/SourceView.java  |  257 +
 src/bindings/org/gnome/sourceview/Style.java       |   58 +
 src/bindings/org/gnome/sourceview/StyleScheme.java |  110 +
 .../org/gnome/sourceview/StyleSchemeManager.java   |   78 +
 .../org/gnome/unixprint/PageSetupUnixDialog.java   |   50 +
 src/bindings/org/gnome/unixprint/Plumbing.java     |   42 +
 .../org/gnome/unixprint/PrintCapabilities.java     |   50 +
 src/bindings/org/gnome/unixprint/PrintJob.java     |   50 +
 .../org/gnome/unixprint/PrintUnixDialog.java       |   50 +
 src/bindings/org/gnome/unixprint/Printer.java      |   50 +
 src/bindings/overview.html                         |  111 +
 src/bindings/stylesheet.css                        |   53 +
 src/defs/AtkAction.defs                            |  121 +
 src/defs/AtkAttributeSet.defs                      |    6 +
 src/defs/AtkComponent.defs                         |  264 +
 src/defs/AtkCoordType.defs                         |   10 +
 src/defs/AtkDocument.defs                          |   75 +
 src/defs/AtkEditableText.defs                      |  139 +
 src/defs/AtkGObjectAccessible.defs                 |   13 +
 src/defs/AtkHyperlink.defs                         |  114 +
 src/defs/AtkHyperlinkImpl.defs                     |   17 +
 src/defs/AtkHyperlinkStateFlags.defs               |    9 +
 src/defs/AtkHypertext.defs                         |   59 +
 src/defs/AtkImage.defs                             |   74 +
 src/defs/AtkImplementor.defs                       |    5 +
 src/defs/AtkImplementorIface.defs                  |   12 +
 src/defs/AtkKeyEventType.defs                      |   11 +
 src/defs/AtkLayer.defs                             |   15 +
 src/defs/AtkNoOpObject.defs                        |   17 +
 src/defs/AtkNoOpObjectFactory.defs                 |   14 +
 src/defs/AtkObject.defs                            |  341 ++
 src/defs/AtkObjectFactory.defs                     |   38 +
 src/defs/AtkRectangle.defs                         |   12 +
 src/defs/AtkRegistry.defs                          |   35 +
 src/defs/AtkRelation.defs                          |   40 +
 src/defs/AtkRelationSet.defs                       |   75 +
 src/defs/AtkRelationType.defs                      |   16 +
 src/defs/AtkRole.defs                              |   78 +
 src/defs/AtkSelection.defs                         |  112 +
 src/defs/AtkStateSet.defs                          |  100 +
 src/defs/AtkStateType.defs                         |   38 +
 src/defs/AtkStreamableContent.defs                 |   69 +
 src/defs/AtkTable.defs                             |  544 ++
 src/defs/AtkText.defs                              |  402 ++
 src/defs/AtkTextAttribute.defs                     |   35 +
 src/defs/AtkTextBoundary.defs                      |   15 +
 src/defs/AtkTextClipType.defs                      |   12 +
 src/defs/AtkTextRange.defs                         |   10 +
 src/defs/AtkTextRectangle.defs                     |   11 +
 src/defs/AtkUtil.defs                              |   33 +
 src/defs/AtkValue.defs                             |   91 +
 src/defs/CairoAntialias.defs                       |   10 +
 src/defs/CairoContent.defs                         |   10 +
 src/defs/CairoContext.defs                         |  432 ++
 src/defs/CairoExtend.defs                          |   11 +
 src/defs/CairoFillRule.defs                        |    9 +
 src/defs/CairoFilter.defs                          |   12 +
 src/defs/CairoFontOptions.defs                     |   41 +
 src/defs/CairoFormat.defs                          |   12 +
 src/defs/CairoHintMetrics.defs                     |   10 +
 src/defs/CairoHintStyle.defs                       |   12 +
 src/defs/CairoMatrix.defs                          |   33 +
 src/defs/CairoOperator.defs                        |   21 +
 src/defs/CairoPattern.defs                         |  124 +
 src/defs/CairoStatus.defs                          |   29 +
 src/defs/CairoSurface.defs                         |  101 +
 src/defs/EnchantBroker.defs                        |   56 +
 src/defs/EnchantDict.defs                          |   49 +
 src/defs/GApplication.defs                         |  140 +
 src/defs/GApplicationCommandLine.defs              |   23 +
 src/defs/GApplicationFlags.defs                    |   14 +
 src/defs/GFile.defs                                |   21 +
 src/defs/GFormatSizeFlags.defs                     |   10 +
 src/defs/GUserDirectory.defs                       |   17 +
 src/defs/GdkAtom.defs                              |    7 +
 src/defs/GdkAxisUse.defs                           |   16 +
 src/defs/GdkByteOrder.defs                         |   11 +
 src/defs/GdkCapStyle.defs                          |   12 +
 src/defs/GdkColorspace.defs                        |    9 +
 src/defs/GdkCrossingMode.defs                      |   14 +
 src/defs/GdkCursor.defs                            |   84 +
 src/defs/GdkCursorType.defs                        |   28 +
 src/defs/GdkDevice.defs                            |   82 +
 src/defs/GdkDisplay.defs                           |  300 +
 src/defs/GdkDisplayManager.defs                    |   37 +
 src/defs/GdkDragAction.defs                        |   14 +
 src/defs/GdkDragContext.defs                       |  174 +
 src/defs/GdkDragProtocol.defs                      |   15 +
 src/defs/GdkEvent.defs                             |   96 +
 src/defs/GdkEventAny.defs                          |   10 +
 src/defs/GdkEventButton.defs                       |   19 +
 src/defs/GdkEventConfigure.defs                    |   14 +
 src/defs/GdkEventCrossing.defs                     |   19 +
 src/defs/GdkEventFocus.defs                        |   12 +
 src/defs/GdkEventKey.defs                          |   18 +
 src/defs/GdkEventMask.defs                         |   30 +
 src/defs/GdkEventMotion.defs                       |   19 +
 src/defs/GdkEventOwnerChange.defs                  |   14 +
 src/defs/GdkEventScroll.defs                       |   18 +
 src/defs/GdkEventType.defs                         |   45 +
 src/defs/GdkEventVisibility.defs                   |   10 +
 src/defs/GdkExtensionMode.defs                     |   11 +
 src/defs/GdkFill.defs                              |   12 +
 src/defs/GdkFillRule.defs                          |   10 +
 src/defs/GdkFilterReturn.defs                      |   11 +
 src/defs/GdkFunction.defs                          |   24 +
 src/defs/GdkGeometry.defs                          |   18 +
 src/defs/GdkGrabStatus.defs                        |   13 +
 src/defs/GdkGravity.defs                           |   18 +
 src/defs/GdkInputMode.defs                         |   11 +
 src/defs/GdkInputSource.defs                       |   12 +
 src/defs/GdkInterpType.defs                        |   12 +
 src/defs/GdkJoinStyle.defs                         |   11 +
 src/defs/GdkKeymap.defs                            |   70 +
 src/defs/GdkKeymapKey.defs                         |   10 +
 src/defs/GdkKeyval.defs                            |   90 +
 src/defs/GdkLineStyle.defs                         |   11 +
 src/defs/GdkModifierType.defs                      |   26 +
 src/defs/GdkNotifyType.defs                        |   14 +
 src/defs/GdkOverlapType.defs                       |   11 +
 src/defs/GdkOwnerChange.defs                       |   11 +
 src/defs/GdkPangoAttrEmbossed.defs                 |   10 +
 src/defs/GdkPangoAttrStipple.defs                  |   10 +
 src/defs/GdkPixbuf.defs                            |  384 ++
 src/defs/GdkPixbufAlphaMode.defs                   |   10 +
 src/defs/GdkPixbufAnimation.defs                   |   51 +
 src/defs/GdkPixbufAnimationIter.defs               |   34 +
 src/defs/GdkPixbufError.defs                       |   17 +
 src/defs/GdkPixbufFormat.defs                      |   62 +
 src/defs/GdkPixbufLoader.defs                      |   96 +
 src/defs/GdkPixbufRotation.defs                    |   12 +
 src/defs/GdkPixbufSimpleAnim.defs                  |   28 +
 src/defs/GdkPixbufSimpleAnimIter.defs              |    7 +
 src/defs/GdkPixdata.defs                           |   40 +
 src/defs/GdkPoint.defs                             |    9 +
 src/defs/GdkPropMode.defs                          |   11 +
 src/defs/GdkPropertyState.defs                     |   10 +
 src/defs/GdkRGBA.defs                              |   40 +
 src/defs/GdkRectangle.defs                         |   32 +
 src/defs/GdkRgbDither.defs                         |   11 +
 src/defs/GdkScreen.defs                            |  198 +
 src/defs/GdkScrollDirection.defs                   |   12 +
 src/defs/GdkSettingAction.defs                     |   11 +
 src/defs/GdkStatus.defs                            |   14 +
 src/defs/GdkSubwindowMode.defs                     |   10 +
 src/defs/GdkVisibilityState.defs                   |   11 +
 src/defs/GdkVisual.defs                            |   46 +
 src/defs/GdkVisualType.defs                        |   14 +
 src/defs/GdkWMDecoration.defs                      |   16 +
 src/defs/GdkWMFunction.defs                        |   15 +
 src/defs/GdkWindow.defs                            |  825 +++
 src/defs/GdkWindowAttr.defs                        |    5 +
 src/defs/GdkWindowAttributesType.defs              |   15 +
 src/defs/GdkWindowClass.defs                       |   10 +
 src/defs/GdkWindowEdge.defs                        |   16 +
 src/defs/GdkWindowHints.defs                       |   17 +
 src/defs/GdkWindowState.defs                       |   16 +
 src/defs/GdkWindowType.defs                        |   14 +
 src/defs/GdkWindowTypeHint.defs                    |   16 +
 src/defs/GlibMisc.defs                             |  122 +
 src/defs/GtkAboutDialog.defs                       |  246 +
 src/defs/GtkAccelFlags.defs                        |   11 +
 src/defs/GtkAccelGroup.defs                        |  110 +
 src/defs/GtkAccelKey.defs                          |   62 +
 src/defs/GtkAccelLabel.defs                        |   53 +
 src/defs/GtkAccelMap.defs                          |  123 +
 src/defs/GtkAccessible.defs                        |   18 +
 src/defs/GtkAction.defs                            |  198 +
 src/defs/GtkActionGroup.defs                       |  207 +
 src/defs/GtkActivatable.defs                       |   71 +
 src/defs/GtkAdjustment.defs                        |  167 +
 src/defs/GtkAlign.defs                             |   11 +
 src/defs/GtkAlignment.defs                         |   56 +
 src/defs/GtkAllocation.defs                        |   11 +
 src/defs/GtkAnchorType.defs                        |   25 +
 src/defs/GtkApplication.defs                       |   70 +
 src/defs/GtkApplicationInhibitFlags.defs           |   11 +
 src/defs/GtkArrow.defs                             |   28 +
 src/defs/GtkArrowType.defs                         |   13 +
 src/defs/GtkAspectFrame.defs                       |   33 +
 src/defs/GtkAssistant.defs                         |  231 +
 src/defs/GtkAssistantPageType.defs                 |   13 +
 src/defs/GtkAttachOptions.defs                     |   11 +
 src/defs/GtkBin.defs                               |   16 +
 src/defs/GtkBindingSet.defs                        |   42 +
 src/defs/GtkBorder.defs                            |   21 +
 src/defs/GtkBox.defs                               |  107 +
 src/defs/GtkBuilder.defs                           |   43 +
 src/defs/GtkButton.defs                            |  180 +
 src/defs/GtkButtonBox.defs                         |   41 +
 src/defs/GtkButtonBoxStyle.defs                    |   14 +
 src/defs/GtkButtonsType.defs                       |   14 +
 src/defs/GtkCalendar.defs                          |  118 +
 src/defs/GtkCalendarDisplayOptions.defs            |   13 +
 src/defs/GtkCellEditable.defs                      |   45 +
 src/defs/GtkCellLayout.defs                        |  152 +
 src/defs/GtkCellRenderer.defs                      |  226 +
 src/defs/GtkCellRendererAccel.defs                 |   33 +
 src/defs/GtkCellRendererAccelMode.defs             |   10 +
 src/defs/GtkCellRendererCombo.defs                 |   14 +
 src/defs/GtkCellRendererMode.defs                  |   11 +
 src/defs/GtkCellRendererPixbuf.defs                |   14 +
 src/defs/GtkCellRendererProgress.defs              |   14 +
 src/defs/GtkCellRendererSpin.defs                  |   14 +
 src/defs/GtkCellRendererSpinner.defs               |   14 +
 src/defs/GtkCellRendererState.defs                 |   13 +
 src/defs/GtkCellRendererText.defs                  |   32 +
 src/defs/GtkCellRendererToggle.defs                |   67 +
 src/defs/GtkCellType.defs                          |   13 +
 src/defs/GtkCellView.defs                          |   58 +
 src/defs/GtkCheckButton.defs                       |   42 +
 src/defs/GtkCheckMenuItem.defs                     |  101 +
 src/defs/GtkClipboard.defs                         |  228 +
 src/defs/GtkColorButton.defs                       |   92 +
 src/defs/GtkColorSelection.defs                    |  121 +
 src/defs/GtkColorSelectionDialog.defs              |   22 +
 src/defs/GtkComboBox.defs                          |  221 +
 src/defs/GtkComboBoxText.defs                      |   95 +
 src/defs/GtkContainer.defs                         |  344 ++
 src/defs/GtkCornerType.defs                        |   12 +
 src/defs/GtkDebugFlag.defs                         |   15 +
 src/defs/GtkDeleteType.defs                        |   16 +
 src/defs/GtkDestDefaults.defs                      |   12 +
 src/defs/GtkDialog.defs                            |  145 +
 src/defs/GtkDialogFlags.defs                       |   10 +
 src/defs/GtkDirectionType.defs                     |   14 +
 src/defs/GtkDrawingArea.defs                       |   14 +
 src/defs/GtkEditable.defs                          |  196 +
 src/defs/GtkEntry.defs                             |  557 ++
 src/defs/GtkEntryBuffer.defs                       |  120 +
 src/defs/GtkEntryCompletion.defs                   |  242 +
 src/defs/GtkEntryIconPosition.defs                 |   10 +
 src/defs/GtkEventBox.defs                          |   44 +
 src/defs/GtkExpander.defs                          |  122 +
 src/defs/GtkExpanderStyle.defs                     |   12 +
 src/defs/GtkFileChooser.defs                       |  420 ++
 src/defs/GtkFileChooserAction.defs                 |   12 +
 src/defs/GtkFileChooserButton.defs                 |   78 +
 src/defs/GtkFileChooserConfirmation.defs           |   11 +
 src/defs/GtkFileChooserDialog.defs                 |   21 +
 src/defs/GtkFileChooserError.defs                  |   10 +
 src/defs/GtkFileChooserWidget.defs                 |   18 +
 src/defs/GtkFileFilter.defs                        |   80 +
 src/defs/GtkFileFilterFlags.defs                   |   12 +
 src/defs/GtkFilePath.defs                          |    6 +
 src/defs/GtkFixed.defs                             |   35 +
 src/defs/GtkFontButton.defs                        |  109 +
 src/defs/GtkFontSelection.defs                     |   45 +
 src/defs/GtkFontSelectionDialog.defs               |   55 +
 src/defs/GtkFrame.defs                             |   90 +
 src/defs/GtkGrid.defs                              |  108 +
 src/defs/GtkHBox.defs                              |   18 +
 src/defs/GtkHButtonBox.defs                        |   14 +
 src/defs/GtkHPaned.defs                            |   14 +
 src/defs/GtkHScale.defs                            |   29 +
 src/defs/GtkHScrollbar.defs                        |   17 +
 src/defs/GtkHSeparator.defs                        |   14 +
 src/defs/GtkHandleBox.defs                         |   75 +
 src/defs/GtkIMContext.defs                         |  216 +
 src/defs/GtkIMContextSimple.defs                   |   25 +
 src/defs/GtkIMMulticontext.defs                    |   23 +
 src/defs/GtkIMPreeditStyle.defs                    |   11 +
 src/defs/GtkIMStatusStyle.defs                     |   10 +
 src/defs/GtkIconFactory.defs                       |   45 +
 src/defs/GtkIconInfo.defs                          |   82 +
 src/defs/GtkIconLookupFlags.defs                   |   11 +
 src/defs/GtkIconSet.defs                           |   54 +
 src/defs/GtkIconSize.defs                          |   15 +
 src/defs/GtkIconSource.defs                        |  163 +
 src/defs/GtkIconTheme.defs                         |  164 +
 src/defs/GtkIconThemeError.defs                    |   10 +
 src/defs/GtkIconView.defs                          |  559 ++
 src/defs/GtkIconViewDropPosition.defs              |   14 +
 src/defs/GtkImage.defs                             |  234 +
 src/defs/GtkImageMenuItem.defs                     |   77 +
 src/defs/GtkImageType.defs                         |   15 +
 src/defs/GtkInfoBar.defs                           |  101 +
 src/defs/GtkInputDialog.defs                       |   31 +
 src/defs/GtkInvisible.defs                         |   40 +
 src/defs/GtkJunctionSides.defs                     |   16 +
 src/defs/GtkJustification.defs                     |   12 +
 src/defs/GtkLabel.defs                             |  386 ++
 src/defs/GtkLayout.defs                            |  102 +
 src/defs/GtkLicense.defs                           |   16 +
 src/defs/GtkLinkButton.defs                        |   66 +
 src/defs/GtkListStore.defs                         |  214 +
 src/defs/GtkMenu.defs                              |  186 +
 src/defs/GtkMenuBar.defs                           |   44 +
 src/defs/GtkMenuDirectionType.defs                 |   12 +
 src/defs/GtkMenuItem.defs                          |  141 +
 src/defs/GtkMenuShell.defs                         |  149 +
 src/defs/GtkMenuToolButton.defs                    |   59 +
 src/defs/GtkMessageDialog.defs                     |   77 +
 src/defs/GtkMessageType.defs                       |   13 +
 src/defs/GtkMetricType.defs                        |   11 +
 src/defs/GtkMisc.defs                              |   47 +
 src/defs/GtkMovementStep.defs                      |   18 +
 src/defs/GtkNotebook.defs                          |  416 ++
 src/defs/GtkNotebookTab.defs                       |   10 +
 src/defs/GtkOffscreenWindow.defs                   |   26 +
 src/defs/GtkOrientable.defs                        |   19 +
 src/defs/GtkOrientation.defs                       |   10 +
 src/defs/GtkPackDirection.defs                     |   12 +
 src/defs/GtkPackType.defs                          |   10 +
 src/defs/GtkPageOrientation.defs                   |   12 +
 src/defs/GtkPageSet.defs                           |   11 +
 src/defs/GtkPageSetup.defs                         |  171 +
 src/defs/GtkPageSetupUnixDialog.defs               |   48 +
 src/defs/GtkPaned.defs                             |  139 +
 src/defs/GtkPaperSize.defs                         |  140 +
 src/defs/GtkPathPriorityType.defs                  |   14 +
 src/defs/GtkPathType.defs                          |   11 +
 src/defs/GtkPlug.defs                              |   47 +
 src/defs/GtkPolicyType.defs                        |   11 +
 src/defs/GtkPositionType.defs                      |   12 +
 src/defs/GtkPrintCapabilities.defs                 |   17 +
 src/defs/GtkPrintContext.defs                      |   84 +
 src/defs/GtkPrintDuplex.defs                       |   11 +
 src/defs/GtkPrintError.defs                        |   11 +
 src/defs/GtkPrintJob.defs                          |   96 +
 src/defs/GtkPrintOperation.defs                    |  309 +
 src/defs/GtkPrintOperationAction.defs              |   12 +
 src/defs/GtkPrintOperationPreview.defs             |   68 +
 src/defs/GtkPrintOperationResult.defs              |   12 +
 src/defs/GtkPrintPages.defs                        |   11 +
 src/defs/GtkPrintQuality.defs                      |   12 +
 src/defs/GtkPrintSettings.defs                     |  507 ++
 src/defs/GtkPrintStatus.defs                       |   17 +
 src/defs/GtkPrintUnixDialog.defs                   |   88 +
 src/defs/GtkPrinter.defs                           |  133 +
 src/defs/GtkProgressBar.defs                       |   95 +
 src/defs/GtkProgressBarOrientation.defs            |   12 +
 src/defs/GtkRCStyle.defs                           |    7 +
 src/defs/GtkRadioAction.defs                       |   59 +
 src/defs/GtkRadioButton.defs                       |   91 +
 src/defs/GtkRadioMenuItem.defs                     |   91 +
 src/defs/GtkRadioToolButton.defs                   |   64 +
 src/defs/GtkRange.defs                             |  196 +
 src/defs/GtkRcFlags.defs                           |   12 +
 src/defs/GtkRcScanner.defs                         |    7 +
 src/defs/GtkRcTokenType.defs                       |   46 +
 src/defs/GtkRecentAction.defs                      |   49 +
 src/defs/GtkRecentChooser.defs                     |  341 ++
 src/defs/GtkRecentChooserDialog.defs               |   20 +
 src/defs/GtkRecentChooserError.defs                |   10 +
 src/defs/GtkRecentChooserMenu.defs                 |   33 +
 src/defs/GtkRecentChooserWidget.defs               |   18 +
 src/defs/GtkRecentFilter.defs                      |  107 +
 src/defs/GtkRecentFilterFlags.defs                 |   14 +
 src/defs/GtkRecentInfo.defs                        |  173 +
 src/defs/GtkRecentManager.defs                     |   93 +
 src/defs/GtkRecentManagerError.defs                |   15 +
 src/defs/GtkRecentSortType.defs                    |   12 +
 src/defs/GtkRegionFlags.defs                       |   12 +
 src/defs/GtkReliefStyle.defs                       |   11 +
 src/defs/GtkRequisition.defs                       |   23 +
 src/defs/GtkResizeMode.defs                        |   11 +
 src/defs/GtkResponseType.defs                      |   23 +
 src/defs/GtkScale.defs                             |  101 +
 src/defs/GtkScaleButton.defs                       |   84 +
 src/defs/GtkScrollStep.defs                        |   14 +
 src/defs/GtkScrollType.defs                        |   24 +
 src/defs/GtkScrollbar.defs                         |   17 +
 src/defs/GtkScrolledWindow.defs                    |  142 +
 src/defs/GtkSelectionData.defs                     |  140 +
 src/defs/GtkSelectionMode.defs                     |   13 +
 src/defs/GtkSensitivityType.defs                   |   11 +
 src/defs/GtkSeparator.defs                         |   16 +
 src/defs/GtkSeparatorMenuItem.defs                 |   14 +
 src/defs/GtkSeparatorToolItem.defs                 |   29 +
 src/defs/GtkSettings.defs                          |   65 +
 src/defs/GtkShadowType.defs                        |   13 +
 src/defs/GtkSignalRunType.defs                     |   14 +
 src/defs/GtkSizeGroup.defs                         |   71 +
 src/defs/GtkSizeGroupMode.defs                     |   12 +
 src/defs/GtkSizeRequestMode.defs                   |    9 +
 src/defs/GtkSocket.defs                            |   41 +
 src/defs/GtkSortType.defs                          |   10 +
 src/defs/GtkSourceBuffer.defs                      |  211 +
 src/defs/GtkSourceDrawSpacesFlags.defs             |   15 +
 src/defs/GtkSourceLanguage.defs                    |   68 +
 src/defs/GtkSourceLanguageManager.defs             |   60 +
 src/defs/GtkSourceMark.defs                        |   43 +
 src/defs/GtkSourcePrintCompositor.defs             |  309 +
 src/defs/GtkSourceSearchFlags.defs                 |    6 +
 src/defs/GtkSourceSmartHomeEndType.defs            |    6 +
 src/defs/GtkSourceStyle.defs                       |   14 +
 src/defs/GtkSourceStyleScheme.defs                 |   47 +
 src/defs/GtkSourceStyleSchemeManager.defs          |   75 +
 src/defs/GtkSourceView.defs                        |  215 +
 src/defs/GtkSpell.defs                             |   51 +
 src/defs/GtkSpinButton.defs                        |  242 +
 src/defs/GtkSpinButtonUpdatePolicy.defs            |   10 +
 src/defs/GtkSpinType.defs                          |   15 +
 src/defs/GtkSpinner.defs                           |   26 +
 src/defs/GtkStateFlags.defs                        |   14 +
 src/defs/GtkStatusIcon.defs                        |  207 +
 src/defs/GtkStatusbar.defs                         |   76 +
 src/defs/GtkStockItem.defs                         |   13 +
 src/defs/GtkStyleContext.defs                      |  131 +
 src/defs/GtkSwitch.defs                            |   33 +
 src/defs/GtkTable.defs                             |  142 +
 src/defs/GtkTargetFlags.defs                       |   10 +
 src/defs/GtkTargetList.defs                        |   69 +
 src/defs/GtkTearoffMenuItem.defs                   |   14 +
 src/defs/GtkTest.defs                              |   27 +
 src/defs/GtkTextAppearance.defs                    |   17 +
 src/defs/GtkTextAttributes.defs                    |   60 +
 src/defs/GtkTextBuffer.defs                        |  806 +++
 src/defs/GtkTextBufferTargetInfo.defs              |   11 +
 src/defs/GtkTextChildAnchor.defs                   |   27 +
 src/defs/GtkTextDirection.defs                     |   11 +
 src/defs/GtkTextIter.defs                          |  699 +++
 src/defs/GtkTextMark.defs                          |   46 +
 src/defs/GtkTextSearchFlags.defs                   |   10 +
 src/defs/GtkTextTag.defs                           |   53 +
 src/defs/GtkTextTagTable.defs                      |   82 +
 src/defs/GtkTextView.defs                          |  609 ++
 src/defs/GtkTextWindowType.defs                    |   15 +
 src/defs/GtkToggleAction.defs                      |   61 +
 src/defs/GtkToggleButton.defs                      |   93 +
 src/defs/GtkToggleToolButton.defs                  |   44 +
 src/defs/GtkToolButton.defs                        |  123 +
 src/defs/GtkToolItem.defs                          |  210 +
 src/defs/GtkToolItemGroup.defs                     |  146 +
 src/defs/GtkToolPalette.defs                       |  185 +
 src/defs/GtkToolPaletteDragTargets.defs            |   10 +
 src/defs/GtkToolbar.defs                           |  142 +
 src/defs/GtkToolbarSpaceStyle.defs                 |   10 +
 src/defs/GtkToolbarStyle.defs                      |   12 +
 src/defs/GtkTooltip.defs                           |   79 +
 src/defs/GtkTreeDragDest.defs                      |   44 +
 src/defs/GtkTreeDragSource.defs                    |   59 +
 src/defs/GtkTreeIter.defs                          |   21 +
 src/defs/GtkTreeModel.defs                         |  406 ++
 src/defs/GtkTreeModelFilter.defs                   |  116 +
 src/defs/GtkTreeModelFlags.defs                    |   10 +
 src/defs/GtkTreeModelSort.defs                     |   88 +
 src/defs/GtkTreePath.defs                          |  123 +
 src/defs/GtkTreeRowReference.defs                  |   62 +
 src/defs/GtkTreeSelection.defs                     |  172 +
 src/defs/GtkTreeSortable.defs                      |  110 +
 src/defs/GtkTreeStore.defs                         |  242 +
 src/defs/GtkTreeView.defs                          |  984 +++
 src/defs/GtkTreeViewColumn.defs                    |  360 ++
 src/defs/GtkTreeViewColumnSizing.defs              |   11 +
 src/defs/GtkTreeViewDropPosition.defs              |   12 +
 src/defs/GtkTreeViewGridLines.defs                 |   12 +
 src/defs/GtkTreeViewMode.defs                      |   10 +
 src/defs/GtkUIManager.defs                         |  214 +
 src/defs/GtkUIManagerItemType.defs                 |   18 +
 src/defs/GtkUnit.defs                              |   12 +
 src/defs/GtkVBox.defs                              |   18 +
 src/defs/GtkVButtonBox.defs                        |   14 +
 src/defs/GtkVPaned.defs                            |   14 +
 src/defs/GtkVScale.defs                            |   29 +
 src/defs/GtkVScrollbar.defs                        |   17 +
 src/defs/GtkVSeparator.defs                        |   14 +
 src/defs/GtkViewport.defs                          |   78 +
 src/defs/GtkWidget.defs                            | 1951 ++++++
 src/defs/GtkWidgetHelpType.defs                    |   10 +
 src/defs/GtkWindow.defs                            |  776 +++
 src/defs/GtkWindowGroup.defs                       |   32 +
 src/defs/GtkWindowPosition.defs                    |   13 +
 src/defs/GtkWindowType.defs                        |   10 +
 src/defs/GtkWrapMode.defs                          |   12 +
 src/defs/NotifyMain.defs                           |   34 +
 src/defs/NotifyNotification.defs                   |  173 +
 src/defs/NotifyUrgency.defs                        |   11 +
 src/defs/PangoAlignment.defs                       |   11 +
 src/defs/PangoAnalysis.defs                        |    5 +
 src/defs/PangoAttrIterator.defs                    |   62 +
 src/defs/PangoAttrList.defs                        |   87 +
 src/defs/PangoAttrType.defs                        |   29 +
 src/defs/PangoAttribute.defs                       |  258 +
 src/defs/PangoCairoFcFont.defs                     |    5 +
 src/defs/PangoColor.defs                           |   41 +
 src/defs/PangoContext.defs                         |  181 +
 src/defs/PangoCoverage.defs                        |   74 +
 src/defs/PangoCoverageLevel.defs                   |   12 +
 src/defs/PangoDirection.defs                       |   15 +
 src/defs/PangoEllipsizeMode.defs                   |   12 +
 src/defs/PangoEngine.defs                          |    7 +
 src/defs/PangoEngineLang.defs                      |    7 +
 src/defs/PangoEngineShape.defs                     |    7 +
 src/defs/PangoFcFont.defs                          |    5 +
 src/defs/PangoFont.defs                            |  115 +
 src/defs/PangoFontDescription.defs                 |  246 +
 src/defs/PangoFontFace.defs                        |   48 +
 src/defs/PangoFontFamily.defs                      |   48 +
 src/defs/PangoFontMap.defs                         |   72 +
 src/defs/PangoFontMask.defs                        |   14 +
 src/defs/PangoFontMetrics.defs                     |   68 +
 src/defs/PangoFontset.defs                         |   59 +
 src/defs/PangoFontsetSimple.defs                   |   33 +
 src/defs/PangoGlyphGeometry.defs                   |    5 +
 src/defs/PangoGlyphInfo.defs                       |    5 +
 src/defs/PangoGlyphItem.defs                       |   38 +
 src/defs/PangoGlyphString.defs                     |  105 +
 src/defs/PangoGravity.defs                         |   13 +
 src/defs/PangoGravityHint.defs                     |   11 +
 src/defs/PangoItem.defs                            |   46 +
 src/defs/PangoLanguage.defs                        |   40 +
 src/defs/PangoLayout.defs                          |  425 ++
 src/defs/PangoLayoutIter.defs                      |  138 +
 src/defs/PangoLayoutLine.defs                      |   80 +
 src/defs/PangoMatrix.defs                          |   94 +
 src/defs/PangoRectangle.defs                       |   11 +
 src/defs/PangoRenderPart.defs                      |   12 +
 src/defs/PangoRenderer.defs                        |  243 +
 src/defs/PangoScript.defs                          |   70 +
 src/defs/PangoScriptIter.defs                      |   34 +
 src/defs/PangoStretch.defs                         |   17 +
 src/defs/PangoStyle.defs                           |   11 +
 src/defs/PangoTabAlign.defs                        |    9 +
 src/defs/PangoTabArray.defs                        |   98 +
 src/defs/PangoUnderline.defs                       |   13 +
 src/defs/PangoVariant.defs                         |   10 +
 src/defs/PangoWeight.defs                          |   18 +
 src/defs/PangoWrapMode.defs                        |   11 +
 src/defs/RsvgDimensionData.defs                    |   12 +
 src/defs/RsvgHandle.defs                           |  134 +
 src/defs/RsvgMain.defs                             |   33 +
 src/defs/ScreenshotCapture.defs                    |   20 +
 src/generator/BindingsGenerator.java               |  229 +
 .../codegen/AccessorGenerator.java                 |   74 +
 .../operationaldynamics/codegen/ArrayThing.java    |   59 +
 .../codegen/BlacklistedThing.java                  |   57 +
 .../codegen/BoxedGenerator.java                    |   88 +
 .../operationaldynamics/codegen/BoxedThing.java    |   38 +
 .../codegen/ConstantArrayThing.java                |   86 +
 .../codegen/ConstructorGenerator.java              |  120 +
 .../codegen/EntityGenerator.java                   |   78 +
 .../operationaldynamics/codegen/EntityThing.java   |   41 +
 .../operationaldynamics/codegen/EnumGenerator.java |  117 +
 .../com/operationaldynamics/codegen/EnumThing.java |   49 +
 .../operationaldynamics/codegen/FixmeThing.java    |   36 +
 .../codegen/FlagsGenerator.java                    |  115 +
 .../operationaldynamics/codegen/FlagsThing.java    |   41 +
 .../codegen/FunctionGenerator.java                 |  702 +++
 .../codegen/FundamentalArrayThing.java             |  104 +
 .../codegen/FundamentalThing.java                  |   79 +
 .../operationaldynamics/codegen/GErrorThing.java   |   58 +
 .../operationaldynamics/codegen/GListThing.java    |   86 +
 .../com/operationaldynamics/codegen/Generator.java |  149 +
 .../codegen/GetterGenerator.java                   |   52 +
 .../codegen/InterfaceGenerator.java                |   54 +
 .../codegen/InterfaceThing.java                    |   37 +
 .../codegen/MethodGenerator.java                   |   53 +
 .../codegen/ObjectGenerator.java                   |   98 +
 .../operationaldynamics/codegen/ObjectThing.java   |   39 +
 .../codegen/ProxiedArrayThing.java                 |   97 +
 .../operationaldynamics/codegen/ProxiedThing.java  |   40 +
 .../codegen/SetterGenerator.java                   |   54 +
 .../codegen/StringArrayThing.java                  |   67 +
 .../operationaldynamics/codegen/StringThing.java   |   86 +
 .../com/operationaldynamics/codegen/Thing.java     |  665 ++
 .../operationaldynamics/codegen/TypeGenerator.java |  209 +
 .../codegen/TypedefEnumThing.java                  |   36 +
 .../codegen/TypedefFundamentalThing.java           |   34 +
 .../operationaldynamics/codegen/ValueThing.java    |   42 +
 .../codegen/VirtualGenerator.java                  |  270 +
 .../defsparser/AccessorBlock.java                  |   59 +
 .../com/operationaldynamics/defsparser/Block.java  |  272 +
 .../operationaldynamics/defsparser/BoxedBlock.java |   93 +
 .../defsparser/DefsLineNumberReader.java           |   49 +
 .../defsparser/DefsParseException.java             |   45 +
 .../operationaldynamics/defsparser/DefsParser.java |  389 ++
 .../defsparser/EntityBlock.java                    |   66 +
 .../operationaldynamics/defsparser/EnumBlock.java  |   75 +
 .../operationaldynamics/defsparser/FlagsBlock.java |   68 +
 .../defsparser/FunctionBlock.java                  |  210 +
 .../defsparser/GetterBlock.java                    |   62 +
 .../defsparser/InterfaceBlock.java                 |   49 +
 .../defsparser/MethodBlock.java                    |   68 +
 .../defsparser/ObjectBlock.java                    |   94 +
 .../defsparser/SetterBlock.java                    |   50 +
 .../operationaldynamics/defsparser/TypeBlock.java  |  112 +
 .../defsparser/UnnecessaryCodeException.java       |   34 +
 .../defsparser/VirtualBlock.java                   |   60 +
 .../com/operationaldynamics/driver/DefsFile.java   |  272 +
 .../driver/ImproperDefsFileException.java          |   50 +
 src/jni/bindings_java.h                            |  118 +
 src/jni/bindings_java_convert.c                    |  361 ++
 src/jni/bindings_java_memory.c                     |  308 +
 src/jni/bindings_java_signal.c                     |  579 ++
 src/jni/bindings_java_threads.c                    |  116 +
 src/jni/bindings_java_type.c                       |  161 +
 src/jni/bindings_java_util.c                       |  545 ++
 src/jni/gnome_screenshot.h                         |   48 +
 src/jni/gnome_screenshot_capture.c                 |  102 +
 src/jni/gnome_screenshot_shadow.c                  |  231 +
 src/jni/gnome_screenshot_shadow.h                  |   28 +
 src/jni/gnome_screenshot_utils.c                   |  499 ++
 src/util/coverage.pl                               |  108 +
 src/util/demux/Makefile                            |   44 +
 src/util/demux/definitions.py                      |  601 ++
 src/util/demux/defsparser.py                       |  181 +
 src/util/demux/demux.py                            |   45 +
 src/util/demux/java-gnome.fixes                    |  210 +
 src/util/demux/scmexpr.py                          |  149 +
 src/util/keyval/keysymsToKeyval.pl                 |   48 +
 src/util/missing.defs                              | 6399 ++++++++++++++++++++
 tests/bindings/UnitTests.java                      |  203 +
 .../junit/VerboseResultPrinter.java                |  184 +
 .../junit/VerboseTestRunner.java                   |  146 +
 .../bindings/com/operationaldynamics/ui/Align.java |   73 +
 .../bindings/com/operationaldynamics/ui/Text.java  |  199 +
 .../com/operationaldynamics/ui/TextOutput.java     |   95 +
 .../freedesktop/bindings/ValidateEnvironment.java  |   89 +
 .../bindings/ValidateInternationalization.java     |  136 +
 .../freedesktop/cairo/ValidateCairoContext.java    |  161 +
 .../freedesktop/cairo/ValidateCairoInternals.java  |  230 +
 .../freedesktop/cairo/ValidateDrawingToFile.java   |   99 +
 .../enchant/ValidateEnchantInternals.java          |  345 ++
 .../org/freedesktop/icons/ValidateIconItems.java   |   66 +
 tests/bindings/org/gnome/gdk/ValidateBoxeds.java   |   77 +
 .../org/gnome/gdk/ValidateImageHandling.java       |  223 +
 .../org/gnome/gdk/ValidateKeyboardHandling.java    |   89 +
 .../org/gnome/gdk/ValidateScreensAndDisplays.java  |   50 +
 .../bindings/org/gnome/glib/ValidateConstants.java |  144 +
 .../org/gnome/glib/ValidateGFileMethods.java       |   43 +
 .../org/gnome/glib/ValidateGListMethods.java       |  102 +
 .../org/gnome/glib/ValidateMemoryManagement.java   |  406 ++
 .../org/gnome/glib/ValidateReferenceCounting.java  |   62 +
 .../org/gnome/glib/ValidateUtilityFunctions.java   |  114 +
 .../bindings/org/gnome/gtk/GraphicalTestCase.java  |  280 +
 tests/bindings/org/gnome/gtk/ValidateArrow.java    |   39 +
 .../bindings/org/gnome/gtk/ValidateAssistant.java  |  186 +
 tests/bindings/org/gnome/gtk/ValidateComboBox.java |  149 +
 tests/bindings/org/gnome/gtk/ValidateEntry.java    |   78 +
 .../org/gnome/gtk/ValidateEntryCompletion.java     |  229 +
 .../org/gnome/gtk/ValidateFileChoosing.java        |  101 +
 .../org/gnome/gtk/ValidateGlobalSettings.java      |  129 +
 tests/bindings/org/gnome/gtk/ValidateIconView.java |  102 +
 .../org/gnome/gtk/ValidateInputMethods.java        |  205 +
 .../org/gnome/gtk/ValidateLinkBehaviour.java       |   62 +
 .../org/gnome/gtk/ValidateNotebookBehaviour.java   |   78 +
 .../org/gnome/gtk/ValidateOutParameters.java       |   95 +
 tests/bindings/org/gnome/gtk/ValidatePacking.java  |   99 +
 tests/bindings/org/gnome/gtk/ValidatePrinting.java |   93 +
 .../bindings/org/gnome/gtk/ValidateProperties.java |  411 ++
 .../bindings/org/gnome/gtk/ValidateRadioThing.java |   87 +
 .../org/gnome/gtk/ValidateResponseType.java        |   80 +
 .../bindings/org/gnome/gtk/ValidateScrolling.java  |   89 +
 .../org/gnome/gtk/ValidateSignalEmission.java      |  119 +
 .../org/gnome/gtk/ValidateSnapshotUtilities.java   |   27 +
 .../bindings/org/gnome/gtk/ValidateStockItems.java |   45 +
 .../org/gnome/gtk/ValidateStyleContext.java        |  112 +
 tests/bindings/org/gnome/gtk/ValidateSwitch.java   |   37 +
 .../bindings/org/gnome/gtk/ValidateTextBuffer.java |  705 +++
 .../gnome/gtk/ValidateTextViewBorderWindows.java   |  120 +
 .../org/gnome/gtk/ValidateTextViewProperties.java  |   73 +
 .../org/gnome/gtk/ValidateTextViewSpelling.java    |   82 +
 .../org/gnome/gtk/ValidateThreadStability.java     |  107 +
 .../bindings/org/gnome/gtk/ValidateTreeModel.java  |  598 ++
 .../org/gnome/gtk/ValidateTreeModelFilter.java     |  184 +
 .../org/gnome/gtk/ValidateTreeModelSort.java       |  141 +
 .../bindings/org/gnome/gtk/ValidateTreeStore.java  |  417 ++
 tests/bindings/org/gnome/gtk/ValidateTreeView.java |   99 +
 tests/bindings/org/gnome/gtk/ValidateUnicode.java  |   83 +
 .../org/gnome/gtk/ValidateUniqueApplications.java  |  122 +
 .../gnome/pango/ValidatePangoAttributeUsage.java   |  187 +
 .../org/gnome/pango/ValidatePangoFonts.java        |  140 +
 .../gnome/pango/ValidatePangoTextRendering.java    |  216 +
 .../gnome/pango/ValidatePangoWrapBehaviour.java    |  118 +
 tests/bindings/org/gnome/rsvg/Linux_Tux.svg        | 1015 ++++
 .../gnome/rsvg/ValidateVectorIllustrations.java    |  117 +
 .../org/gnome/sourceview/ValidateSourceView.java   |   58 +
 tests/defs/AtkCoordType.defs                       |   10 +
 tests/defs/AtkImage.defs                           |   74 +
 tests/defs/GdkWindowState.defs                     |   15 +
 tests/defs/GtkButton.defs                          |  205 +
 tests/defs/GtkReliefStyle.defs                     |   20 +
 tests/defs/GtkTreeIter.defs                        |   27 +
 tests/defs/GtkWidget.defs                          |   26 +
 tests/exploration/accelerators.c                   |   30 +
 tests/exploration/compose.c                        |  111 +
 tests/exploration/enums.c                          |   67 +
 tests/exploration/fonts.c                          |   55 +
 tests/exploration/pixbuf_formats.c                 |   53 +
 .../codegen/ValidateThingUsage.java                |  137 +
 .../codegen/ValidateUtilityMethods.java            |   87 +
 .../defsparser/ValidateBlockUsage.java             |   80 +
 .../defsparser/ValidateDefsParsing.java            |  167 +
 tests/po/en_US.po                                  |   25 +
 tests/prototype/Designer.java                      |   87 +
 tests/prototype/Experiment.java                    |  141 +
 tests/prototype/ManualInput.java                   |  116 +
 tests/prototype/MapleSyrup.jpg                     |  Bin 0 -> 22016 bytes
 tests/prototype/Toggling.java                      |  156 +
 tests/prototype/WorkerThreads.java                 |  133 +
 tests/prototype/simple.ui                          |   19 +
 tests/screenshots/Harness.java                     |  334 +
 .../org/freedesktop/cairo/Illustration.java        |   83 +
 .../freedesktop/cairo/IllustrationOperator.java    |   49 +
 .../freedesktop/cairo/IllustrationOperatorAdd.java |   33 +
 .../cairo/IllustrationOperatorAtop.java            |   33 +
 .../cairo/IllustrationOperatorClear.java           |   33 +
 .../cairo/IllustrationOperatorDest.java            |   33 +
 .../cairo/IllustrationOperatorDestAtop.java        |   33 +
 .../cairo/IllustrationOperatorDestIn.java          |   33 +
 .../cairo/IllustrationOperatorDestOut.java         |   33 +
 .../cairo/IllustrationOperatorDestOver.java        |   33 +
 .../freedesktop/cairo/IllustrationOperatorIn.java  |   33 +
 .../freedesktop/cairo/IllustrationOperatorOut.java |   33 +
 .../cairo/IllustrationOperatorOver.java            |   33 +
 .../cairo/IllustrationOperatorSaturate.java        |   33 +
 .../cairo/IllustrationOperatorSource.java          |   33 +
 .../freedesktop/cairo/IllustrationOperatorXOR.java |   33 +
 .../org/freedesktop/cairo/SnapshotCairo.java       |   52 +
 .../org/freedesktop/cairo/SnapshotCairoAxis.java   |   79 +
 .../org/freedesktop/cairo/SnapshotContextArc.java  |   59 +
 .../cairo/SnapshotContextArcNegative.java          |   63 +
 .../org/freedesktop/cairo/SnapshotContextLine.java |   44 +
 .../cairo/SnapshotContextRectangle.java            |   43 +
 .../org/freedesktop/cairo/SnapshotMatrix.java      |   51 +
 .../freedesktop/cairo/SnapshotMatrixRotate.java    |   50 +
 .../org/freedesktop/cairo/SnapshotMatrixScale.java |   50 +
 .../freedesktop/cairo/SnapshotMatrixTranslate.java |   50 +
 tests/screenshots/org/gnome/gtk/Snapshot.java      |  153 +
 .../org/gnome/gtk/SnapshotAboutDialog.java         |   54 +
 tests/screenshots/org/gnome/gtk/SnapshotArrow.java |   55 +
 .../org/gnome/gtk/SnapshotAssistant.java           |   58 +
 .../screenshots/org/gnome/gtk/SnapshotButton.java  |   44 +
 .../org/gnome/gtk/SnapshotCalendar.java            |   46 +
 .../org/gnome/gtk/SnapshotComboBox.java            |   86 +
 .../org/gnome/gtk/SnapshotComboBoxText.java        |   55 +
 .../org/gnome/gtk/SnapshotComboBoxTextEntry.java   |   52 +
 .../screenshots/org/gnome/gtk/SnapshotDialog.java  |   52 +
 .../org/gnome/gtk/SnapshotEntryCompletion.java     |   71 +
 .../org/gnome/gtk/SnapshotEntryIcon.java           |   48 +
 .../org/gnome/gtk/SnapshotEntryRed.java            |   52 +
 .../org/gnome/gtk/SnapshotFileChooserDialog.java   |   54 +
 .../screenshots/org/gnome/gtk/SnapshotHScale.java  |   46 +
 .../screenshots/org/gnome/gtk/SnapshotInfoBar.java |   54 +
 .../org/gnome/gtk/SnapshotInfoMessageDialog.java   |   37 +
 .../org/gnome/gtk/SnapshotLinkButton.java          |   63 +
 .../org/gnome/gtk/SnapshotNotebook.java            |   58 +
 .../gnome/gtk/SnapshotQuestionMessageDialog.java   |   36 +
 .../org/gnome/gtk/SnapshotRadioButton.java         |   62 +
 .../org/gnome/gtk/SnapshotStatusbar.java           |   64 +
 .../screenshots/org/gnome/gtk/SnapshotSwitch.java  |   53 +
 .../org/gnome/gtk/SnapshotTextView.java            |   69 +
 .../gnome/gtk/SnapshotTextViewBorderWindows.java   |   86 +
 .../org/gnome/gtk/SnapshotTextViewSpelling.java    |   68 +
 .../org/gnome/gtk/SnapshotTreeStore.java           |   89 +
 .../org/gnome/gtk/SnapshotTreeView.java            |  121 +
 .../screenshots/org/gnome/gtk/SnapshotVScale.java  |   47 +
 .../screenshots/org/gnome/gtk/SnapshotWindow.java  |   39 +
 1501 files changed, 165956 insertions(+)

diff --git a/.cdtproject b/.cdtproject
new file mode 100644
index 0000000..7c166d4
--- /dev/null
+++ b/.cdtproject
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="scannerConfiguration">
+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="makefileGenerator">
+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+</item>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path="src/jni"/>
+<pathentry kind="src" path="generated/bindings"/>
+<pathentry kind="src" path="src/bindings"/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="org.eclipse.cdt.make.core.buildtargets">
+<buildTargets>
+<target name="all" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildArguments/>
+<buildTarget>all</buildTarget>
+<stopOnError>true</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+</buildTargets>
+</item>
+</data>
+</cdtproject>
diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..e776112
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="src" output="tmp/bindings" path="src/bindings"/>
+	<classpathentry kind="src" output="tmp/tests" path="tests/screenshots"/>
+	<classpathentry kind="src" output="tmp/tests" path="doc/examples"/>
+	<classpathentry kind="src" output="tmp/tests" path="tests/prototype"/>
+	<classpathentry kind="src" output="tmp/tests" path="tests/bindings"/>
+	<classpathentry kind="src" output="tmp/generator" path="src/generator"/>
+	<classpathentry kind="src" output="tmp/tests" path="tests/generator"/>
+	<classpathentry kind="src" output="tmp/bindings/" path="generated/bindings"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3.8.1"/>
+	<classpathentry kind="output" path="tmp/classes"/>
+</classpath>
diff --git a/.cproject b/.cproject
new file mode 100644
index 0000000..6fd6064
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject>
+<storageModule moduleId="org.eclipse.cdt.core.settings">
+<cconfiguration id="converted.config.87722985">
+<storageModule moduleId="scannerConfiguration">
+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="makefileGenerator">
+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+</storageModule>
+
+<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
+<buildTargets>
+<target name="all" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildArguments/>
+<buildTarget>all</buildTarget>
+<stopOnError>true</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+</buildTargets>
+</storageModule>
+<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="converted.config.87722985" moduleId="org.eclipse.cdt.core.settings" name="convertedConfig">
+<externalSettings/>
+<extensions>
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+</extensions>
+</storageModule>
+<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+<storageModule moduleId="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path="src/jni"/>
+<pathentry kind="src" path="generated/bindings"/>
+<pathentry kind="src" path="src/bindings"/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</storageModule>
+<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+</cconfiguration>
+</storageModule>
+</cproject>
diff --git a/.externalToolBuilders/java-gnome Builder.launch b/.externalToolBuilders/java-gnome Builder.launch
new file mode 100644
index 0000000..9cc1ebc
--- /dev/null
+++ b/.externalToolBuilders/java-gnome Builder.launch	
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${project}"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_BUILD_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?>
<launchConfigurationWorkingSet editPageId="org.eclipse.ui.resourceWorkingSetPage" factoryID="org.eclipse.ui.internal.WorkingSetFactory" label="java-gnome resources to trigger build" name="java-gnome resources to trigger build">
<item factoryID="org.eclipse.ui.internal.model. [...]
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/java-gnome/build/faster}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="ide"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc}"/>
+</launchConfiguration>
diff --git a/.project b/.project
new file mode 100644
index 0000000..bc13d73
--- /dev/null
+++ b/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>java-gnome</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>auto,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value><project>/.externalToolBuilders/java-gnome Builder.launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs
new file mode 100644
index 0000000..94f33c4
--- /dev/null
+++ b/.settings/org.eclipse.cdt.core.prefs
@@ -0,0 +1,3 @@
+#Sun Jan 14 23:23:40 EST 2007
+eclipse.preferences.version=1
+indexerId=org.eclipse.cdt.core.domsourceindexer
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..099e518
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,295 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=53
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=78
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=105
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..98ae979
--- /dev/null
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+formatter_profile=_The java-gnome Style
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;\#;
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/AUTHORS.markdown b/AUTHORS.markdown
new file mode 100644
index 0000000..36c3e8c
--- /dev/null
+++ b/AUTHORS.markdown
@@ -0,0 +1,72 @@
+AUTHORS
+
+Principal architects
+--------------------
+
+	Andrew Cowie <andrew at operationaldynamics.com>
+	Srichand Pendyala <srichand.pendyala at gmail.com>
+	Vreixo Formoso Lopes <metalpain2002 at yahoo.es>
+
+Significant authors
+-------------------
+
+	Sebastian Mancke <s.mancke at tarent.de>
+	Stefan Prelle <stefan at prelle.org>
+	Serkan Kaba <serkan at gentoo.org>
+	Guillaume Mazoyer <respawneral at gmail.com>
+	Sarah Leibbrand <xavalia at gmail.com>
+
+Casual contributors
+-------------------
+
+	Wouter Bolsterlee <uws at xs4all.nl>
+	Nat Pryce <npryce at users.sourceforge.net>
+	Remy Suen <remy.suen at gmail.com>
+	Thomas Schmitz <t.schmitz at tarent.de>
+	Mario Torre <neugens at limasoftware.net>
+	Manu Mahajan <manu at knowyourraga.com>
+	Andreas Kühntopf <andreas at kuehntopf.org>
+	Zak Fenton <zak.fenton at gmail.com>
+	Stefan Schweizer <steve.schweizer at gmail.com>
+	Kenneth Prugh <ken69267 at gmail.com>
+
+Mentoring and design review
+---------------------------
+
+	Owen Taylor <otaylor at redhat.com>
+	Carl Worth <cworth at cworth.org>
+
+Build system improvements
+-------------------------
+
+	Laszlo Peter <laca at sun.com>
+	Michael Kedzierski <waikurosu at gmail.com>
+	Maciej Piechotka <uzytkownik2 at gmail.com>
+	Vincent Geddes <vgeddes at gnome.org>
+	Karsten Bräckelmann <kbrae at gnome.org>
+	Timm Preetz <timm at preetz.us>
+	Colin Walters <walters at verbum.org>
+	Rob Taylor <rob.taylor at codethink.co.uk>
+	Yaakov Selkowitz <yselkowitz at users.sourceforge.net>
+	Alexander Boström <abo at root.snowtree.se>
+
+--
+
+Although java-gnome 4.0 is a complete from-the-ground-up rewrite, certain
+parts would not have been possible without the example and inspiration
+provided by the generations of authors and maintainers of java-gnome leading
+up to 2006. We owe them an enormous debt of gratitude.
+
+Where significant portions of code is re-used, the copyright and authorship
+noted in a given file reflect it. Otherwise the authors of java-gnome, and the
+copyright they exert as owners of their work, are summarized above and listed
+on a file by file basis.
+
+<style>
+<!--
+pre {
+	color: black;
+	background: white;
+}
+-->
+</style>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/HACKING.markdown b/HACKING.markdown
new file mode 100644
index 0000000..7304930
--- /dev/null
+++ b/HACKING.markdown
@@ -0,0 +1,155 @@
+We'd love to have you contribute by hacking on the bindings themselves!
+
+GETTING STARTED
+===============
+
+1. Checkout the source code
+---------------------------
+
+If you're going to hack seriously with, or on, java-gnome, we recommend the
+following sequence to checkout the source code:
+
+    $ cd ~/src/
+    $ mkdir java-gnome/
+    $ git clone git://github.com/afcowie/java-gnome.git working
+    $ cd working/
+    $ less README.markdown
+
+If you are using Eclipse, you may instead want to do this such that the
+checkout is under `~/workspace`.
+
+    $ cd ~/workspace/
+    $ git clone git://github.com/afcowie/java-gnome.git java-gnome
+    $ cd ~/workspace/java-gnome/
+    $ less README.markdown
+
+Doing it this way allows you to later do 
+
+    $ git checkout some-other-branch
+
+to change between branches you have created with different lines of
+development. This works well, but is an advanced layout, so do experiement
+with it a bit if you aren't well versed in distributed version control
+practises.
+
+### And build!
+
+If you haven't already read them, see the instructions in the top level
+[`README`](README.html) for how to install from a source tarball and what
+options you can supply to the `./configure` script.
+
+
+TECHNICAL DETAILS
+=================
+
+The java-gnome bindings are pretty straight forward, so in terms of adding
+new coverage you can probably pick things up by example fairly easily. But you
+really should take the time to understand *why* things work, or you won't be
+able to understand the mechanisms involved behind the scene.
+
+API design and overall system architecture 
+------------------------------------------
+
+In the `doc/design/` subdirectory you will find extensive documentation of the
+current re-engineering process that lead to the design and architecture of the
+java-gnome bindings. Try starting with
+[`doc/design/START`](doc/design/START.html).
+
+You really are encouraged to peruse these files; the one on Architecture in
+particular is pretty much required reading if you want to understand what's
+going on.
+
+STYLE GUIDE
+===========
+
+Things like how you format your code, what editor you use, etc are all very
+personal issues, but for a project to function with anything even remotely
+resembling sanity, there need to be some standards and conventions. Thus we
+have several documents outlining the style guidelines you'll need to know if
+hacking on the java-gnome 4.x bindings. They're in the `doc/style/` directory.
+
+Code formatting
+---------------
+
+I've carefully documented the 4 divergences from the otherwise default "Java
+conventions" for Java source code formatting. Please take a moment to read
+[`doc/style/CodeFormat`](doc/style/CodeFormat.html); your patches have a much
+better chance of being accepted if they produce clean diffs, and that's more
+likely to happen if you stick to these rules.
+
+Commit Messages
+---------------
+
+There are just a few minor conventions you should be aware of when committing
+patches. See [`doc/style/CommitMessages`](doc/style/CommitMessages.html).
+
+Documentation
+-------------
+
+JavaDoc is the heart and soul of our API documentation and good JavaDoc is
+going to be *the* key defining criteria for our bindings being **approachable**
+to new developers. As such we've written out considerable guidance about how
+to best go about documenting our public APIs. 
+
+Of course, JavaDoc alone isn't sufficient, and we have a number of supporting
+documents describing the design and architecture of java-gnome.  See
+[`doc/style/Documentation`](doc/style/Documentation.html) for discussion of
+appropriate style for both in-code JavaDoc and supporting textual Design
+documentation.
+
+Markup
+------
+
+We have gone to considerable trouble to ensure our text documentation files are
+readable from a terminal window, but by using a simple yet powerful markup
+syntax called Markdown we can also easily render these files to useful web
+pages. See [`doc/style/MARKUP`](doc/style/MARKUP.html).
+
+
+CONCLUSION
+==========
+
+The opportunity to work on something you love is the greatest experience you
+can have. If you or your company chooses to offer code you write, be it
+towards helping us on this project or on any other endeavour whatsoever, I
+encourage you to choose to let others use your work as Software Libre and in
+your own turn help people find their own passion and excitement. By your
+actions you lift us all up. I hope you'll join us!
+
+Apotheosis Rising.
+
+AfC
+
+`--`  
+Andrew Frederick Cowie  
+Managing Director,  
+[Operational Dynamics](http://www.operationaldynamics.com/),  
+a Change Management consultancy...
+
+Maintainer,  
+[java-gnome](http://java-gnome.sourceforge.net/),  
+opening GTK and GNOME to Java programmers!
+
+_Last modified 22 Feb 13_
+
+<!--
+ 
+  Copyright © 2006-2013 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78:
+
+-->
diff --git a/LICENCE.markdown b/LICENCE.markdown
new file mode 100644
index 0000000..6f394f8
--- /dev/null
+++ b/LICENCE.markdown
@@ -0,0 +1,98 @@
+LICENCE
+
+This is the java-gnome user interface library allowing you to write GTK and
+GNOME programs from Java!
+
+    Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+See [`AUTHORS`](AUTHORS.html) file for contributors.
+
+1) java-gnome source code and documentation
+-------------------------------------------
+
+java-gnome is Logiciel Libre and is Open Source; you can redistribute it
+and/or modify it under the terms of the GNU General Public License, version 2
+("GPL").
+
+Linking this library statically or dynamically with other modules is making a
+combined work based on this library. Thus, the terms and conditions of the GPL
+cover the whole combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent modules, and
+to copy and distribute the resulting executable under terms of your choice,
+provided that you also meet, for each linked independent module, the terms and
+conditions of the license of that module. An independent module is a module
+which is not derived from or based on this library. If you modify this
+library, you may extend this exception to your version of the library, but you
+are not obligated to do so. If you do not wish to do so, delete this exception
+statement from your version.
+
+_In other words, if you change java-gnome itself, you can still link against
+it, but you must publish the changes you made to this library._
+
+--
+
+java-gnome is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE. See the GPL for more details. In particular, note that
+if you use this and lose your data, you're on your own.
+
+Of course, if you find a bug, please let us know. And, if you fix anything or
+improve the code please contribute your changes back -- that's the whole idea
+of Open Source. See [`BUGS`](/4.0/lists/#bugs) and [`HACKING`](HACKING.html)
+files for details.
+
+You should have a copy of the GPL somewhere on your system. If you don't, see
+[`http://www.gnu.org/licenses/`][GPL] or write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+2) prerequisites and dependencies
+---------------------------------
+
+java-gnome depends on a number of external libraries. They are either provided
+by your operating system distribution or, in some cases, may be shipped
+alongside the java-gnome sources in the `lib/` subdirectory. That code is open
+source (or we couldn't have redistributed it), but note that third party
+sources are made available under the terms specified by their authors and as
+documented in the individual licences within those files, as noted below and
+in `lib/README`.
+
+The most notable dependency, of course, is GNOME itself. You will need to have
+a recent version of GLib, Cairo, GTK, and many of the other GNOME libraries
+installed in order to build java-gnome and use it in your programs. Just in
+case you are wondering, this is a feature, not a bug.
+
+3) use of Java
+--------------
+
+The public API of the java-gnome library is expressed in the Java programming
+language with the glue code to reach the native libraries it wraps written
+jointly in Java and C.
+
+You have the option of building and running java-gnome either using the
+original Proprietary compilers and runtime environments are available from Sun
+and others, or using the Libre and Open Java implementation available through
+one of the Free runtimes that use the GNU CLASSPATH (aka glibj) project. We
+welcome you to deploy java-gnome using either approach. Software Freedom,
+after all, is about choice.
+
+Our build framework, Equivalence, allows you to easily switch between
+proprietary and Free compilers and runtimes, allowing you to evaluate
+different options.
+
+Of course, with Sun having recently released their Java VM under the GPL, and
+having announced that the full JDK and class libraries will likewise be
+released as Free Software, you are most certainly encouraged to make use of
+that code as it becomes available. Java Libre!
+
+4) trademarks and acknowledgements
+----------------------------------
+
+Java is a trademark of Sun Microsystems, Inc.
+GNOME is a trademark of the GNOME Foundation.
+
+[GPL]: http://www.gnu.org/licenses/
+
+<!-- vim: set textwidth=78 nowrap: -->
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..3ec3f07
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,153 @@
+#
+# java-gnome, a UI library for writing GTK and GNOME programs from Java!
+#
+# Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others 
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+ifdef V
+else
+MAKEFLAGS=-s
+REDIRECT=>/dev/null
+endif
+
+-include .config
+
+all: build-java
+
+.PHONY: test demo doc clean distclean install
+
+# --------------------------------------------------------------------
+# Source compilation
+# --------------------------------------------------------------------
+
+build-java:
+	build/faster
+
+# --------------------------------------------------------------------
+# Install (run as root, or specify DESTDIR on Make command line)
+# --------------------------------------------------------------------
+
+install: build-java install-dirs install-java
+	rm $(DESTDIR)$(PREFIX)/.java-gnome-install-dirs
+
+install-dirs: $(DESTDIR)$(PREFIX)/.java-gnome-install-dirs
+$(DESTDIR)$(PREFIX)/.java-gnome-install-dirs:
+	@test -d $(DESTDIR)$(JARDIR) || /bin/echo -e "MKDIR\tinstallation directories"
+	-mkdir -p $(DESTDIR)$(PREFIX)
+	-touch $@ 2>/dev/null
+	test -w $@ || ( /bin/echo -e "\nYou don't seem to have write permissions to $(DESTDIR)$(PREFIX)\nPerhaps you need to be root?\n" && exit 7 )
+	mkdir -p $(DESTDIR)$(JARDIR)
+	mkdir -p $(DESTDIR)$(LIBDIR)
+
+install-java: build-java \
+	$(DESTDIR)$(JARDIR)/gtk-$(APIVERSION).jar \
+	$(DESTDIR)$(LIBDIR)/libgtkjni-$(VERSION).so
+
+$(DESTDIR)$(JARDIR)/gtk-$(APIVERSION).jar: tmp/gtk-$(APIVERSION).jar
+	@/bin/echo -e "INSTALL\t$@"
+	cp -f $< $@
+	@/bin/echo -e "JAR\t$@"
+	jar uf $@ .libdir
+	@/bin/echo -e "SYMLINK\t$(@D)/gtk.jar -> gtk-$(APIVERSION).jar"
+	cd $(@D) && rm -f gtk.jar && ln -s gtk-$(APIVERSION).jar gtk.jar
+	
+$(DESTDIR)$(LIBDIR)/libgtkjni-$(VERSION).so: tmp/libgtkjni-$(VERSION).so
+	@/bin/echo -e "INSTALL\t$@"
+	cp -f $< $@
+
+
+# --------------------------------------------------------------------
+# Tests
+# --------------------------------------------------------------------
+
+test:
+	build/faster test
+
+demo:
+	build/faster demo
+
+# --------------------------------------------------------------------
+# Documentation generation
+# --------------------------------------------------------------------
+
+doc:
+	build/faster doc
+
+
+#
+# Remember that if you bump the version number you need to commit the change
+# and re-./configure before being able to run this! On the other hand, we
+# don't have to distclean before calling this.
+#
+dist: all
+	@/bin/echo -e "CHECK\tfully committed state"
+	[ -z "`git status --short`" ] || ( /bin/echo -e "\nYou need to commit all changes before running make dist\n" ; exit 4 )
+	@/bin/echo -e "EXPORT\tjava-gnome-$(VERSION).tar.xz"
+	git archive --format tar master --prefix java-gnome-$(VERSION)/ | xz -z - > java-gnome-$(VERSION).tar.xz
+
+clean:
+	@/bin/echo -e "RM\tgenerated code"
+	rm -rf generated/bindings/*
+	@/bin/echo -e "RM\tcompiled output"
+	rm -rf tmp/generator/ tmp/bindings/ tmp/tests/
+	rm -rf tmp/include/ tmp/objects/
+	rm -rf tmp/i18n/ tmp/locale/
+	@/bin/echo -e "RM\ttemporary files"
+	rm -rf tmp/stamp/
+	rm -f hs_err_*
+	@/bin/echo -e "RM\tbuilt .jar and .so"
+	rm -f tmp/gtk-*.jar \
+		tmp/libgtkjni-*.so
+
+distclean: clean
+	@/bin/echo -e "RM\tbuild configuration information"
+	-rm -f .config .config.tmp .libdir
+	@/bin/echo -e "RM\tgenerated documentation"
+	-rm -rf doc/api/*
+	-rm -f java-gnome-*.tar.bz2
+	@/bin/echo -e "RM\ttemporary directories"
+	-rm -rf tmp generated
+	@/bin/echo -e "RM\tglade cruft"
+	find . -name '*.glade.bak' -o -name '*.gladep*' -type f | xargs rm -f
+
+#
+# A convenience target to run the code formatter built into Eclipse. This is
+# for people who don't use the Eclipse Java IDE as their editor so they
+# can normalize their code and ensure clean patches are submitted.
+#
+
+ifdef ECLIPSE
+else
+ECLIPSE=/usr/bin/eclipse
+endif
+
+ifdef V
+ECLIPSE:=$(ECLIPSE) -verbose
+else
+endif
+
+format: all
+	@/bin/echo -e "FORMAT\tsrc/ tests/ doc/examples/"
+	touch -r src/bindings/org/freedesktop/bindings/Version.java tmp/stamp/version
+	$(ECLIPSE) -nosplash \
+		-application org.eclipse.jdt.core.JavaCodeFormatter \
+		-config .settings/org.eclipse.jdt.core.prefs \
+		src/ tests/ doc/examples/ \
+		$(REDIRECT)
+	touch -r tmp/stamp/version src/bindings/org/freedesktop/bindings/Version.java
+	
+
+# vim: set filetype=make textwidth=78 nowrap:
diff --git a/NEWS.markdown b/NEWS.markdown
new file mode 100644
index 0000000..88a9281
--- /dev/null
+++ b/NEWS.markdown
@@ -0,0 +1,3212 @@
+<a name="4.1.3" id="1367686931" title="Tooltips"></a>
+
+java-gnome 4.1.3  (4 May 2013)
+==============================
+
+_Adventures in Tooltips ._
+
+A third release in the 4.1 series, with improved coverage of GTK's tooltips
+and styling functionality. Also includes numerous build fixes and maintenance
+of the build infrastructure.
+
+Thanks to Guillaume Mazoyer and Sarah Leibbrand for their contributions!
+
+AfC
+
+<a name="4.1.2" id="1346294738" title="GtkApplication"></a>
+
+java-gnome 4.1.2  (30 Aug 2012)
+===============================
+
+_Applications don't stand idly by._
+
+After a bit of a break, we're back with a second release in the 4.1 series
+covering GNOME 3 and its libraries. 
+
+Application for Unique
+----------------------
+
+The significant change in this release is the introduction of GtkApplication,
+the new mechanism providing for unique instances of applications. This
+replaces the use of libunique for this purpose, which GNOME has deprecated and
+asked us to remove.
+
+* **`org.gnome.gtk.Application`**
+* **`org.gnome.glib.Application`**
+* **`org.gnome.glib.ApplicationFlags`**
+* **`org.gnome.glib.ApplicationCommandLine`**
+* <strike>`org.gnome.unique.Application`</strike>
+* <strike>`org.gnome.unique.Message`</strike>
+* <strike>`org.gnome.unique.Response`</strike>
+
+Thanks to Guillaume Mazoyer for having done the grunt work figuring out how
+the underlying GApplication mechanism worked.
+
+Idle time
+---------
+
+The new Application coverage doesn't work with java-gnome's multi-thread
+safety because GTK itself is not going to be thread safe anymore. This is a
+huge step backward, but has been coming for a while, and despite our intense
+disappointment about it all, java-gnome will now be like every other GUI
+toolkit out there: not thread safe.
+
+If you're working from another thread and need to update your GTK widgets, you
+must do so from within the main loop. To get there, you add an idle handler
+which will get a callback from the main thread at some future point. We've
+exposed that as `Glib.idleAdd()`; you put your call back in an instance of the
+Handler interface.
+
+* **`org.gnome.glib.Glib`**
+* **`org.gnome.glib.Handler`**
+
+As with signal handlers, you have to be careful to get back from your callback
+as soon as possible; you're blocking the main loop while that code is running.
+
+Miscellaneous improvements
+--------------------------
+
+Other than this, we've accumulated a number of fixes and improvements over the
+past months. Improvements to radio buttons, coverage of GtkSwitch, fixes to
+Assistant, preliminary treatment of StyleContext, and improvements to
+SourceView, FileChooser, and more. Compliments to Guillaume Mazoyer, Georgios
+Migdos, and Alexander Boström for their contributions.
+
+* **`org.gnome.gtk.Switch`**
+* **`org.gnome.gtk.FileChooserButton`**
+* **`org.gnome.gtk.ProgressBar`**
+* **`org.gnome.gtk.Style`**
+* **`org.gnome.gtk.StyleContext`**
+* **`org.gnome.gtk.StyleProperty`**
+* **`org.gnome.gtk.StyleRegion`**
+* **`org.gnome.gtk.JunctionSides`**
+* **`org.gnome.gtk.RegionFlags`**
+
+java-gnome builds correctly when using Java 7. The minimum supported version
+of the runtime is Java 6. This release depends on GTK 3.4.
+
+AfC
+
+<a name="4.1.1" id="1310346568" title="GNOME 3"></a>
+
+java-gnome 4.1.1  (11 Jul 2011)
+===============================
+
+_To bump or not to bump; that is the question_
+
+This is the first release in the 4.1 series. This introduces coverage of the
+GNOME 3 series of libraries, notably GTK 3. There was a fairly significant API
+change from GTK 2.x to 3.x, and we've done our best to accommodate it.
+
+Drawing with Cairo, which you were already doing
+------------------------------------------------
+
+The biggest change has to do with drawing; if you have a custom widget (ie, a
+DrawingArea) then you have to put your Cairo drawing code in a handler for the
+[`Widget.Draw`][Widget.Draw] signal rather than what used to be
+`Widget.ExposeEvent`. Since java-gnome has ever only exposed drawing via
+Cairo, this change will be transparent to most developers using the library.
+
+Other significant changes include colours: instead of the former `Color` class
+there's now RGBA; you use this in calls in the `override...()` family instead
+of `modify...()` family; for example see Widget's
+[`overrideColor()`][Widget.overrideColor()].
+
+* **`org.gnome.gdk.RGBA`**
+* **`org.gnome.gtk.StateFlags`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.Widget.Draw`**
+
+Orientation is allowed now
+--------------------------
+
+Widgets that had abstract base classes and then concrete horizontal and
+vertical subclasses can now all be instantiated directly with an Orientable
+parameter. The most notable example is Box's [`<init>()`][Box.<init>()] (the
+idea is to replace [VBox][] and [HBox][], which upstream is going to do away
+with). Others are [Paned][], various `Range` subclasses such as
+[Scrollbar][]. [Separator][], [Toolbar][], and [ProgressBar][] now implement
+Orientable as well.
+
+* **`org.gnome.gtk.Scrollbar`**
+* **`org.gnome.gtk.Toolbar`**
+* **`org.gnome.gtk.Box`**
+* **`org.gnome.gtk.Paned`**
+* **`org.gnome.gtk.ProgressBar`**
+* **`org.gnome.gtk.Separator`**
+* **`org.gnome.gtk.Toolbar`**
+
+There's actually a new layout Container, however. Replacing Box and Table
+is [Grid][]. Grid is optimized for GTK's new height-for-width geometry
+management and should be used in preference to other Containers.
+
+* **`org.gnome.gtk.Grid`**
+
+The [ComboBox][] API was rearranged somewhat. The text-only type is now
+[ComboBoxText][]; the former ComboBoxEntry is gone and replaced by a ComboBox
+property. This is somewhat counter-intuitive since the behaviour of the Widget
+is so dramatically different when in this mode (ie, it looks like a
+ComboBoxEntry; funny, that).
+
+* **`org.gnome.gtk.ComboBox`**
+* **`org.gnome.gtk.ComboBoxText`**
+
+Other improvements
+------------------
+
+It's been some months since our last release, and although most of the work
+has focused on refactoring to present GTK 3, there have been numerous other
+improvements. Cairo in particular has seen some refinement in the area of
+Pattern and [Filter][] handling thanks to Will Temperley, and coverage of
+additional [TextView][] and [TextTag][] properties, notably relating to
+paragraph spacing and padding.
+
+* **`org.freedesktop.cairo.Filter`**
+* **`org.freedesktop.cairo.Pattern`**
+* **`org.gnome.gtk.TextTag`**
+* **`org.gnome.gtk.TextView`**
+
+Thanks to Kenneth Prugh, Serkan Kaba, and Guillaume Mazoyer for their help
+porting java-gnome to GNOME 3.
+
+AfC
+
+[HBox]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/HBox.html>
+[VBox]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/VBox.html>
+[Paned]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Paned.html>
+[Separator]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Separator.html>
+[Scrollbar]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Scrollbar.html>
+[ProgressBar]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/ProgressBar.html>
+[ToolBar]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/ToolBar.html>
+[Box.<init>()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Box.html#Box(org.gnome.gtk.Orientation,%20int)>
+[Grid]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Grid.html>
+[ComboBox]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/ComboBox.html>
+[ComboBoxText]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/ComboBoxText.html>
+[Widget.Draw]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Widget.Draw.html>
+[Widget.overrideColor()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Widget.html#overrideColor(org.gnome.gtk.StateFlags,%20org.gnome.gdk.RGBA)>
+[TextTag]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/TextTag.html>
+[Filter]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/cairo/Filter.html>
+
+<a name="4.0.20" id="1310346568" title="Port Me"></a>
+
+java-gnome 4.0.20 (11 Jul 2011)
+===============================
+
+This will be the last release in the 4.0 series. It is meant only as an aide
+to porting over the API bump between 4.0 and 4.1; if your code builds against
+4.0.20 without reference to any deprecated classes or methods then you can be
+fairly certain it will build against 4.1.1; if we've missed something please
+let us know.
+
+* <strike>**`org.gnome.gdk.Color`**</strike>
+* <strike>**`org.gnome.gdk.Colormap`**</strike>
+* <strike>**`org.gnome.gdk.EventExpose`**</strike>
+* <strike>**`org.gnome.gdk.Drawable`**</strike>
+* <strike>**`org.gnome.gdk.Pixmap`**</strike>
+* <strike>**`org.gnome.gdk.Bitmap`**</strike>
+* <strike>**`org.gnome.gdk.Region`**</strike>
+* <strike>**`org.gnome.gtk.Widget.ExposeEvent`**</strike>
+* <strike>**`org.gnome.gtk.StateType`**</strike>
+* <strike>**`org.gnome.gtk.Ruler`**</strike>
+* <strike>**`org.gnome.gtk.Object`**</strike>
+* <strike>**`org.gnome.gtk.Item`**</strike>
+* <strike>**`org.gnome.gtk.ComboBoxEntry`**</strike>
+* <strike>**`org.gnome.gtk.TextComboBox`**</strike>
+* <strike>**`org.gnome.gtk.TextComboBoxEntry`**</strike>
+* <strike>**`org.gnome.glade.Glade`**</strike>
+* <strike>**`org.gnome.glade.XML`**</strike>
+
+AfC
+
+Website update
+==============
+
+We've reorganized the java-gnome website. API Documentation is now found at
+[`doc/api/4.1/`](/doc/api/4.1/overview-summary.html). This prepares us for the
+upcoming API bump.
+
+AfC
+
+<a name="4.0.19" id="1297659945" title="Which Font?"></a>
+
+java-gnome 4.0.19 (14 Feb 2011)
+===============================
+
+_What do you mean that's not the font I asked for?_
+
+This release includes some minor feature enhancements.
+
+Preliminary coverage of Pango's Font object. Font is Pango's abstraction
+describing a typeface, and is what is actually loaded. We've exposed the
+methods that allow you to find out what was _actually_ loaded for a given
+FontDescription request. You do this with Context's
+[`loadFont()`][Context.loadFont()] and then Font's
+[`describe()`][Font.describe()]. Thanks to Behdad Esfahbod for explaining how
+all this works.
+
+* **`org.gnome.pango.Font`**
+* **`org.gnome.pango.Context`**
+
+Exposed a few utility functions, including one to find out if your program is
+running in a terminal or from the Desktop directly.
+
+* **`org.freedesktop.bindings.Environment`**
+
+GTK improvements
+----------------
+
+Further improved some corner cases involved in using Actions, and now you can
+make them with named Icons.
+
+* **`org.gnome.gtk.Action`**
+* **`org.gnome.gtk.ToolItem`**
+
+There are some odd corner cases, especially with TextView, where idle handlers
+need to run before you have the calculations you need ready to query. One
+workaround appears to be letting the main loop cycle, so we've exposed
+[`Gtk.mainIterationDo()`][Gtk.mainIterationDo()] and the `Gtk.eventsPending()`
+which wraps it.
+
+* **`org.gnome.gtk.Gtk`**
+
+Build improvements
+------------------
+
+Building java-gnome on Mandriva now works! Thanks to Liam Quin for helping QA
+the top level `configure` script.
+
+AfC
+
+[Gtk.mainIterationDo()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Gtk.html#mainIterationDo(boolean)>
+[Context.loadFont()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/pango/Context.html#loadFont(org.gnome.pango.FontDescription)>
+[Font.describe()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/pango/Font.html#describe()>
+
+<a name="4.0.18" id="1293156906" title="Fix GDK_IS_WINDOW crash"></a>
+
+java-gnome 4.0.18 (23 Dec 2010)
+===============================
+
+_My compressed original is better than your uncompressed copy_
+
+This is a bug fix release. A serious crasher was occurring when you requested
+a the underlying [org.gnome.gdk] Window backing a Widget, as is often
+necessary before popping up context menus. Thanks to Kenneth Prugh and
+Guillaume Mazoyer for their help in duplicating and isolating the problem.
+
+Better image rendering
+----------------------
+
+While we're at it, we've merged work in progress offering coverage of the
+librsvg Scalable Vector Graphics loader. This allows you to draw an SVG image
+as a vector graphic to Cairo (which itself works in vector form, of course),
+and is a substantial improvement over just loading the `.svg` with gdk-pixbuf
+(which rasterizes the graphic to a bitmap first, of course). Load the image
+with [Handle][], then draw it with Context's
+[`showHandle()`][Context.showHandle()].
+
+* **`org.freedesktop.cairo.Context`**
+* **`org.gnome.rsvg.Handle`**
+* **`org.gnome.rsvg.DimensionData`**
+* `org.gnome.rsvg.Plumbing`
+* `org.gnome.rsvg.RsvgDimensionDataOverride`
+* `org.gnome.rsvg.ValidateVectorIllustrations`
+* `cairo.ExampleDrawingPenguins`
+
+We've also added coverage of Cairo Surface's new
+[`setMimeType()`][Surface.setMimeType()], which allows you to embed the the
+original [ie JPEG, or to a lesser extent PNG] image in PDF output rather than
+just the decoded, rasterized, and very huge bitmap image that Cairo uses on
+screen and would otherwise have used in PDF and SVG output. So 100 kB JPEGs
+stay JPEGs instead of turning into 12 MB bitmaps. Yeay.
+
+* **`org.freedesktop.cairo.Surface`**
+* **`org.freedesktop.cairo.RecordingSurface`**
+* **`org.freedesktop.cairo.MimeType`**
+* `org.freedesktop.cairo.CairoSurfaceOverride`
+* `org.freedesktop.cairo.ValidateCairoInternals`
+
+java-gnome now depends on Cairo 1.10 and librsvg 2.32.
+
+AfC
+
+[Handle]: http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/rsvg/Handle.html
+[Context.showHandle()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/cairo/Context.html#showHandle(org.gnome.rsvg.Handle)>
+[Surface.setMimeType()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/cairo/Surface.html#setMimeData(org.freedesktop.cairo.MimeType,%20byte[])>
+
+<a name="4.0.17" id="1290043843" title="Dictionaries exist"></a>
+
+java-gnome 4.0.17 (18 Nov 2010)
+===============================
+
+_All dictionaries are equal. But some dictionaries are more equal than
+others._
+
+After some 6 months of development, this release includes substantial
+improvements across the library. Thanks to Guillaume Mazoyer, Michael
+Culbertson, Douglas Goulart, Vreixo Formoso, Mauro Galli, Thijs Leibbrand, and
+Andrew Cowie for their contributions to the library, and also to Yaakov
+Selkowitz, and Alexander Boström for their updates to the build system.
+
+Enchant Dictionaries
+--------------------
+
+Improve the utility of the Enchant library by exposing functionality to test
+wither a dictionary [exists][Enchant.existsDictionary()] for a given "language
+tag", and to [list][Enchant.listDictionaries()] all available dictionaries.
+Add speciality functions to the Internationalization class facilitating the
+translation of [language][Internationalization.translateLangageName()] and
+[country][Internationalization.translateCountryName()] names so you can
+present the list of available languages properly translated in the user's
+language.
+
+* **`org.freedesktop.enchant.Enchant`**
+* **`org.freedesktop.bindings.Internationalization`**
+* `org.freedesktop.enchant.EnchantBrokerOverride`
+* `org.freedesktop.enchant.ValidateEnchantInternals`
+* `org.freedesktop.bindings.ValidateInternationalization`
+
+GTK improvements
+----------------
+
+Introduce Icon as a strongly typed class to wrap "named icons" available in an
+icon theme, complementing the previous coverage of "stock icons" provided by
+the Stock class. Add methods to DataColumn, TreeModel, Image, and Entry making
+these available.
+
+* **`org.freedesktop.icons.Icon`**
+* `org.freedesktop.icons.Helper`
+* **`org.freedesktop.icons.ActionIcon`**
+* **`org.freedesktop.icons.ApplicationIcon`**
+* **`org.freedesktop.icons.CategoryIcon`**
+* **`org.freedesktop.icons.DeviceIcon`**
+* **`org.freedesktop.icons.EmblemIcon`**
+* **`org.freedesktop.icons.FaceIcon`**
+* **`org.freedesktop.icons.MimeIcon`**
+* **`org.freedesktop.icons.PlaceIcon`**
+* **`org.freedesktop.icons.StateIcon`**
+* **`org.gnome.gtk.DataColumnIcon`**
+* **`org.gnome.gtk.TreeModel`**
+* **`org.gnome.gtk.Image`**
+* **`org.gnome.gtk.Entry`**
+* `org.freedesktop.icons.ValidateIconItems`
+
+Also in TreeView land, Vreixo Foromso contributed a change to make
+DataColumnReference generic, noting that this was his "one great irritation"
+with java-gnome. Itch scratched, apparently. `:)`
+
+* **`org.gnome.gtk.TreeModel`**
+* **`org.gnome.gtk.DataColumnReference`**
+* `org.gnome.gtk.ValidateTreeModel`
+
+A fair bit of work went into polishing coverage in various classes. We now
+have coverage for Adjustment's various properties (necessary if you want to
+drive a scroll bar around yourself without using one built into a
+ScrolledWindow).
+
+* **`org.gnome.gtk.Adjustment`**
+* **`org.gnome.gtk.HScrollbar`**
+* **`org.gnome.gtk.VScrollbar`**
+* `org.gnome.gtk.ValidateAssistant`
+* `org.gnome.gtk.ValidateProperties`
+* `org.gnome.gtk.ValidateSignalEmission`
+
+We've also introduced a new signal in the [Assistant][]. You can now define
+the behaviour of an Assistant using the `ForwardPage` signal with the
+`setForwardPageCallback()` method. It can help you to skip pages when you need
+to. When going back, the Assistant will also skip the previously skipped page.
+
+* **`org.gnome.gtk.Assistant`**
+* `org.gnome.gtk.GtkAssistantOverride`
+* `org.gnome.gtk.ValidateAssistant`
+
+java-gnome now supports GTK+ 2.20 and introduces the new [Spinner][] widget
+that can be used to display an unknown progress.
+
+* **`org.gnome.gtk.Spinner`**
+* **`org.gnome.gtk.CellRendererSpinner`**
+
+Added coverage for another utility function, this time the one that
+[escapes][Glib.markupEscapeText()] text in strings so that it can be safely
+included when Pango markup is being used.
+
+* **`org.gnome.glib.Glib`**
+
+If you need to ensure whatever has been copied to the clipboard is available
+after your application terminates, you can call Clipboard's `store()`.
+
+* **`org.gnome.gtk.Clipboard`**
+
+Thread safety
+-------------
+
+Fixed a fairly serious bug in the interaction between the memory management
+code and the thread safety mechanism. Amazing we got away with this one so
+long, really. Thanks to Vreixo Formoso for helping with analysis of the crash
+dumps, confirming the diagnosis, and double checking the proposed solution.
+The problem only showed up if you were making extensive use of something like
+TextViews which (internal to GTK) did its drawing in a background idle
+handler.
+
+* `org.gnome.glib.GObject`
+
+Also fixed a crasher that turned up if your cursor theme didn't have a certain
+named cursor. `ENOTGNOME`, but anyway.
+
+* **`org.gnome.gdk.Cursor`**
+
+More drawing
+------------
+
+The Cairo graphics library continues to be a joy to use and we continue to
+make minor improvements to our coverage as people use it more. In particular,
+based on help from Benjamin Otte and others we've refined the way you create a
+[Context][] in a `Widget.ExposeEvent`, improving efficiency and taking
+advantage of some of the underlying support functions more effectively.
+
+* **`org.freedesktop.cairo.Extend`**
+* **`org.freedesktop.cairo.FillRule`**
+* **`org.freedesktop.cairo.HintStyle`**
+* **`org.freedesktop.cairo.Context`**
+* **`org.freedesktop.cairo.FontOptions`**
+* **`org.freedesktop.cairo.Pattern`**
+* **`org.gnome.gdk.Color`**
+* **`org.gnome.pango.Layout`**
+* **`org.gnome.pango.Underline`**
+* `org.freedesktop.cairo.GdkCairoSupport`
+* `org.freedesktop.cairo.ValidateCairoContext`
+
+Looking ahead
+-------------
+
+With GTK 3.0 coming closer to reality, we're keeping close track of the
+activity there. GTK 3.0 is a pretty vast API and ABI break from 2.x with some
+fairly major changes to the way Widget sizing works, along with an overhaul of
+the drawing system. We'll be updating java-gnome to meet these changes in the
+months to come.
+
+AfC, GM
+
+[Enchant.existsDictionary()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/enchant/Enchant.html#existsDictionary(java.lang.String)>
+[Enchant.listDictionaries()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/enchant/Enchant.html#listDictionaries()>
+[Internationalization.translateLangageName()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/bindings/Internationalization.html#translateLanguageName(java.lang.String)>
+[Internationalization.translateCountryName()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/bindings/Internationalization.html#translateCountryName(java.lang.String)>
+[Assistant]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Assistant.html>
+[Spinner]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/gtk/Spinner.html>
+[Glib.markupEscapeText()]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/glib/Glib.html#markupEscapeText(java.lang.String)>
+[Context]: <http://java-gnome.sourceforge.net/doc/api/4.1/org/freedesktop/cairo/Context.html#Context(org.gnome.gdk.EventExpose)>
+
+
+<a name="4.0.16" id="1276732981" title="Accelerating operations"></a>
+
+java-gnome 4.0.16 (17 Jun 2010)
+===============================
+
+_Accelerating is good for you_
+
+Accelerators
+------------
+
+java-gnome now has full support for accelerators, the key bindings (such as
+**`Ctrl+Q`** for "quit") typically used to activate MenuItems and Actions. The
+heart of the API is in the [AcceleratorGroup][] class, although you actually
+use it care of MenuItem's `setAccelerator()` and Action's `setAccelerator()`.
+Huge thanks are due to Thijs Leibbrand for having navigating the almost
+incomprehensible native API and figured out how we could best add coverage for
+Java programs.
+
+* **`org.gnome.gtk.AcceleratorGroup`**
+* **`org.gnome.gtk.Menu`**
+* **`org.gnome.gtk.MenuItem`**
+* **`org.gnome.gtk.ImageMenuItem`**
+* **`org.gnome.gtk.Window`**
+* **`org.gnome.gtk.Action`**
+* `menu.ExampleSimpleMenu`
+
+Cairo Operations
+----------------
+
+Though we've had support for Cairo's various "operators" (different modes for
+combining what's being drawn with what's already on the surface) for some
+time, we didn't really know what we were doing. Thanks to the careful work of
+Kenneth Prugh, we've now got full coverage in the [Operator][] class along
+with a magnificent series of illustrations. These are the same pictures as are
+in the underlying Cairo documentation, but like our screenshots, ours are
+generated automatically by java-gnome programs whenever you build the
+documentation.
+
+* **`org.freedesktop.cairo.Operator`**
+* `Harness`
+* `org.freedesktop.cairo.IllustrationOperatorOver`
+* `org.freedesktop.cairo.IllustrationOperatorDestOver`
+* `org.freedesktop.cairo.IllustrationOperatorSaturate`
+* `org.freedesktop.cairo.IllustrationOperatorDestIn`
+* `org.freedesktop.cairo.IllustrationOperatorDestAtop`
+* `org.freedesktop.cairo.Illustration`
+* `org.freedesktop.cairo.IllustrationOperatorAdd`
+* `org.freedesktop.cairo.IllustrationOperatorDest`
+* `org.freedesktop.cairo.IllustrationOperatorAtop`
+* `org.freedesktop.cairo.IllustrationOperatorSource`
+* `org.freedesktop.cairo.IllustrationOperatorClear`
+* `org.freedesktop.cairo.IllustrationOperatorDestOut`
+* `org.freedesktop.cairo.IllustrationOperatorOut`
+* `org.freedesktop.cairo.IllustrationOperator`
+* `org.freedesktop.cairo.IllustrationOperatorXOR`
+* `org.freedesktop.cairo.IllustrationOperatorIn`
+
+Miscellaneous improvements
+--------------------------
+
+The style `CENTER` has been added in ButtonBoxStyle.
+
+* **`org.gnome.gtk.ButtonBoxStyle`**
+
+Coverage of GTK's new [InfoBar][] Widget was added by Guillaume Mazoyer, who
+also made numerous touch ups to various core classes. The Activatable and
+Editable interfaces got some love. And methods to get "human readable" byte
+sizes have been added to the [Glib][] utility class.
+
+* **`org.gnome.gtk.Activatable`**
+* **`org.gnome.gtk.Editable`**
+* **`org.gnome.gtk.Entry`**
+* **`org.gnome.gtk.EntryBuffer`**
+* **`org.gnome.gtk.InfoBar`**
+* **`org.gnome.glib.Glib`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.StatusIcon`**
+* `org.gnome.glib.ValidateUtilityFunctions`
+* `org.gnome.gtk.ValidateEntry`
+
+Finally, we exposed the code needed to force GDK to revert to the pre GTK 2.18
+behaviour of using native X Windows for every Widget. This shouldn't be
+necessary -- the whole point of major changes like the "client-side windows"
+branch are is that they are supposed to Just Work (and more to the point Just
+Work better, over time) -- but it does give a workaround for unusual corner
+cases where either GTK, java-gnome, or the developer is constrained and needs
+some help.
+
+* **`org.gnome.gdk.Window`**
+
+AfC
+
+[InfoBar]: doc/api/4.1/org/gnome/gtk/InfoBar.html
+[AcceleratorGroup]: doc/api/4.1/org/gnome/gtk/AcceleratorGroup.html
+[Operator]: doc/api/4.1/org/freedesktop/cairo/Operator.html
+[Glib]: doc/api/4.1/org/gnome/glib/Glib.html
+
+<a name="4.0.15" id="1268692532" title="Radio thang"></a>
+
+java-gnome 4.0.15 (16 Mar 2010)
+===============================
+
+_Radio things_
+
+This has mostly been a bug fix cycle with numerous internal quality
+improvements being made. A few developer visible API additions have been made,
+summarized below.
+
+Unified radio handling
+----------------------
+
+There are a number of controls in GTK that exhibit the "radio" behaviour of
+being in a group of which only one can be selected: RadioButton,
+RadioMenuItem, RadioToolButton and RadioAction. We originally had a class
+called RadioButtonGroup which was used when constructing RadioButtons to
+indicate which group they were a member of. In introducing overage of the
+other radio types, Guillaume Mazoyer implemented a generic grouping class
+called RadioGroup which is now used for all the radio types.
+
+* **`org.gnome.gtk.RadioGroup`**
+* **`org.gnome.gtk.RadioButton`**
+* **`org.gnome.gtk.RadioMenuItem`**
+* **`org.gnome.gtk.RadioToolButton`**
+* **`org.gnome.gtk.RadioAction`**
+
+XDG utility functions
+---------------------
+
+A number of utility functions (aka static methods) were added to Glib allowing
+you to access the various user and systems directories as specified by the XDG
+specification. These are `Glib.getUserConfigDir()`, `Glib.getUserDataDir()`
+and friends.
+
+* **`org.gnome.glib.UserDirectory`**
+* **`org.gnome.glib.Glib`**
+
+Miscellaneous improvements
+--------------------------
+
+Better control of positioning when popping up context menus; you can specify
+co-ordinates when calling Menu's `popup()`.
+
+* **`org.gnome.gtk.Menu`**
+* `org.gnome.gtk.GtkMenuOverride`
+
+The no-arg "convenience" packing methods we invented for HBox and VBox were
+causing more trouble than they were worth because people we not understanding
+the implications of the "default" packing values. So these are deprecated; the
+full four-argument `packStart()` and `packEnd()` have been present for a long
+time and are to be used in preference.
+
+* **`org.gnome.gtk.Box`**
+
+Serkan Kaba spent a bit of time working with the text version of the ComboBox
+API. Apparently no one had needed `removeText()` so he added that.
+
+* **`org.gnome.gtk.TextComboBox`**
+
+A number of improvements to the coverage of GDK's event masks were merged.
+This is work originally by Vreixo Formoso necessary to support the
+`Widget.MotionNotifyEvent` signal, though it has use in other applications.
+Widget now has `addEvents()` and `setEvents()` to this end.
+
+* **`org.gnome.gtk.Widget`**
+* `org.gnome.gtk.GtkWidgetOverride`
+* **`org.gnome.gdk.EventMotion`**
+* **`org.gnome.gdk.EventMask`**
+
+Finally, Guillaume needed to handle selections in IconViews. The API is
+similiar to that in TreeView, but doesn't use the same TreeSelection helper
+class; the methods are directly on IconView. Boo for asymmetry. Anyway, we've
+exposed isSelected() on both TreeSelection and IconView so you can find out if
+a given TreePath is currently selected.
+
+* **`org.gnome.gtk.IconView`**
+* **`org.gnome.gtk.TreeSelection`**
+* `org.gnome.gtk.ValidateIconView`
+
+Better initialization checking
+------------------------------
+
+Logic checking that the library has been properly initialized has been
+refactored, making it harder to accidentally misuse java-gnome when getting
+started \[or when starting a new program after you've been using the library
+for years and forgotten the basics `:)`\].
+
+Last but not least, a number of bug fixes; one was developer-visible;
+`Enchant.requestDictionary()` now returns `null` like it claimed to if you
+request an unknown dictionary. Nice catch, Serkan.
+
+* **`org.freedesktop.enchant.Enchant`**
+* `org.freedesktop.enchant.Plumbing`
+* `org.freedesktop.enchant.ValidateEnchantInternals`
+
+All the source files have the full (ie traditional) GPL v2 header text now;
+the files comprising the library as used at run-time have GPL headers text +
+the Classpath Exception text. Needed to be done. Makes for a large diff this
+release, but makes the
+[Ohloh](http://www.ohloh.net/p/java-gnome/analyses/latest)'s page for
+java-gnome happy too `:)`.
+
+AfC
+
+<a name="4.0.14" id="1260921997" title="Enchanting input methods"></a>
+
+java-gnome 4.0.14 (16 Dec 2009)
+===============================
+
+_You have to compose in order to enchant_
+
+Access to Enchant spell checking API
+------------------------------------
+
+Coverage of the Enchant spell checking facade (which was already an implicit
+dependency arising from our GtkSpell coverage) is now included in java-gnome.
+It's a lovely library with a simple to use API which in turn fronts for
+various back end spelling providers.
+
+* **`org.freedesktop.enchant.Enchant`**
+* **`org.freedesktop.enchant.Dictionary`**
+* `org.freedesktop.enchant.Broker`
+* `org.freedesktop.enchant.ValidateEnchantInternals`
+
+More detailed input handling
+----------------------------
+
+GTK's handling of complex input methods is extraordinarily powerful, and of
+course present by default in the Entry and TextView text entry Widgets. If
+you're doing your own text based work, however, you might need to capture the
+results of an input method being used to compose characters or words.
+`InputMethod.Commit` is where the result of a compose sequence is captured and
+delivered to the application.
+
+* **`org.gnome.gtk.InputMethod`**
+* **`org.gnome.gtk.SimpleInputMethod`**
+* **`org.gnome.gtk.MulticontextInputMethod`**
+* `org.gnome.gtk.ValidateInputMethods`
+
+We've also made numerous improvements down in GDK where events are processed;
+as a Java library we represent many naked low-level native entities with
+strongly-typed classes, and have improved our coverage here, notably with new
+Cursor constants representing the common use cases of changing the pointer.
+
+* **`org.gnome.gdk.Keyval`**
+* **`org.gnome.gdk.ModifierType`**
+* **`org.gnome.gdk.Cursor`**
+* **`org.gnome.gdk.CursorType`**
+
+Improved text rendering
+-----------------------
+
+Other minor improvements are present across the text rendering stack, notably
+with the ability to introspect where a Pango Layout has made its line breaks
+when wrapping via LayoutLine's `getStartIndex()` and `getLength()` methods.
+
+* **`org.gnome.gtk.TextIter`**
+* **`org.gnome.gtk.TextTag`**
+* `org.gnome.pango.ValidateTextBuffer`
+* **`org.gnome.pango.LayoutLine`**
+* `org.gnome.pango.ValidatePangoWrapBehaviour`
+
+Guillaume Mazoyer finished up a work by Serkan Kaba resulting in us having
+coverage of the special LinkButton subclass of Button which can be used to
+present clickable URLs.
+
+* **`org.gnome.gtk.LinkButton`**
+* `org.gnome.gtk.ValidateLinkBehaviour`
+* `button.ExampleDocumentationLink`
+
+You can now create custom PaperSize objects, which is handy if you need to use
+Cairo to output PDF documents with a non-standard paper format.
+
+* **`org.gnome.gtk.CustomPaperSize`**
+* `org.gnome.gtk.ValidatePrinting`
+
+Other changes
+-------------
+
+You can now use gdk-pixbuf to query an image on disk for its dimensions via
+Pixbuf `getFileInfo()` function calls.
+
+* **`org.gnome.gdk.Pixbuf`**
+* `org.gnome.gdk.ValidateImageHandling`
+
+There were of course miscellaneous improvements to various long established
+core classes, mostly fixing typos.
+
+* **`org.gnome.gtk.Dialog`**
+* **`org.gnome.gtk.AboutDialog`**
+* **`org.gnome.gtk.TreeIter`**
+* **`org.gnome.gtk.TreeModelFilter`**
+* `org.gnome.gtk.ValidateTreeStore`
+* **`org.gnome.gtk.Window`**
+* **`org.gnome.pango.Attribute`**
+
+We now have the methods necessary to have ImageMenuItems actually show images
+(there's a GNOME bug whereby suddenly icons are not showing in menus. So you
+need to either explicitly tell an ImageMenuItem that it should always show its
+image, or use the global Settings to say that Menus and Buttons should always
+have their icons showing).
+
+* **`org.gnome.gtk.ImageMenuItem`**
+* **`org.gnome.gtk.Settings`**
+* `org.gnome.gtk.ValidateGlobalSettings`
+
+The internal initialization sequence has been tweaked to ensure that GLib's
+threads are initialized before anything else. This means java-gnome apps will
+work if `glib 2.22.3` is installed; this is a workaround for bug
+[603774](https://bugzilla.gnome.org/show_bug.cgi?id=603774).
+
+Headless testing
+----------------
+
+For a long time we've had to be careful in our test suite not to do anything
+that would cause a Window to appear or otherwise popup while the tests were
+running. But some for some test cases this is unavoidable, especially if the
+main loop needs to cycle. We now run the java-gnome test suite within a
+virtual X server (ie `Xvfb`), and as a result distros packaging the library
+can run the test suite on their headless build servers if they wish.
+
+There's a new base class for java-gnome TestCases needing to run in this
+environment.
+
+* `org.gnome.gtk.GraphicalTestCase`
+
+Looking ahead
+-------------
+
+What's ahead for java-gnome? That's always a good question. At this point
+java-gnome provides a comprehensive API for development of user interfaces
+suitable for the GNOME desktop, and it's incredibly rewarding to see people
+using the library for their own programs.
+
+Development of java-gnome has continued pretty steadily, driven by people
+finding they need additional features from some of the underlying GNOME and
+FreeDesktop libraries we already expose. As a community we also work to
+fine-tune the performance and quality of the library through continuous
+improvement of the code base and its algorithms.
+
+There are also people quietly working on experimental coverage of more unusual
+libraries such as GStreamer and Clutter which is pretty exciting to see.
+
+People using java-gnome are always welcome to join us in `#java-gnome` to ask
+questions or just hang out! So happy hacking, and see you soon.
+
+AfC
+
+<a name="4.0.13" id="1251341992" title="Fix unicode handling"></a>
+
+java-gnome 4.0.13 (27 Aug 2009)
+===============================
+
+_Unicode. It's bigger than you think._
+
+This is a bug fix release to address a serious weakness in Java's handling of
+Unicode characters.
+
+Unicode handling
+----------------
+
+It turns out that Java's chars are **not** pure Unicode codepoints. Most
+people know that Java String objects are arrays of Java chars, but in
+aggregate they are encoded in UTF-16 in order to deal with the fact that there
+are Unicode characters whose index is higher than `0xFFFF` and which need more
+than two bytes to identify them. It's a problem that an application developer
+has to deal with if they're using high-range "supplementary" Unicode
+characters, but wasn't something that would break java-gnome...
+
+Except it turns out that the Java VM does not do UTF-8 translation properly.
+It has a hard wired limitation preventing it from writing out UTF-8 sequences
+longer than 3 bytes. Who knows what crack they were smoking when they decided
+that one. But things like TextView / TextBuffer work in characters, so we need
+characters. (actually, they work in UTF-8 bytes, but the offsets in our public
+API are the characters variants).
+
+Luckily, we can get at the raw UTF-16 arrays backing Strings, and so in
+combination with GLib's character set conversion functions, we've been able to
+redo our string handling internally so as to have correct treatment of Unicode
+codepoints. Lots of testing.
+
+* `org.gnome.gtk.ValidateUnicode`
+* `org.gnome.gtk.ValidateTextBuffer`
+* **`org.gnome.gtk.TextIter`**
+
+This surgery was almost entirely internal; Strings returned by java-gnome
+methods are of course still Java String objects. There was only one signature
+change in the public API: TextIter's `getChar()` now returns Java int, not
+Java char.
+
+New coverage
+------------
+
+<img src="doc/api/4.1/org/gnome/gtk/Entry.png" alt="" style="float: right;
+text-align: right; padding-left: 15px;" /> This release also features the work
+of Guillaume Mazoyer exposing some of the new features available in Entry
+Widgets, including displaying icons and showing progress bars in the
+background.
+
+* **`org.gnome.gtk.Entry`**
+* **`org.gnome.gtk.EntryIconPosition`**
+* `org.gnome.gtk.ValidateEntry`
+* `org.gnome.gtk.SnapshotEntryIcon`
+* `entry.ExampleSearchSomeone`
+
+Along with minor enhancements to various miscellaneous classes.
+
+* **`org.gnome.gdk.ModifierType`**
+* **`org.gnome.gtk.Label`**
+* **`org.gnome.pango.EllipsizeMode`**
+* **`org.gnome.pango.RiseAttribute`**
+
+With this release, java-gnome now requires GTK `2.16` or newer.
+
+AfC
+
+<a name="4.0.12" id="1248418784" title="Unique, Notify, Sourceview, Spelling"></a>
+
+java-gnome 4.0.12 (24 Jul 2009)
+===============================
+
+_Being Uniquely Notified while Spelling the Sources you are Viewing is good
+for the soul._
+
+In addition to ongoing improvement in our coverage of the GTK widget toolkit,
+the next release of java-gnome begins to realize our vision to offer
+coverage of the broad suite of libraries making up the GNOME desktop.
+
+New Coverage
+------------
+
+The TextView text editing Widget has received two significant capability
+boosts. With the work of Stefan Schweizer, we now have coverage of the
+powerful GtkSourceView library with its impressive built-in multi
+\[programming\] language source highlighting features.
+
+* **`org.gnome.sourceview.Language`**
+* **`org.gnome.sourceview.LanguageManager`**
+* `org.gnome.sourceview.Plumbing`
+* **`org.gnome.sourceview.SourceBuffer`**
+* **`org.gnome.sourceview.SourceView`**
+* `org.gnome.sourceview.ValidateSourceView`
+* `sourceview.ExampleEditor`
+
+And with the contribution of GtkSpell coverage by Serkan Kaba, we can now
+offer spell checking in TextViews as well.
+
+* **`org.gnome.gtk.Spell`**
+* **`org.gnome.gtk.TextView`**
+* `org.gnome.gtk.ValidateTextViewSpelling`
+* `org.gnome.gtk.SnapshotTextViewSpelling`
+* `textview.ExampleInstantMessenger`
+
+Two other GNOME libraries feature in this release. Serkan also contributed
+excellent coverage of LibNotify, enabling an application to create and send
+popups to be displayed by the desktop notification mechanism.
+
+* **`org.gnome.notify.Notification`**
+* **`org.gnome.notify.Notify`**
+* **`org.gnome.notify.Urgency`**
+* `org.gnome.notify.Plumbing`
+* `notify.ExampleLowBattery`
+
+And, we expose LibUnique, which offers DBus-powered machinery enabling a
+developer to ensure only one instance of their application is running.
+
+* **`org.gnome.unique.Application`**
+* **`org.gnome.unique.Command`**
+* **`org.gnome.unique.MessageData`**
+* `org.gnome.unique.Plumbing`
+* **`org.gnome.unique.Response`**
+* `org.gnome.unique.ValidateUniqueApplications`
+* `unique.ExampleThereCanBeOnlyOne`
+
+Continuing improvement
+----------------------
+
+Lots of minor changes and enhancements throughout the core GTK libraries.
+Highlights include improved mouse button handling, filtering when choosing
+files, and further refinement to Pixbuf. Thanks to Peter Mossveld, Kenneth
+Prugh, Vreixo Formoso, Serkan Kaba.
+
+* **`org.freedesktop.cairo.Context`**
+* `org.freedesktop.cairo.Status`
+* `org.freedesktop.cairo.ValidateCairoContext`
+* **`org.gnome.gdk.CursorType`**
+* **`org.gnome.gdk.EventScroll`**
+* **`org.gnome.gdk.MouseButton`**
+* **`org.gnome.gdk.Pixbuf`**
+* **`org.gnome.gdk.ScrollDirection`**
+* **`org.gnome.gtk.AboutDialog`**
+* **`org.gnome.gtk.CellRendererProgress`**
+* **`org.gnome.gtk.ColorButton`**
+* **`org.gnome.gtk.Entry`**
+* **`org.gnome.gtk.FileChooser`**
+* **`org.gnome.gtk.FileChooserButton`**
+* **`org.gnome.gtk.FileChooserDialog`**
+* **`org.gnome.gtk.FileChooserWidget`**
+* **`org.gnome.gtk.FileFilter`**
+* **`org.gnome.gtk.Notebook`**
+* **`org.gnome.gtk.Range`**
+* **`org.gnome.gtk.Toolbar`**
+* **`org.gnome.gtk.ToolbarStyle`**
+* **`org.gnome.gtk.Widget`**
+* `org.freedesktop.bindings.ValidateInternationalization`
+* `org.gnome.gtk.ValidateProperties`
+* `org.gnome.gtk.ValidateTextBuffer`
+
+Finally, thanks to Guillaume Mazoyer we now have coverage of EntryCompletion,
+the feature of Entry Widgets whereby available possible completions are
+offered to the based on characters the user has typed so far.
+
+* **`org.gnome.gtk.EntryCompletion`**
+* `org.gnome.gtk.ValidateEntryCompletion`
+* `org.gnome.gtk.SnapshotEntryCompletion`
+* `completion.ExampleLoginPrompt`
+
+Looking ahead
+-------------
+
+There are a number of people working on various branches -- some small feature
+extensions, and some major coverage additions that add signifant capabilies --
+but which haven't quite made it to the point where they can be merged into
+java-gnome. We'll see how these pieces of work fare in the coming months, but
+nevertheless the Java bindings for GNOME have reached a significant level of
+maturity and we are pleased to see people starting to use them in serious
+applications.
+
+AfC
+
+<a name="4.0.11" id="1241147383" title="Bug fixes"></a>
+
+java-gnome 4.0.11 (1 May 2009)
+==============================
+
+_This is a bug fix release._
+
+We made a few mistakes in our handling of the PangoAttribute structures'
+memory which resulted in VM crashes [unfortunately, the normal GNOME way of
+debugging things is to `SIGSEGV`. That's fine for a C program but Bad™ for
+your average Java Virtual Machine as it takes out the entire process. We
+therefore work rather hard to avoid -- or at least trap -- this sort of
+thing]. Releasing corrections for these bugs was a priority.
+
+Concurrently a significant internal improvement in our handling of
+accumulating Attributes into AttributeLists was made. While this is not user
+visible _per se_, we were able to drop the requirement that the text you were
+formatting already be in the Pango Layout before assigning the range that the
+Attribute would cover. You also no longer need to pass that Layout to
+`setIndices()`. This makes things a great deal easier if you are
+simultaneously aggregating the text and assigning markup.
+
+* **`org.gnome.pango.Attribute`**
+* **`org.gnome.pango.AttributeList`**
+* `org.gnome.pango.PangoAttributeOverride`
+* **`org.gnome.pango.Layout`**
+* **`org.gnome.pango.FontDescription`**
+* **`org.gnome.pango.FallbackAttribute`**
+* `org.gnome.pango.ValidatePangoTextRendering`
+* **`org.gnome.pango.WrapMode`**
+
+Martin Garton contributed some documentation quality improvements and new
+coverage. Serkan Kaba made some minor fixes to ensure the unit tests run in a
+Turkish locale. And as ever there are small incremental improvements to
+various classes, including a number of additional properties exposed care of
+the work of new contributor Thijs Leibbrand. 
+
+* **`org.gnome.gtk.TreeViewColumn`**
+* **`org.gnome.gtk.ComboBox`**
+* **`org.gnome.gtk.Widget`**
+* `org.freedesktop.bindings.ValidateInternationalization`
+* **`org.gnome.gtk.Label`**
+* **`org.gnome.gtk.ScrolledWindow`**
+* **`org.gnome.gtk.Box`**
+* **`org.gnome.gtk.AboutDialog`**
+
+Looking ahead
+-------------
+
+This was a brief cycle; as noted we're mostly pushing some bug fixes.
+Meanwhile there are a number of significant branches underway by various
+hackers; which, hopefully, will feature prominently in the next release.
+
+AfC
+
+<a name="4.0.10" id="1236252051" title="Beautiful sculpted text"></a>
+
+java-gnome 4.0.10 (5 Mar 2009)
+==============================
+
+_Sculptures made of letters_
+
+This release is a landmark, because it features coverage of the Pango text
+rendering library and so, along with our coverage of Cairo, brings us to a
+complete solution for drawing graphics with text -- be they custom Widgets,
+PDF documents, or beautiful vector illustrations.
+
+In addition to merging Pango work from numerous contributors, we have made
+massive improvements to our Cairo coverage, support for writing PDFs, and
+better access to the system Clipboard.
+
+Drawing API improvements
+------------------------
+
+We've done a huge amount of refinement to our APIs for the ever fabulous Cairo
+Graphics drawing library, including full coverage of matrix translations,
+rotations, and scaling and more integrated ways of setting the source pattern
+to be used in stroke, paint, and fill operations. <img
+src="doc/api/4.1/org/freedesktop/cairo/Matrix-translate.png" alt="" style="float:
+right; text-align: right; padding-left: 15px;" /> Thanks to Kenneth Prugh for
+having seen this through and having done the lion's share of the testing. <img
+src="doc/api/4.1/org/freedesktop/cairo/Context-arcNegative.png" alt=""
+style="float: right; text-align: right; padding-left: 15px; clear: right;" />
+
+* **`org.freedesktop.cairo.Content`**
+* **`org.freedesktop.cairo.Context`**
+* **`org.freedesktop.cairo.Matrix`**
+* `org.freedesktop.cairo.Plumbing`
+* `org.freedesktop.cairo.Status`
+* **`org.freedesktop.cairo.Surface`**
+* **`org.freedesktop.cairo.ImageSurface`**
+* **`org.freedesktop.cairo.SvgSurface`**
+* **`org.freedesktop.cairo.XlibSurface`**
+* **`org.freedesktop.cairo.SurfacePattern`**
+* `cairo.ExampleDrawingText`
+
+The various use cases of setting a source pattern for a Context including RGB,
+RGBA, other Surfaces, already existing Pixbufs, etc have been combined into a
+series of `setSource()` method overloads.
+
+We've also had a number of improvements in the lower levels of GTK relating to
+image rendering. The gdk-pixbuf library contains a capable image parser and we
+can now feed it directly from a Pixbuf constructor. Thanks to new contributor
+Martin Garton for his hard work getting that tested and accepted.
+
+* **`org.gnome.gdk.InterpType`**
+* **`org.gnome.gdk.Pixbuf`**
+
+Drawing graphics often also requires drawing text. This release features
+coverage of Pango, GNOME's powerful text rendering library. Pango is not just
+about drawing mere glyphs; it also includes a sophisticated paragraph layout
+engine which gives us a capable solution for drawing text onto Cairo Surfaces.
+
+Thanks are due to Serkan Kaba and Kenneth Prugh have both been really helpful
+testing; it was Vreixo Formoso who did the original leg work in April that
+identified Layout as the key class that we needed to concentrate on and
+cleaned up much of the underlying infrastructure.
+
+* **`org.gnome.pango.Alignment`**
+* **`org.gnome.pango.FontDescription`**
+* **`org.gnome.pango.Layout`**
+* **`org.gnome.pango.LayoutLine`**
+* **`org.gnome.pango.Rectangle`**
+* **`org.gnome.pango.Style`**
+* **`org.gnome.pango.Variant`**
+* **`org.gnome.pango.Weight`**
+* `org.gnome.pango.Plumbing`
+* **`org.gnome.pango.Context`**
+* **`org.freedesktop.cairo.FontOptions`**
+* **`org.freedesktop.cairo.HintMetrics`**
+* **`org.gnome.pango.Attribute`**
+* **`org.gnome.pango.AttributeList`**
+* **`org.gnome.pango.FontDescriptionAttribute`**
+* **`org.gnome.pango.SizeAttribute`**
+* **`org.gnome.pango.StyleAttribute`**
+* **`org.gnome.pango.VariantAttribute`**
+* **`org.gnome.pango.WeightAttribute`**
+* **`org.gnome.pango.UnderlineAttribute`**
+* **`org.gnome.pango.BackgroundColorAttribute`**
+* **`org.gnome.pango.ForegroundColorAttribute`**
+* **`org.gnome.pango.BackgroundColorAttribute`**
+* **`org.gnome.pango.UnderlineColorAttribute`**
+
+As we were working on this we had occasion to continue the polish in and
+around the TextView / TextBuffer APIs, including a number of convenience
+methods for inserting text while simultaneously applying multiple TextTags,
+and supporting changing default fonts.
+
+* **`org.gnome.gtk.TextBuffer`**
+* **`org.gnome.gtk.TextIter`**
+* **`org.gnome.gtk.TextTag`**
+* **`org.gnome.gtk.TextView`**
+* **`org.gnome.gtk.TreeViewColumn`**
+* **`org.gnome.gtk.Widget`**
+
+We've also modelled "notify signals" for when a property changes; see the
+`TextBuffer.NotifyCursorPosition` signal for this in action.
+
+Finally, thanks to contributions from Zak Fenton and Kamil Szymala we have
+support for applications running in composited window managers to have
+transparent backgrounds -- which is an exceptionally cool effect, even if it
+doesn't have much to do with creating HIG compliant usable applications `:)`.
+
+* **`org.freedesktop.cairo.Operator`**
+* **`org.gnome.gdk.Colormap`**
+* **`org.gnome.gdk.Screen`**
+* **`org.gnome.gdk.Window`**
+* **`org.gnome.gtk.Widget`**
+
+Handling cut & paste
+--------------------
+
+The GTK clipboard APIs are fairly complex, in no small part because the
+underlying implementations in X are really rather complex. Our coverage here
+in java-gnome is still fairly basic relative to that, but it's been enough for
+people working on applications like text editors to write text to the system
+clipboard, get notification when the clipboard changes, and read text back out
+again.
+
+* **`org.gnome.gtk.Clipboard`**
+
+Printed document support
+------------------------
+
+<img src="doc/examples/cairo/ExampleLinedPaper.png" alt="" width="200"
+style="float: right; text-align: right; padding-left: 15px; clear: right;" />
+The work on Pango noted above represented the essential machinery necessary to
+make effective use of Cairo's PDF backend, and this has started us down the
+road of covering the GNOME printing APIs.  You can now generate `.pdf`
+documents with java-gnome, and we've included an fun
+[example](doc/examples/START.html#ExampleLinedPaper) showing this in action.
+
+* **`org.freedesktop.cairo.PdfSurface`**
+* **`org.gnome.gtk.PaperSize`**
+* **`org.gnome.gtk.InternationalPaperSize`**
+* **`org.gnome.gtk.NorthAmericanPaperSize`**
+* **`org.gnome.gtk.Unit`**
+* `cairo.ExampleLinedPaper`
+
+Thanks to Nathan Strum for permission to use one of his sketches in the
+example (you might find reading the [blog][nathan] where we found this
+interesting -- it's a fascinating exposé of a graphic artist in action).
+
+[nathan]: http://www.atariage.com/forums/index.php?automodule=blog&blogid=118&showentry=5460
+
+Continuing improvement
+----------------------
+
+Thanks to new contributor Stefan Schweizer we now have better coverage of
+signals relating to Notebook style Containers, and to new contributors Miloud
+Bel and Bruno Dusausoy for numerous small improvements in and around
+ProgressBar.
+
+* **`org.gnome.gtk.Notebook`**
+* **`org.gnome.gtk.ProgressBar`**
+
+Miscellaneous documentation improvements and minor feature improvements always
+feature in our releases, with minor changes having accrued in many classes.
+
+* **`org.gnome.gtk.ShadowType`**
+* **`org.gnome.gdk.CrossingMode`**
+* **`org.gnome.gdk.NotifyType`**
+* **`org.gnome.gtk.AboutDialog`**
+* **`org.gnome.gtk.Arrow`**
+* **`org.gnome.gtk.ArrowType`**
+* **`org.gnome.gtk.Assistant`**
+* **`org.gnome.gtk.Menu`**
+
+Just as important as new coverage is getting rid of cruft that we don't need.
+Libraries like GTK and GDK are, like any other mature project, full of
+deprecated, obsolete, and unnecessary code -- not to mention things that we
+just plain don't need in a Java binding of these underlying native libraries.
+We're already pretty good about not generating translation Java or JNI C code
+for such things; this release continues our refinements in this area with a
+considerable refinement of the `.jar` and `.so` which is ultimately what we
+ship.
+
+Finally, it's worth noting that java-gnome's test suite is now 40 unit test
+classes with 186 individual test fixtures. Combined with over 30 screenshot
+generating programs and 17 example programs, we actually have surprisingly
+good test coverage of our library. It's high time they -- and more to the
+point the people who work hard to create such tests -- got as much credit as
+the visible public APIs do.
+
+* `UnitTests`
+* `com.operationaldynamics.codegen.ValidateUtilityMethods`
+* `com.operationaldynamics.defsparser.ValidateBlockUsage`
+* `com.operationaldynamics.defsparser.ValidateDefsParsing`
+* `com.operationaldynamics.codegen.ValidateThingUsage`
+* `org.freedesktop.bindings.ValidateEnvironment`
+* `org.freedesktop.bindings.ValidateInternationalization`
+* `org.gnome.glib.ValidateReferenceCounting`
+* `org.gnome.glib.ValidateMemoryManagement`
+* `org.gnome.glib.ValidateGListMethods`
+* `org.gnome.glib.ValidateConstants`
+* `org.gnome.gtk.ValidateProperties`
+* `org.gnome.gtk.ValidateSignalEmission`
+* `org.gnome.gdk.ValidateScreensAndDisplays`
+* `org.gnome.gdk.ValidateKeyboardHandling`
+* `org.gnome.gdk.ValidateImageHandling`
+* `org.freedesktop.cairo.ValidateCairoInternals`
+* `org.freedesktop.cairo.ValidateDrawingToFile`
+* `org.gnome.gtk.ValidateOutParameters`
+* `org.gnome.gtk.ValidatePacking`
+* `org.gnome.gtk.ValidateNotebookBehaviour`
+* `org.gnome.gtk.ValidateFileChoosing`
+* `org.gnome.gtk.ValidateStockItems`
+* `org.gnome.gtk.ValidateResponseType`
+* `org.gnome.gtk.ValidateTreeModel`
+* `org.gnome.gtk.ValidateTreeStore`
+* `org.gnome.gtk.ValidateTreeModelFilter`
+* `org.gnome.gtk.ValidateTreeView`
+* `org.gnome.gtk.ValidateIconView`
+* `org.gnome.gtk.ValidateComboBox`
+* `org.gnome.gtk.ValidateSnapshotUtilities`
+* `org.gnome.gtk.ValidateAssistant`
+* `org.gnome.gtk.ValidateTextBuffer`
+* `org.gnome.gtk.ValidateTextViewProperties`
+* `org.gnome.gtk.ValidateTextViewBorderWindows`
+* `org.gnome.gtk.ValidateArrow`
+* `org.gnome.pango.ValidatePangoTextRendering`
+* `org.gnome.gtk.ValidatePrinting`
+* `Harness`
+* `org.freedesktop.cairo.SnapshotMatrixRotate`
+* `org.freedesktop.cairo.SnapshotCairoAxis`
+* `org.freedesktop.cairo.SnapshotCairo`
+* `org.freedesktop.cairo.SnapshotContextLine`
+* `org.freedesktop.cairo.SnapshotMatrixScale`
+* `org.freedesktop.cairo.SnapshotContextArcNegative`
+* `org.freedesktop.cairo.SnapshotMatrixTranslate`
+* `org.freedesktop.cairo.SnapshotContextArc`
+* `org.freedesktop.cairo.SnapshotMatrix`
+* `org.freedesktop.cairo.SnapshotContextRectangle`
+* `org.gnome.gtk.SnapshotCalendar`
+* `org.gnome.gtk.SnapshotTreeView`
+* `org.gnome.gtk.SnapshotButton`
+* `org.gnome.gtk.SnapshotAboutDialog`
+* `org.gnome.gtk.SnapshotArrow`
+* `org.gnome.gtk.SnapshotTextView`
+* `org.gnome.gtk.SnapshotRadioButton`
+* `org.gnome.gtk.SnapshotTextComboBox`
+* `org.gnome.gtk.SnapshotTreeStore`
+* `org.gnome.gtk.SnapshotTextComboBoxEntry`
+* `org.gnome.gtk.SnapshotFileChooserDialog`
+* `org.gnome.gtk.SnapshotTextViewBorderWindows`
+* `org.gnome.gtk.SnapshotVScale`
+* `org.gnome.gtk.SnapshotHScale`
+* `org.gnome.gtk.SnapshotDialog`
+* `org.gnome.gtk.SnapshotEntryRed`
+* `org.gnome.gtk.SnapshotComboBox`
+* `org.gnome.gtk.SnapshotStatusbar`
+* `org.gnome.gtk.SnapshotInfoMessageDialog`
+* `org.gnome.gtk.Snapshot`
+* `org.gnome.gtk.SnapshotAssistant`
+* `org.gnome.gtk.SnapshotWindow`
+* `org.gnome.gtk.SnapshotNotebook`
+* `org.gnome.gtk.SnapshotQuestionMessageDialog`
+
+Anyone can run the tests (and anyone wanting to submit a patch had _better_
+run the tests!); they've been accumulating since java-gnome 4.0.0; it's just:
+
+    $ make test
+
+and
+
+    $ make doc
+
+If you're working in Eclipse launch class `UnitTests` as a JUnit test suite.
+
+Build improvements
+------------------
+
+We have some fixes from new contributor Przemysław Grzegorczyk ensuring we
+include the correct headers in a few corner cases. This came to us via work on
+a GNOME Love bug, which is a first for us. Thanks!
+
+Meanwhile, the ever industrious Serkan Kaba has added some changes to ensure
+that our magically locating the native shared library component of java-gnome
+works properly even under strange and unusual conditions.
+
+Configuration and prerequisite detection on Open Solaris is improved thanks to
+reports from new contributor Kamil Szymala.
+
+Instructions for how to optimally lay out your branches when working with
+java-gnome have been moved to the [`HACKING`](HACKING.html) file. People
+intending to hack on the bindings from Eclipse are _really_ urged to set
+things up this way as it will make their lives much easier. Also, using the
+latest release of Bazaar (ie `bzr >= 1.12`) is definitely recommended -- it's
+getting really fast. We've upgraded our public branches, so you will need
+`1.9` at a minimum.
+
+Note to those creating packages for distributions: java-gnome now depends on
+the current stable GTK (ie `gtk+ >= 2.14`).
+
+Looking ahead
+-------------
+
+Coverage of Poppler, GNOME's PDF rendering library is well along, but didn't
+quite make it in time for this release. It could very likely feature in the
+next version of java-gnome, as might coverage of GConf, GNOME's simple store
+for application configuration options. People are also known to be working on
+coverage of GtkSourceView, libwnck, and librsvg. We'll see what gets
+contributed!
+
+The most exciting part about java-gnome at the moment, though, is the number
+of people working hard on applications using it. It takes a **long** time to
+write a mature, well rounded, robust end-user program, but there are some
+pretty cool projects ticking away out there, and it has been terrific to see
+the authors of these projects joining our community.
+
+Happy developing,
+
+AfC
+
+<a name="pango" id="1229699838" title="Text drawing"></a>
+
+Rendering text
+==============
+
+One thing that was previously missing from our Cairo support was the ability
+to draw text. To that end we have been working on exposing the excellent Pango
+text rendering library. The '`pango`' branch where the effort has been
+underway to polish coverage allowing developers add text when drawing has now
+been merged to '`mainline`'.
+
+Pango is not just about drawing mere words. It also includes a sophisticated
+paragraph layout engine. This in turn represents the essential machinery
+necessary to make effective use of Cairo's PDF backend; you can now generate
+`.pdf` documents with java-gnome, and we've included an fun example showing
+this in action.
+
+Thanks are due to Serkan Kaba and Kenneth Prugh have both been really helpful
+testing; it was Vreixo Formoso who did the original leg work in April that
+identified Layout as the key class that we needed to concentrate on and
+cleaned up much of the underlying infrastructure.
+
+The API documentation for [Layout][] is pretty much the center piece of all
+this work. Improvements to various Cairo backends have also been underway; the
+descriptions at [XlibSurface][] and [PdfSurface][] may also be of interest.
+
+AfC
+
+[Layout]: doc/api/4.1/org/gnome/pango/Layout.html
+[XlibSurface]: doc/api/4.1/org/freedesktop/cairo/XlibSurface.html
+[PdfSurface]: doc/api/4.1/org/freedesktop/cairo/PdfSurface.html
+
+<a name="4.0.9" id="1223889576" title="Text APIs and better running!"></a>
+
+java-gnome 4.0.9 (13 Oct 2008)
+==============================
+
+_The pen is mightier than the sword_
+
+New coverage
+------------
+
+<img src="doc/examples/textview/ExampleInstantMessenger.png" alt=""
+style="float: right; text-align: right; padding-left: 15px;" /> 
+
+This is the first release with coverage of GTK's powerful TextView/TextBuffer
+multi-line text display and editing Widget. This has been the result of
+several months of careful effort to present a clean and self-consistent API
+while remaining faithful to the underlying implementation. This bulk of this
+work was done by Stefan Prelle and Andrew Cowie, with contributions from
+Kenneth Prugh and testing by many people in the `#java-gnome` community.
+
+* **`org.gnome.gtk.TextBuffer`**
+* **`org.gnome.gtk.TextIter`**
+* **`org.gnome.gtk.TextTag`**
+* **`org.gnome.gtk.TextTagTable`**
+* **`org.gnome.gtk.TextView`**
+* **`org.gnome.gtk.TextWindowType`**
+
+The snapshot at right is from
+[`ExampleInstantMessenger`](doc/examples/textview/ExampleInstantMessenger.html),
+included with the sources. It is a somewhat detailed example showing the use
+of TextView, TextBuffer, and related classes. Try running it!
+
+Other improvements
+------------------
+
+Continuous improvement to various classes, especially in our documentation.
+Incremental changes have occurred in a number of places. In the
+TreeView/TreeModel APIs, some useful methods for translating TreeIters from
+one model to another have been added.
+
+* **`org.gnome.gtk.TreeModelSort`**	
+* **`org.gnome.gtk.TreeModelFilter`**
+
+Also thanks to the persistent work of Stefan Prelle, we have nice coverage of
+GTK's Assistant (aka druid, wizard, etc): 
+
+* **`org.gnome.gtk.Assistant`**
+
+Better support for doing popup context menus, including some bug fixes. Thanks
+Srichand Pendyala for taking care of this and to Owen Taylor for having
+explained out some of the underlying implementation details.
+
+* **`org.gnome.gdk.EventButton`**
+* **`org.gnome.gtk.Action`**
+* **`org.gnome.gtk.TreeView`**
+* **`org.gnome.gtk.Widget`**
+
+And, as usual, incremental improvements to core classes, notably a few new
+signals here and there. Virtually every class has been touched in one way or
+another; most changes are cosmetic but they add up to significant
+contribution.
+
+Reducing memory pressure
+------------------------
+
+Internally, java-gnome maintains a lookup table so that pointers coming from
+the C side can be converted into proxy objects for the case where a proxy has
+already been created. In any library there a great number of transient and
+temporary objects and structures allocated, and we are no different. It turned
+out that registering these temporary objects was putting pressure on the
+lookup table. While these objects _were_ properly weak referenced and being
+garbage collected (and thence freed), there were nevertheless an enormous
+number of temporary objects being inserted and removed from the lookup table
+-- and that sort of thing causes hash tables to grow overly large.
+
+To do something about this we have split the former hierarchy root into two
+classes. Only structures which have a persistent identity (which, in practise,
+means only GObjects and certain Cairo entities) are registered so they can be
+looked up by address later as necessary. These remain subclasses of the former
+root `Proxy`. The rest of the Java side proxies for are now subclasses of
+`Pointer` which is now the new root for our class hierarchy. These _aren't_
+registered, essentially eliminating the transient pressure on the lookup
+table.
+
+* **`org.freedesktop.bindings.Pointer`**
+* **`org.freedesktop.bindings.Proxy`**
+* `org.freedesktop.bindings.Plumbing`
+* `org.freedesktop.cairo.Entity`
+* **`org.gnome.glib.Object`**
+* `org.gnome.glib.Plumbing`
+* **`org.gnome.glib.Boxed`**
+
+This is entirely an internal change. Users of released & packaged versions of
+the library will not notice any difference. Developers and hackers who have a
+checkout of the project source code may need to `make clean` if they haven't
+since `'mainline'` revno 567.
+
+Thanks to Vreixo Formoso for doing the bulk of the leg-work on this one.
+
+Making it easier to run java-gnome programs
+-------------------------------------------
+
+Because java-gnome is directly binds to underlying system libraries, it has a
+native shared library component. This led to the usual development hassle of
+having to specify where this library is to be found if it were anywhere other
+than `/usr` and of course the nightmare of ensuring a VM used the right
+library in the event you were developing against or hacking on a newer version
+of java-gnome; in Java this meant:
+
+    $ java -classpath /opt/local/share/java/gtk-4.0.jar:. -Djava.library.path=/opt/local/lib com.example.Program
+
+No longer!
+
+The native shared library part of java-gnome is now located deterministically
+and loaded automatically. You don't need to faff about with
+`java.library.path` on the command line or in your IDE any more!
+
+    $ java -classpath /opt/local/share/java/gtk-4.1.jar:. com.example.Program
+
+Our native component is completely coupled to the specific release you are
+using, so sufficient version information is embedded in the `.so` name to
+ensure that the right library (and only the right library) is loaded.
+
+There are _no_ changes if you are simply working against an "in-place"
+development build of java-gnome, be it from command line, or in an IDE like
+Eclipse, things will Just Work™; again, no `-Djava.library.path`:
+
+    $ java -classpath ~/workspace/java-gnome/tmp/gtk-4.1.jar:. com.example.Program
+
+Note to downstream packagers: running `make install` is now **compulsory**.
+This signals a build that it is no longer being used "in-place" but instead is
+to be prepared for installation to a system prefix (Gentoo got bit by this;
+hooray for downstream packagers testing release candidates!). If you need to
+change the install locations, you can specify overrides when you run
+`./configure`, perhaps:
+
+    $ ./configure prefix=/usr jardir=/opt/share/java libdir=/usr/lib/jni
+
+The defaults are all sensible, of course, and are as described in
+[README](README.html).
+
+Build system improvements
+-------------------------
+
+Serkan Kaba has contributed a number of internal improvements allowing the top
+level `./configure` script to be precise about the versions of various GNOME
+dependencies we require.
+
+With the release of GTK 2.14, various bits of the underlying libraries have
+been deprecated. Thanks to the hard work from Serkan Kaba and new contributor
+George McLachlan, java-gnome correctly builds against GTK 2.14 without any
+problems.
+
+Note that java-gnome releases do _not_ set `GTK_DISABLE_DEPRECATED` (this is a
+change from 4.0.8); thanks to Mart Raudsepp of the Gentoo Linux desktop team
+for pointing out why this would be better. These macros _are_ still enabled
+for builds checked out from version control so hackers working on the bindings
+so will be able to keep up with ensuring we react to future deprecations (it's
+always awesome when downstream is a part of the upstream community; Serkan and
+Kenneth are also Gentoo packagers, and take care of the java-gnome `.ebuild`
+for us).
+
+Incidentally, the version constants identifying the library are now alongside
+the rest of the infrastructure. Public methods are now available if you want
+to use the API or release version number in a snapshot or example.
+
+* **`org.freedesktop.bindings.Version`**
+
+Looking ahead
+-------------
+
+We're pretty happy with the state of the java-gnome right now. Coverage of the
+most important parts of GTK are in place. Our treatment of the underlying
+drawing library, Cairo, still has a bit to go, but the basics are there and a
+firm foundation to build from. More interesting are the remaining areas; the
+more general GNOME utility libraries and other parts of the Free Desktop stack
+that might be needed by an end-user application. It'll be interesting to see
+how these areas evolve in the coming months.
+
+AfC
+
+<a name="textview" id="1219892996" title="Text rendering"></a>
+
+Lorem ipsum
+===========
+
+A major concentration of effort over the last few months has been to write
+appropriate public coverage to present GTK's powerful but complex
+TextView/TextBuffer API, a Widget for presenting multi-line text and the
+backing store for manipulating it.
+
+The '`textview`' branch where this work has been taking place has finally been
+merged to '`mainline`'.
+
+As this development cycle continues we will continue to review and refine the
+API we're presenting, but this is nonetheless a significant milestone and one
+we're justly proud of. Thanks to Stefan Prelle for having done much of the leg
+work and also to Kenneth Prugh for his support during testing.
+
+You can read the API documentation for [TextBuffer][] and [TextView][] if
+you're interested in how things are shaping up.
+
+AfC
+
+[TextBuffer]: doc/api/4.1/org/gnome/gtk/TextBuffer.html
+[TextView]: doc/api/4.1/org/gnome/gtk/TextView.html
+
+<a name="4.0.8" id="1218770492" title="Cleanups and signals naming revised"></a>
+
+java-gnome 4.0.8 (15 Aug 2008)
+==============================
+
+_Cleanups and fixups._
+
+This release is mostly to push out bug fixes and internal improvements,
+setting the stage for some major new feature development. We've also taken the
+opportunity to introduce a major change to the way we connect handlers for
+signals.
+
+New coverage and continuing improvement
+---------------------------------------
+
+With thanks to new contributors Stefan Prelle and Andreas Kuehntopf we have a
+number of small improvements to the TreeView/TreeModel APIs.
+
+* **`org.gnome.gtk.TreeView`**
+* **`org.gnome.gtk.TreeViewColumn`**
+* **`org.gnome.gtk.TreeViewColumnSizing`**
+* **`org.gnome.gtk.CellRendererText`**
+* **`org.gnome.gtk.CellRendererToggle`**
+
+As always, Widget and Window saw a bunch of work, with `Window.ConfigureEvent`
+now being available and a number of additional property setters and methods
+relating to window type.
+
+* **`org.gnome.gdk.WindowTypeHint`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.Window`**
+
+Widgets that scroll around a view of a broader underlying canvas have seen a
+fair bit of activity related to controlling that scrolling.
+
+* **`org.gnome.gtk.Adjustment`**
+* **`org.gnome.gtk.Layout`**
+* **`org.gnome.gtk.ScrolledWindow`**
+* **`org.gnome.gtk.Viewport`**
+
+New features include refinements and new coverage of methods in a variety of
+lower level classes including that further support drawing operations. Bug
+fixes, debugging improvements, and defencive enhancements to our thread safety
+measures have also featured largely.
+
+* `org.freedesktop.bindings.Plumbing`
+* `org.gnome.glib.GObject`
+* **`org.gnome.glib.Object`**
+* `org.gnome.glib.Plumbing`
+* `org.gnome.gdk.Plumbing`
+* **`org.gnome.gdk.Rectangle`**
+* **`org.gnome.gdk.Pixbuf`**
+* **`org.gnome.gdk.Window`**
+* **`org.gnome.gtk.Allocation`**
+* **`org.gnome.gtk.Box`**
+* **`org.gnome.gtk.Button`**
+* **`org.gnome.gtk.Entry`**
+* **`org.gnome.gtk.Image`**
+* **`org.gnome.gtk.IconView`**
+* **`org.gnome.gtk.Gtk`**
+* **`org.gnome.gtk.Requisition`**
+* **`org.gnome.gtk.Table`**
+
+Signal naming change
+--------------------
+
+We have changed the naming scheme used to name the interfaces that are used
+when hooking up signal handlers.
+
+The names of the inner interfaces used to specify the prototypes of the
+methods which receive signal callbacks have changed to the pattern
+`Button.Clicked`, this being more appropriate to Java type naming conventions
+and providing better consistency between the signal name, the method to be
+implemented to receive the callback, and the method that can be used to emit
+this signal.
+
+API compatibility to previous releases in the 4.0 series has been preserved.
+The old signal interfaces and `connect()` methods are `@deprecated`.
+Developers are encouraged to migrate quickly; new coverage will of course all
+follow the new pattern. Making the transition is is easy, especially in an
+IDE. Most of the people we're aware of using the library have already ported
+their code. Just turn assertions on to double check.
+
+Build changes
+-------------
+
+java-gnome now defines C compiler flags like `GTK_DISABLE_DEPRECATED` to
+ensure we are not linking against code that will be unavailable in GTK 3.0.
+Many thanks are due to new contributor Kenneth Prugh for having done some
+terrific grunt work to prune deprecated classes and methods from our `.defs`
+data so that java-gnome compiles without using these APIs.
+
+The build system internally now ensures that multiple runs don't occur
+simultaneously, fixing a number of annoyances that cropped up when using IDEs
+which tend to like trying to frequently re-run the build even if a previous
+one hasn't finished.
+
+Documentation, examples, and testing
+------------------------------------
+
+Our [API documentation](doc/api/4.1/overview-summary.html) and the growing set of
+[example code](doc/examples/START.html) have all been updated to reflect the
+new signal interface names. Doing so forced us to review a wide swath of the
+documentation, and so along the way a huge number of minor improvements were
+made. Given how detailed our JavaDoc is, this sort of painstaking work really
+makes a genuine contribution to overall quality.
+
+There has been steady growth in our test suite, which is great. When combined
+with the snapshots used to illustrate our documentation, the coverage level
+is substantial.
+
+Error handling continues to improve. In the (hand written) public API wrapper
+layer we do our best to catch  misuses of the library before they get sent to
+the native code. But that's not always possible, and in 4.0.7 we introduced a
+mechanism whereby GLib error messages get translated into Java Exceptions and
+thrown. As of 4.0.8, in addition to `ERROR` and `CRITICAL`, we also throw
+`WARNING`s as Exceptions. Getting a stack trace this way has proved very
+useful in helping developers track down where they are making mistakes in
+using the library.
+
+Conclusion
+----------
+
+You can see the full changes accompanying a release by grabbing a copy of the
+sources and running:
+
+    $ bzr diff -r tag:v4.0.7..tag:v4.0.8
+
+Because of the API changes to signal handling this release touches just about
+every public class in the library and so isn't quite as clean (as a summary)
+as in previous releases -- but it does show you everything that changed. `:)`
+
+Looking ahead
+-------------
+
+Most of the contributors to java-gnome are working on branches that didn't
+reach sufficient maturity to be merged in time for 4.0.8; that's the way it
+goes sometimes. Major effort continues on implementing coverage of GTK's
+powerful TextView/TextBuffer APIs, along with further drawing capabilities in
+Cairo and Pango. There have also been a surprising level of interest on other
+areas of the GNOME stack, with new contributors working on adding support to
+java-gnome for Nautilus, GStreamer, and even WebKit. Exciting stuff!
+
+AfC
+
+<a name="signal" id="1217552625" title="Signal API change"></a>
+
+Signal API change
+=================
+
+We have changed the naming scheme used to name the interfaces that are used
+when hooking up signal handlers.
+
+Connecting a handler to a Button now looks as follows:
+
+<pre style="background:white; color:black;">
+b.connect(new Button.Clicked() {
+    public void onClicked(Button source) {
+        // do stuff
+    }
+});
+</pre>
+
+Those developing with java-gnome will recognize that the inner interface's
+name has changed to `Button.Clicked`, being more appropriate to Java type
+naming conventions and providing better consistency between the signal name,
+the method to be implemented, `onClicked()`, and the method that can be used
+to emit this signal, `emitClicked()`.
+
+The process which led to this change was discussed on the `java-gnome-hackers`
+mailing list; see first [message][] if interested.
+
+[message]: http://article.gmane.org/gmane.comp.gnome.bindings.java.devel/1147
+
+Interfaces with the old names and corresponding `connect()` methods are still
+present in the library (marked `@deprecated`, of course, and with assertions
+to encourage developers to migrate their code) so the upcoming release will
+preserve ABI compatibility.
+
+The [documentation](doc/api/4.1/overview-summary.html) posted here has been
+updated and a release candidate has been uploaded.
+
+AfC
+
+<a name="4.0.7" id="1209449091" title="Drawing"></a>
+
+java-gnome 4.0.7 (30 Apr 2008)
+==============================
+
+_Draw some._
+
+In addition to improvements to our coverage of the GNOME libraries, this
+release introduces preliminary coverage of the Cairo Graphics drawing library,
+along with the infrastructure to make it work within a GTK program.
+
+Drawing with Cairo
+------------------
+
+![Example](doc/examples/cairo/ExampleCairoDrawingBlends.png)
+
+The trusty Cairo context, traditionally declared as a variable named `cr` in
+code, is mapped as class
+[`Context`](doc/api/4.1/org/freedesktop/cairo/Context.html). Various Cairo types
+such as different surfaces and patterns are mapped as an abstract base class
+(`Surface`, `Pattern`) along with various concrete subclasses (`ImageSurface`,
+`XlibSurface`, and `SolidPattern`, `RadialPattern`, etc). Error checking is
+implicit: the library status is checked internally after each operation and an
+Exception thrown if there is a failure.
+
+* `org.freedesktop.cairo.Plumbing`
+* **`org.freedesktop.cairo.Context`**
+* **`org.freedesktop.cairo.ImageSurface`**
+* **`org.freedesktop.cairo.XlibSurface`**
+* **`org.freedesktop.cairo.SVGSurface`**
+* **`org.freedesktop.cairo.SolidPattern`**
+* **`org.freedesktop.cairo.LinearPattern`**
+* **`org.freedesktop.cairo.RadialPattern`**
+* **`org.freedesktop.cairo.SurfacePattern`**
+* **`org.freedesktop.cairo.Operator`**
+* **`org.freedesktop.cairo.Format`**
+* `org.freedesktop.cairo.Status`
+* `org.freedesktop.bindings.FatalError`
+* **`org.freedesktop.cairo.FatalError`**
+
+The gateway to custom Widgets is the
+[`EXPOSE_EVENT`](doc/api/4.1/org/gnome/gtk/Widget.EXPOSE_EVENT.html) signal; this
+is where you can transition from the GDK `Window` to a Cairo `Context` and
+then begin drawing.
+
+* **`org.gnome.gtk.Widget.EXPOSE_EVENT`**
+* **`org.gnome.gdk.EventExpose`**
+* **`org.gnome.gdk.Rectangle`**
+* **`org.gnome.gdk.EventCrossing`**
+* **`org.gnome.gdk.CrossingMode`**
+* **`org.gnome.gdk.NotifyType`**
+* **`org.gnome.gtk.Image`**
+
+Thanks in particular to Carl Worth for having reviewed our API and having
+helped test our implementation.
+
+New coverage and continuing improvement
+---------------------------------------
+
+The single option choice buttons in GTK are called `RadioButton`s and have now
+been exposed. When using them you need to indicate the other buttons they are
+sharing a mutually exclusive relationship with, and this is expressed by
+adding them to a `RadioButtonGroup`.
+
+![RadioButton](doc/api/4.1/org/gnome/gtk/RadioButton.png)
+
+
+* **`org.gnome.gtk.RadioButton`**
+* **`org.gnome.gtk.RadioButtonGroup`**
+
+The usual steady refinements to our coverage of the GtkTreeView API continue.
+There's a new `DataColumn` type for Stock icons, and TreeModelSort is now
+implemented.
+
+* **`org.gnome.gtk.TreeModelSort`**
+* **`org.gnome.gtk.DataColumnPixbuf`**
+* **`org.gnome.gtk.DataColumnStock`**
+* **`org.gnome.gtk.CellRendererPixbuf`**
+* **`org.gnome.gtk.TreeView`**
+* **`org.gnome.gtk.TreeModel`**
+* **`org.gnome.gtk.ListStore`**
+* **`org.gnome.gtk.TreeStore`**
+
+and minor changes to various other miscellaneous classes:
+
+* **`org.freedesktop.bindings.Environment`**
+* **`org.gnome.gtk.Expander`**
+* **`org.gnome.gtk.Frame`**
+* **`org.gnome.gtk.Paned`**
+* **`org.gnome.gtk.HPaned`**
+* **`org.gnome.gtk.VPaned`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.ProgressBar`**
+* **`org.gnome.gtk.Action`**
+
+Considerable internal optimizations have been done, especially relating to
+ensuring proper memory management, with notable refinements to make use  of
+"caller owns return" information available in the `.defs` data. This fixes a
+number of bugs. Thanks to Vreixo Formoso for having driven these improvements.
+
+Error handling has been improved for GLib based libraries as well. If an
+`ERROR` or `CRITICAL` is emitted, our internals will trap this and throw an
+exception instead, allowing the developer to see a Java stack trace leading
+them to the point in their code where they caused the problem.
+
+* **`org.gnome.glib.FatalError`**
+
+Internationalization support
+----------------------------
+
+java-gnome now has full support for the GNOME translation and localization
+infrastructure, including the standard `_("Hello")` idiom for marking strings
+for extraction and translation. There's a fairly detailed explanation in the
+[`Internationalization`](doc/api/4.1/org/freedesktop/bindings/Internationalization.html)
+utility class.
+
+* **`org.freedesktop.bindings.Internationalization`**
+
+Build changes
+-------------
+
+Note that as was advertised as forthcoming some time ago, Java 1.5 is now the
+minimum language level required of your tool chain and Java virtual machine in
+order to build and use the java-gnome library.
+
+Thanks to Colin Walters, Manu Mahajan, Thomas Girard, Rob Taylor, and Serkan
+Kaba for contributing improvements allowing the library to build in more
+environments and for their work on packages for their distributions.
+
+The [download](get/) page has updated instructions for getting either binary
+packages or checking out the source code.
+
+Documentation, examples, and testing
+------------------------------------
+
+Refinements to the API documentation continue across the board, notably
+improving consistency. A large number of javadoc warnings have also been
+cleaned up.
+
+While not a full blown tutorial, the number of fully explained examples is
+growing. There are examples for box packing and signal connection, presenting
+tabular data, and basic drawing, among others. See the description page in the
+[`doc/examples/`](doc/examples/START.html) section.
+
+This code, together with the not inconsiderable number of unit tests and the
+code for generating snapshots of Widgets and Windows means that a large
+portion of the public API is tested within the library itself. The number of
+non-trivial applications making use of java-gnome is starting to grow, which
+are likewise providing for ongoing validation of the codebase.
+
+Summary
+-------
+
+You can see the full changes accompanying a release by grabbing a copy of the
+sources and running:
+
+    $ bzr diff -r tag:v4.0.6..tag:v4.0.7
+
+Looking ahead
+-------------
+
+It's probably unwise to predict what will be in future releases. The challenge
+for anyone contributing is that they need to understand _what_ something does,
+_when_ to use it (and more to the point, when not to!), and be able to
+_explain_ it to others. This needs neither prior experience developing with
+GNOME or guru level Java knowledge, but a certain willingness to dig into
+details _is_ necessary.
+
+That said, I imagine we'll likely see further Cairo improvements as people
+start to use it in anger. It shouldn't take too long until the bulk of the
+functionality needed for most uses is present in java-gnome. In particular,
+forthcoming coverage of the Pango text drawing library will round things out
+nicely.
+
+There are a number of other major feature improvements we'd like to see in
+java-gnome. Conceptual and design work is ongoing on for bindings of GConf,
+GStreamer, and even support for applets. Within GTK, there have been a number
+of requests made for various things to be exposed, for example, the powerful
+GtkTextView / GtkTextBuffer text display and editing capability. Some of these
+have preliminary implementations; whether or not any given piece of work is
+acceptable in time for any particular future release will remain to be seen
+and depends on the willingness of clients to fund us to review and test such
+work.
+
+In the mean time, people are happily _using_ the library to develop rich user
+interfaces, which is, of course, the whole point. We're always pleased to
+welcome new faces to the community around the project. If you want to learn
+more, stop by `#java-gnome` and say hello!
+
+AfC
+
+<a name="debian" id="1208324712" title="Packaged in Debian Linux"></a>
+
+Debian packages
+===============
+
+The java-gnome bindings suite is now available in [Debian
+Linux](http://www.debian.org/) as
+
+ * `libjava-gnome-java`
+
+If you need help installing it, see the the Debian page in the
+[download](/get/debian.php) section here.
+
+Compliments to Manu Mahajan for having done the research to develop the Debian
+package, and thanks to Thomas Girard for having refined Manu's start and for
+having seen through the process of getting the package uploaded.
+
+AfC
+
+<a name="cairo" id="1207377494" title="Cairo"></a>
+
+Cairo support
+=============
+
+Adding coverage of the Cairo Graphics library is a feature we've been working
+on for about 6 months now, and during the 4.0.7 development cycle we've been
+able to land it in java-gnome!
+
+Cairo is a huge library, of course, but we've put enough coverage in place to
+ensure that things are working. Cairo has lots of convenience functions and
+tons of obscure uses; no surprise (and no apology) that there's still lots
+that will need doing. If you want to help make sure it has what you need, then
+grab '`mainline`' and see `org.freedesktop.cairo.`[`Context`][Context].
+
+Huge thanks go out to Behdad Esfahbod and Carl Worth; Behdad was really
+critical in explaining some basic Cairo concepts to me started when we were
+working together at the GNOME Summit back in October in Boston, and during March
+at the GTK hackfest in Berlin, Carl Worth was awesome for having checked our 
+preliminary APIs and for having helped sorted us out as we were working our
+way through create some examples.
+
+[Context]: doc/api/4.1/org/freedesktop/cairo/Context.html
+
+AfC
+
+<a name="4.0.6" id="1202791317" title="Missing"></a>
+
+java-gnome 4.0.6 (12 Feb 2008)
+==============================
+
+_Finding the missing methods._
+
+Most of our effort recently has simply been fleshing out areas of the
+public API. The focus for this work as been getting the coverage needed to
+allow us to port some of our in-house applications to java-gnome 4.0. It's not
+especially glamorous -- if anything it has been tedious as hell -- but the
+result has been a large body of improvements to java-gnome as a whole which
+we're pleased to release as java-gnome 4.0.6
+
+The bulk of this development took place on the '`missing`' branch, so named
+because that's where I was working on what was missing `:)`.
+
+Continuing Improvement
+----------------------
+
+Notable public changes include coverage additions to enable key stroke and
+mouse button handling:
+
+* **`org.gnome.gdk.Keyval`**
+* **`org.gnome.gdk.KeypadKeyval`**
+* **`org.gnome.gdk.EventKey`**
+* **`org.gnome.gdk.ModifierType`**
+* **`org.gnome.gdk.MouseButton`**
+* **`org.gnome.gdk.EventButton`**
+
+Rather than exposing the `int` keyvals that bubble up out of the X server, we
+have wrapped these as  constants of type
+[Keyval](doc/api/4.1/org/gnome/gdk/Keyval.html) (thereby being consistent with the
+rest of java-gnome in our working to the strengths of Java as a strongly-typed
+language; MouseButton was created for the same reason, helping developers
+understand just what on earth mouse button
+"[1](doc/api/4.1/org/gnome/gdk/MouseButton#LEFT)" is, anyway). Along with
+[ModifierType](doc/api/4.1/org/gnome/gdk/ModifierType.html), this gives enough to
+deal with the `KEY_PRESS_EVENT` and `KEY_RELEASE_EVENT` signals when the
+developer wishes to deal with key strokes.
+
+We've finally gotten around to providing proper coverage of the box packing
+model which underlies every aspect of how GTK presents user interfaces. To
+understand the size-request/size-allocation process, you might start with
+Widget's
+[`setSizeRequest()`](doc/api/4.1/org/gnome/gtk/Widget.html#setSizeRequest\(int,%20int\)).
+
+* **`org.gnome.gtk.Requisition`**
+* **`org.gnome.gtk.Allocation`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.Container`**
+* **`org.gnome.gtk.SizeGroup`**
+* **`org.gnome.gtk.SizeGroupMode`**
+
+We've also added coverage for SizeGroup, which, when used in concert with
+nested VBoxes and HBoxes, can work wonderful magic and is often far better
+than messing around with Table when doing complex layouts.
+
+After dithering for several releases, we've settled on how we're going to deal
+with ComboBox and family. The underlying GtkComboBox presents something of a
+nightmare as it is really two classes in one with more-or-less incompatible
+APIs. So, not surprisingly, we've presented it as two sets of classes, with the
+text-only convenience API spliced out of ComboBox and ComboBoxEntry into
+TextComboBox and TextComboBoxEntry respectively.
+
+* **`org.gnome.gtk.ComboBox`**
+* **`org.gnome.gtk.ComboBoxEntry`**
+* **`org.gnome.gtk.TextComboBox`**
+* **`org.gnome.gtk.TextComboBoxEntry`**
+
+We've added a few new features in our coverage of GTK's TreeView API, and many
+other classes involved have also seen improvements. The persistent reference to
+a row provided by TreeRowReference is now available as is model type
+TreeModelFilter.
+
+* **`org.gnome.gtk.TreeModel`**
+* **`org.gnome.gtk.ListStore`**
+* **`org.gnome.gtk.TreeIter`**
+* **`org.gnome.gtk.TreePath`**
+* **`org.gnome.gtk.TreeView`**
+* **`org.gnome.gtk.TreeViewColumn`**
+* **`org.gnome.gtk.TreeViewColumnSizing`**
+* **`org.gnome.gtk.TreeModelFilter`**
+* **`org.gnome.gtk.TreeRowReference`**
+* **`org.gnome.gtk.CellLayout`**
+* **`org.gnome.gtk.CellRenderer`**
+* **`org.gnome.gtk.CellRendererPixbuf`**
+* **`org.gnome.gtk.CellRendererText`**
+
+Support for the actual filtering in TreeModelFilter is notable for having been
+quite tricky. The underlying C library use a function pointers rather than a
+GObject signal emission, and we don't have any mechanism to handle that. We
+_do_, however, have a fantastic capability to marshal signals, so we dealt with
+the problem by creating a custom signal and then passing a function which emits
+it when the TreeModelFilter wants to ask the developer whether to include a row
+or not.
+
+The new classes include support for TreeModel columns storing `long` data as
+well as setting properties of that type:
+
+* `org.gnome.glib.Value`
+* `org.gnome.gtk.Value`
+* `org.gnome.gtk.Object`
+* **`org.gnome.gtk.DataColumnLong`**
+
+It should also be noted that most of the methods taking a TreeViewColumn have
+been converted to taking an argument of type CellLayout (an interface
+implemented by TreeViewColumn). This has no change to how you use our TreeView
+API, but was necessary to support ComboBox properly.
+
+Finally lots and lots of minor additions to both public APIs and internals
+deeper down in the GDK part of the toolkit:
+
+* **`org.gnome.gdk.Color`**
+* **`org.gnome.gdk.Cursor`**
+* **`org.gnome.gdk.CursorType`**
+* **`org.gnome.gdk.Pixbuf`**
+* **`org.gnome.gdk.Window`**
+* **`org.gnome.gtk.AboutDialog`**
+* **`org.gnome.gtk.Action`**
+* **`org.gnome.gtk.Box`**
+* **`org.gnome.gtk.Button`**
+* **`org.gnome.gtk.Calendar`**
+* **`org.gnome.gtk.Editable`**
+* **`org.gnome.gtk.Entry`**
+* **`org.gnome.gtk.EventBox`**
+* **`org.gnome.gtk.Image`**
+* **`org.gnome.gtk.IconSize`**
+* **`org.gnome.gtk.ImageMenuItem`**
+* **`org.gnome.gtk.Label`**
+* **`org.gnome.gtk.ScrolledWindow`**
+* **`org.gnome.gtk.Statusbar`**
+* **`org.gnome.gtk.Table`**
+* **`org.gnome.gtk.Window`**
+
+As ever, you can see the full changes accompanying a release by
+grabbing a copy of the sources and running:
+
+    $ bzr diff -r tag:v4.0.5..tag:v4.0.6
+
+Documentation
+-------------
+
+We've always had HTML JavaDoc for the current stable release at
+[`doc/api/`](doc/api/4.1/overview-summary.html) on the java-gnome website.
+We're going to change that a bit, though. As fixes to the explanatory
+documentation happen quite frequently to classes and methods all over the
+place, we've decided to generate the JavaDoc from '`mainline`' periodically and
+upload that instead. This means that there will, of course, be descriptions of
+some methods which aren't yet available in a released version of the library,
+but they will clearly identifiable by virtue of having a `@since` tag showing
+a version number greater than the most recent release.
+
+The idea of having up-to-date illustrations of the various Widgets has proved
+popular, and we've continued to update the suite of snapshots. Doing that 
+is _also_ tedious, but it does provide a good opportunity to test APIs we are
+exposing especially where unit tests are less suitable.
+
+![Statusbar](doc/api/4.1/org/gnome/gtk/Statusbar.png)
+
+Looking ahead
+-------------
+
+Almost as complex as the TreeView/TreeModel API are GTK's powerful
+TextView/TextModel classes, collectively a Widget used to display and edit
+large text documents. Working out the java-gnome coverage for TextView will
+take a fair bit of consideration, but TreeView provides a road map, and, as
+with the coverage in 4.0.5 and 4.0.6 (which was driven largely by existing
+applications we were porting), we have some significant uses of GtkTextView
+which will guide us on our way.
+
+The next release will also feature significant work outside of GTK; we should
+be in a position to merge our coverage of the excellent Cairo drawing library
+soon, and likewise we have tentative work in place letting people store
+configuration and settings data in GConf. Both the '`cairo`' and '`gconf`'
+branches need more QA and documentation work, but they're looking good and will
+definitely be featured in java-gnome 4.0.7.
+
+AfC
+
+<a name="4.0.5" id="1196060444" title="TreeView is here"></a>
+
+java-gnome 4.0.5 (26 Nov 2007)
+==============================
+
+_TreeView is here!_
+
+It's always a great feeling when you bag a milestone, and with this release we
+have reached a major goal on our way to having outstanding Java bindings for
+the GNOME platform: coverage of GTK's powerful yet complex TreeView &
+TreeModel API.
+
+TreeView
+--------
+
+TreeViews are a central part of almost every application. GUIs use lists for
+all sorts of things, and so a significant goal was to make coding TreeViews
+and their backing TreeModels as straight forward as possible.
+
+The most challenging and complex part was to design the Java side API, which
+was no small matter. As a native library, the GtkTreeView API is complex and
+very much written with programming in the C language in mind, and as such our
+algorithmic mapping of the underlying libraries into Java doesn't entirely
+fit. Long experience with the TreeViews in the previous bindings had made it
+clear just how nasty to use the API could be, and so the hardest part of the
+work was to come up with a mapping and a usage pattern that would be both
+faithful to GTK _and_ be sensible to use.
+
+The other significant challenge was to document the work effectively. Our Java
+side API documentation is a major feature of java-gnome, and merely exposing
+classes and methods is not sufficient; they need to be clearly explained in
+our JavaDoc as well. Introduced in this release, then, are:
+
+* **`org.gnome.gtk.TreeView`**
+* **`org.gnome.gtk.TreeViewColumn`**
+* **`org.gnome.gtk.CellRenderer`**
+* **`org.gnome.gtk.CellRendererText`**
+* **`org.gnome.gtk.CellRendererPixbuf`**
+* **`org.gnome.gtk.TreeSelection`**
+* **`org.gnome.gtk.SelectionMode`**
+* **`org.gnome.gtk.TreeModel`**
+* **`org.gnome.gtk.ListStore`**
+* **`org.gnome.gtk.TreeIter`**
+* **`org.gnome.gtk.TreePath`**
+* **`org.gnome.gtk.Alignment`**
+
+along with numerous test cases in our unit test suite, and several
+comprehensively worked [examples][example-treeview].
+
+This was a monster patch, and the culmination of not just three months direct
+effort, but also where we've been heading since we first started the
+re-engineering of Java bindings for GNOME. Although largely written by Andrew
+Cowie, a _significant_ contribution was made by Srichand Pendyala who not only
+exhaustively evaluated the design but also threw in some serious chunks of
+code. The work benefited from comprehensive input from Peter Miller on the
+modelling and design, and the comments of Bryan Clark, Owen Taylor, and Hanna
+Wallach were all really positive and helped us know that we'd gone in the
+right direction. Finally, thanks to Behdad Esfahbod and the GNOME Foundation
+who made it possible for us to meet in Boston at the GNOME Summit and so
+accomplish much of the final pulling together of this branch.
+
+Continuing Improvement
+----------------------
+
+Meanwhile, steady work continues on to the fundamental base classes, with a
+whack of additional signals and methods on Widget and especially Window, along
+with expansion of coverage in numerous other classes:
+
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.Window`**
+* **`org.gnome.gtk.StateType`**
+* **`org.gnome.gdk.Color`**
+* **`org.gnome.gdk.VisibilityState`**
+* **`org.gnome.gdk.EventVisibility`**
+
+What else? We've begun to get the basics of image handling in place,
+
+* **`org.gnome.gdk.Pixbuf`**
+* **`org.gnome.gtk.Image`**
+* **`org.gnome.gtk.ImageMenuItem`**
+
+One nice piece of contributed work came from Vreixo Formoso and Thomas Schmitz
+with coverage of the Dialog Window functionality in GTK. It took a bit of
+doing to map the `int` response codes used by GTK into something suitably
+strongly-typed, but all good:
+
+* **`org.gnome.gtk.Dialog`**
+* **`org.gnome.gtk.ResponseType`**
+* **`org.gnome.gtk.MessageDialog`**
+* **`org.gnome.gtk.MessageType`**
+* **`org.gnome.gtk.ButtonsType`**
+* **`org.gnome.gtk.FileChooserDialog`**
+
+And finally, minor improvements to all sorts of stuff:
+
+* **`org.gnome.gtk.Container`**
+* **`org.gnome.gtk.Button`**
+* **`org.gnome.gtk.Box`**
+* **`org.gnome.gtk.Bin`**
+* **`org.gnome.gtk.Menu`**
+
+notably from new contributor Mario Torre. Awesome!
+
+For further details you can always grab a copy of the sources and run
+
+    $ bzr diff -r tag:v4.0.4..tag:v4.0.5
+
+to see the complete code delta.
+
+Screenshots
+-----------
+
+<img src="doc/api/4.1/org/gnome/gtk/Window.png" alt="" style="float: right;
+text-align: right; padding-left: 15px;" /> For fun we built in a capability to
+create demonstrations to be captured as screenshots to illustrate various
+things. It doesn't get more basic than the example on the
+[`Window`][api-Window] documentation page, but it's a nice touch. `:)` We've
+screenshots for a number of Dialog classes and one for the TreeView page. I
+imagine we'll build up a nice library of images in the next few months (yes,
+dear contributors, you can add snapshots to the list of things we'll be
+expecting along with well written documentation and unit tests when submitting
+additions to the public API).
+
+Building and requirements
+-------------------------
+
+The library now depends on GTK >= 2.12. Those packaging java-gnome for their
+distributions please take note.
+
+Looking ahead
+-------------
+
+Continuing to expand the coverage levels in the classes already exposed will
+continue to dominate our attention; there's still a long way to go but we're
+pleased with the progress we've made so far; you can definitely build real
+applications with java-gnome now.
+
+The next release also ought to include preliminary coverage of GConf and
+Cairo. Doing each justice will again take a serious amount of work, but will
+continue to grow the fun things you can do with java-gnome.
+
+AfC
+
+[example-treeview]: http://research.operationaldynamics.com/bzr/java-gnome/mainline/doc/examples/treeview/ExampleTrailHeads.java
+[api-window]: doc/api/4.1/org/gnome/gtk/Window.html
+
+<a name="arch" id="1195662600" title="Packaged in Arch Linux"></a>
+
+Arch packages
+=============
+
+java-gnome now builds on [Arch Linux](http://www.archlinux.org/) and is
+packaged there. Thanks to Timm Preetz for having done the legwork for this!
+
+AfC
+
+<a name="treeview" id="1194509646" title="Trees and Branches"></a>
+
+Trees and Branches
+==================
+
+Lots of ongoing work.
+
+The major focus over the last three months has been on the '`treeview`' branch.
+Andrew Cowie, backed by Srichand Pendyala, has made awesome progress in working
+out the engineering necessary to support GTK's powerful but complex
+TreeView/TreeModel system and designing an appropriate public API by which
+java-gnome can present it. This has taken most of September and October but is
+working really well at this point. This branch should be ready for merging to
+'`mainline`' in the next week or two; just need to bring the documentation up
+to release quality and we're set.
+
+Vreixo Formoso and Thomas Schmitz have done some great work to expose the
+Dialog family of classes. This work has exposed a few bugs in our internals,
+but thanks to some expert help from Owen Taylor we should have that sorted out
+soon. Work to fix that is taking place on the '`delete`' branch.
+
+Andrew Cowie, helped by Behdad Esfahbod, has begun work on a binding of the
+Cairo library. This work is still experimental at this stage, but we'll merge
+this '`cairo`' branch in so we can to at least set the tone for what will be an
+exciting addition to java-gnome over the coming months.
+
+Once we land these branches we should be able to polish things up for the
+release of 4.0.5, hopefully by the end of November.
+
+AfC
+
+<a name="4.0.4" id="1190798858" title="Coverage increasing"></a>
+
+java-gnome 4.0.4 (26 Sep 2007)
+==============================
+
+_Coverage increasing!_
+
+Most of our work continues to be on infrastructure and architecture, improving
+the code generator that outputs the translation Java layer and JNI C layer
+which allow bindings hackers to reach the underlying native libraries.
+Nevertheless, there have been a number of publicly visible improvements across
+the board, so we wanted to push out a release highlighting these contributions!
+
+Documentation improvements
+--------------------------
+
+Continuing our effort to have extensive developer friendly tutorial style
+documentation, there have been major additions to a number of existing classes.
+Of particular note is the Window class, containing the various utility methods
+used to ask the window manager to do things for you (we've also started
+exposing some of the deeper parts of the GTK toolkit, though only a few things
+that were immediately related to window management).
+
+* **`org.gnome.gtk.Window`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gdk.Screen`**
+* **`org.gnome.gdk.Window`**
+
+While the topic of thread safety was discussed at considerable length in the
+last release, we have added some of the more relevant information to the code
+documentation to reinforce its importance.
+
+* **`org.gnome.gdk.Gdk`**'s `lock`
+
+New coverage
+------------
+
+Numerous people have been hard at work developing new coverage. The standards
+for accepting patches which expose public API are high, so it's awesome to see
+bundles accepted for being merged to `mainline` from new contributors Thomas
+Schmitz, Wouter Bolsterlee, and Nat Pryce.
+
+The infrastructure for a number of areas important to supporting applications
+including Menus, Toolbars, and Actions has been put in place:
+
+* **`org.gnome.gtk.Toolbar`**
+* **`org.gnome.gtk.ToolItem`**
+* **`org.gnome.gtk.ToolButton`**
+* **`org.gnome.gtk.ToggleToolButton`**
+* **`org.gnome.gtk.MenuToolButton`**
+* **`org.gnome.gtk.SeparatorToolItem`**
+* **`org.gnome.gtk.MenuItem`**
+* **`org.gnome.gtk.CheckMenuItem`**
+* **`org.gnome.gtk.SeparatorMenuItem`**
+* **`org.gnome.gtk.Action`**
+* **`org.gnome.gtk.ActionGroup`**
+
+A number of Container related Widgets have been added, though coverage is
+preliminary. There have, of course, also been a number of minor improvements in
+other existing classes, including:
+
+* **`org.gnome.gtk.Notebook`**
+* **`org.gnome.gtk.ScrolledWindow`**
+* **`org.gnome.gtk.Misc`**
+* **`org.gnome.gtk.ButtonBox`**
+* **`org.gnome.gtk.HButtonBox`**
+* **`org.gnome.gtk.VButtonBox`**
+* **`org.gnome.gtk.Label`**
+
+and even:
+
+* **`org.gnome.gtk.StatusIcon`**
+
+Along with these goes a variety of miscellaneous constants and wrappers around
+the stock item identifiers:
+
+* **`org.gnome.gtk.Alignment`**
+* **`org.gnome.gtk.ImageType`**
+* **`org.gnome.gtk.ButtonBoxStyle`**
+* **`org.gnome.gtk.Justification`**
+* **`org.gnome.gtk.Orientation`**
+* **`org.gnome.gtk.Stock`**
+* **`org.gnome.gdk.Gravity`**
+
+Internals
+---------
+
+Vreixo Formoso carried out an important refactoring to the type database and
+Generator family of classes in the code generator, with the result that more of
+the array passing and out-parameter cases are now being handled correctly. This
+kind of work is usually thankless and taken for granted, but it's hugely
+appreciated!
+
+The real gains are in internal quality. A number of serious bugs and
+limitations have been overcome (`Glade` is working again, for example). The
+generated code now guards against improper use (you can't pass a `null` pointer
+unless it's allowed by the underlying library). Related to this is handling of
+"`GError`" -- Java side, bindings hackers will get `GlibException` which they
+can then re-throw as an appropriate Java Exception, say `FileNotFoundException`
+in the case of not being able to open a file.
+
+This all goes along with numerous build system fixes by Srichand Pendyala to
+make for an increasingly robust project. Thanks guys!
+
+Looking ahead
+-------------
+
+As mentioned above, we have mostly been focused on areas other than public API,
+but it is expanding steadily. The hard work on infrastructure, however, is
+starting to pay off, and the next release should include coverage of TreeView,
+GTK's powerful but complex list Widget.
+
+AfC
+
+<a name="gentoo" id="1187677072" title="Packaged in Gentoo Linux"></a>
+
+Gentoo packages
+===============
+
+The java-gnome bindings suite is now available in [Gentoo
+Linux](http://www.gentoo.org/). An `.ebuild` for 4.0.3 has been merged to
+Portage in
+
+ * `dev-java/java-gnome`
+
+If you need help installing it, see the the Gentoo page in the 
+[download](/get/gentoo.php) section here.
+
+Thanks to the people who pushed this through: Xerces MC for having submitted an
+initial `.ebuild`, Petteri Räty (Gentoo dev and Java team lead) for having
+fixed it up, and Christoph Brill for testing.
+
+AfC
+
+<a name="4.0.3" id="1185883828" title="Code generator landed"></a>
+
+java-gnome 4.0.3 (31 Jul 2007)
+==============================
+
+_The code generator has landed!_
+
+
+Work has been underway for several months to develop the next stage of the new
+java-gnome: the code generator that will output the tedious translation and
+native layers that allow us to glue our public API to the native GNOME
+libraries. With this release we're pleased to announce that the code generator
+is a reality!
+
+Generated translation and JNI layers
+------------------------------------
+
+The primary goal of the java-gnome 4.0 re-engineering effort has been to switch
+to an architecture whereby we could _generate_ the bulk of the machinery
+necessary to take make native calls into the GNOME libraries from Java.
+
+Extensive prototyping was done to establish the detailed design and to validate
+the architecture we had developed. Releases 4.0.0 through 4.0.2 contained this
+work along with mockups of the "translation" layer (the Java code that
+downshifts from our Proxy objects to primitives suitable to pass over the JNI
+boundary, along with the `native` declarations necessary in order to call
+methods actually written in C) and of the "JNI layer" (the C code that
+implements the methods declared in the translation layer which in turn coverts
+parameters into GLib terms and then makes the actual function call into the
+appropriate GNOME library).
+
+With a solid foundation proving that our design was sound, we subsequently
+began the long effort to implement a code generator which would output these
+Java and C layers, allowing us to replace the `mockup/` directory and at last
+leave behind the shackles of entirely hand written bindings. Over the past five
+months, the java-gnome hackers have been steadily working on the 'codegen'
+branch. The nature of the challenge meant that we had to have most of the code
+in place before any of it would be useful -- never an enviable task to be
+working on. Thanks to the hard work of Andrew Cowie, Vreixo Formoso Lopes, and
+Srichand Pendyala, we reached the point  where the output Java code compiled in
+May, and the output C code successfully compiled in by the end of June.
+Tremendous.
+
+We've been bug hunting and refining since then, pushing towards the point where
+we could merge back to 'mainline', at last replacing the hand written mockup
+code. We are today pleased to announce the culmination of that work with the
+release of java-gnome 4.0.3.
+
+_This post on the [development of the java-gnome code generator][codegen]
+contains further details should you be interested; the file
+[5a-Architecture.txt][architecture] in the `doc/design/` directory of the
+source code explains the rationale and origin of the engineering design._
+
+New coverage
+------------
+
+Although our focus has evidently been on getting the generator into working
+order, there have nevertheless been a few minor coverage additions along the
+way:
+
+* **`org.gnome.gtk.Entry`**
+* **`org.gnome.gtk.Separator`**
+* **`org.gnome.gtk.HSeparator`**
+* **`org.gnome.gtk.VSeparator`**
+* **`org.gnome.gtk.Frame`**
+* **`org.gnome.gtk.Calendar`**
+* **`org.gnome.gtk.Notebook`**
+* **`org.gnome.gtk.Image`**
+* **`org.gnome.gtk.Menu`**
+* **`org.gnome.gtk.MenuBar`**
+* **`org.gnome.gtk.MenuItem`**
+* **`org.gnome.gtk.ToggleButton`**
+* **`org.gnome.gtk.CheckButton`**
+
+which are largely to the credit of Sebastian Mancke for having submitted them
+and Srichand Pendyala for having fixed up their JavaDoc. There have also been
+steady improvements to a number of other classes; notably further signals and
+utility methods exposed in:
+
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.Container`**
+
+along with some preliminary coverage of the lower level GDK event machinery:
+
+* **`org.gnome.gdk.Event`**
+* **`org.gnome.gdk.EventType`**
+
+As is reasonable given our focus on writing the actual translation and JNI
+layer generators, most of these present only one or two methods from the
+underlying native class. Coverage will steadily improve as people contribute
+their knowledge and experience in documentation form.
+
+_People upgrading from 4.0.2 will actually notice that there are stubs for
+**all** of the public API classes; this was necessary to make the generated
+code compile. Most of these are empty as yet._
+
+GList and friends
+-----------------
+
+`GList` and `GSList` are the native GLib data structures used to represent
+lists and are the return type from quite a few methods across GTK. Vreixo
+Formoso Lopes worked out how to handle and working our wrap/unwrap functions
+for us to use in the JNI layer made a significant contribution to reducing our
+blacklisted method count.
+
+Flags
+-----
+
+We've also worked out handling of native types that, while type defined as
+enums, are actually bit fields. These are used occasionally in GTK to express
+options; two examples now exposed are:
+
+* **`org.gnome.gtk.CalendarDisplayOptions`**
+* **`org.gnome.gdk.WindowState`**
+
+Flags subclasses present an `or()` function allowing you to combine individual
+Flags constants into a new composite Flags object. Yes it's a lot of machinery
+to do a logical `|`, but being strongly typed is a hallmark of java-gnome.
+
+Build improvements
+------------------
+
+No release would be complete without mentioning that the code builds on more
+systems than it did before! Thanks to Maciej Piechotka and Srichand Pendyala
+for fixing problems resulting from Debian and Ubuntu strangeness.
+
+The build internally now uses an optimized script that takes into account that
+even though the code generator may have run the translation and jni files may
+not actually be different. This was causing problems as Make only looks at file
+modification time. Instead, `build/faster` (great name, huh?) will only rebuild
+a target when source contents have changed. This was necessary for bindings
+hackers working in Eclipse; every time a file was saved Eclipse would merrily
+spawn off an auto-build which sooner or later would block the IDE UI. Yuk.
+Addressing this has also resulted in a faster build for everyone; all good.
+
+The internal build script _should_ be transparent; you still run `./configure`
+and `make` as before. If you experience problems let us know.
+
+Thread safety
+-------------
+
+In addition to the code generator, java-gnome 4.0.3 incorporates a
+comprehensive thread safety strategy. 
+
+None of the major Java graphical toolkits out there let you make GUI calls from
+threads other than the "main" one; they're all single threaded. Even if all you
+want to do is a quick worker thread to carry out some input validation in the
+background after the user presses "OK", you have to jump through horrific
+contortions to do so safely, resulting in cumbersome, clunky code.
+
+By contrast, the new Java bindings of GTK presented in java-gnome are
+**transparently thread safe**, the first and only graphical user interface
+widget toolkit for Java to be so! We integrate properly with the underlying GDK
+thread lock and as a result you can safely make calls to various GTK methods
+from worker threads! This has been a long sought after goal and we hope a
+significant contribution to helping developers write elegant code.
+
+Every call made to the native libraries is protected by entering the "GDK lock"
+[that's `gdk_threads_enter/leave()` for those familiar with the C side of
+things]. The lock used is actually a Java side `synchronized` monitor and
+therefore reentrant; nested calls all behave properly. When in a signal handler
+callback the GDK lock is already held (you're "in" the main loop when a
+callback happens), but since it just works transparently you don't need to
+worry about it. If you do find a need to take the lock into account explicitly
+in your own code, see `Gdk.lock` in `org.gnome.gdk`.
+
+_It is worth noting that we have been warned that there are certain to be
+places in the underlying libraries that do not yet live up to the requirements
+of the GDK threads model -- thus we will likely end up tripping over such
+things as we slowly add API coverage. We regard such inevitable instances as an
+opportunity to help contribute to improving the stability of the underlying
+libraries and will actively work with their maintainers to identify and resolve
+such issues. Nevertheless, in testing thus far our multi-threaded use of GTK
+has been rock solid. See these posts on [GTK thread
+"awareness"][gtk-thread-awareness] and [java-gnome's thread
+strategy][java-gnome-thread] if you wish further details on our approach to the
+thread safety question._
+
+Thanks in particular to Owen Taylor for having helped us navigate these waters!
+
+Looking ahead
+-------------
+
+Taken together, these innovations represent the culmination of an immense
+amount of work towards realizing java-gnome as a viable platform for GTK and
+GNOME development.
+
+Obviously with the generated translation layer in place the opportunity at last
+exists to start dramatically improving our coverage level, and we welcome
+contributions to this end. Prospective hackers are cautioned, however, that
+simply wrapping generated methods is insufficient -- public API will only be
+added when it is clearly documented and meets the [approachability][objectives]
+criterion.
+
+There are still areas where the code generator needs to be improved; we need to
+improve our handling for arrays, lists, and out-parameters -- there are
+numerous permutations with all sorts of ugly corner cases.
+
+Now that Free Java with support for generics is becoming widely available,
+4.0.3 will be the last release holding the language level to Java 1.4; starting
+the next cycle 1.5 will be the minimum language requirement and we will be
+leveraging generics and other 1.5 features from here on.
+
+Most importantly, the primary focus of the next few months will be developing a
+quality binding for the backbone of many applications: the `TreeView` Widget
+and the underlying `TreeModel` which powers it. The APIs in the native library
+is hideously complicated and has long been the source of confusion and pain for
+developers in C; it has long been a major goal amongst the java-gnome hackers
+to present a public API with as friendly and usable an interface as possible.
+It'll be a good challenge.
+
+AfC
+
+[architecture]: /doc/design/5a-Architecture.html
+[codegen]: http://research.operationaldynamics.com/blogs/andrew/software/java-gnome/code-generator-cometh.html
+[objectives]: /objectives.php
+[gtk-thread-awareness]: http://research.operationaldynamics.com/blogs/andrew/software/gnome-desktop/gtk-thread-awareness.html
+[java-gnome-thread]: http://research.operationaldynamics.com/blogs/andrew/software/java-gnome/thread-safety-for-java.html
+
+
+<a name="4.0.2" id="1171283501" title="End of the beginning"></a>
+
+java-gnome 4.0.2 (12 Feb 2007)
+==============================
+
+_The End of the Beginning!_
+
+Major bugfixes and refactorings
+-------------------------------
+
+Setting and getting properties on GObjects requires some tricky manoeuvring.
+We implemented the code to do this early on, and it looked like our general
+mechanism for getting Proxy instances for arbitrary pointers was working  fine
+for properties. It turns out, however, that when you call `g_type_name()` on a
+GValue _containing_ a GObject, it returns the name of the type that was listed
+when the property specification was registered, rather than saying it is a
+GValue (as you might expect) or what the object actually is (that you might
+_also_ reasonably expect).
+
+This led to all kinds of nastiness since the type name was what we were using
+in our `instanceFor()` mechanism to discriminate (on the Java side) what kind
+of Proxy subclass to create. The example we tripped over was asking for the
+parent property of a Button packed into a VBox. What `g_type_name()` told us
+was "GtkContainer", not "GtkVBox"! And that was a big problem, because
+Container is abstract, and besides, we want to instantiate a concrete VBox
+Proxy, not a Container one!
+
+Solving the problem involved major changes to:
+
+ * **`org.gnome.glib.Value`**
+ * **`org.gnome.glib.Object`**
+ * `org.gnome.glib.Plumbing`
+ * `org.gnome.glib.GValue`
+ * `org.gnome.glib.GObject`
+
+The solution basically boiled down to having two separate code paths: one
+named `objectFor()` [a greatly simplified version of the previous
+`instanceFor()`] which returns normal Proxy objects for GObject subclasses
+(Buttons and Labels and whatnot), and a new code path available via
+`valueFor()` to specifically return our GValue Proxy for the cases where we
+know we're getting a GValue back. Since that occurs in limited and known
+circumstances only (ie, when we're getting properties) it's no problem to know
+which to use when.
+
+Thanks to Davyd Madeley for extensive debugging assistance, and credit to
+Manish Singh, James Henstridge, and Malcolm Tredinnick for having analyzed the
+root cause issue and having clarified that two code paths would indeed be
+necessary.
+
+As often happens when you kick a stone loose, we were able to do a number of
+refactorings to clean things up. This eventually led to the realization (ok,
+epiphany) that our treatment of the GValue mechanism was needlessly complex.
+Toss. We no longer have individual Value subclasses for each different
+fundamental type, but rather just leave them as opaque references:
+
+ * <span style="text-decoration: line-through;">
+   `org.gnome.glib.Fundamental`
+ * <span style="text-decoration: line-through;">
+   `org.gnome.glib.StringValue`  
+ * <span style="text-decoration: line-through;">
+   `org.gnome.glib.BooleanValue`
+ * <span style="text-decoration: line-through;">
+   `org.gnome.glib.IntegerValue`
+ * <span style="text-decoration: line-through;">
+   `org.gnome.glib.EnumValue`
+ * <span style="text-decoration: line-through;">
+   `org.gnome.glib.ObjectValue`
+ * **`org.gnome.glib.Value`**
+ * `org.gnome.glib.Plumbing`
+
+This allowed a further simplification of the `valueFor()` mechanism and even
+more smashing about in Plumbing with a chainsaw. Net result was a _reduction_
+by several hundred lines of code. Yeay!
+
+All of these changes were confined to the internals of the binding machinery
+and are not user visible.
+
+Loading `.glade` files
+----------------------
+
+User interface designers are nothing new, but one of the really cool things
+about GTK has long been the existence of `libglade`. It's a library which
+takes the output of a one of the GNOME user interface designers (such as such
+as **Glade 3** or **Gazpacho**) and dynamically, at runtime, generates live
+Windows full of Widgets!
+
+With the arbitrary Proxy retrieval sorted out, the beginnings of a binding of
+`libglade` was possible. None of the fancy stuff is there yet, but a `.glade`
+file can be loaded, and Widgets retrieved from the instantiated tree.
+
+* **`org.gnome.glade.Glade`**
+* **`org.gnome.glade.Xml`**
+* _`org.gnome.glade.GladeXml`_
+
+The JavaDoc for these classes clearly indicates that this is preliminary and
+subject to change. It may well all be blown away when GtkBuilder lands. We'll
+see.
+
+Testing framework
+-----------------
+
+We've introduced the beginnings of a unit test framework. At the moment, this
+just evaluates various getters and setters without doing anything that
+requires the main loop. Despite this, the unit tests end up exercising the
+entire Proxy system discussed above; validating that the properties set and
+get and that the correct Proxy object is returned through a round trip is no
+mean feat.
+
+You can run the suite from Eclipse, by specifying a JUnit 3 launcher on class
+UnitTests in the default package in `tests/java`, or by running 
+
+	$ make test
+
+from the command line.
+
+Further coverage
+----------------
+
+This release also sees the addition of:
+
+* **`org.gnome.gtk.FileChooser`**
+* **`org.gnome.gtk.FileChooserAction`**
+* **`org.gnome.gtk.FileChooserButton`**
+
+Along with mocked up code for:
+
+* _`org.gnome.gtk.GtkFileChooser`_
+* _`org.gnome.gtk.GtkFileChooserAction`_
+* _`org.gnome.gtk.GtkFileChooserButton`_
+
+This is significant because GtkFileChooser is an _interface_ in GTK, and
+GtkFileChooserButton implements it. We'd been putting off the question of
+dealing with GInterface (would it work or be a major problem?) for a while
+now. We were delighted to find that the design implied by the re-engineered
+bindings handled it cleanly, elegantly, and without any fuss. Another nice
+validation of our new architecture.
+
+Finally, a number of new signals were exposed on: 
+
+* **`org.gnome.gtk.Widget`**
+
+though these were mostly the result of doing live demonstrations at
+conferences of how easy extending the coverage of the new bindings is.
+
+Memory management
+-----------------
+
+We have successfully implemented full GObject memory management in java-gnome
+4.0 using GLib's ToggleRef mechanism.
+
+A strongly referenced Java Proxy will not allow its GObject to be destroyed
+out from underneath it; meanwhile, as long as the GObject is still referenced
+by something other than java-gnome, an otherwise only weakly reachable Java
+object that Proxies it will not be finalized. When the situation _does_ occur
+whereby the GObject is only referenced from java-gnome, and the Java object is
+no longer strongly referenced by any other Java objects, then the Java object
+can be garbage collected and the GObject will be unref()'d and destroyed.
+
+You can watch the reference system in action if you set
+`Debug.MEMORY_MANAGEMENT` to `true`.
+
+Huge thanks go to Vreixo Formoso Lopes who collaborated on the design,
+reviewed the implementation, and contributed test case code.
+
+Build system improvements
+-------------------------
+
+A better detection of jni.h is done on Ubuntu, thanks to Michael Kedzierski.
+This makes java-gnome more likely to build out of the box on Debian-derived
+systems.
+
+On the eve of release, Srichand Pendyala noticed that if you are running such
+a system, a package named `libglade-dev` needs to be installed. Of course, on
+more modern systems all the necessary dependencies are present merely by
+having GNOME installed in the first place. We'll add a check for this Debian
+specific behaviour in 4.0.3.
+
+The `VERSION` and `APIVERSION` constants were moved to
+
+* `org.gnome.gtk.Version`
+
+so that anyone working on the Gtk main class isn't forced to do a
+re-configuration every time they save.
+
+Installation and Packaging
+--------------------------
+
+java-gnome 4.0 now has the standard `make install` command, and the equally
+standard `--prefix` option to `./configure`.
+
+	$ ./configure --prefix=/usr
+	$ make
+	$ sudo make install
+
+The `install` target understands the `DESTDIR` variable used by packagers to
+install to a specified prefix _within_ a temporary directory.
+
+See the [`README`](README.html) file for details.
+
+Looking ahead
+-------------
+
+The feature additions described above were done to bring java-gnome up to
+speed for the GTK & GNOME tutorial given at [linux.conf.au][LCA]. With that
+past, we're not going to do any more manual mockups of code in what will be
+the generated layers. Focus now turns to designing and implementing the tool
+that will parse `.defs` files and output the translation code.
+
+Once we secure funding for the project, the code generator will be our top
+priority and shouldn't take more than a couple months to complete.
+
+AfC
+
+[LCA]: http://lca2007.linux.org.au/talk/258
+
+
+<a name="4.0.1" id="1167969613" title="Prototype becomes foundation"></a>
+
+java-gnome 4.0.1 (05 Jan 2007)
+==============================
+
+_It's not really a prototype anymore! the design works, and so the code that
+is here is forming the foundation of the new Java bindings for GTK and GNOME._
+
+While there are some significant pieces of engineering that are yet to be
+done, and of course a universe of coverage yet to write, we're pleased to mark
+the milestone of the prototype having proved itself to be stable and the
+strong foundation that we need. In this release:
+
+Project documentation
+---------------------
+
+Import project documentation, initially consisting of the re-engineering
+emails written by Andrew Cowie to the java-gnome-hackers mailing list, and
+expanded to include top level [`README`](README.html) and
+[`HACKING`](HACKING.html) files, and a style guide for contributors to follow.
+All documentation [re]formatted in Markdown syntax so as to be renderable to
+web pages. See [`doc/design/`](doc/design/START.html) and
+[`doc/style/`](doc/style/).
+
+Project website
+---------------
+
+Create an entirely new website for <http://java-gnome.sourceforge.net/>,
+introducing sections "[About](/about/)", "[Documentation](/doc/)",
+"[Download](/get/)" and "[Interact](/lists/)" to discuss the the
+project as a whole, to be a home for the documentation, to provide
+instructions on how to get java-gnome, and information about the mailing lists
+and IRC channel, respectively.
+
+The website is no longer a wiki but is entirely within the source code of
+java-gnome itself. See the `web/public/` directory; improvements welcome.
+
+Major engineering
+-----------------
+
+Quite significantly, the infrastructure to get a Proxy or Constant instance
+for any arbitrary C side pointer or enum is complete, involving _significant_
+work to:
+
+ * `org.freedestkop.bindings.Plumbing`
+ * **`org.freedestkop.bindings.Proxy`**
+ * **`org.freedestkop.bindings.Constant`**
+ * `org.gnome.glib.Plumbing`
+ * **`org.gnome.glib.Value`**
+ * `org.gnome.glib.GValue`
+ * `org.gnome.glib.Fundamental`
+ * **`org.gnome.glib.Object`**
+
+Along with the corresponding C side code, especially in `GValue.c`
+
+This was a necessary building block in order to complete the generalized
+`getProperty()` mechanism that, while hidden from public view, is nevertheless
+a major aspect of the GObject tool chest and is usable by bindings hackers
+when necessary. The generalized instance mechanism was the last major
+engineering hurdle that needed to be achieved in order to prove the new
+bindings design.
+
+New coverage
+------------
+
+* **`org.gnome.gtk.Label`**
+* **`org.gnome.gtk.Fixed`**
+* **`org.gnome.gtk.Box`**
+* **`org.gnome.gtk.VBox`**
+* **`org.gnome.gtk.HBox`**
+
+Along with
+
+* _`org.gnome.gtk.GtkLabel`_
+* _`org.gnome.gtk.GtkFixed`_
+* _`org.gnome.gtk.GtkBox`_
+* _`org.gnome.gtk.GtkVBox`_
+* _`org.gnome.gtk.GtkHBox`_
+
+And corresponding [working] mockup native code.
+
+Compliments to Srichand Pendyala from Bangalore, India for being the first
+external hacker to have a patch accepted to mainline! He contributed methods
+to Label and initiated the implementation of the Fixed class. In so doing, he
+also helped work the bugs out of the `bzr bundle` submission process. Awesome.
+
+Build improvements
+------------------
+
+java-gnome now builds on Ubuntu and OpenSolaris in addition to its home turf
+of Gentoo. Thanks to John Rice of Sun Microsystems who provided the guidance
+allowing us to port Equivalence to Solaris some months ago, and Laszlo Peter,
+also of Sun Ireland, for several fixes to allow configure to recognize a wider
+range of Solaris environments.
+
+The tiny example program that we have been using to validate the code,
+`Experiment` is now compiled by the build system if you so request. Try `make
+demo`.
+
+API documentation
+-----------------
+
+Extensive attention has been paid to the JavaDoc for the few methods that are
+presented so as to clearly set the standard required. The canonical JavaDoc
+for the project is available at the website with a stable URL and can be
+linked to.
+
+All source code [comments, ie JavaDoc] have been spell checked! Initial top
+level `overview.html` and `package.html` files have also been written to help
+round out the JavaDoc.
+
+AfC
+
+
+<a name="4.0.0" id="1164533400" title="First public demonstration"></a>
+
+java-gnome 4.0.0 (26 Nov 2006)
+==============================
+ 
+_Initial release of the java-gnome 4.0 prototype, corresponding to the first
+public demonstration of the new bindings done at
+[foss.in/2006](http://foss.in/2006/) at Bangalore, India._
+
+The prototype is fully functional and is intended to prove the design and
+architecture we have arrived at as a result of the re-engineering process. It
+includes both real wrapper layer classes that are the seed from which our
+public API will grow, along with the infrastructure that the wrapper layer
+depends on.
+
+Initial coverage
+----------------
+
+Wrapper layer presenting the public API to developers (publicly visible
+classes in bold):
+
+* **`org.freedesktop.bindings.Proxy`**
+* **`org.gnome.glib.Value`**
+* **`org.gnome.glib.Object`**
+* **`org.gnome.gtk.Object`**
+* **`org.gnome.gtk.Widget`**
+* **`org.gnome.gtk.Container`**
+* **`org.gnome.gtk.Bin`**
+* **`org.gnome.gtk.Button`**
+* **`org.gnome.gtk.Window`**
+
+Along with complete translation layer implementations for each:
+
+* `org.freedesktop.bindings.Plumbing`
+* `org.gnome.glib.Plumbing`
+* `org.gnome.glib.GValue`
+* `org.gnome.glib.GObject`
+* `org.gnome.gtk.GtkObject`
+* _`org.gnome.gtk.GtkWidget`_
+* _`org.gnome.gtk.GtkContainer`_
+* _`org.gnome.gtk.GtkBin`_
+* _`org.gnome.gtk.GtkButton`_
+* _`org.gnome.gtk.GtkWindow`_
+
+At present the bindings mock up the code that will be generated with
+temporarily hand written substitutes (ie, those in italics above) for both
+translation (Java) and native (C) layers. These will do until we receive the
+funding to make the code generator a reality; we certainly don't want to be
+writing much more translation layer Java and C code by hand. Yuk.
+
+
+Signal API
+----------
+
+The defining aspect of GUI programming is, of course, that it is event driven.
+In addition to the "forward" direction of making calls to the native library
+and having return values bubble back up, there is the "reverse" direction of
+connecting callback handlers to the various signals that different Widgets
+offer, and having those signal events result in those handlers being invoked.
+
+java-gnome 4.0 has an entirely new and redesigned signal connection and
+callback API. This functionality was demonstrated, and coverage of
+**`Button.CLICKED`** and **`Window.DELETE`** is now present and functional!
+The APIs used by GNOME language bindings to achieve this are some of the most
+voodoo I have ever seen. But it's hooked up, and it works. It's like black
+magic :)
+
+Build
+-----
+
+java-gnome is configured and built using Andrew Cowie's Equivalence build
+scripts. It builds on Gentoo and should build on a Debian or Fedora derived
+system as well. See [`README`](README.html) for further details.
+
+At the moment, java-gnome is a single source package.
+
+The source code is available via `bzr`. Again, see `README`.
+
+AfC
+
+<!--
+ 
+  Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78:
+
+-->
diff --git a/README.markdown b/README.markdown
new file mode 100644
index 0000000..29d3da5
--- /dev/null
+++ b/README.markdown
@@ -0,0 +1,350 @@
+This is the java-gnome language bindings project. We endeavour to provide a
+high quality library you can use to write GTK and GNOME programs. The
+underlying APIs are elegantly transformed into Java and carefully documented so
+that anyone new to Linux or Open Source can rapidly be on their way to creating
+fabulous applications.
+
+<!--
+If you didn't know, the project website is:  
+
+	http://java-gnome.sourceforge.net
+
+where we host the API documentation, web versions of all the design files, and
+tutorials to help get people started. Contact information, release notes and
+and project news are also to be found there.
+-->
+
+This README file is devoted to helping you get started building the bindings
+themselves. 
+
+Building java-gnome
+===================
+
+For the impatient:
+
+    $ tar xJf java-gnome-4.1.3.tar.xz
+    $ cd java-gnome-4.1.3
+    $ ./configure
+    $ make
+
+But there's a bunch of stuff you probably want to know, so read on!
+
+
+1. Get the source code
+----------------------
+
+### From a release tarball ###
+
+You can download the latest java-gnome release from the GNOME FTP server at:  
+[`http://ftp.gnome.org/pub/gnome/sources/java-gnome/4.1/`][mirror]
+
+Once you've downloaded the latest source tarball:
+
+    $ tar xjf java-gnome-4.1.3.tzr.xz
+    $ cd java-gnome-4.1.3
+
+And go on to step 2 for details about options you can pass to the
+configuration command.
+
+
+### Or checkout the source ###
+
+If you want a newer version of the code than the tarball you might have, you
+can always check it out over the net. We use Bazaar (`bzr`), an advanced
+third-generation Distributed Version [or Revision] Control System, to manage
+our source code. 
+
+Getting a checkout is easy:
+
+    $ cd ~/src/
+    $ mkdir java-gnome/
+    $ git clone git://github.com/afcowie/java-gnome.git mainline
+    $ cd mainline/
+    $ less README.markdown
+
+2. Run `./configure`
+--------------------
+
+The top level directory contains a custom `./configure` which detects your
+Operating System variant, sets defaults accordingly, verifies the location of
+prerequisites (the various `.jar` files), and finally chooses a Java bytecode
+compiler and Java Virtual Machine runtime environment. The configuration
+output is a Makefile fragment which is written to `.config` and subsequently
+included by the top level `Makefile`.
+
+So run it already:
+
+    $ ./configure
+
+### Background ###
+
+The steps necessary to configure and build a Java project are quite different
+than those needed to construct a program written in a more traditional
+language. Unlike C, for example, there is no need to do substitution across
+the codebase nor to worry about conditional compilation; `#ifdef` is not
+something we do in Java. This is in no small part because the Java class
+libraries and the language itself have been remarkably stable. To build and
+run a Java program, however, three things are necessary:
+
+ * locate pre-requisite libraries (`.jar`s), and form a `CLASSPATH`;
+
+ * locate, validate, and select a Java compiler; and
+
+ * locate, validate, and select a Java runtime.
+
+That's it! From there, often a single compiler invocation will take care of
+building an entire program, but these preconditions must be satisfied before
+compiling is possible. _(Incidentally, tools like Ant are no help with any of
+this -- it just takes care of the build part; and don't even think about
+suggesting the GNU autotools -- they are a complex, arcane, and bloated
+nightmare that don't address with the Java specific challenges at all)_.
+
+At the moment, we use Andrew Cowie's "Equivalence" build system, which is
+composed of a straight-forward (if somewhat overweight) Perl program along
+with a simple Makefile which together carry out the task of configuring and
+building the library. Right now, Gentoo Linux, Debian Linux, Fedora Core
+Linux, and Solaris Unix should be detected properly and result in working
+configurations. If you are running a different operating system or
+distribution, please contact us and we'll add it -- it's just a matter of
+identifying the location of a few things. Better yet, look in the `configure`
+Perl script -- the places where OS is switched are obvious, and just add what
+you need to add, and send us a patch.
+
+Meanwhile...
+
+### Customizing build options ###
+
+You can override the choices `configure` makes by listing parameters on the
+command line, like this:
+
+    $ ./configure compiler=ecj runtime=jamvm
+
+This facilitates easily switching between runtimes and compilers for testing.
+At the moment, the available selections are:
+
+* `compiler` `-->` javac, ecj
+
+* `runtime`  `-->` java, cacao, jamvm, cacao, gij, and kaffe
+
+The whole point of the Equivalence's `configure` script is to figure things
+out for you, but if it can't quite figure out where Java is, you can override
+it by specifying an alternate location to find a JDK using either
+of the following:
+
+* `jdk` -- where to find a traditional Java Development Kit, ie `JAVA_HOME`
+
+* `jamvm` -- path to the JamVM executable
+
+* `cacao` -- path to the CACAO executable
+
+Examples:
+
+    $ ./configure
+    $ ./configure jdk=/opt/sun-jdk
+    $ ./configure jamvm=/home/joe/custom/bin/jamvm runtime=jamvm
+
+Your configuration is persistent across builds in that checkout, ie, `make
+clean` won't force you to reconfigure (though `make distclean` will). The
+`configure` script runs very quickly, so it's no big deal to switch settings
+by re-running it.
+
+### Dependencies ###
+
+The java-gnome library depends on the GNOME desktop and is intended for people
+wishing to do tight integration with it. In particular, this version of
+java-gnome depends on:
+
+* GLib `>= 2.28.0`
+
+* GTK `>= 3.0.4`
+
+* Cairo `>= 1.10.0`
+
+* Pango `>= 1.28.0`
+
+* gtksourceview `>= 2.91.9`
+
+* libnotify `>= 0.7.0`
+
+* gtkspell `>= 3.0`  
+_This isn't available yet, and GtkSpell support is currently disabled._
+
+* libunique `>= 3.0`
+
+* Enchant `>= 1.4.2`
+
+* librsvg `>= 2.32.0`
+
+3. Build
+--------
+
+Once you've configured, compiling java-gnome is as simple as running Make:
+
+    $ make
+
+If you're having trouble with something as Make runs and need to debug it, you
+can try:
+
+    $ V=1 make
+
+This will show you the actual commands being executed (ie, Make's normal
+behaviour, which we override for appearances sake and because otherwise the
+signal to noise ratio is terrible and you never see warnings). If you're still
+stumped, you might try having a look at `.config`, which is where all the Make
+variables come from.
+
+The build products end up in `tmp/`:
+
+`tmp/gtk-4.1.jar`  
+`tmp/libgtkjni-4.1.3.so`
+
+That's actually enough to go on -- if you're using an IDE like Eclipse you can
+just tell it about the `.jar` and then jump right to "Using the Bindings". Or
+you can install java-gnome somewhere. Doesn't matter, really.
+
+<a name="install"></a>
+
+4. Install
+----------
+
+java-gnome 4.1 has the standard `make install` behaviour, and the equally
+standard `prefix` option to `./configure`.
+
+### Installing locally
+
+Someone installing it locally (to your home directory, say) might do:
+
+	$ ./configure prefix=/home/bloggins
+	$ make install
+
+and you would end up with:
+
+`~/share/java/gtk-4.1.jar`  
+`~/share/java/gtk.jar`  
+`~/lib/libgtkjni-4.1.3.so`
+
+The default is to send it off to `/usr/local` as you'd expect. 
+
+Using `make install` is **compulsory** if you intend to use java-gnome from
+anywhere other than "in-place" from the temporary location where it was built.
+
+### Installing to system (for people packaging the library for their distro)
+
+The `install` target understands the `DESTDIR` variable used by packagers to
+install to a specified prefix _within_ a temporary directory. Someone writing
+an `.ebuild` to create a package for java-gnome on a Gentoo system would
+probably end up seeing the following commands being run by Portage, for
+example:
+
+	...
+	
+	./configure prefix=/usr
+	make
+	
+	...
+	
+	make DESTDIR=/var/tmp/portage/java-gnome-4.1.3-r2/image install
+	
+	...
+
+With a prefix of `/usr` you will end up with:
+
+`/usr/share/java/gtk-4.1.jar`  
+`/usr/share/java/gtk.jar`  
+`/usr/lib/libgtkjni-4.1.3.so`
+
+If you have distro policy issues to deal with, then pass `jardir` and/or
+`libdir` overrides to `configure`.
+
+<a name="using"></a>
+
+Using the bindings
+==================
+
+### Running the "demo"
+
+There are a few _tiny_ and _trivial_ example programs in the `doc/examples/`
+directory of the bindings. If you would like to see one, you could compile and
+run it by hand, doing something like:
+
+    $ javac -classpath tmp/gtk-4.1.jar -d tmp/tests doc/examples/button/ExamplePressMe.java
+    $ java -classpath tmp/gtk-4.1.jar:tmp/tests button.ExamplePressMe
+
+This shows you how you can reference and use the library after it is built by
+`make` into `tmp/`.
+
+Of course, that was _way_ too much typing. Instead, just do this:
+
+    $ make demo
+
+`:)`. As usual, use `V=1` to see what it is actually doing.
+
+### Running your own programs
+
+java-gnome has a native component that links tightly against various GNOME
+libraries (after all, the whole point is to use the real GTK, not some pseudo
+look alike pathetic attempt of a widget toolkit), but we take care of locating
+it and loading it for you. So all you need to do to run an application is:
+
+    $ java -client -ea                                   \
+        -classpath /home/bloggins/share/java/gtk-4.1.jar \
+        com.example.ComeOnBabyLightMyFire
+
+Oh, the joys of running Java programs by hand. 
+
+
+Status
+======
+
+java-gnome is now a solid foundation that has been used to develop non-trivial
+applications. The architecture and internal design has been well proved, and
+the coverage level (relative to the full breadth of the underlying libraries)
+is reaching maturity.
+
+Get Involved
+------------
+
+If you would like to get involved yourself as an individual, we would welcome
+your contribution. See [`HACKING`](HACKING.html). If you are working on an
+application, want to learn more, or are just curious, join us online in
+`#java-gnome` on `irc.gimp.net`.
+
+Happy coding!
+
+AfC
+
+`--`  
+Andrew Frederick Cowie  
+Managing Director,  
+[Operational Dynamics](http://www.operationaldynamics.com/),  
+a Change Management consultancy...
+
+Maintainer,  
+[java-gnome](http://java-gnome.sourceforge.net/),  
+opening GTK and GNOME to Java programmers!
+
+_Last modified 22 Feb 13_
+
+[mirror]: http://ftp.gnome.org/pub/gnome/sources/java-gnome/4.1/
+
+<!--
+ 
+  Copyright © 2006-2013 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78:
+
+-->
diff --git a/build/faster b/build/faster
new file mode 100755
index 0000000..ffa4cb6
--- /dev/null
+++ b/build/faster
@@ -0,0 +1,743 @@
+#!/usr/bin/env python2
+# vim: set fileencoding=UTF-8
+#
+# java-gnome, a UI library for writing GTK and GNOME programs from Java!
+#
+# Copyright © 2007-2013 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# faster.py, an abbreviated build script for java-gnome
+# Must be invoked from the project top level directory as [./]build/faster
+#
+
+#
+# This is a total hack, but a good one :) Make has two critical weakness, which
+# this script, being programmatic, tries to address:
+#
+# 1) variables are only populated once, so the variables containing the lists
+# of files to be built resulting from output of the code generator are
+# inaccurate (or in a clean build, empty)
+#
+# 2) it doesn't look at actual file contents, only looking to see if the target
+# is older than the source file(s). This is a real problem for people hacking
+# on the bindings; every time you save a source file in the generator, it runs,
+# and even though most (even all) of output files are unchanged [ie, were
+# refilled with exactly the same content], they are newer, and so make charges
+# ahead with a full rebuild, costing over 5 minutes of CPU time.
+#
+# So this program takes an md5sum of each source file at each step, only
+# invoking the external program for that target if the files have actually
+# changed since the last run.
+#
+# No, this is not some grand replacement for all the worlds problems. It's a
+# quick hack. I said so already. And it's entirely custom for building
+# java-gnome. But it encapsulates some of the capabilities that buildtool will
+# bring to the process when it lands, so it is a step in the right direction.
+#
+
+import os, hashlib, subprocess, cPickle, sys
+from os.path import *
+from shutil import move
+
+config = {}
+hashes = {}
+verbose = False
+silent = False
+
+configFile = ".config"
+versionFile = "src/bindings/org/freedesktop/bindings/Version.java"
+hashFile = "tmp/.hashes"
+lockFile = "tmp/.build"
+
+GNOME_MODULES = "gthread-2.0 glib-2.0 gtk+-3.0 gtk+-unix-print-3.0 gtksourceview-3.0 libnotify enchant librsvg-2.0"
+
+#
+# Armour against multiple simultaneous invocations.
+#
+# Rumour has it that locking is hard, unsafe, and generally evil. That's all
+# true. Usage here should be safe enough; this lock is just to prevent
+# double-taps by Eclipse being overzealous. Question: is this NFS safe?
+#
+
+from fcntl import flock, LOCK_EX, LOCK_NB
+
+def lockBuild():
+	global lock
+
+	ensureDirectory("tmp/")
+
+	lock = open(lockFile, "wb")
+	try:
+		flock(lock, LOCK_EX | LOCK_NB)
+	except IOError:
+		if not silent:
+			print "Inhibited: another build process already running"
+			sys.stdout.flush()
+		sys.exit(0)
+
+
+def unlockBuild():
+	global lock
+	lock.close()
+
+#
+# Read the configuration data from .config
+#
+# The ./configure script produces a make fragment full of variables suitable to
+# be included in our top level Makefile. So long as that Makefile exists we'll
+# leave it alone, meaning we need to enclose the variable declarations with "
+# characters before sourcing it into this Python program.
+#
+# We could be smart and verify that the requisite data is there, but I imagine
+# a KeyError will be raised later on if it isn't.
+#
+
+def loadConfig():
+	global config
+	if ((not isfile(configFile)) or (getmtime(configFile) < getmtime(versionFile))):
+		print
+		print "You need to run ./configure to check prerequisites"
+		print "and setup preferences before you can build java-gnome."
+
+		if not os.access("configure", os.X_OK):
+			print "I'll make it executable for you."
+			print
+			executeCommand("CHMOD", "configure", "chmod +x configure")
+		else:
+			print
+
+		sys.exit(1)
+	try:
+		cfg = open(configFile, "r")
+		for line in cfg: 
+			if line.find("=") != -1:
+				escaped = line.replace("=", "=\"", 1)
+				escaped = escaped.strip()
+				escaped += "\""
+				exec(escaped, config)
+		cfg.close()
+
+	except (EOFError):
+		print "Error while trying to read .config"
+		sys.exit(9)
+
+	config['GNOME_CCFLAGS'] = os.popen("pkg-config --cflags " + GNOME_MODULES).read().rstrip()
+	config['GNOME_LDFLAGS'] = os.popen("pkg-config --libs " + GNOME_MODULES).read().rstrip()
+
+
+def loadHashes():
+	global hashes
+	if isfile(hashFile):
+		try:
+			db = open(hashFile, "rb")
+			hashes = cPickle.load(db)
+			db.close()
+		except (EOFError, KeyError, IndexError):
+			print "build checksum cache corrupt; full rebuild forced"
+			hashes = {}
+
+
+#
+# TODO writing the whole pickle each time must be tremendously inefficient, but
+# so long as the build is nice and fast, we can leave it be. If someone wants
+# to try replacing this with bdb or dbm, please give it a try.
+#
+
+def checkpointHashes():
+	db = open(hashFile + ".tmp", "wb")
+	cPickle.dump(hashes, db)
+	db.close()
+
+	move(hashFile + ".tmp", hashFile)
+
+
+def ensureDirectory(dir):
+	if isdir(dir):
+		return
+	executeCommand("MKDIR", dir, "mkdir -p " + dir)
+	
+
+def touchFile(file):
+	f = open(file, "w")
+	f.close()
+
+
+def prepareBindingsDirectories():
+	ensureDirectory("tmp/stamp/")
+	ensureDirectory("generated/bindings/")
+	ensureDirectory("tmp/bindings/")
+	ensureDirectory("tmp/generator/")
+	ensureDirectory("tmp/objects/")
+	ensureDirectory("tmp/include/")
+	ensureDirectory("tmp/tests/")
+
+def prepareTestDirectories():
+	ensureDirectory("tmp/tests/")
+
+def findFiles(baseDir, ext):
+	result = []
+	for (root, dirs, files) in os.walk(baseDir):
+		for file in files:
+			if file.endswith(ext):
+				result.append(join(root, file))
+	return result
+
+
+#
+# Scan a list of files and decide if they need [re]-building.
+#
+# Two things to check:
+# 1) target older?
+# 2) if so, has source changed?
+#
+# Otherwise, (no target), just
+
+# *) has source changed?
+#
+# We compare source files' md5sums against the values we have stored in our
+# hash dictionary. The dictionary is immediately updated but this only has any
+# persistent effect if a checkpoint happens after a command is run
+# successfully. FIXME verify!
+#
+# Takes a list of touples mapping candidate source files to target filenames
+#
+
+def sourceChanged(file, hash):
+	if hashes.has_key(file):
+		if hashes[file] == hash:
+			return False
+	return True
+
+
+def updateHash(file, hash):
+	hashes[file] = hash
+
+
+def debug(args):
+	if False:
+		print args, 
+
+
+def filesNeedBuilding(list, update=True):
+	changed = []
+	for (source, target) in list:
+		if fileNeedsBuilding(source, target, update):
+			changed.append(source)
+	return changed
+
+
+def fileNeedsBuilding(source, target, update=True):
+	if not isfile(source):
+		sys.exit(source + " missing, abort")
+
+	f = open(source)
+	m = hashlib.md5(f.read())
+	f.close()
+	hash = m.hexdigest()
+
+	debug("CHECK\t"+str(target)+" from "+source+"\n")
+
+	debug("TARGET",)
+	if not isfile(target):
+		debug("MISSING",)
+	elif getmtime(target) < getmtime(source):
+		debug("OLDER,")
+		if not sourceChanged(source, hash):
+			debug("SOURCE UNCHANGED\n")
+			return False
+	else:
+		debug("NEWER, SKIP\n")
+		return False
+
+	debug("BUILD\n")
+	if update:
+		updateHash(source, hash)
+
+	return True
+
+#
+# common use case that source files transform predictably 1:1 into target
+# files. Return a list of (source, target) touples
+#
+
+def dependsMapSourceFilesToTargetFiles(sourceDir, sourceExt, targetDir, targetExt):
+	list = findFiles(sourceDir, sourceExt)
+	result = []
+
+	for source in list:
+		target = source.replace(sourceDir, targetDir)
+		target = target.replace(sourceExt, targetExt)
+
+		pair = (source, target)
+		result.append(pair)
+	
+	return result
+
+#
+# single target depends on many files. Use this with a stamp if all you really
+# want to do is check to see if a series of sources have changed
+#
+
+def dependsListToSingleTarget(list, target):
+	result = []
+
+	for source in list:
+		pair = (source, target)
+		result.append(pair)
+
+	return result
+
+
+#
+# the rather kludgy mapping between .po files and .mo files
+#
+
+def dependsMapTranslationFileToCatalogueFile(domain, poDir, targetDir):
+	list = findFiles(poDir, ".po")
+	result = []
+
+	for source in list:
+		target = source.replace(".po", "")
+		target = target.replace(poDir, targetDir)
+		target = target + "/LC_MESSAGES/" + domain + ".mo"
+
+		pair = (source, target)
+		result.append(pair)
+
+	return result
+
+
+#
+# FIXME One fairly glaring weakness of this script is that it doesn't do Nth
+# order build concurrency in the sense of make -jN. I imagine that given the
+# sort of semantics that wait() provides we could probably fork off multiple
+# children. Feel welcome to fix this.
+#
+
+def executeCommand(short, what, cmd, inDir=None):
+	sys.stderr.flush()
+	if not silent:
+		print short + "\t" + what
+		if verbose:
+			print cmd
+	sys.stdout.flush()
+	
+	status = subprocess.call(cmd, shell=True, cwd=inDir, bufsize=1)
+	if status != 0:
+		sys.exit(1)
+
+	checkpointHashes()
+	sys.stderr.flush()
+	sys.stdout.flush()
+
+
+def compileJavaCode(outputDir, classpath, sourcepath, sources):
+	cmd = config['JAVAC'] + " "
+	cmd += "-d " + outputDir
+	if classpath:
+		cmd += " -classpath " + classpath
+	if sourcepath:
+		cmd += " -sourcepath " + sourcepath
+	cmd += " -encoding UTF-8"
+	cmd += " " + " ".join(sources)
+
+	blurb = "\n\t".join(sources)
+
+	executeCommand(config['JAVAC_CMD'], blurb, cmd)
+
+
+def runJavaClass(classname, classpath, args=""):
+	cmd = config['JAVA'] + " "
+	cmd += "-classpath " + classpath + " "
+	cmd += classname
+
+	if args:
+		cmd += " " + args
+
+	executeCommand(config['JAVA_CMD'], classname, cmd)
+
+
+def compileGeneratorClasses():
+	pairs = dependsMapSourceFilesToTargetFiles("src/generator/", ".java", "tmp/generator/", ".class")
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+	compileJavaCode("tmp/generator/", "", "src/generator/", changed)
+
+
+def generateTranslationAndJniLayers():
+	list = findFiles("tmp/generator", ".class")
+	list += findFiles("src/defs", ".defs")
+	stamp = "tmp/stamp/generator"
+	redirect = ""
+
+	pairs = dependsListToSingleTarget(list, stamp)
+
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+
+	if not verbose:
+		redirect = "> /dev/null"
+
+	runJavaClass("BindingsGenerator", "tmp/generator/", redirect)
+	touchFile(stamp)
+
+
+def compileBindingsClasses():
+	pairs = dependsMapSourceFilesToTargetFiles("generated/bindings/", ".java", "tmp/bindings/", ".class")
+	pairs += dependsMapSourceFilesToTargetFiles("src/bindings/", ".java", "tmp/bindings/", ".class")
+
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+
+	compileJavaCode("tmp/bindings/", "tmp/bindings/", "src/bindings/:generated/bindings/", changed)
+
+
+#
+# This seems like a lot of effort to copy a file
+#
+
+def copyMappingFile():
+	source = "generated/bindings/typeMapping.properties"
+	target = "tmp/bindings/typeMapping.properties"
+
+	if not fileNeedsBuilding(source, target):
+		return
+
+	cmd = "cp " + source + " " + target
+	executeCommand("CP", target, cmd)
+
+
+def makeJarFile():
+	jar = "tmp/gtk-4.1.jar"
+
+	list = findFiles("tmp/bindings/", ".class")
+	list += findFiles("tmp/bindings/", ".properties")
+	pairs = dependsListToSingleTarget(list, jar)
+
+	changed = filesNeedBuilding(pairs, False)
+	if not changed:
+		return
+
+	files = [] 
+	for file in list:
+		file = file.replace("tmp/bindings/", "")
+		file = file.replace("$", "\$")
+		files.append(file)
+
+	cmd = config['JAR'] + " cf "
+	cmd += "../../" + jar + " "
+	cmd += " ".join(files)
+
+	executeCommand(config['JAR_CMD'], jar, cmd, "tmp/bindings/")
+
+
+def generateHeaderFiles():
+	list = findFiles("tmp/bindings/", ".class")
+	map_c = {}
+	map_h = {}
+	pairs = []
+	classes = []
+	headers = []
+
+	for file in list:
+		if file.find("$") != -1:
+			continue
+		t = file.replace("tmp/bindings/", "")
+		t = t.replace(".class", "")
+		c = t.replace("/", ".")
+
+		t = t.replace("/", "_")
+		t = t.replace("$", "_")
+		t = t + ".h"
+		t = "tmp/include/" + t
+
+		pairs.append((file, t))
+		map_c[file] = c
+		map_h[file] = t
+
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+
+	for file in changed:
+		classes.append(map_c[file])
+		headers.append(map_h[file])
+	
+	cmd = config['JAVAH'] + " "
+	if verbose:
+		cmd += "-verbose "
+	cmd += "-d tmp/include/ "
+	cmd += "-classpath tmp/bindings/ "
+	cmd += " ".join(classes)
+	if not verbose:
+		cmd += " >/dev/null"
+
+	blurb = "\n\t".join(headers)
+
+	executeCommand(config['JAVAH_CMD'], blurb, cmd)
+
+
+def compileCSourceToObject(source, target):
+	ensureDirectory(dirname(target))
+	
+	if config.has_key('CCACHE'):
+		cmd = config['CCACHE'] + " "
+	else:
+		cmd = ""
+	cmd += config['CC'] + " "
+	cmd += "-Isrc/jni -Itmp/include "
+	cmd += config['GNOME_CCFLAGS'] + " "
+	if os.getenv("CFLAGS"):
+		cmd += os.getenv("CFLAGS") + " "
+	cmd += "-o " + target + " -c " + source
+
+	executeCommand(config['CC_CMD'], source, cmd)
+
+
+def compileBindingsObjects():
+	pairs = dependsMapSourceFilesToTargetFiles("src/bindings/", ".c", "tmp/objects/", ".o")
+	pairs += dependsMapSourceFilesToTargetFiles("generated/bindings/", ".c", "tmp/objects/", ".o")
+	pairs += dependsMapSourceFilesToTargetFiles("src/jni/", ".c", "tmp/objects/", ".o")
+	
+	for (source, target) in pairs:
+		if fileNeedsBuilding(source, target):
+			compileCSourceToObject(source, target)
+
+	
+def linkSharedLibrary():
+	so = "tmp/libgtkjni-" + config['VERSION'] +  ".so"
+
+	list = findFiles("tmp/objects/", ".o")
+	pairs = dependsListToSingleTarget(list, so)
+
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+
+	cmd = config['LINK'] + " "
+	if os.getenv("LDFLAGS"):
+		cmd += os.getenv("LDFLAGS") + " "
+	cmd += "-o " + so + " "
+	cmd += " ".join(list) + " "
+	cmd += config['GNOME_LDFLAGS'] + " "
+
+	executeCommand(config['LINK_CMD'], so, cmd)
+
+
+def compileTestClasses():
+	pairs = dependsMapSourceFilesToTargetFiles("tests/generator/", ".java", "tmp/tests/", ".class")
+	pairs += dependsMapSourceFilesToTargetFiles("tests/bindings/", ".java", "tmp/tests/", ".class")
+	pairs += dependsMapSourceFilesToTargetFiles("tests/prototype/", ".java", "tmp/tests/", ".class")
+	pairs += dependsMapSourceFilesToTargetFiles("tests/screenshots/", ".java", "tmp/tests/", ".class")
+	pairs += dependsMapSourceFilesToTargetFiles("doc/examples/", ".java", "tmp/tests/", ".class")
+
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+
+	compileJavaCode("tmp/tests/", "tmp/generator:tmp/bindings/:"+config['JUNIT_JARS'], "tests/generator/:tests/bindings/:tests/prototype/:tests/screenshots/:doc/examples/", changed)
+
+
+def compileMessageCatalogue(source, target):
+	ensureDirectory(dirname(target))
+
+	cmd = "msgfmt " + "-o " + target + " " + source
+	executeCommand("MSGFMT", target, cmd)
+
+
+#
+# FIXME this could be better generalized, but in any event this verges on
+# being unnecessary
+#
+
+def extractInternationalizationTemplates():
+	list = findFiles("doc/examples/i18n", ".java")
+	template = "tmp/i18n/example.pot"
+
+	pairs = dependsListToSingleTarget(list, template)
+
+	changed = filesNeedBuilding(pairs)
+	if not changed:
+		return
+
+	ensureDirectory(dirname(template))
+
+	cmd = "xgettext "
+	cmd += "--from-code=UTF-8 "
+	cmd += "-o " + template + " "
+	cmd += "--omit-header --keyword=_ --keyword=N_ "
+	cmd += " ".join(list)
+
+	executeCommand("EXTRACT", template, cmd)
+
+
+def compileTranslationCatalogues():
+	pairs =  dependsMapTranslationFileToCatalogueFile("example", "doc/po/", "tmp/locale/")
+	pairs += dependsMapTranslationFileToCatalogueFile("unittest", "tests/po/", "tmp/locale/")
+
+	for (source, target) in pairs:
+		if fileNeedsBuilding(source, target):
+			compileMessageCatalogue(source, target)
+
+
+#
+# main build sequence, with elaborately named methods Carl Rosenberger style
+#
+
+def generateBindings():
+	prepareBindingsDirectories()
+
+	compileGeneratorClasses()
+	generateTranslationAndJniLayers()
+
+	compileBindingsClasses()
+	copyMappingFile()
+
+	makeJarFile()
+
+	generateHeaderFiles()
+	compileBindingsObjects()
+	linkSharedLibrary()
+
+
+def generateTests():
+	prepareTestDirectories()
+	compileTestClasses()
+
+	extractInternationalizationTemplates()
+	compileTranslationCatalogues()
+
+
+#
+# Output the API documentation. Owing to the need to configure the standard
+# doclet on the command line, building up this expression is rather ulgy, and
+# not the place we'd like to see presentation stuff, all things considered.
+#
+# We also run the harness which takes screenshots of the Snapshot classes
+# which are used to illustrate our docs.
+#
+# The logic to have this rendered off screen is buggy at the moment, so you
+# need to let it run by itself and not take focus away. The code to execute it
+# is also somewhat fragile and still has a number of hard coded paths. As the
+# only person who actually has to run this is the maintainer uploading to the
+# website, this isn't a problem right now, but at some point we'll want to
+# consider having configure probe for the things that (disabled) code path
+# depends on.
+#
+
+def compileDocumentation():
+	cmd = config['JAVADOC'] + " "
+	if not verbose:
+		cmd += "-quiet "
+
+	cmd += "-d doc/api "
+	cmd += "-public "
+	cmd += "-nodeprecated "
+	cmd += "-source 1.5 "
+	cmd += "-notree "
+	cmd += "-noindex "
+	cmd += "-notimestamp "
+	cmd += "-nohelp "
+	cmd += "-version "
+	cmd += "-author "
+	cmd += "-windowtitle 'java-gnome %s API Documentation' " % config['VERSION']
+	cmd += "-doctitle '<h1>java-gnome %s API Documentation</h1>' " % config['VERSION']
+	cmd += "-header 'java-gnome version %s' " % config['VERSION']
+	cmd += "-footer '<img src=\"/images/java-gnome_JavaDocLogo.png\" style=\"padding-right:25px;\"><br> <span style=\"font-family: Arial; font-style: normal; font-size: large;\">java-gnome</span>' "
+	cmd += "-breakiterator "
+	cmd += "-stylesheetfile src/bindings/stylesheet.css "
+	cmd += "-overview src/bindings/overview.html "
+	cmd += "-sourcepath src/bindings:generated/bindings "
+	cmd += "-encoding UTF-8 "
+	cmd += "-subpackages org "
+	cmd += "-exclude org.freedesktop.bindings "
+	cmd += "-noqualifier 'java.*:com.sun.*' "
+	cmd += "src/bindings/org/freedesktop/bindings/Time.java "
+	cmd += "src/bindings/org/freedesktop/bindings/Version.java "
+	cmd += "src/bindings/org/freedesktop/bindings/Internationalization.java "
+	if not verbose:
+		cmd += " >/dev/null"
+
+	executeCommand(config["JAVADOC_CMD"], "doc/api/*.html", cmd % config)
+
+
+def takeSnapshots():
+	runJavaClass("Harness", "tmp/gtk-4.1.jar:tmp/tests/")
+
+
+def generateDocumentation():
+	compileDocumentation()
+	takeSnapshots()
+
+#
+# Final miscallaneous execution targets, taking advantage of the fact that
+# we've got all this infrastructure to run Java code.
+#
+
+def runTests():
+	runJavaClass("UnitTests", "tmp/gtk-4.1.jar:tmp/generator/:tmp/tests/:"+config['JUNIT_JARS'])
+
+def runDemo():
+	runJavaClass("button.ExamplePressMe", "tmp/gtk-4.1.jar:tmp/tests/")
+
+
+#
+# Preliminary setup & main entry point.
+#
+
+from sys import argv
+
+def main():
+	lockBuild()
+	loadConfig()
+	loadHashes()
+
+	generateBindings()
+
+	if len(argv) > 1:
+		generateTests()
+
+	unlockBuild()
+
+	if len(argv) == 1:
+		return
+
+	if sys.argv[1] == "doc":
+		generateDocumentation()
+
+	elif sys.argv[1] == "test":
+		runTests()
+
+	elif sys.argv[1] == "demo":
+		runDemo()
+
+
+if __name__ == '__main__':
+	if os.getenv("V"):
+		verbose = True
+	
+	if len(argv) > 1 and sys.argv[1] == "ide":
+		silent = True
+	
+	try:
+		main()
+	except KeyboardInterrupt:
+		print
+
diff --git a/configure b/configure
new file mode 100755
index 0000000..81b1ddf
--- /dev/null
+++ b/configure
@@ -0,0 +1,2305 @@
+#!/usr/bin/perl -w
+#
+# java-gnome, a UI library for writing GTK and GNOME programs from Java!
+#
+# Copyright © 2005-2013 Operational Dynamics Consulting, Pty Ltd and Others
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# configure
+# part of Equivalence, version 0.2.x
+#
+# THIS IS A PROTOTYPE. Although functional enough, this has grown to the point
+# of being a somewhat embarrassing and monolithic piece of code. Patches are
+# gladly accepted to this file to fix bugs and improve prerequisite detection,
+# but be aware that a new and refactored version is in progress.  With any
+# luck, it will be easier to extend and suitable for use by other projects. See
+# http://research.operationaldynamics.com/projects/equivalence/ In the mean
+# time, see README for instructions on how to use this one.
+#
+
+use strict;
+
+use File::Basename;
+use Cwd 'abs_path';
+
+#
+# Configure java-gnome for building. We:
+#
+# - determine the operating system
+#
+# - set known defaults that correspond to that OS
+#
+# - for items where we have multiple possibilities, work through the
+#   possibilities until we find one
+#
+# - for items where there are options to choose from (notably which java
+#   compiler and VM we're using), we select a sensible default unless
+#   instructed otherwise on the command line.
+#
+
+my $os;
+my $cpu_arch = ""; # set only when needed
+my $quiet;
+
+# There's nothing worse than having an old config file, getting half way
+# through this, having it break, and then being able to build, but getting
+# errors because configure really didn't finish. We do leave .config.tmp 
+# in place on error to facilitate troubleshooting.
+
+`rm -f .config`;
+`rm -f Hello.java Hello.class`;
+
+
+# --------------------------------------------------------------------
+# Utility and checking functions
+# --------------------------------------------------------------------
+
+#
+# Very simply: if the msg does not contain a newline, then it is assumed
+# to introduce a statement, so we print it and left pad it with spaces.
+# If the text does contain a newline, then probably it is concluding a 
+# statement (ok, failed, whatever) but not necessarily - just print the thing
+# without any padding.
+#
+sub output {
+	my $str = shift;
+	if ($str =~ /\n/) {
+		print $str unless $quiet;
+	} else {
+		printf "%-35s", $str unless $quiet;
+	}
+}
+
+sub which {
+	my $program = shift;
+	my $path = $ENV{'PATH'};
+	my @path_dirs = split /:+/, $path;
+	foreach my $dir (@path_dirs) {
+		if (-f "$dir/$program") {
+			return abs_path("$dir/$program");
+		}
+	}
+	return $program;
+}
+
+sub bail {
+	my $status = shift || "failed";
+	my $msg = shift || "";
+
+	# assuming that we're in an incomplete line 
+	output "$status\n\n";
+
+
+	print "$msg\n\n" if $msg;
+	print "Failed to complete configuration.\n";
+	exit(1);
+}
+
+# Check for all the required gnome development libraries. Distributions such as 
+# Ubuntu/Debian and Fedora don't always install the gnome development libs
+# (for whatever reason). If they aren't installed, we bomb here in configure
+# instead of dying unceremoniously while make'ing.
+
+sub check_system_library(\@$$@) {
+	my ($gnomedevref, $pkgconfig, $item, $package) = @_;
+	output " - ".$item;
+	
+	my $found;
+	my $str = "";
+	my $tries = "";
+
+	$found = system("pkg-config --exists '$pkgconfig'");
+
+	if ($found) {
+		my $msg;
+
+		$msg = `pkg-config --modversion --errors-to-stdout '$pkgconfig'`;
+		$str .= "$msg\n" if ($msg =~ /^Requested /);
+		$str .= "In order to build java-gnome, you will need the GNOME\n";
+		$str .= "development libraries. Depending on what you have installed,\n";
+		$str .= "this could be a considerable set of packages, but if you\n";
+		$str .= "want to be a GNOME hacker, that's the way it is.\n\n";
+
+		$str .= "On a ".ucfirst($os)." system, you should be able to satisfy this\n";
+		$str .= "requirement by doing:\n\n";
+		$str .= "     # ";
+
+		if ($os eq "gentoo") {
+			$str .= "emerge";
+		} elsif ($os eq "debian") {
+			$str .= "apt-get install";
+		} elsif ($os eq "fedora") {
+			$str .= "yum install";
+		} elsif ($os eq "suse") {
+			$str .= "zypper install";
+		} elsif ($os eq "arch") {
+			$str .= "pacman -S";
+		} elsif ($os eq "mandriva") {
+			$str .= "urpmi";
+		} elsif ($os eq "solaris") {
+			$str .= "pkgadd";
+		} elsif ($os eq "slackware") {
+			$str .= "slackpkg install";
+		} else {
+			$str .= "[FIXME fetch and install command for this OS]"; 
+		}
+		$str .= " $package";
+
+		bail "not found!", $str;
+	}
+	print "found\n";
+	
+	push(@$gnomedevref, $found);
+
+}
+# The files (jars) to check for should be listed in order of preference, as the
+# first one found will be the one selected.  For example, if you want version 3
+# but version 2 will do, list them in that order.  Typically, this means that
+# you list newer libraries first, on the presumption that you'd rather use the
+# newer one than the older one; when adding upgrades put them above the
+# already present entries.
+
+sub check_prereq (\@$$@) {
+	my ($jararrayref, $item, $package, @files) = @_;
+
+	output " - ".$item;
+
+	my $str;
+	my $tries = "";
+	my $found = "";
+
+	foreach my $file ( @files ) {
+		if ( -f "$file" ) {
+			$found = $file;
+			last;
+		}
+		$tries .= ($tries ? ", or" : "" ) . "\n\t".  basename($file) . "\t(looked in ".dirname($file).")";
+	}
+
+	if ( ! "$found" ) {
+		$str = "In order to build java-gnome, you need\n".$tries;
+		$str .= "\n\nwhich is part of the $item Java library.\n";
+		$str .= "On a ".ucfirst($os)." system, you should be able to get this requirement by doing:\n\n";
+		$str .= "     # ";
+
+		if ($os eq "gentoo") {
+			$str .= "emerge";
+		} elsif ($os eq "debian") {
+			$str .= "apt-get install";
+		} elsif ($os eq "fedora") {
+			$str .= "yum install";
+		} elsif ($os eq "suse") {
+			$str .= "zypper install";
+		} elsif ($os eq "arch") {
+			$str .= "pacman -S";
+		} elsif ($os eq "mandriva") {
+			$str .= "urpmi";
+		} elsif ($os eq "solaris") {
+			$str .= "pkgadd";
+		} elsif ($os eq "slackware") {
+			$str .= "slackpkg install";
+		} else {
+			$str .= "[FIXME fetch and install command for this OS]"; 
+		}
+		$str .= " $package";
+
+		bail "not found!", $str;
+	}
+	print "found\n";
+
+	push (@$jararrayref, $found);
+}
+
+# if we return without setting the variable pointed at by scalarref, its being
+# empty will be used later to indicate that this compiler wasn't present /
+# usable.
+#
+# The "not present" check is somewhat spurious given the input in many cases
+# is the result of a `which` call.
+
+sub check_compiler (\$$$$) {
+	my $scalarref = $_[0];
+	my $item = $_[1];
+	my $program = $_[2];
+	my $args = $_[3];
+
+	chomp $program;
+	if ( ! -f "$program") {
+		$$scalarref = "";
+		return;
+	}
+
+	# appealing to my sense of economy, we only print something out if 
+	# it's there - that way we can list lots of options to check without
+	# cluttering things endlessly.
+	output " - ".$item;
+
+	if ( ! -x "$program") {
+		output "found but not executable\n";
+		$$scalarref = "";
+		return;
+	}
+
+	# Ok, so inline code is lame, but it's so small, and only one,
+	# and, avoids having a file in tests/ that will be picked up later
+	# as neededing compiling.
+	if (! -f "Hello.java") {
+		open HELLO, ">Hello.java";
+		print HELLO <<HERE ;
+public class Hello {
+	public static void main(String[] args) {
+		System.out.println("Hello");
+	}
+}
+HERE
+		close HELLO;
+	}
+
+	`$program $args -sourcepath . Hello.java >/dev/null 2>&1`;
+	if ($? != 0) {
+		output "doesn't work\n";
+		$$scalarref = "";
+		return
+	}
+
+	output "works\n";
+	$$scalarref = "$program $args";
+}
+
+#
+# Check that a jar program somewhere works.
+#
+
+sub check_jar (\$$$$) {
+	my $scalarref = $_[0];
+	my $item = $_[1];
+	my $program = $_[2];
+	my $args = $_[3];
+
+	chomp $program;
+	if ( ! -f "$program") {
+		$$scalarref = "";
+		return;
+	}
+
+	# appealing to my sense of economy, we only print something out if 
+	# it's there - that way we can list lots of options to check without
+	# cluttering things endlessly.
+	output " - ".$item;
+
+	if ( ! -x "$program") {
+		output "found but not executable\n";
+		$$scalarref = "";
+		return;
+	}
+
+	`$program cf Hello.jar $args Hello.class >/dev/null 2>&1`;
+	if (($? != 0) || (! -f "Hello.jar")) {
+		output "doesn't work\n";
+		$$scalarref = "";
+		return
+	}
+
+	# TODO validate the result
+
+	output "works\n";
+	$$scalarref = "$program $args";
+}
+
+#
+# Check that a javadoc program somewhere works.
+#
+
+sub check_javadoc (\$$$$) {
+	my $scalarref = $_[0];
+	my $item = $_[1];
+	my $program = $_[2];
+	my $args = $_[3];
+
+	chomp $program;
+	if ( ! -f "$program") {
+		$$scalarref = "";
+		return;
+	}
+
+	# appealing to my sense of economy, we only print something out if 
+	# it's there - that way we can list lots of options to check without
+	# cluttering things endlessly.
+	output " - ".$item;
+
+	if ( ! -x "$program") {
+		output "found but not executable\n";
+		$$scalarref = "";
+		return;
+	}
+
+	# TODO validate the result
+
+	output "found\n";
+	$$scalarref = "$program $args";
+}
+
+
+sub check_runtime (\$$$$) {
+	my $scalarref = $_[0];
+	my $item = $_[1];
+	my $program = $_[2];
+	my $args = $_[3];
+
+	chomp $program;
+	if ( ! -f "$program") {
+		$$scalarref = "";
+		return;
+	}
+
+	output " - ".$item;
+
+	if ( ! -x "$program") {
+		output "found but not executable\n";
+		$$scalarref = "";
+		return;
+	}
+
+	my $output = `$program -version 2>&1 | grep 'version "'`;
+	$output =~ s/.*version \"(.*)\".*/$1/g;
+	my @version = split(/[\.\-\_]/, $output);
+	for (my $i = 0; $i < 3; $i++) {
+		chomp $version[$i];
+
+		if (!($version[$i] =~ /^\d+$/)) {
+			output "can't parse version\n";
+			$$scalarref = "";
+			return
+		}
+	}
+	if (
+		($version[0] < 1) ||
+		($version[0] == 1 && ($version[1] < 4))
+	) {
+		output "not >= 1.5.0\n";
+		$$scalarref = "";
+		return
+	}
+
+	$output = `$program $args Hello 2>/dev/null`;
+	chomp $output;
+
+	if (($? != 0) || ($output ne "Hello")) {
+		output "doesn't work\n";
+		$$scalarref = "";
+		return
+	}
+
+	output "works\n";
+	$$scalarref = "$program $args";
+}
+
+
+sub check_jni_header_generator(\$$$$) {
+	my $scalarref = $_[0];
+	my $item = $_[1];
+	my $program = $_[2];
+	my $args = $_[3];
+
+	chomp $program;
+	if ( ! -f "$program") {
+		$$scalarref = "";
+		return;
+	}
+
+	# appealing to my sense of economy, we only print something out if 
+	# it's there - that way we can list lots of options to check without
+	# cluttering things endlessly.
+	output " - ".$item;
+
+	if ( ! -x "$program") {
+		output "found but not executable\n";
+		$$scalarref = "";
+		return;
+	}
+
+	# FIXME do a test!
+
+	output "found\n";
+	$$scalarref = "$program $args";
+}
+
+
+# test for C compiler
+
+sub check_CC (\$$$$) {
+	my $scalarref = $_[0];
+	my $item = $_[1];
+	my $program = $_[2];
+	my $args = $_[3];
+
+	chomp $program;
+	if ( ! -f "$program") {
+		$$scalarref = "";
+		return;
+	}
+
+	# appealing to my sense of economy, we only print something out if 
+	# it's there - that way we can list lots of options to check without
+	# cluttering things endlessly.
+	output " - ".$item;
+
+	if ( ! -x "$program") {
+		output "found but not executable\n";
+		$$scalarref = "";
+		return;
+	}
+
+	# Hello.java should already available.
+
+		open HELLO, ">Hello.c";
+		print HELLO <<HERE ;
+#include <stdio.h>
+int main(int argc, char **argv) {
+	printf("Hello");
+	return 0;
+}
+HERE
+		close HELLO;
+
+	# compile
+	`$program $args -o Hello.o -c Hello.c >/dev/null 2>&1`;
+	if ($? != 0) {
+		output "compiling doesn't work\n";
+		$$scalarref = "";
+		return
+	}
+
+	if ( ! -f "Hello.o") {
+		bail "internal error","why isn't Hello.o present?";
+	}
+
+	# link
+	`$program $args -o Hello Hello.o >/dev/null 2>&1`;
+	if ($? != 0) {
+		output "linking doesn't work\n";
+		$$scalarref = "";
+		return
+	}
+
+	# run
+	my $output = `./Hello 2>/dev/null`;
+	chomp $output;
+
+	if (($? != 0) || ($output ne "Hello")) {
+		output "executable doesn't work\n";
+		$$scalarref = "";
+		return
+	}
+
+	output "works\n";
+	$$scalarref = "$program $args";
+}
+
+# --------------------------------------------------------------------
+# Process command line arguments for overrides
+# --------------------------------------------------------------------
+
+my $prefix;
+my $libdir;
+my $jardir;
+my $compiler;
+my $runtime;
+my $jdk_home;
+my $gcj_home;
+my $jamvm_bin;
+my $cacao_bin;
+my $strict = "";
+
+foreach my $arg (@ARGV) {
+	my ($key, $value) = split /=/, "$arg";
+
+	if ($key eq "quiet") {
+		$quiet = 1;
+	} elsif (($key =~ /^-\?$/) ||
+		 ($key =~ /^-h$/) ||
+		 ($key =~ /^--help$/) ||
+		 ($key =~ /^-help$/) ||
+		 ($key =~ /^help$/)) {
+		print <<HERE ;
+
+This is Equivalence, a simple build system suited to the
+unique needs of configuring and compiling Java programs on
+Linux and Unix.
+
+Look at the README file in this directory for information
+about this project and instructions on how to adjust the
+./configure script's behaviour.
+
+HERE
+		exit 4;
+	} elsif (($key =~ /^--prefix$/) ||
+		 ($key =~ /^prefix$/)) {
+		$prefix="$value";
+	} elsif (($key =~ /^--libdir$/) ||
+		 ($key =~ /^libdir$/)) {
+		$libdir="$value";
+	} elsif (($key =~ /^--jardir$/) ||
+		 ($key =~ /^jardir$/)) {
+		$jardir="$value";
+	} elsif ($key =~ /^runtime/) {
+		$runtime="$value";
+	} elsif ($key =~ /^compiler/) {
+		$compiler="$value";
+	} elsif ($key =~ /^jdk/) {
+		$jdk_home="$value";
+	} elsif ($key =~ /^gcj/) {
+		$gcj_home="$value";
+	} elsif ($key =~ /^cacao/) {
+		$cacao_bin="$value";
+	} elsif ($key =~ /^jamvm/) {
+		$jamvm_bin="$value";
+	} elsif ($key =~ /^strict/) {
+		$strict="yes";
+	}
+}
+
+
+# check jdk_home and gcj_home overrides. compiler and runtime are checked 
+# later (at the end) against choices that have been validated.
+
+if ($jdk_home) {
+	$jdk_home =~ s/\/$//;
+	if (! -x "$jdk_home/bin/javac") {
+		bail "bad override", "jdk_home specified doesn't seem to be a Java Development Kit home directory!";
+	}
+}
+
+if ($gcj_home) {
+	$gcj_home =~ s/\/$//;
+	if (! -x "$gcj_home/bin/gcj") {
+		bail "bad override", "gcj_home specified doesn't seem to be a GCJ install!";
+	}
+}
+
+
+# --------------------------------------------------------------------
+# Determine Operating System
+# --------------------------------------------------------------------
+
+output "\n";
+
+open CONFIG, ">.config.tmp";
+print CONFIG <<HERE ;
+# This is an automatically generated Makefile fragment which is used
+# to configure java-gnome for building. Do not edit (your changes will
+# be overwritten next time ./configure is run), do not commit to
+# repository. Anyone packaging java-gnome on any operating system:
+# please do not override this file by patching it! Figure out what the
+# problem is, and let us know so we can improve the ./configure perl
+# script which generates it.
+
+HERE
+
+output "equivalence, v0.2\n";
+output "...configuring Java projects to build and run on Linux & Unix\n";
+output "\n";
+
+output "Identify operating system:";
+
+if (( -f "/etc/gentoo-release" ) || ( -f "/etc/make.conf" )) {
+	output "Gentoo\n";
+	$os = "gentoo";
+} elsif ( -f "/etc/debian_version") {
+	output "Debian\n";
+	# and Ubuntu
+	$os = "debian";
+} elsif ( -f "/etc/fedora-release" ) {
+	output "Fedora";
+	$os = "fedora";
+} elsif ( -f "/etc/SuSE-release" ) {
+	output "Open SuSE";
+	$os = "suse";
+} elsif ( -f "/etc/arch-release" ) {
+	output "Arch";
+	$os = "arch";
+} elsif ( -f "/etc/mandriva-release" ) {
+	output "Mandriva";
+	$os = "mandriva";
+	# Mandriva Linux has different package names
+	# for 64-bit CPU architectures
+	if (-x "/bin/arch") {
+	    my $arch = `/bin/arch`;
+	    if ($arch =~ m/_64/) { # 64-bit OS
+		$cpu_arch = "64";
+	    }
+	}
+} elsif ( -f "/etc/release" ) {
+	if (`grep Solaris /etc/release`) {
+		output "Solaris";
+		$os = "solaris";
+	}
+} elsif ( -f "/etc/slackware-version" ) {
+	output "Slackware";
+	$os = "slackware";
+} elsif ( -f "/usr/bin/cygwin1.dll" ) {
+	output "Cygwin";
+	$os = "cygwin";
+} elsif ( -f "/etc/centos-release" ) {
+	output "CentOS";
+	$os = "fedora";
+} elsif ( -f "/etc/redhat-release" ) {
+	output "RedHat";
+	$os = "fedora";
+} elsif ( -f "/etc/java/jpackage-release" ) {
+	output "JPackage";
+	$os = "fedora";
+}
+
+if ($os) {
+	print CONFIG "OS=$os\n\n";
+} else {
+	bail "unknown!", <<HERE ;
+What we really need you to do is to look into this configure program,
+and tell us what to add. Based on the examples of what is specified
+for other distributions, you can probably quickly figure out what the
+appropriate settings are for your platform. 
+
+Letting us know what changes you had to make here (ie, whatever
+actions resulted in a .config that allows you to build and test
+java-gnome, and run the java-gnome demo) we can help others with your
+operating system take advantage of this program.
+
+HERE
+}
+
+output "\n";
+
+# --------------------------------------------------------------------
+# Specify locations of dependencies, by operating system, and 
+# verify pre-requisites are present.
+# --------------------------------------------------------------------
+
+my @junit_jars;
+my $jni_path;
+
+output "Check for required jar files:\n";
+
+
+# ADVICE TO PEOPLE EXTENDING THIS SECTION FOR THEIR OWN OPERATING SYSTEM:
+# You might as well list things in such an order that you tell the builder
+# the package whose dependencies will bring the rest of the pre-requisites 
+# in along the way...
+
+if ($os eq "gentoo") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/junit/lib/junit.jar");
+
+
+} elsif ($os eq "debian") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+
+	
+} elsif ($os eq "fedora") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+
+} elsif ($os eq "arch") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+
+} elsif ($os eq "mandriva") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+
+} elsif ($os eq "suse") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+
+
+} elsif ($os eq "solaris") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/lib/java/junit.jar");
+
+} elsif ($os eq "slackware") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+
+} elsif ($os eq "cygwin") {
+
+	check_prereq(@junit_jars,
+		"JUnit test framework",
+		"junit",
+		"/usr/share/java/junit.jar");
+	
+	
+} else {
+	bail "failed!", "This OS not configured with defaults!\nTHIS IS AN INTERNAL ERROR, PLEASE FILE A BUG.";
+}
+
+
+# This section checks for all the GNOME pre requisites.
+# Paths mentioned here, are relative to the prefix.
+
+my @gnomedev_libs;
+
+output "\nCheck for required system libraries:\n";
+
+if ($os eq "gentoo") {
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28 
+					gtk+-3.0 >= 3.0.0
+					pango >= 1.28 
+					librsvg-2.0 
+					atk 
+					gdk-3.0 
+					gtk+-unix-print-3.0 
+					cairo-svg >= 1.10.0 
+					gtksourceview-3.0",
+			"GNOME",
+			"gnome");
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"app-text/enchant");
+
+#	check_system_library(@gnomedev_libs,
+#			"gtkspell-3.0",
+#			"GtkSpell",
+#			"gtkspell");
+
+
+} elsif ($os eq "slackware") {
+	# on slackware gdk-2.0 and gtk+-unix-print-2.0 are part of gtk+-2.0
+	# use http://packages.slackware.it/ for more details. 
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28",
+			"GLib",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"gtk+-3.0 >= 3.0.0",
+			"GTK+",
+			"gtk+2");
+
+	check_system_library(@gnomedev_libs,
+			"pango >= 1.28",
+			"Pango",
+			"pango");
+
+	check_system_library(@gnomedev_libs,
+			"librsvg-2.0",
+			"RSVG",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"atk",
+			"ATK",
+			"atk");
+
+	check_system_library(@gnomedev_libs,
+			"gtksourceview-3.0",
+			"GtkSourceView",
+			"FIXME");
+
+
+#	check_system_library(@gnomedev_libs,
+#			"gtkspell-3.0",
+#			"GtkSpell",
+#			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"FIXME");
+
+
+} elsif ($os eq "debian") {
+	check_system_library(@gnomedev_libs,
+			"cairo-svg >= 1.10",
+			"Cairo",
+			"libcairo2-dev");
+
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28",
+			"GLib",
+			"libglib2.0-dev");
+
+	check_system_library(@gnomedev_libs,
+			"gtk+-3.0 >= 3.0 
+					gdk-3.0 
+					gtk+-unix-print-3.0",
+			"GTK+",
+			"libgtk3.0-dev");
+
+	check_system_library(@gnomedev_libs,
+			"pango >= 1.28",
+			"Pango",
+			"libpango1.0-dev");
+
+	check_system_library(@gnomedev_libs,
+			"librsvg-2.0",
+			"RSVG",
+			"librsvg2-dev");
+
+	check_system_library(@gnomedev_libs,
+			"atk",
+			"ATK",
+			"libatk1.0-dev");
+
+	check_system_library(@gnomedev_libs,
+			"gtksourceview-3.0",
+			"GtkSourceView",
+			"libgtksourceview-3.0-dev");
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"libenchant-dev");
+
+#	check_system_library(@gnomedev_libs,
+#			"gtkspell-3.0",
+#			"GtkSpell",
+#			"libgtkspell-dev");
+
+
+} elsif ($os eq "arch") {
+	check_system_library(@gnomedev_libs,
+			"cairo-svg >= 1.10",
+			"Cairo",
+			"cairo");
+
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28",
+			"GLib",
+			"glib2");
+
+	check_system_library(@gnomedev_libs,
+			"gtk+-3.0 >= 3.0 
+					gdk-3.0 
+					gtk+-unix-print-3.0",
+			"GTK+",
+			"gtk3");
+
+	check_system_library(@gnomedev_libs,
+			"pango >= 1.28",
+			"Pango",
+			"pango");
+
+	check_system_library(@gnomedev_libs,
+			"librsvg-2.0",
+			"RSVG",
+			"librsvg");
+
+	check_system_library(@gnomedev_libs,
+			"atk",
+			"ATK",
+			"atk");
+
+	check_system_library(@gnomedev_libs,
+			"gtksourceview-3.0",
+			"GtkSourceView",
+			"gtksourceview3");
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"enchant");
+
+	check_system_library(@gnomedev_libs,
+			"gtkspell3-3.0",
+			"GtkSpell",
+			"gtkspell3");
+
+
+} elsif ($os eq "suse") {
+	check_system_library(@gnomedev_libs,
+			"cairo-svg >= 1.10",
+			"Cairo",
+			"libcairo2-dev");
+
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28 
+					gtk+-3.0 >= 3.0.0
+					pango >= 1.22 
+					atk 
+					gdk-3.0 
+					gtk+-unix-print-3.0",
+			"GNOME development libraries",
+			"libgnome-devel");
+
+	check_system_library(@gnomedev_libs,
+			"librsvg-2.0",
+			"RSVG",
+			"librsvg-devel");
+
+	check_system_library(@gnomedev_libs,
+			"gtksourceview-3.0",
+			"GtkSourceView",
+			"FIXME");
+
+
+#	check_system_library(@gnomedev_libs,
+#			"gtkspell-3.0",
+#			"GtkSpell",
+#			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"FIXME");
+
+} elsif ($os eq "mandriva") {
+	check_system_library(@gnomedev_libs,
+			"cairo-svg >= 1.10",
+			"Cairo",
+			"lib{$cpu_arch}cairo-devel");
+		    # lib64cairo-devel-1.10.2-2-mdv2011.0.x86_64
+
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28 
+					gtk+-3.0
+					pango >= 1.22 
+					atk 
+					gdk-3.0 
+					gtk+-unix-print-3.0",
+			"GTK development libraries",
+			"lib${cpu_arch}gtk+3.0-devel");
+
+	check_system_library(@gnomedev_libs,
+			"librsvg-2.0",
+			"RSVG",
+			"lib${cpu_arch}rsvg2-devel");
+
+	check_system_library(@gnomedev_libs,
+			"gtksourceview-3.0",
+			"GtkSourceView",
+			"lib${cpu_arch}gtksourceview-3.0-devel");
+
+
+#	check_system_library(@gnomedev_libs,
+#			"gtkspell-3.0",
+#			"GtkSpell",
+#			"lib${cpu_arch}gtkspell-devel");
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"lib${cpu_arch}enchant-devel");
+
+} elsif ($os eq "fedora") {
+	check_system_library(@gnomedev_libs,
+			"cairo-svg >= 1.10",
+			"Cairo",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"glib-2.0 >= 2.28",
+			"GLib",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"gtk+-3.0 >= 3.0
+					gdk-3.0 
+					gtk+-unix-print-3.0",
+			"GTK+",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"pango >= 1.28",
+			"Pango",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"librsvg-2.0",
+			"RSVG",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"atk",
+			"ATK",
+			"FIXME");
+
+	check_system_library(@gnomedev_libs,
+			"gtksourceview-3.0",
+			"GtkSourceView",
+			"FIXME");
+
+
+	check_system_library(@gnomedev_libs,
+			"enchant",
+			"Enchant",
+			"FIXME");
+
+#	check_system_library(@gnomedev_libs,
+#			"gtkspell-3.0",
+#			"GtkSpell",
+#			"FIXME");
+
+}
+
+
+
+# --------------------------------------------------------------------
+# Record jar locations
+# --------------------------------------------------------------------
+
+print CONFIG <<HERE ;
+
+# The lists of jars are colon separated, suitable for being
+# concatenated into a CLASSPATH
+
+HERE
+
+print CONFIG "JUNIT_JARS=".join(":", at junit_jars)."\n";
+
+output "\n";
+
+# --------------------------------------------------------------------
+# Check compilers: locations, necessary arguments, and that they work
+# --------------------------------------------------------------------
+
+output "Check Java compilers:\n";
+
+# compilers we will check for:
+my $javac;
+my $ecj;
+my $gcjC;	# The moniker $gcjC refers to `gcj -C`
+my $kaffec;
+
+# tools we check at same time (not switchable)
+my $javah;
+my $jar;
+my $javadoc;
+
+if ($os eq "gentoo") {
+
+	if ( ! -x "/usr/bin/java-config") {
+		bail "", "INTERNAL ERROR couldn't find java-config";
+	}
+	# this is getting ridiculous
+	my $java_home;
+	if ($jdk_home) {
+		$java_home = "$jdk_home";
+	} else {
+		$java_home = `java-config -O`;
+		chomp $java_home;
+	}
+
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", "/usr/bin/ecj-3.4", "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+	check_compiler($ecj, "Eclipse ecj", "/usr/bin/ecj-3.3", "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6") unless $ecj;
+	
+	# check javac (the one specified by Gentoo's java-config tool)
+	# The $vendor business is just some precision prettiness for the
+	# display.
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = `java-config --javac`;
+
+		$javah_candidate = `java-config -O`;
+		chomp $javah_candidate;
+		$javadoc_candidate = $javah_candidate;
+
+		$javah_candidate .= "/bin/javah";
+		$javadoc_candidate .= "/bin/javadoc";
+
+		$jar_candidate = `java-config --jar`;
+		$vendor = "System";
+	}
+
+	if ($javac_candidate =~ /sun/i) {
+		$vendor = "Sun";
+	} elsif ($javac_candidate =~ /blackdown/i) {
+		$vendor = "Blackdown";
+	} elsif ($javac_candidate =~ /ibm/i) {
+		$vendor = "IBM";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check gcj. -C means generate .class files, not .o files (which are
+	# for linking into native executables.
+
+	my $gcj_candidate;
+
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C");
+
+	# check tools
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} elsif ($os eq "debian") {
+	# we can do much better than this, especially for java/javac.
+	# Do we access the alternatives system, or just go with known
+	# paths, or...? `which` is lame
+
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	# check for a proper "real" JDK's javac as installed (and maybe
+	# selected in the alternatives system) by the user. In other words,
+	# javac -> /opt/sun-jdk-1.4.2.02/bin/javac, not javac -> kaffec.
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = which("javac");
+		$javah_candidate = "";
+		$jar_candidate = "";
+		$javadoc_candidate = "";
+		$vendor = "System";
+	}
+	if ($javac_candidate =~ /sun/i) {
+		$vendor = "Sun";
+	} elsif ($javac_candidate =~ /blackdown/i) {
+		$vendor = "Blackdown";
+	} elsif ($javac_candidate =~ /ibm/i) {
+		$vendor = "IBM";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check gcj. The moniker $gcjC refers to `gcj -C`. See HACKING.
+	my $gcj_candidate;
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C -g");
+
+	# check for kaffe's compiler
+	check_compiler($kaffec, "Kaffe javac", "/usr/lib/kaffe/bin/javac", "");
+
+	# check for JDK tools. To suit Debian prejudices, use GNU tools if found.
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jni_header_generator($javah, "GNU gcjh", which("gcjh"), "-jni") unless $javah;
+	check_jni_header_generator($javah, "System javah", which("javah"), "-jni") unless $javah;
+
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_jar($jar, "GNU fastjar", which("fastjar"), "") unless $jar;
+	check_jar($jar, "System jar", which("jar"), "") unless $jar;
+
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+	check_javadoc($javadoc, "GNU gjdoc", which("gjdoc"), "");
+	check_javadoc($javadoc, "System javadoc", which("javadoc"), "") unless $javadoc;
+
+} elsif ($os eq "fedora") {
+	# we can do much better than this, especially for java/javac.
+	# Should we just go with known paths, or...? `which` is so lame
+
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = "/usr/bin/javac";
+		$javah_candidate = "/usr/bin/javah";
+		$jar_candidate = "/usr/bin/jar";
+		$javadoc_candidate = "/usr/bin/javadoc";
+		$vendor = "System Default";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check for gcj
+	my $gcj_candidate;
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C");
+
+	# check for kaffe's compiler
+	check_compiler($kaffec, "Kaffe javac", which("kaffec"), "");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} elsif ($os eq "suse") {
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = "/usr/lib/jvm/java/bin/javac";
+		$javah_candidate = "/usr/lib/jvm/java/bin/javah";
+		$jar_candidate = "/usr/lib/jvm/java/bin/jar";
+		$javadoc_candidate = "/usr/lib/jvm/java/bin/javadoc";
+		$vendor = "Sun";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check for gcj
+	my $gcj_candidate;
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C");
+
+	# check for kaffe's compiler
+	check_compiler($kaffec, "Kaffe javac", which("kaffec"), "");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+
+} elsif ($os eq "arch") {
+	# we can do much better than this, especially for java/javac.
+	# Should we just go with known paths, or...? `which` is so lame
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$vendor = "Specified";
+	} else {
+		$vendor = "System";
+		$jdk_home = $ENV{"JAVA_HOME"};
+	}
+
+	$javac_candidate = "$jdk_home/bin/javac";
+	$javah_candidate = "$jdk_home/bin/javah";
+	$jar_candidate = "$jdk_home/bin/jar";
+	$javadoc_candidate = "$jdk_home/bin/javadoc";
+
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} elsif ($os eq "mandriva") {
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = which("javac");
+		$javah_candidate = which("javah");
+		$jar_candidate = which("jar");
+		$javadoc_candidate = which("javadoc");
+		$vendor = "System";
+	}
+
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} elsif ($os eq "solaris") {
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = "/usr/java/bin/javac";
+		$javah_candidate = "/usr/java/bin/javah";
+		$jar_candidate = "/usr/java/bin/jar";
+		$javadoc_candidate = "/usr/java/bin/javadoc";
+		$vendor = "Sun";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check for gcj
+	my $gcj_candidate;
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C -g");
+
+	# check for kaffe's compiler
+	check_compiler($kaffec, "Kaffe javac", which("kaffec"), "");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} elsif ($os eq "slackware") {
+	# we can do much better than this, especially for java/javac.
+	# Should we just go with known paths, or...? `which` is so lame
+
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = "/usr/lib/java/bin/javac";
+		$javah_candidate = "/usr/lib/java/bin/javah";
+		$jar_candidate = "/usr/lib/java/bin/jar";
+		$javadoc_candidate = "/usr/lib/java/bin/javadoc";
+		$vendor = "Sun";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check for gcj
+	my $gcj_candidate;
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C");
+
+	# check for kaffe's compiler
+	check_compiler($kaffec, "Kaffe javac", which("kaffec"), "");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} elsif ($os eq "cygwin") {
+	# check ecj, the standalone Eclipse compiler.
+	check_compiler($ecj, "Eclipse ecj", which("ecj"), "-g -preserveAllLocals -nowarn -source 1.6 -target 1.6");
+
+	my $javac_candidate;
+	my $javah_candidate;
+	my $jar_candidate;
+	my $javadoc_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$javac_candidate = "$jdk_home/bin/javac";
+		$javah_candidate = "$jdk_home/bin/javah";
+		$jar_candidate = "$jdk_home/bin/jar";
+		$javadoc_candidate = "$jdk_home/bin/javadoc";
+		$vendor = "Specified";
+	} else {
+		$javac_candidate = "/usr/bin/javac";
+		$javah_candidate = "/usr/bin/javah";
+		$jar_candidate = "/usr/bin/jar";
+		$javadoc_candidate = "/usr/bin/javadoc";
+		$vendor = "GNU Classpath";
+	}
+	check_compiler($javac, "$vendor javac", $javac_candidate, "-g -source 1.6 -target 1.6");
+
+	# check for gcj
+	my $gcj_candidate;
+	if ($gcj_home) {
+		$gcj_candidate = "$gcj_home/bin/gcj";
+	} else {
+		$gcj_candidate = which("gcj");
+	}
+	check_compiler($gcjC, "GNU gcj -C (bytecode mode)", $gcj_candidate, "-C");
+
+	# check for kaffe's compiler
+	check_compiler($kaffec, "Kaffe javac", which("kaffec"), "");
+
+	check_jni_header_generator($javah, "$vendor javah", $javah_candidate, "-jni");
+	check_jar($jar, "$vendor jar", $jar_candidate, "");
+	check_javadoc($javadoc, "$vendor javadoc", $javadoc_candidate, "");
+
+} else {
+	bail "failed!", "This OS not configured with a workable Java compiler checks!\nTHIS IS AN INTERNAL ERROR, PLEASE FILE A BUG.";
+}
+
+output "\n";
+
+# --------------------------------------------------------------------
+# Check runtimes
+# --------------------------------------------------------------------
+
+output "Check Java virtual machines:\n";
+
+# runtimes we will check for:
+my $java;
+my $gij;
+my $kaffe;
+my $cacao;
+my $jamvm;
+
+if ($os eq "gentoo") {
+	# check java (the one specified by Gentoo's java-config tool)
+	# Is there any actual scenario where the javac would be from one 
+	# vendor's JDK and the java from anther's JRE? I can't imagine, but
+	# do the $vendor check again. It's only cosmetic in any event.
+	my $java_candidate;
+	my $vendor;
+
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+	} else {
+		$java_candidate = `java-config --java`;
+	}
+
+	if ($java_candidate =~ /sun/i) {
+		$vendor = "Sun";
+	} elsif ($java_candidate =~ /blackdown/i) {
+		$vendor = "Blackdown";
+	} elsif ($java_candidate =~ /ibm/i) {
+		$vendor = "IBM";
+	} else {
+		$vendor = "System";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe
+	check_runtime($kaffe, "kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "debian") {
+	# check for a proper JDK/JRE java Virtual Machine (presumably either
+	# blackdown, or the real thing from Sun or IBM, as installed by the
+	# user).  NOTE that this does *NOT* mean Sable VM or kaffe (so, if the
+	# Debian alternatives system can say that's what's providing
+	# java-runtime, then we need to take advantage of that. This is for a
+	# real JRE only, ie java -> /opt/sun-jdk-1.4.2.02/bin/java, not for
+	# java -> kaffe.
+	my $java_candidate;
+	my $vendor;
+
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = which("java");
+		$vendor = "System";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project). In Debian
+	# and Ubuntu the default version is provided by package gij.
+	my $gij_candidate;
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe. Don't take it personally, but kaffe is not meant as a
+	# robust production ready VM.  It's a research tool (so described on
+	# their home page) but given the progress in GNU classpath lately it
+	# *may* work, so we do check for it  - we just don't pick it by
+	# preference.
+	check_runtime($kaffe, "Kaffe VM", "/usr/lib/kaffe/bin/java", "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "fedora") {
+	# check for a proper JDK/JRE java Virtual Machine. Red Hat is using
+	# the alternatives system symlinks to select JVMs, and then *again*
+	# to select versions. All the symlinks end up back in /usr/lib/jvm with
+	# predictable names, which makes this workable.
+	my $java_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = "/usr/bin/java";
+		$vendor = "System Default";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe. See the comment about Kaffe above in the Debian block.
+	check_runtime($kaffe, "Kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "suse") {
+	# check for a proper JDK/JRE java Virtual Machine. 
+	my $java_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = "/usr/lib/jvm/java/bin/java";
+		$vendor = "Sun";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe. See the comment about Kaffe above in the Debian block.
+	check_runtime($kaffe, "Kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "arch") {
+	# check for a proper JDK/JRE java Virtual Machine. Red Hat is using
+	# the alternatives system symlinks to select JVMs, and then *again*
+	# to select versions. All the symlinks end up back in /usr/lib/jvm with
+	# predictable names, which makes this workable.
+	my $java_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = "/opt/java/bin/java";
+		$vendor = "IBM";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe. See the comment about Kaffe above in the Debian block.
+	check_runtime($kaffe, "Kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "mandriva") {
+	# check for a proper JDK/JRE java Virtual Machine.
+	my $java_candidate;
+	my $vendor;
+
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = which("java");
+		$vendor = "System";
+	}
+
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "solaris") {
+	# check for a JDK/JRE java Virtual Machine, allowing an alternate to be set
+	# (no reason to disable that)
+	my $java_candidate;
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+	} else {
+		$java_candidate = "/usr/java/bin/java";
+	}
+
+	check_runtime($java, "Sun java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe
+	check_runtime($kaffe, "kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "slackware") {
+	# check for a proper JDK/JRE java Virtual Machine. 
+	my $java_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = "/usr/lib/java/bin/java";
+		$vendor = "Sun";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe. See the comment about Kaffe above in the Debian block.
+	check_runtime($kaffe, "Kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} elsif ($os eq "cygwin") {
+	# check for a proper JDK/JRE java Virtual Machine. 
+	my $java_candidate;
+	my $vendor;
+	if ($jdk_home) {
+		$java_candidate = "$jdk_home/bin/java";
+		$vendor = "Specified";
+	} else {
+		$java_candidate = "/usr/bin/java";
+		$vendor = "Sun";
+	}
+	check_runtime($java, "$vendor java VM", $java_candidate, "-client -ea");
+
+	# check gij (the bytecode interpreter from the GCJ project)
+	my $gij_candidate;
+	if ($gcj_home) {
+		$gij_candidate = "$gcj_home/bin/gij";
+	} else {
+		$gij_candidate = which("gij");
+	}
+	check_runtime($gij, "GNU gij", $gij_candidate, "");
+
+	# check kaffe. See the comment about Kaffe above in the Debian block.
+	check_runtime($kaffe, "Kaffe VM", which("kaffe"), "");
+
+	# check jamvm (an elegant bytecode interpreter used by many in the
+	# CLASSPATH project to test new releases)
+	my $jamvm_candidate;
+	if ($jamvm_bin) {
+		$jamvm_candidate = "$jamvm_bin";
+	} else {
+		$jamvm_candidate = "/usr/bin/jamvm";
+	}
+	check_runtime($jamvm, "JamVM VM", $jamvm_candidate, "");
+
+	my $cacao_candidate;
+	if ($cacao_bin) {
+		$cacao_candidate = "$cacao_bin";
+	} else {
+		$cacao_candidate = "/usr/bin/cacao";
+	}
+	check_runtime($cacao, "CACAO VM", $cacao_candidate, "");
+
+} else {
+	bail "failed!", "This OS not configured with appropriate Java VM checks!\nTHIS IS AN INTERNAL ERROR, PLEASE FILE A BUG.";
+}
+
+output "\n";
+
+
+# --------------------------------------------------------------------
+# Check for GCJ native Java compiler and for a C compiler
+# --------------------------------------------------------------------
+
+output "Check native compiler:\n";
+
+# these are initialized as, unlike javac which is populated with *something*,
+# even if gcj is not found we still need a variable for it.
+my $gcc;
+my $cc;
+
+if ($os eq "solaris") {
+	# this should result in something with gcc in its name
+	check_CC($gcc, "GNU gcc", abs_path("/usr/gnu/bin/cc"), "");
+
+	# otherwise, we use Sun's compiler and linker
+	check_CC($cc, "Sun cc", abs_path("/usr/bin/cc"), "") unless $gcc;
+
+	# and if things are completely out to lunch,
+	check_CC($cc, "Path cc", which("cc"), "") unless $cc;
+
+} elsif ($os) {
+	my $gcc_candidate;
+
+	if (($gcj_home) && ($gcjC)) {
+		$gcc_candidate = "$gcj_home/bin/gcc";
+	} else {
+		$gcc_candidate = which("gcc");
+
+		# Workaround ccache needing to be symlinked as gcc 
+		# to perform _as_ gcc. Gentoo bug #180353
+		if (basename($gcc_candidate) eq "ccache") {
+			$gcc_candidate = `which gcc`;
+		}
+	}
+
+	check_CC($gcc, "GNU gcc", $gcc_candidate, "");
+}
+
+output "\n";
+
+# --------------------------------------------------------------------
+# Choose between java compilers and VMs, reviewing overrides
+# --------------------------------------------------------------------
+
+# if gij isn't sufficient version, then knock out gcj
+if (!$gij) {
+	if ($gcjC) {
+		output "Can't use GCJ, insufficiently recent version\n\n";
+	}
+	undef $gcjC;
+	undef $gij;
+}
+
+print CONFIG <<HERE ;
+
+# the JAVAC variable contains the path to the java source compiler,
+# the JAVA variable contains the path to the java runtime virtual
+# machine. In both cases, the _CMD variable is for the terse output
+# when make commands are running.
+
+HERE
+
+output "Select compiler:";
+
+if ($compiler) {
+	# if overridden, check override...
+	if ($compiler eq "javac") {
+		bail "bad override", "javac specified but not detected as a workable compiler." unless $javac;
+	} elsif ($compiler eq "ecj") {
+		bail "bad override", "ecj specified but not detected as a workable compiler." unless $ecj;
+	} elsif ($compiler eq "gcj") {
+		bail "bad override", "gcj (-C) specified but gcj not detected as a workable compiler." unless $gcjC;
+	} else {
+		bail "bad override", <<HERE ;
+You specified compiler=$compiler on the command line, but that's not an option.
+Valid choices are ecj, javac, or gcj - but of course that compiler must be
+installed (and detected!) in order to be able to specify it.
+HERE
+	}
+
+} else {
+	# otherwise, pick a compiler.
+	if ($ecj) {
+		$compiler = "ecj";
+	} elsif ($javac) {
+		$compiler = "javac";
+	} elsif ($gcjC) {
+		$compiler = "gcj";
+	} else {
+		bail "failed", "No java compiler was detected.";
+	}
+}
+
+if ($compiler eq "javac") {
+	print CONFIG "JAVAC=$javac\n";
+	print CONFIG "JAVAC_CMD=JAVAC    \n";
+} elsif ($compiler eq "ecj") {
+	print CONFIG "JAVAC=$ecj\n";
+	print CONFIG "JAVAC_CMD=ECJ      \n";
+} elsif ($compiler eq "gcj") {
+	print CONFIG "JAVAC=$gcjC\n";
+	print CONFIG "JAVAC_CMD=GCJ [-C] \n";
+} else {
+	bail "failed", "INTERNAL ERROR no compiler selected.";
+}
+
+
+print CONFIG <<HERE ;
+
+# the JAVAH, JAR, and JAVADOC variables simply contains a usable jar
+# and javah executable, respectively, while the JAVAH_CMD, JAR_CMD,
+# and JAVADOC_CMD variables is for display purposes, matching the
+# pattern above.
+
+HERE
+
+
+if ($javah) {
+	print CONFIG "JAVAH=$javah\n";
+	print CONFIG "JAVAH_CMD=JAVAH    \n";
+} else {
+	bail "failed", "No JNI header generator detected.";
+}
+
+if ($jar) {
+	print CONFIG "JAR=$jar\n";
+	print CONFIG "JAR_CMD=JAR      \n";
+} else {
+	bail "failed", "No Java archive tool detected.";
+}
+if ($javadoc) {
+	print CONFIG "JAVADOC=$javadoc\n";
+	print CONFIG "JAVADOC_CMD=JAVADOC  \n";
+} else {
+	bail "failed", "No JavaDoc tool detected.";
+}
+
+output "$compiler\n";
+
+
+output "Select runtime:";
+
+# Note that java is favoured over gij only because the error messages
+# are better! (Ok, and, frankly, the compliance is obviously better
+# if its a real Java VM). The Free ones are getting there...
+
+if ($runtime) {
+	# if overridden, check override...
+	if ($runtime eq "java")  {
+		bail "bad override", "java specified but not detected." unless $java;
+	} elsif ($runtime eq "gij") {
+		bail "bad override", "gij specified but not detected." unless $gij;
+	} elsif ($runtime eq "kaffe") {
+		bail "bad override", "kaffe specified but not detected." unless $kaffe;
+	} elsif ($runtime eq "cacao") {
+		bail "bad override", "cacao specified but not detected." unless $cacao;
+	} elsif ($runtime eq "jamvm") {
+		bail "bad override", "jamvm specified but not detected." unless $jamvm;
+	} else {
+		bail "bad override", <<HERE ;
+You specified runtime=$runtime on the command line, but that's not an option.
+Valid choices are java, gij, or kaffe - but of course that virtual machine
+must be installed (and detected!) before you can specify it.
+HERE
+	}
+
+} else {
+	if ($java) {
+		$runtime = "java";
+	} elsif ($cacao) {
+		$runtime = "cacao";
+	} elsif ($jamvm) {
+		$runtime = "jamvm";
+	} elsif ($gij) {
+		$runtime = "gij";
+	} elsif ($kaffe) {
+		$runtime = "kaffe";
+	} else {
+		bail "failed", "No usable Java runtime environment was detected.";
+	}
+}
+
+$java="$java -Djava.awt.headless=true";
+
+if ($runtime eq "java") {
+	print CONFIG "JAVA=$java\n";
+	print CONFIG "JAVA_CMD=JAVA     \n";
+} elsif ($runtime eq "gij") {
+	print CONFIG "JAVA=$gij\n";
+	print CONFIG "JAVA_CMD=GIJ      \n";
+} elsif ($runtime eq "kaffe") {
+	print CONFIG "JAVA=$kaffe\n";
+	print CONFIG "JAVA_CMD=KAFFE    \n";
+} elsif ($runtime eq "cacao") {
+	print CONFIG "JAVA=$cacao\n";
+	print CONFIG "JAVA_CMD=CACAO    \n";
+} elsif ($runtime eq "jamvm") {
+	print CONFIG "JAVA=$jamvm\n";
+	print CONFIG "JAVA_CMD=JAMVM    \n";
+} else {
+	bail "failed", "INTERNAL ERROR no virtual machine selected";
+}
+output "$runtime\n";
+
+# --------------------------------------------------------------------
+# Output native build information
+# --------------------------------------------------------------------
+
+print CONFIG <<HERE ;
+
+# the path to the C compiler
+
+HERE
+
+if ($gcc) {
+	use File::Basename;
+
+	my $jni_include = "";
+	my $java_home = dirname($java);
+	$java_home =~ s/\/bin$//;
+	if ($os eq "fedora" && $java_home eq "/usr") {
+	    $java_home = "/usr/lib/jvm/java";
+	}
+
+	if (!-d "$java_home"."/include") {
+		$java_home =~ s/\/jre//;
+	}
+
+	if (-f "$java_home"."/include/jni.h") {
+		if ($os eq "solaris") {
+			$jni_include = "-I$java_home/include -I$java_home/include/solaris";
+		} else {
+			$jni_include = "-I$java_home/include -I$java_home/include/linux";
+		}
+	} elsif (-f "/usr/include/jni.h") {
+		# good, but that's default search path - no -I required.
+	} else {
+		bail "failed", "Can't locate the JNI header file";
+	}
+
+	my $ccache = which("ccache");
+	if ( -x $ccache) {
+		print CONFIG "CCACHE=$ccache\n";
+	}
+
+	my $deprecations;
+	if ( "$strict" ) {
+		$deprecations = "-DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DG_DISABLE_DEPRECATED -DGSEAL_ENABLE";
+	} else {
+		$deprecations = "";
+	}
+
+	my $pic_flag;
+	if ($os eq "cygwin") {
+		$pic_flag = "-DPIC";
+	} else {
+		$pic_flag = "-fPIC";
+	}
+
+	print CONFIG "CC=$gcc -g -Wall $pic_flag $jni_include -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast $deprecations -Werror-implicit-function-declaration -Wfatal-errors\n";
+	print CONFIG "CC_CMD=GCC      \n";
+	print CONFIG "LINK=$gcc -g -shared -Wall $pic_flag\n";
+	print CONFIG "LINK_CMD=LINK     \n";
+} elsif (($cc) && ($os eq "solaris")) {
+	print CONFIG "CC=$cc -Kpic -I/usr/java/include -I/usr/java/include/solaris\n";
+	print CONFIG "CC_CMD=CC       \n";
+	print CONFIG "LINK=$cc -G -zdefs -Kpic -lc\n";
+	print CONFIG "LINK_CMD=LINK     \n";
+} else {
+	bail "failed", "C compiler not detected";
+}
+
+`rm -f Hello.java Hello.class Hello.o Hello Hello.c Hello.jar`;
+
+print CONFIG <<HERE ;
+
+# the install prefix. This *only* affects the location that installed
+# files are sent to during the `make install` step. You can, as it
+# happens, override it on the make command line the same way you
+# specify DESTDIR, ie by doing `make PREFIX=/blah install`.
+
+HERE
+
+if (!$prefix) {
+	$prefix = "/usr/local";
+}
+print CONFIG "PREFIX=$prefix\n";
+if (!$libdir) {
+	$libdir = "$prefix/lib";
+}
+print CONFIG "LIBDIR=$libdir\n";
+if (!$jardir) {
+	$jardir = "$prefix/share/java";
+}
+print CONFIG "JARDIR=$jardir\n";
+
+# --------------------------------------------------------------------
+# Get version constant
+# --------------------------------------------------------------------
+
+my $apiversion;
+my $version;
+
+open SOURCE, "src/bindings/org/freedesktop/bindings/Version.java";
+while (<SOURCE>) {
+	chomp;
+	if (/.* APIVERSION = \"([\d\.]+)\";/) {
+		$apiversion = $1;
+	}
+	if (/.* VERSION = \"([\d\.\-rcdev]+)\";/) {
+		$version = $1;
+	}
+}
+close SOURCE;
+
+if (!$apiversion) {
+	bail("","Couldn't find the API version");
+}
+if (!$version) {
+	bail("","Couldn't find the release version");
+}
+
+print CONFIG <<HERE ;
+
+# finally, we extract the version strings from the source code, for
+# use in naming the target library files.
+
+HERE
+
+print CONFIG "APIVERSION=$apiversion\n";
+print CONFIG "VERSION=$version\n";
+
+# --------------------------------------------------------------------
+# Done! Create .config file
+# --------------------------------------------------------------------
+
+output "\n";
+output "Output:\n";
+output " - configuration data";
+close CONFIG;
+system "mv .config.tmp .config";
+
+output "ok\n";
+
+
+# --------------------------------------------------------------------
+# Output text file with library location
+# --------------------------------------------------------------------
+
+output " - native library location";
+
+open LIBRARY, ">.libdir";
+
+print LIBRARY <<HERE ;
+$libdir
+HERE
+
+close LIBRARY;
+
+output "ok\n";
+output "\n";
diff --git a/doc/design/1a-Homework.txt b/doc/design/1a-Homework.txt
new file mode 100644
index 0000000..59eded5
--- /dev/null
+++ b/doc/design/1a-Homework.txt
@@ -0,0 +1,266 @@
+Re-engineering (1): Homework
+
+BACKGROUND
+==========
+
+Discussions of auto-generating the Java bindings around GTK, GNOME and friends
+are NOT new. So its time to do your homework:
+
+1. learn what algorithmic mapping means,
+2. learn what denaturation is,
+3. see why `onEvent()` will be a better method prototype than `event()`
+   in a redesigned signal handling API,
+4. know what a `.defs` files looks like are and where you might get them
+   from.
+
+The Great Owen Thread
+---------------------
+
+18 months ago there was an outstanding discussion on the subject of
+java-gnome's API design and internals. Since it was started by Owen
+Taylor, I've named it _The Great Owen Thread_. :)
+
+You could read it online at SourceForge
+<http://sourceforge.net/mailarchive/message.php?msg_id=11579420>
+but don't do that: you can't make out half of it because it's so deeply
+nested. Instead, I cleaned up a copy of the thread so it would be suitable for
+printing and included it here:
+
+[`TheGreatOwenThread.html`](TheGreatOwenThread.html)
+
+Follow the link and _print it out_ with your _printer_ so you can _read it_
+carefully and thoroughly. **THIS IS REQUIRED READING**. I'm not kidding. If
+you want to comment on what we might do to redesign the signal handling APIs,
+then read this thread. If you're interested in what the overall structure and
+architecture and "feel" of the new java-gnome might be like, then read this
+thread. If you want to know why its necessary to break API, read this thread.
+
+The proposals there are not gospel, and, in fact, we've learnt a lot since
+then as you will be seeing in the subsequent emails about architecture. But
+it's good background: it contains a lot of wisdom from the very bright people
+who preceded us as maintainers of java-gnome, and it behoves us to learn from
+them. 
+
+
+Aside: Memory Management
+------------------------
+
+Do note that much of the memory stuff was successfully incorporated into
+java-gnome in when libgtk-java 2.8 was released containing the "memory
+management patches". See the release notes for
+
+[java-gnome 2.12.0](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoTwelveZero)
+
+It was a shame that Nick Rahn and Jeffery Morgan had to move on from the
+project right when they did as they contributed so much to the the fact
+that the code no longer leaks **everything**.
+
+While you're at it, see all the release announcements over the last year
+or so:
+
+[java-gnome 2.12.1](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoTwelveOne)  
+[java-gnome 2.12.2](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoTwelveTwo)  
+[java-gnome 2.12.3](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoTwelveThree)  
+[java-gnome 2.14.0](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoFourteenZero)  
+[java-gnome 2.14.1](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoFourteenOne)  
+[java-gnome 2.14.2](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoFourteenTwo)  
+[java-gnome 2.14.3](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoFourteenThree)  
+[java-gnome 2.16.0](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoSixteenZero)  
+[java-gnome 2.16.1](http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/NewsTwoSixteenOne)  
+
+
+Considering using .defs format
+------------------------------
+
+It turns out that there _is_ a meta data representation of GTK. Well sort
+of.
+
+For a while now, several other language bindings have used something
+called defs files to help them know what code they need to generate, and
+how.
+
+There is _not_, however, one canonical version of this information.  Rather,
+the individual projects run a defs file generator (`h2defs.py`, etc) over
+their own copy of the header files from each C library, then tinker with the
+results a little (or a lot) and then run their own code generator over THAT.
+
+As you all know, we've had some good chats with the python crowd, and and
+having looked over their `.defs` files (and compared to gtkmm's, etc) I get
+the sense that we will probably be best off to import their `.defs` files and
+use those [on the premise that someday we might be able to abstract the .defs
+information OUT of pyGTK and into some other module on their own.
+Unfortunately, it's not a 100% drop in - there are PyThis and PyThat here and
+there in their `.defs` files. {sigh}.
+
+Anyway, discussions about defs files goes 'way back: this message from
+2000 (midway through the discussion thread where the design was
+originally done) more or less documents the file format:  
+<http://mail.gnome.org/archives/gtk-devel-list/2000-January/msg00086.html>  
+(reading the whole thread gives a sense of the complexity of the
+problem, but you can skip it)
+
+There was also discussion of cross project use of .defs files. See this
+thread from 2004,  
+<http://mail.gnome.org/archives/language-bindings/2004-March/msg00089.html>  
+but its unclear whether anything actually came of it.
+
+Finally, I recommend you check out a copy of pyGTK and nose around the
+`gtk/*.defs` files and the `codegen/*.py` files. Failing a checkout, at least
+look at one of these files
+[online](http://cvs.gnome.org/viewcvs/pygtk/gtk/gtk-base.defs?view=markup).
+
+
+Optional reading: Software version control
+------------------------------------------
+
+GNOME is *still* using CVS, which is rather surprising. They are about to do a
+migration to Subversion (tried once, and aborted, which is a surprise seeing
+as how most other projects managed to get off of CVS quite a while ago).
+
+None of this impresses me terribly much; while Subversion is indeed a
+better CVS, it's still of the same mold and still reliant on a
+centralized server. Its branching and merging capability is rather
+simplistic.And more to the point, distributed version control has been
+with us for quite a while now.
+
+Of course, it's difficult to know which Distributed Revision Control
+System might be best to choose. Third generation systems of current note
+are
+
+* Bazaar[-NG] (`bzr`) an evolution from Bazaar (`baz`) evolving from
+  (`tla`) which evolved from (`arch`). Current work being done by the likes of
+  Martin Pool, Robert Collins, Aaron Bentley and other really smart people I
+  respect. Written in Python
+
+* Git (`git`), the version control system written by Linux Torvalds
+  after their licence to use the proprietary bitkeeper software the Linux
+  kernel was using was revoked out from underneath them. Written in C.
+
+* Mercurial (`hg`), also written in Python, started about the same week as
+  Git was, and for the same reason.
+
+I'm going to blog my views on the subject one of these days, but for now
+I encourage you to read up on them.
+
+In particular, I recommend the following two threads, both from Carl Worth,
+the leader of the Cairo project:  
+<http://lists.freedesktop.org/archives/cairo/2006-February/006255.html>  
+(just read his message unless you want to hear arguments about why Subversion
+isn't up to it)
+
+<http://lists.freedesktop.org/archives/cairo/2006-February/006335.html>  
+(read the thread -- interesting insights into things)
+
+FreeDesktop as a whole is rapidly moving to git; in particular X.org has now
+migrated as well.
+
+Why do I bring this up?
+
+1. There won't likely be very much direct code reuse from the existing
+java-gnome bindings so whether and when GNOME CVS migrates to Subversion is
+less of a concern at this point;
+
+2. I'm not super concerned about code history in any event;
+
+3. the way that distributed systems dramatically drop the barrier to
+contribution is **amazing**, and can (depending on how you use them) better
+reflect the way that open source projects actually work.
+
+Counterpoint: Jeff Waugh noted to me the other day that Bazaar-NG has a
+read-from-subversion feature, something like
+
+        bzr checkout http://svn.blah.org/path/to/repo
+
+which I thought rather a good idea. (Jeff contends that this is why switching
+to Subversion is "ok"). Of course, it didn't take me long to realize that git
+has the same feature, care of `git-svn`. Oh, and the Bazaar feature relies on
+an unreleased version of Subversion.
+
+All this to say: we will not be using a 1st generation revision control tool
+for the new java-gnome bindings. Which to use? Good question. We'll decide
+over the next couple months. Despite my evident enthusiasm for Git, I suspect
+we will settle on Bazaar. It is more likely to work on more platforms, the
+developers actually write unit tests around their tool (imagine), but most
+importantly, it's easier to use -- and given that we are serious about
+inviting new audiences to the GNOME world, I think that's pretty important.
+
+_Andrew Overholt and others commented that IDE integration with the VCS tool
+is important. This is true, but the benefits of going with a modern 3rd
+generation DVCS system outweigh the team tools as currently in Eclipse and the
+others. They will catch up soon enough._
+
+
+Optional reading: GNOME politics
+--------------------------------
+
+I'm hesitant to introduce this topic, but as members of the GNOME community,
+it's important to understand the context of things. Anyone wanting to someday
+be a future maintainer of the GNOME Java bindings had probably better be
+current on all this.
+
+In essence, there was great concern expressed recently over the proposed
+inclusion of a GTK# based app in the GNOME Desktop. That in turn led to the
+question of whether or not Mono should be a language allowed for desktop apps.
+
+I do not take this as an overly significant issue, since distros will ship
+whatever they're going to ship and it matters to me somewhat less what is
+"official GNOME release" and what isn't. It is nevertheless a massively
+contentious issue within GNOME and so here you go with the latest instalment
+of the flame fest.
+
+Jeff's attempt to restart the discussion [a good summary email which
+leads a second monster debate]:
+<http://mail.gnome.org/archives/desktop-devel-list/2006-July/msg00516.html>
+
+The mail from the release manager which quickly mutated out of control
+into an enormous discussion:
+<http://mail.gnome.org/archives/desktop-devel-list/2006-July/msg00076.html>
+
+To a lesser extent, this discussion about the role of GNOME is
+interesting:
+<http://mail.gnome.org/archives/desktop-devel-list/2006-July/msg00240.html>
+
+Observations:
+
+1. It's quite obvious that people have many preconceived notions that they are
+not in a rush to let facts or objective benchmarking get in the way of.  The
+fact there is little or no concrete objective benchmarking available doesn't
+help.
+
+2. Several of the corporate players in the the GNOME community have expressed
+that they will not be shipping Mono apps (and are shipping Java ones).
+
+3. This entire discussion has absolutely nothing to do with you being
+"allowed" to write java-gnome apps. It would be relevant if you ever want your
+app will be a part of *core* GNOME. Of course, the definition of *THAT* is a
+bit vague, as you will see if you delve into this monster.
+
+4. Java is already a blessed part of the language binding suite, for whatever
+that's worth.
+
+AfC  
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 12
+Aug 06; last modified 4 Dec 06._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/1b-AllAboutJNI.txt b/doc/design/1b-AllAboutJNI.txt
new file mode 100644
index 0000000..4ec9e76
--- /dev/null
+++ b/doc/design/1b-AllAboutJNI.txt
@@ -0,0 +1,113 @@
+Re-engineering (1): The Java Native Interface 
+
+There's one other vitally important area of background information necessary
+to grok; I should have included this in the Homework email. It's hard to
+contemplate a Java binding of a C library without understanding the API used
+to cross the boundary between Java code and C code: the Java Native Interface,
+or JNI.
+
+The JNI Book
+------------
+
+There's a [good book][jnibook] on the topic which at some point became
+available in an HTML version. You can download it from the link below and I
+recommend that you do. You'll need to make a couple symlinks to make the
+navigation work, though.  
+<http://java.sun.com/docs/books/jni/>  
+
+[jnibook]: http://java.sun.com/docs/books/jni/html/jniTOC.html
+
+The book does get a touch off the beaten track at some points. Without the
+experience we already have I'm sure it would be easy to get lost down blind
+alleys. You don't need to worry about the C code creating and running a VM,
+for example. And their example of leveraging existing native libraries
+(binding, to us) is chaotic.
+
+Despite these points (which you can ignore), the rest of the book is
+excellent. Certainly if you've done any work already with the existing
+java-gnome libraries it'll be a welcome reference to help understand some of
+the things we've been doing by rote. :)
+
+In any case, there's one message that comes through loud and clear: while you
+_can_ do manipulations equivalent to Java code on the C side, it takes MANY
+more lines of code to do so and is WAY more error-prone; therefore, don't!
+
+Obviously there are corner cases where we won't be able to avoid using the
+power of JNI to cause things to happen on the Java side [raising Exceptions is
+the thin edge of that particular wedge] but nevertheless it is increasingly
+obvious to me that if we're careful about the choices we make we can end up
+avoiding a huge amount of hassle. As Ismael said on #java-gnome last night: "I
+prefer that approach more, where you do as most as you can in the Java side.
+It's faster and there are better tools to debug with". Agreed.
+
+The JNI Specification
+---------------------
+
+The spec itself is somewhat obscurely written. As far as I can tell,
+everything you need is in the above book. I'd still recommend downloading a
+copy of the spec for reference. Doing:
+
+    $ wget -x -nc -r -I/j2se/1.4.2/docs/guide/jni/spec/ http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html
+
+will get you a copy which you can then move somewhere convenient.
+
+Performance
+-----------
+
+People (myself included) always express concerns about the performance of code
+which uses JNI. 
+
+Someone in `#classpath` pointed out the following link:  
+<http://java.sun.com/docs/books/performance/1st\_edition/html/JPNativeCode.fm.html#18062>
+
+Reading any selected paragraph of the above reference or the JNI book would
+quickly give you the idea that most of JNI is the kiss of death for
+performance. Well, it turns out that java-gnome in its present 2.x form
+already *does* things the worst case way:
+
+* multiple crossings of the boundary per call to pass data
+* passing objects for Handles
+* using finalizers
+* not caching class and method lookups (!)
+
+And you know what? It's not slow! Java GTK apps are perfectly snappy. My
+inference is that the underlying libraries we are calling are costly enough
+(or, fast enough) that a few cycles for the overhead of JNI are not a
+significant factor. So restricting ourselves based on some paranoia about this
+or that way of doing things turns out to premature. (Take finalizers for
+example -- so what if "It is typically slower to create and reclaim instances
+of classes with finalizers than to create and reclaim those without
+finalizers." -- in the present design we use them to good effect, and things
+work just fine. If we need them in the re-engineered bindings, so be it)
+
+Doesn't mean that we won't choose better algorithms if we can, but we can
+first and foremost concentrate on getting the job done properly, and accept
+small JNI overheads should a particular approach that we choose imply those
+overheads.
+
+AfC
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 18
+Aug 06; last modified 4 Dec 06._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/2a-ObjectiveAndAudience.txt b/doc/design/2a-ObjectiveAndAudience.txt
new file mode 100644
index 0000000..a255e9b
--- /dev/null
+++ b/doc/design/2a-ObjectiveAndAudience.txt
@@ -0,0 +1,184 @@
+Re-engineering (2): Objective and Audience
+
+Now that you've done your homework, we can talk about where we're going and
+why.
+
+As I've said elsewhere on many occasions, I have the utmost respect for the
+authors who have built the Java bindings up over the past 9 years.  As someone
+with well over 38,400 lines of application code built on libgtk-java and
+friends, I continue to be astounded by the richness and power of GTK and the
+ease of use [relative to C, anyway] of the bindings.
+
+Having been a developer with java-gnome, QA person for a distro's packages,
+then author of that distro's packages of the java-gnome libraries, meanwhile
+bug reporter to the bindings themselves, then code contributor, then
+committer, for now for the last year or so I have found myself the titular
+maintainer of the java-gnome project. Along the way as I've been confronted
+with bug reports, patches, and my own attempts to scratch out improvements,
+I've gained a fair familiarity with what's inside the guts of the project and
+appreciate well the complexity and pain involved in deploying a set of
+libraries such as ours.
+
+6 weeks ago I was sitting at GUADEC listening to the lecture about all the new
+features in GTK 2.10, and I started going into cardiac arrest wondering how
+the heck we were going to manually re-invent and wrap all the new APIs.
+Unfortunately, the existing foundation we have just isn't scalable and
+requires far too much work to maintain, let alone grow.
+
+So we're off on a redesign, something we've been talking about for years. The
+primary motivation for this process is so that we can switch to a mostly
+generated bindings to allow us keep up with the underlying libraries with
+minimal further marginal effort, but along the way hopefully we can improve
+some of the things that have been less than ideal all these years.
+
+That's all nice and fine, but who are we as a project, and what are we trying
+to achieve?
+
+I'd like to put the following suggestion of what our goals should be and who I
+think our audience is to you in this email; the following one will describe
+what I think the overall design constraints are, and then we can move on into
+the technical decisions we need to agree upon which we will use to govern the
+rest of our work together.
+
+
+Objective
+=========
+
+As I see it, our mission, as a bindings, is to achieve one quality above all
+else:
+
+<center>
+                            **APPROACHABILITY**
+</center>
+
+I define this to mean that we take every effort to make java-gnome as easy to
+learn as possible and as pleasant to develop with as possible.
+
+Bog knows GTK itself is hard! The GTK APIs themselves are rich and powerful
+but with that richness comes complexity and detail that needs to be mastered.
+
+In its native C, GTK programs are very nearly impenetrable, certainly
+exceedingly verbose, and brutally difficult to debug. All these factors are
+areas where Java in general and java-gnome in particular are a great
+improvement. In particular, we've already seen that the combination of a
+naturally object-oriented language like Java along with the code completion
+features of a rich IDE like Eclipse make for a really excellent development
+experience.
+
+If we do our job with the bindings right, then newcomers who have chosen to
+write a GTK app from Java to quickly learn for themselves how to go about
+doing what they need to do.
+
+This doesn't mean we don't do things differently! After all is said and done,
+technically, the primary goal is:
+
+<center>
+                          **TO PRESENT GTK WELL**
+</center>
+
+
+so we will do our best to come up with an excellent representation of GTK in
+Java, not to come up with some idealized watered-down middle-of-the-road
+please-everyone toolkit that looks like all the other toolkits just because
+that's the way they look.
+
+Rather, we're trying to do as effective a language binding as we can possibly
+come up with, consistent with the discussion in the rest of this email and the
+ones that follow in topic (2).
+
+
+Audiences
+=========
+
+We have a number of audiences to look towards. It's just as important,
+however, to point out who I *don't* think we should be worrying about, as much
+as who we are trying to support.
+
+
+Java developers who want to write a "native" Linux app: YES!
+------------------------------------------------------------
+
+There is an important segment which I think we can address effectively: the
+huge number of people with Java programming experience.
+
+You might think this goes without saying, but specifically, our target
+audience are people who are Java programmers who happen to be using GNOME on
+Linux or Solaris and who just might like to write an application and want it
+to look good and therefore want to write it in GTK.
+
+The existing pool of people with Java expertise is enormous and is a large
+audience whom free software have largely ignored over the years.  More than
+anything, I'd like to ensure we give these people the power to write rich
+desktop programs and clients, and in the process bring a whole new crowd of
+people into the amazing world that is GNOME and Software Libre.
+
+
+People who are already GTK hackers: NOT REALLY
+----------------------------------------------
+
+On the other hand, existing GTK hackers are not a group that I think we should
+be trying to target as our primary audience.
+
+They are, after all, **already** proficient with GTK! (presumably from C but
+perhaps from Python or whatever) and are quite the wizards to have been able
+to do so.
+
+And so I feel no moral imperative to try and convert them to using Java or our
+bindings. I point this out explicitly to contrast to the Mono project, who
+treat their work like its some kind of religion that everyone must convert to.
+
+Now: if an experienced GNOME developer wants to move on to using a mature and
+fast managed runtime, and if they want to avoid writing in Microsoft's patent
+encumbered languages, and if they want to take advantage of the monumental
+power of Eclipse, then yes, absolutely, we'd love to have them working in GTK
+via java-gnome.
+
+And that's one of the reasons that as-complete-as-we-can-manage coverage and
+an algorithmic mapping of the APIs is important. But in the mean time, lets
+concentrate on approachability, ok?
+
+
+Everyone else: NO
+-----------------
+
+There are lots of GUI choices out there already.
+
+We will differentiate ourselves by being a good binding of GTK.
+
+If someone wants to go on and on about how SWING does that and SWT does that,
+well then my very simple answer is "sure, no problem. Go use it, then". We're
+not forcing anyone to do anything; Open Source is about choice, after all.
+
+So we don't have to try and be all things to all people, which frees us up
+nicely to concentrate on doing a good job of being a Java binding to GTK,
+Cairo, and the GNOME libraries.
+
+Which leads us to the question of how we can best do that. [Design
+constraints](2b-DesignConstraints.html) are the subject of the next document.
+
+AfC   
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 19
+Aug 06; last modified 4 Dec 06._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/2b-DesignConstraints.txt b/doc/design/2b-DesignConstraints.txt
new file mode 100644
index 0000000..11ac214
--- /dev/null
+++ b/doc/design/2b-DesignConstraints.txt
@@ -0,0 +1,293 @@
+Re-engineering (2): Design constraints
+
+The issue of audience described in my last message has a significant impact on
+our design. You've probably already guessed:
+
+* useful JavaDoc is paramount
+* full coverage is important
+* predictable API is important
+
+As much as possible, this message describes conceptual goals and constraints,
+rather than elaborating on actual implementation. You might therefore be
+tempted to dismiss this discussion, but note that as of this writing I have a
+working prototype that so far achieves these objectives, so realizing them is
+at least possible.
+
+In no particular order, then:
+
+Overall feel
+============
+
+The basic pattern is good...
+----------------------------
+
+There is lots of java-gnome code out there, even if most of it is tucked away
+quietly. So people (certainly myself among them) have been reasonably happy
+with the basic idioms that working in java-gnome has presented.
+
+This is not, however, a governing constraint.
+
+...but API breakage is going to be necessary
+--------------------------------------------
+
+This can't be helped. Certainly, if you recall the areas of inconsistency that
+Owen pointed out in his messages to this list last year, you will recognize
+that it will be impossible to switch to a (presumably generated) algorithmic
+mapping of the underlying libraries while somehow maintaining the chaotic
+variety of method naming schemes that are present today. The two simply aren't
+compatible.
+
+There are also vast areas of GTK that aren't covered properly -- mostly
+because of missing accessors and mutators for properties, but also a fair
+number of fundamental features are missing as well. I won't mention the stuff
+that notionally has coverage but that in reality, well, just doesn't work.
+
+So there's going to be API breakage. It may well be considerable (ie major
+version number increment API change, along the lines of what we went through
+from GTK+ 1.2 to GTK+ 2.0). 
+
+At which point we have a golden opportunity.
+
+Improvement
+-----------
+
+Frankly, there really aren't too many sacred cows. Some areas of the coverage
+are cumbersome or are implemented poorly. And these are definitely targets for
+repair.
+
+TreeView is a classic example. Right now we have an implementation that is
+serviceable, but oh my is it hard to use. This in no small part reflects the
+very thick complexity of the underlying GTK TreeView and TreeModel APIs. Now,
+I rather expect that when we crank out generated bindings, that, if anything,
+the situation will be worse because the constructs in GTK really _are_ low
+level. This is where we potentially have an opportunity to do better this time
+around. As a supplement to the low level APIs, it may well make sense to
+develop a wrapper layer on top of the generated low level function mappings
+which would provide a much simpler API and which would integrate with basic
+Java language idioms more cleanly.
+
+This particular topic will be continued in another thread; lots of room for
+creativity and ideas here. See FIXME
+
+<a name="comfort"></a>
+
+The bindings will be comfortable to Java developers
+===================================================
+
+Java is not the "best" language. Nor is it the "worst". Frankly, it's just
+another programming language and that's more or less that. But it does have a
+few characteristics that are worth taking advantage of.
+
+More than anything, the existence of outstanding IDEs has made java-gnome a
+pleasure to work in. And it's a specific feature of the IDE that matters: code
+completion. Getting a list of property setters or listeners that you can
+connect along with popup JavaDoc describing what each one does makes for a
+vastly superior development experience.
+
+And that means:
+
+<a name="hand-written"></a>
+
+Extensive JavaDoc that is hand written, not generated
+-----------------------------------------------------
+
+One of the reasons that GTK is hard to use is because the documentation -- for
+all that it is extensive -- doesn't really tell you how to use it if you don't
+already know what you're doing. Certainly, if you are not already a wizard C
+programmer you can forget about it being told how to use it _right_. Trying to
+do a one to one translation from C descriptions to Java ones would be foolish
+at best (doesn't mean we can't cut and paste many of the property
+descriptions).
+
+A related problem in API documentation in general is that it is usually
+written for a given entry point and defined (generally linear) reading path.
+Which is no good whatsoever when you're neck deep in the middle of something,
+and you're either mouse hovering over a method name or you've jumped directly
+to some arbitrary page in the HTML docs.
+
+This, more than anything else, is where approachability comes in.
+
+We will have **extensive** explanation to the point of considerable redundancy
+so that people new to GTK and using our bindings to try and write a GTK
+program can quickly learn how the heck to do what it is they want to do. YES
+that violates the programming dictat to abstract out functionality rather than
+duplicating code, but YES we're going to do it anyway.
+
+They key to understand why is to realize that whenever someone looks at a
+given snippet of documentation, they have a specific question in mind.
+Perhaps its "how do I get a button click". If you look at GtkButton, you
+discover there's clicked and activate. What's the difference? The doc should
+explain, and refer to both, rather than just "get a clicked event" -- thanks
+for nothing (it's even worse, there's activate() and an activate event signal.
+What's the difference?)
+
+And not just
+
+    "Set the rabbit property." (gee, thanks for nothing)
+
+but
+
+    "Set the rabbit property to one of fast, lean, fat, or dead. You probably
+    want to choose a fast rabbit if you're betting on the races, whereas
+    selecting dead is appropriate if you're hungry.  On the other hand, fat
+    rabbits are cute and cuddly and make great companions."
+
+Finally, we will include code snippets in our JavaDoc. Yes, code snippets.
+Phil and I were talking the other night and recalling how amazing the original
+Turbo C|Pascal documentation was -- every single function call in the standard
+library had a small bit of code to show how you might use the thing. Now
+that's not necessary for every last method, but certainly at class level it's
+a great idea. See the JavaDoc for Button's [connect()][example]
+for an idea of what I'm getting at.
+
+[example]: http://java-gnome.sourceforge.net/4.0/doc/api/org/gnome/gtk/Button.html#connect(org.gnome.gtk.Button.CLICKED)
+
+Implementation details hidden
+-----------------------------
+
+One of my personal grievances about the present java-gnome bindings is the
+amount of internal machinery that is exposed. With the possible exception of
+`getType()` [and I'm not even sure that will be necessary], I'd like to see a
+strategy that completely hides internal implementation details.
+
+This means, for instance, that if (say) GtkButton were a generated class
+{underlying, implementing, or being the delegate of} Button, then GtkButton
+simply **should not** visible to anyone developing an application with the
+bindings. Java has a rich scoping mechanism and we should make the most of it.
+
+
+Development features
+====================
+
+Must be able to use an IDE to do any of the Java coding required
+----------------------------------------------------------------
+
+This came up last week, and I reiterate it here as a design constraint. A
+major consideration is that whatever part of the bindings that have to be hand
+crafted can be maintained from an IDE.
+
+Even if every last drop of the bindings were to be generated, there would
+still be the requirement to hand write documentation as described above. If
+someone is writing JavaDoc comments, they should be able to do so from within
+an IDE's editor. Eclipse for one provides warnings (tunable to error!) if
+JavaDoc is malformed. [Example: we've got un-escaped `<` and `>` characters in
+the documentation of Accelerator; so, surprise, they API documentation there
+is confusing].
+
+This is one reason why the pattern of maintaining documentation blobs in
+individual files and then somehow trying to copy those blurbs into the right
+inclusion points at code generation time is such a terrible approach to doing
+things. You have to develop a terribly complex naming scheme of how and where
+to include such snippets, and then you've got no support for writing the
+snippets in the first place.
+
+[SWIG does this by embedding `""` strings in a *config* file. For 10,000
+methods? Yeah, right]
+
+A bit more broadly, the overall anti-pattern is injection. Trying to embed
+generated code into programmer maintained code or vice versa is a nightmare,
+in no small part because of the collision between what you're editing and that
+file being edited, amended or replaced right out from beneath you. No, if
+you're going to mix and match, they need to be in separate files.
+
+This isn't SWING, or AWT, or SWT, or...
+---------------------------------------
+
+This is an important point. 
+
+"Java-like" and "doing-it-like-SWING-does-it" are not the same thing.
+
+We have a free hand at this point how the more complex APIs are presented. I
+referred you to the long discussions about how to handle events. Our
+opportunity for improvement is to come up with something in these cases that
+makes sense, that is consistent, and that is easily learnt. In other words,
+approachable.
+
+
+...It's GTK!...
+---------------
+
+GTK as a toolkit has quite a number of distinctly GTKish notions.  There's no
+getting around that, and more importantly, presenting those knobs and levers
+is *the whole point*.
+
+...but that doesn't mean every last thing needs to be exposed
+-------------------------------------------------------------
+
+Providing full access to the richness of the GTK API is our primary technical
+goal. But this doesn't mean that every last little thing needs to be exposed.
+
+What I do want to see, though, more than anything, is consistency. Once we
+pick a way to do something, let's stick to it.
+
+A few cases come to mind:
+
+* StockItems: some places the current bindings pass a strongly
+defined Type such as GtkStockItem, and some places we pass a String.
+
+* Properties: many GTK widgets have convenience methods around the
+more popular properties. So those we have those bound; meanwhile, we've
+occasionally bound some of the more interesting properties. We could choose to
+only expose things via `setProperty()`. Or we can choose to expose a getter
+and/or setter for each and every property (the existing bindings lean in this
+direction). I'm inclined to think that this is the best approach as it allows
+us to be really strongly typed. But whichever we do, we should do it
+consistently across the board.
+
+
+...and it doesn't mean we need to completely bind GLib
+-------------------------------------------------------
+
+This may well be contentious. I'm not even certain that it is correct. But
+one thing I have observed is that we may not need to strongly bind the GLib
+and GObject machinery. My investigations so far have tended towards the
+conclusion that _so long as we use GLib and GObject correctly on the C side,
+the fact that Java is already a perfectly well object oriented language means
+we may be able to take [considerable] shortcuts_.
+
+No mapping of deprecated features
+---------------------------------
+
+Deprecated methods and classes are hugely confusing to newcomers for whom GTK
+is already complex enough to grok.
+
+There's tons of cruft in GTK, and tons of cruft in our existing libraries. We
+will, I'm sure, build up new cruft in the future, but it would be silly to
+start a new major version with any of it. So none of the deprecated code in
+GTK and friends will be exposed by our new bindings.
+
+Conclusion
+==========
+
+Those are the list of features and qualities that I think must constrain us.
+The only one that *really* drives design is the JavaDoc one. For what I hope
+are obvious reasons we want to write JavaDoc in `.java` files, and that more
+than anything helps us find our way as we go down the road of considering what
+architectures might work.
+
+AfC
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 24
+Aug 06; last modified 4 Dec 06._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/3a-PackageNames.txt b/doc/design/3a-PackageNames.txt
new file mode 100644
index 0000000..c9c61a2
--- /dev/null
+++ b/doc/design/3a-PackageNames.txt
@@ -0,0 +1,131 @@
+Re-engineering (3): Package names
+
+This is a minor matter, but while we're breaking everything anyway, several
+people have commented that the old java-gnome 2.x package names were _really_
+messed up.
+
+Library names, prefixes, and suffixes
+-------------------------------------
+
+Specifically, we have `glib-java`, `cairo-java`. All good. Then we have
+`libgtk-java`. Huh? Shouldn't that be just `gtk-java`? Or, alternately, the
+first should have been `libglib-java`. Tell me that doesn't look stupid.
+
+Personally, I'm inclined to ditch the lib prefix:
+
+* `glib-java`  
+* `cairo-java`  
+* `gtk-java`  
+
+but then it gets tricky:
+
+* `gnome-java`  ? 
+
+We already get no end of confusion with people wondering where to get
+"`java-gnome`". More to the point, `libgnome{,ui}` is the thing we're
+wrapping, so should it be
+
+* `libgnomeui-java`  ? 
+
+for instance? Same applies to Glade - `libglade` is the thing we're wrapping,
+which would imply we keep
+
+* `libglade-java`  X 
+
+even though that seems stupid. On the other hand, just getting on with it,
+regardless of the underlying library name, seems smart:
+
+* `glade-java`  
+
+which, incidentally, matches what the GTK# folks did, calling it
+`glade-sharp`.
+
+That raises another point. Is the `-java` suffix what people want? We could as
+easily switch to:
+
+* `java-glib`  
+* `java-cairo`  
+* `java-gtk`  
+* `java-gnome`  ? 
+* `java-glade`  
+* `java-vte`  
+
+etc. I'm really undecided about it. Using a suffix matches current practise
+and the GTK# '-sharp' naming pattern to boot, whereas the prefix keeps all the
+libs nicely together in a directory listing (and one in the middle,
+`java-gnome`, matches our current branding).
+
+Open to suggestions.
+
+Of course, changing package names is hell for downstream distros doing the
+actual packaging, but given that there is a major API break happening
+concurrently, I don't view renaming as a completely offencive thing to
+contemplate :)
+
+Number of release blobs
+-----------------------
+
+An even bigger question is whether or not we need this many individual
+libraries. I for one am already **sick and tired** of doing releases on 8+
+libraries each time a macro in the single base library changes. (Of course,
+that's just the gross negligence of the GNU autotools for you. We won't be
+using those in the future).
+
+So we could well reduce it to
+
+* `java-glib`  [to allow independent bindings to be written]
+* `java-gtk`  [to wrap the basic GTK + Glade and/or GtkBuilder]
+* `java-gnome`  [everything else]
+
+And be done with it. A variation on this theme is to do as pyGTK has done:
+
+* `pygtk` 
+* `gnome-python-desktop` 
+* `gnome-python-extras` 
+
+etc which is a naming split based around the constraints of what is allowed to
+go into the bindings set, desktop set, etc of GNOME. Looks a bit inconsistent,
+though.
+
+
+Decision? How about just one!
+-----------------------------
+
+Another variation is what the GTK# folks did, which is one source leads to
+however many packages a given distro wishes. That actually seems rather
+appealing, but they ran all afoul of the GNOME release team over this for some
+reason.
+
+Personally, anything that lets us not have to zillions of tarballs would
+make me much happier, so:
+
+Right now, **the new Java bindings are just a single `java-gnome` and it
+contains everything**. We'll see how long we can keep that up, but someone is
+going to have to pay me a lot of money to change it.
+
+AfC
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 24
+Aug 06; last modified 24 Aug 07._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/3b-VersionNumbers.txt b/doc/design/3b-VersionNumbers.txt
new file mode 100644
index 0000000..fa4f231
--- /dev/null
+++ b/doc/design/3b-VersionNumbers.txt
@@ -0,0 +1,79 @@
+Re-engineering (3): Version numbers
+
+I've stated my [views about
+versioning](http://sourceforge.net/mailarchive/message.php?msg_id=3D15113906)
+before; summarizing quickly:
+
+Our version numbers NOT coupled to underlying libraries
+-------------------------------------------------------
+
+I'd like us to break the tight coupling of our library version number to the
+versions of the underlying libraries (note, plural) that we are wrapping, thus
+freeing us to use the traditional major.minor.patchlevel (`z.y.x`) numbering
+to properly signal API changes without having much of anything to do with
+whether or not GTK or GNOME finally chooses to go to "`3.0`" next week or next
+century.
+
+[The bump to `4.y` and `3.y` is to avoid being re-entangled the moment that
+the myriad GNOME libraries arbitrarily do the jump to `3.0`. As has been
+pointed out elsewhere, that event will probably be marketing-driven and 
+will _not_ likely imply an API or ABI break! Good optics, but bad programming
+juju]
+
+Therefore, our next release set will be (plus or minus whatever naming scheme
+we use):
+
+    glib-java   4.0.x
+    cairo-java  4.0.x
+    gtk-java    4.0.x
+etc.
+
+Which as a whole will be called "`java-gnome 4.0`". The pieces that are part
+of the GNOME bindings set will happily go into "`GNOME 2.18`" or whatever with
+these version numbers.
+
+Release plan
+------------
+
+One final note here -- the first golden release set of the new bindings will
+be **`java-gnome 4.2`**:
+
+* `4.0` will be us hacking and bashing it into shape. I'm hoping it will be
+  ready by GNOME 2.18 [March '07], assuming the work is funded;
+
+* `4.1` will be the first unstable branch when the point eventually comes along
+  after we have ported apps to `4.0` that we need to advance the bindings
+  without wrecking those apps, whenever that comes. It's going to happen --
+  we're sure to have forgotten something {shrug}; and
+
+* that `4.1` will become `4.2` when it goes out with the next formal GNOME
+  release after `4.1` is ready. Crystal ball time? Perhaps "`GNOME 2.20`"
+  [Sept '07] or "`GNOME 2.22`" [March '08]). Here's hoping!
+
+AfC
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 7 Sep
+06; last modified 7 Dec 06. This document is fairly transient and will likely
+be removed once a more rigorous release plan is written_
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/4a-TreeViewAndTreeModel.txt b/doc/design/4a-TreeViewAndTreeModel.txt
new file mode 100644
index 0000000..36e98e4
--- /dev/null
+++ b/doc/design/4a-TreeViewAndTreeModel.txt
@@ -0,0 +1,112 @@
+Re-engineering (4): TreeView and TreeModel API design
+
+A few weeks ago I wrote:
+
+> TreeView is a classic example. Right now we have an implementation that is
+> serviceable, but oh my is it hard to use. This in no small part reflects the
+> very thick complexity of the underlying GTK TreeView and TreeModel APIs.
+> Now, I rather expect that when we crank out generated bindings that, if
+> anything, the situation will be worse because the constructs in GTK really
+> **are** low level. We potentially have an opportunity to do better this time
+> around. As a supplement to the low level APIs, it may well make sense to
+> develop a wrapper layer on top of the generated low level function mappings
+> which would provide a much simpler API and which would integrate with basic
+> Java language idioms more cleanly.
+
+We've discussed this a bit in the past, but in general the scope was limited
+by what we already have in place. Removing that constraint, lets see what we
+can come up with?
+
+Some thoughts to seed the discussion: I had a conversation with some of the
+pyGTK hackers the other day, and they made some interesting comments in
+respect of how they have done things. Interpreting these observations in terms
+of what we might consider doing:
+
+Use the language's iterator?
+----------------------------
+
+Java already has a "perfectly good" (well sort of) idiom for iterators.  It's
+called `Iterator` :) [Yes, the one in `java.util`].
+
+To all intents and purposes it has the same limitations as TreeIter (only
+valid for one cycle through the underlying Collection, invalidated [illegal?]
+if the Collection changes.  TreeIter behaves the same way). So our higher
+level TreeModel API could be an Iterator instead.
+
+Or we could not bother :)
+
+Implement a custom model that uses language data types?
+-------------------------------------------------------
+
+We could write a custom model that implements the GtkTreeModel interface but
+does so in Java and on the Java side so that you can just store Java objects
+in it and carry on. You'd use this instead of [Gtk]ListStore or [Gtk]TreeStore
+
+I'm not convinced this is a good idea, especially given boundary crossing
+costs (there would have to be a C -> JNI query every time a CellRenderer
+needed a bit of information), but maybe.
+
+I imagine it would call for *considerable* work on the C side to create the
+TreeModel subtype that would do all the right hooks which we would then bind
+to. Be pretty cool, though.
+
+Personally, I consider the Object to User Interface mapping to be as tough a
+problem as the Object to Relational mapping problem. What you present and how
+you present it doesn't have a terribly great deal to do with how you represent
+that information in your object model in memory.
+
+As such, the effort of copying data into a ListStore is to me no different
+than that of copying text into a Label. The fact that the data is duplicated?
+{shrug}, whatever.
+
+Davyd Madeley's use case for a custom model was one whereby it did lazy
+loading of a huge data set from disk and as such only had a partial amount in
+memory and thus only that or a subset of it presented to user in the TreeView.
+That does sound rather smart of them to have worked out, but in most of the
+java-gnome code I've seen, that sort of thing is done elsewhere in the code --
+the model in TreeView's MVC is *not* used for primary data storage. After all,
+we've got a perfectly good object-oriented language for that.
+
+More natural idioms?
+--------------------
+
+We could, for example, present Integer and Long and String as the TreeModel
+column types, rather than DataColumnInt and so on.
+
+This one is a touch more appealing to me. The `DataColumn[]` that we pass to
+our {Tree,List}Store constructor has always struck me as a bit cumbersome; or,
+at least, it is because of the requirements to pass the individual DataColumn
+objects as identifiers to later `{set,get}Value()` calls. Ugh.
+
+Just touching up around the margins isn't really going to change anything, but
+a wholesale model API improvement would be something to see.
+
+Just for consideration. Comments welcome.
+
+AfC
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 11
+Sep 06; last modified 7 Dec 06. This document most certainly will evolve if
+we actually redesign the TreeModel and TreeView APIs._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/4b-ObjectProperties.txt b/doc/design/4b-ObjectProperties.txt
new file mode 100644
index 0000000..c1b6ae4
--- /dev/null
+++ b/doc/design/4b-ObjectProperties.txt
@@ -0,0 +1,246 @@
+Re-engineering (4): GObject property handling API
+
+I was chatting with Davyd last night about how I'd achieved a generalized
+setProperty() capability for GObjects in the new bindings. I wrote him an
+email about one of the details, included below, but along the way I've arrived
+at a design decision that I'd like to make sure everyone is ok with.
+
+
+Type safety
+-----------
+
+Java is strongly and statically typed. That's a burden in some cases, but of
+course the benefit of that is type *safety* if something takes an Image, you
+can't shot yourself in the foot by passing it a Font.
+
+That all goes out the window if you have a generic mechanism that takes a
+String as the property name, and some arbitrary Object to use as the its value
+and then tries to do something with it:
+
+    setProperty("label", someFont)
+
+this will compile but blow at runtime in a really ugly fashion.
+
+
+Method Signatures
+-----------------
+
+For a while I've considered properties as special, or at least as needing
+special treatment compared to the more usual functions that are provided. I
+had a good chat with Sandor about this, and we agreed that we would probably
+end up with:
+
+    setPropertyFoo()
+    setPropertyBar()
+
+etc as a good way to  present such properties to developers using our bindings
+in a way that would allow us type safety.
+
+But consider that things like GtkButton have a property called "label".
+GtkButton of course provides a "convenience" method to set the label. Yup,
+it's `gtk_button_set_label()` which java-gnome mapped years ago as
+`setLabel()`. If we consider our wrapper around the standard method, and the
+property, we would end up with
+
+    setLabel()
+    setPropertyLabel()
+
+in the same Button class, and that's just silly.
+
+
+Completion
+----------
+
+One of the characteristics we discussed that we're all in love with is
+code-completion of appropriate methods turning out to be a really cool way of
+finding out what things you can manipulate in (say) a Button, like,
+
+    setLabel()
+    setRelief()
+    setFocusOnClick()
+    setImage()
+
+etc.
+
+These all exist as explicit methods because in a lot of cases the methods
+pre-date the property system in GObject (since GtkObject predates GObject
+which was abstracted out of GTK+).
+
+However, just because there is a label property does not mean that we should
+just set the property directly and bypass the explicit method supplied by GTK.
+That's just asking for trouble, as there is always the risk that the real C
+function does more than just twiddling the public property.
+
+[ok, a String label is a bad example, but there are many more properties which
+are decidedly internal mechanisms, especially in the more complex widgets]
+
+So here comes a design decision:
+
+
+Explicit methods for everything
+-------------------------------
+
+We will have an explicit, strongly typed method for any characteristic that
+can be written to or read from.
+
+Where a characteristic has an explicit function provided by GTK already, and
+we have chosen to expose it, we will wrap and bind that function as normal
+
+    setImage(Image image) -> gtk_button_set_image(button, image)
+
+and ignore a property by the same name if such exists.
+
+When there is no pre-existing explicit function [convenience or otherwise] on
+the C side for a characteristic, and a property exists and is public [and in
+this case, writable], and if we wish to expose it in our public API, we will
+do so with an appropriately named, strongly typed setter method for that
+property doing so by using the GObject property setting mechanism.
+
+    setAlignmentX(float align) {
+        setPropertyFloat(this, "xalign", align) -> g_object_set_property(button, "xalign", align);
+    }
+
+Thus our developers will never have to know that "xalign" is a property, and
+nor do they need to risk runtime type smashups. They can simply learn that
+they can set the x alignment with a predictably named method call.
+
+
+Details
+-------
+
+The hacker visible (ie protected)
+
+    setPropertyFloat()
+
+is a type safe wrapper around the actual `setProperty()`; although we could
+have done a pile of overloading, we can't overload a method's return type in
+Java, so `getProperty()` wouldn't work, whereas
+
+    getPropertyFloat()
+    getPropertyString(), etc
+
+work fine... and along the way allows us to create a GValue which we can a)
+memory manage properly and b) pass to `setProperty(String name, Value value)`
+without having to expose the mechanics of wrapping Fundamental types. More
+below.
+
+AfC
+
+
+-------- Forwarded Message --------  
+From: Andrew Cowie  
+To: Davyd Madeley  
+Subject: Method overloading  
+Date: Mon, 06 Nov 2006 14:26:15 +1100
+
+After you mentioned method overloading the other day and wondered why I was
+bothering with different explicitly named convenience functions (protected so
+only bindings hackers see 'em, but anyway), I woke up screaming worried that I
+may have briefly given you the idea that I didn't know what overloading was.
+
+Just so that you don't think I'm a complete basket case, it occurred to me to
+show you what the constructor of those (likely rarely used) various
+fundamental Value types all call. Each one gets its pointer [as stored Java
+side in a long] by calling one of the various
+
+    GValue.createValue()
+
+which looks something like the code snippet that follows. Actually, not only
+is the hacker visible static factory (-esque) method overloaded, but the
+native methods are also overloaded (for the value of the fact that crossing
+the JNI boundary with primitives is far more efficient than passing objects
+across then having to reach back to get field values).
+
+So,
+
+    class GValue extends Plumbing {
+         
+        ...
+    
+        static final long createValue(int i) {
+            return g_value_init(i);
+        }
+    
+        static final long createValue(boolean b) {
+            return g_value_init(b);
+        }
+    
+        static final long createValue(String str) {
+            return g_value_init(str);
+        }
+    
+        ...
+    
+        /*
+         * These ones does not match the exact prototype of g_value_init()
+         * [which is (GValue*, GType)]; we do the type system magic on the
+         * other side (where its all mostly macros in any case) and carry
+         * out allocation using GSlice.  A rare occasion when we overload
+         * the native call.
+         */
+    
+        private static native final long g_value_init(int i);
+    
+        private static native final long g_value_init(boolean b);
+    
+        private static native final long g_value_init(String str);
+    
+        ...
+    
+        static final void free(Fundamental reference) {
+            g_slice_free(pointerOf(reference));
+        }
+    
+        /*
+         * This could live in GSlice.java, I suppose, but no real reason.
+         * We're below the level of clean abstraction here, and it just
+         * needs to go somewhere.
+         */
+        private static native final long g_slice_free(long value);
+    
+        ...
+    }
+
+Given that I pass primitives across the JNI boundary in the end anyway, it's
+tempting to wonder why not just have the `setProperty()` methods do that --
+and indeed that is what I once had. But the underlying
+`g_object_set_property()` takes a GValue as an argument, so going to the
+trouble of wrapping Java primitives into a GValue means that my single hacker
+visible `setProperty()` is org.gnome.glib.Object's
+
+    setProperty(String name, Value value)
+
+can be used for any of the various things that can be passed to
+`g_object_set_property()`, be they Glib Fundamentals, GBoxeds, GObjects, etc,
+rather than needing an overload of setProperty() for every single type at each
+of developer API, generated java layer, and native layer levels.
+
+Emailing my friends code commentary in an email. I must be on crack.
+
+AfC  
+Sydney
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 6 Nov
+06; last modified 4 Dec 06._
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/5a-Architecture.txt b/doc/design/5a-Architecture.txt
new file mode 100644
index 0000000..0042cc1
--- /dev/null
+++ b/doc/design/5a-Architecture.txt
@@ -0,0 +1,381 @@
+Re-engineering (5): Internal Architecture
+
+I have alluded several times to having worked out an architecture that I think
+will do nicely for us given the constraints that I have articulated.
+
+I spent about a month trailing different alignments of things. When I later
+found Jeff Morgan's "peanut" and "cashew" suggestions, I smiled, but sadly
+those variations had already been considered *and discarded* because they
+weren't sufficient.
+
+Actually, I've done two architectures. I got all the way to a working
+prototype with the first approach, only to discover at the very end that I'd
+missed something. Damn. It was, nevertheless, a rather elegant solution, and
+so I'll describe it:
+
+Interfaces
+==========
+
+The defining constraint is approachability, defined as a) being able to hand
+write documentation and b) ensuring and algorithmic mapping. [Refer to the
+documents in the (2) series]. I also mentioned that I consider it abhorrent to
+expose any implementation machinery to ordinary developers using the bindings.
+
+One common technique in Java land to achieve this is to only hand instances of
+Interfaces to public users, with the actual concrete implementation being
+otherwise hidden.
+
+On the pro side:
+
+If we hand write these interface files, and do our JavaDoc there. This is cool
+because at the end of the day we have to map API documentation to methods, and
+what better meta mapping that to do so *in* Java.
+
+We would be held to ensuring we obey the algorithmic mapping because if we
+borked a method name the generated classes wouldn't map.
+
+It hides the implementation, so all the machinery (signal handlers, object
+Handles, etc) can be hidden from view in the concrete class and not be on the
+interface.
+
+But there's a con:
+
+The biggest objection was to come up with a way to factory create these
+instances. In java-gnome 2.x, you do:
+
+    Button b = new Button("Press Me");
+
+Since Button would now be an Interface, I pondered long and hard about what we
+might replace that with. Putting a static "`create`" factory method on Button
+doesn't work when Interfaces are involved because of course there's no code in
+an Interface file. Creating a separate factory class in parallel naming seemed
+silly:
+
+    Button b = ButtonFactory.createWithLabel("Press Me");
+
+and NOT exposing the underlying generated code is the whole point, so:
+
+    Button b = InternalButtonImplementation.createWithLabel("Press Me");
+
+sucks because it's got nothing to do with the Button we're trying to create.
+
+(Actually, the name GtkButton is the obvious choice for the generated code,
+but the whole point is to not have that class to be visible to developers)
+
+Then one night I struck upon this idea instead: why not put the constructors
+on the static classes we have, roughly one per module, that are named with
+that module name?
+
+    Button b = Gtk.createButton("PressMe");
+
+Which I then shortened about 5 minutes later to:
+
+    Button b = Gtk.Button("PressMe");
+
+Which I was really pleased with. [So pleased in fact that I picked up the
+phone, called Ismael in England, and babbled on for 30 minutes about how cool
+I thought it was. Poor ijuma. :)]
+
+It has a lot to recommend it: it quietly groups things by which GNOME module
+things are from without being offencive about it. The underlying instance that
+is returned is some generated class which implements our Button interface. All
+good. And other than constructors being separated from the declaring
+interfaces, not so bad.
+
+I coded up a fully working prototype, all the way to it popping a window up on
+the screen with a button in it. It worked quite nicely. One thing I paid
+enormous attention to was making sure that whenever you hit `<COMPLETE>` in
+your IDE it offers sensible choices, not mush.
+
+Things were going swimmingly until I ran the JavaDoc generator over my
+prototype. When I loaded them up in my browser I was surprised that the class
+hierarchy was missing.
+
+Oh shit.
+
+The part I'd missed was not only can Classes can implement more than one
+Interface, but Interfaces can implement more than one Interface as well. So
+there's no singular parent, so,
+
+Con: JavaDoc doesn't show that nice inheritance tree.
+
+[actually, I'd often wondered why Eclipse wouldn't show a clean super
+hierarchy of a bunch of interfaces like it would for classes. Duh. Here's why
+-- it can't draw a simple parent relationship because there could be more than
+one parent at each step up the hierarchy]
+
+So is this a show stopper?
+
+I think so: given the criteria of approachability, seeing that GtkButton
+descends from GtkBin descends from GtkContainer descends from GtkWidget is
+really important for quickly coming to understand the whole stack.
+
+We could play games like generating an HTML snippet that would have the
+inheritance diagram we want, but I'm not hugely impressed with that idea, and
+it still looks crummy in an IDE.
+
+I won't go into all the design that I did for how to do custom overrides of
+behaviours and code we'd have to add for various things, or the design I had
+for the generated side. Suffice it to say that those parts all worked quite
+nicely.
+
+Concrete wrappers
+=================
+
+So if that nice class inheritance diagram is important, then the public API
+needs to be in concrete classes. {shrug} ok.
+
+It actually only took me about a day or so of mad hacking to take the
+Interfaces prototype and morph it into something that worked this way. There
+were a couple of surprising changes along the way, but things are looking
+pretty good.
+
+The trick remains this: we need to separate the hand written Java code (where
+the JavaDoc goes and [now] where custom overrides of behaviour [can] go) from
+the generated Java code. The tough parts are issues like:
+
+1. name spaces (ie, effectively leveraging the combination of package space
+and class name space).
+
+2. inheritance hierarchies -- who is extending what? Given that any native G
+entity has two parts on the Java side (the hand written part with the API that
+we expose, and the machinery that we generate and put ... somewhere) ... Is
+there an inheritance hierarchy in both public classes and generated classes?
+Yuk, but if necessary, so be it.
+
+3. where does the information about the underlying native {GObject | Boxed |
+Flag | Enum | whatever} live?
+
+4. Somewhat orthogonal to all this is consideration of what pattern to use
+across the JNI boundary. At first it was tempting to use the fact that a
+native instance method automatically conveys a reference to the Java side
+object, which seemed to offer great possibilities in terms of skipping the
+whole `getHandle()` / `getPointerFromHandle()` nightmare.
+
+I'm not going to iterate through the universe of possibilities, though a lot
+may come out if anyone cares to dispute the choices I'm suggesting. Anyway,
+this is what I ended up with:
+
+Usage wise, we're back to a familiar idiom:
+
+    Button b = new Button("Press Me");
+
+Button is a hand written concrete class. That is not as ideal as the
+"Interfaces" design because instead of typing:
+
+    /**
+     * Some documentation
+     */
+    public String getLabel();
+
+we of course have to have to type:
+
+    /**
+     * Some documentation
+     */
+    public String getLabel() {
+        // call to the generated code, however that's to be done...
+    }
+
+which means that we have to hand write the signature of the generated method
+we're calling, and loose the rigour of matching our method names to the
+underlying native API we're wrapping as a check of algorithmic mapping.
+
+That's the theoretical risk; in practise it evaporates quite nicely. To
+explain why it's not a problem, consider the situation in the 2.x bindings:
+
+At the moment, we have a hand written method signature and the native
+declaration embedded in the same class. Someone typed:
+
+    /**
+     * Some documentation
+     */
+    public void setLabel(String text) {
+        gtk_button_set_label(getHandle(), text);
+    }
+
+    protected native void gtk_button_set_label(Handle handle, String label);
+
+This is what allowed us to get all wonky with our names as Owen pointed out to
+us... there was nothing obviously reminding us to name our method `getLabel()`
+so stuff like `getSticker()` crept in.
+
+By ensuring the generated code has the algorithmic name that under 98% of
+circumstances matches what we are supposed to present as public API, there's
+less guess work involved:
+
+    /**
+     * Some documentation
+     */
+    public String getLabel() {
+        return getLabel();       // FIXME!
+    }
+
+So, duh, if you're wrapping something that the generator spewed out as
+getLabel() you just call your method "`getLabel`" .
+
+[For an example of places where we will want to diverge from slavish
+naming and be a bit more sensible, consider `getAlignment()` which has two
+floats out parameters. We shall again wrap that as `getAlignmentX()` and
+`getAlignmentY()`, but even so, the naming is still consistent and
+predictable - and because we have hand written wrapper classes
+presenting the public API, its easy to add the few lines of custom code
+that will be necessary to present these methods. In fact, I've already
+trialed it]
+
+Of course, there's the obvious question of where the hell does the second
+`getLabel()` come from? I said it was generated, and I said that an
+anti-pattern we're absolutely going to avoid is trying to inject generated
+code and hand maintained code in the same file.
+
+I mentioned wanting to use native instance methods (rather than class
+methods), and I spent a while mixing and matching trying to figure that out.
+The reason to use that mechanism seemed to be a nice match between improving
+the elegance of our code along with being a way to reduce the JNI boundary
+crossing pressure that Andrew Cagney has commented on.
+
+In the end, I landed on something quite different, and the proxy (aka, Handle)
+management is for another email. Relevant for our purposes here is just this:
+rather than having a delegate Proxy object (which we call Handle), I've
+abstracted that down to a single member field on a class that is at the very
+top of our object hierarchy. So instead of passing the Handle object to the
+generated code, we just pass a reference to self which Java provides with
+keyword "`this`". Too easy.
+
+Anyway, what's more important is _"how much work does the person writing the
+wrapper class have to do?"_
+
+How's this:
+
+    /**
+     * Some documentation
+     */
+    public void setLabel(String label) {
+        GtkButton.setLabel(this, label);
+    }
+
+Details:
+
+* The class GtkButton is generated code.
+
+* It is in the same package as our Button class, but unlike button is
+  default visibility (aka "package" visibility aka "package private"). So
+  someone hacking on the bindings can see it with `GtkB<COMPLETE>` but
+  `Gtk<COMPLETE>` is **not** polluted for someone _developing_ with our
+  bindings since they can't see GtkButton. (ie, `Gtk<COMPLETE>` will lead to a
+  single import, Gtk, and show only `Gtk.init()`, `Gtk.main()`, etc -- but see
+  note [1])
+
+* `setLabel()` is a generated class method in GtkButton.
+
+* It in turn calls a static native method [declaration] which is also a
+  generated class method in GtkButton; it was tempting to make `setLabel()`
+  the static native method, but it turns out that we need to be a bit of
+  translating before we can make the JNI call. As we've discussed, better to
+  do that work on the Java side and keep the JNI code as trivial as possible.
+
+(Actually, I ended up on using the existing convention of using the name of
+the C function as the name of the native method; more than anything, it looks
+really good in stack traces when the top most line is evidently the name of
+the underlying C function that we're wrapping and says "native method")
+
+So, `gtk_button_set_label()` is also generated class method (but this time
+`native`, of course) also in generated file GtkButton.java . And moreover,
+there's not even any reason for it to be more than private -- so even
+java-gnome hackers are kept away from this implementation goo.
+
+Here's a skeleton of what generated code for setLabel looks like:
+
+    final class GtkButton extends Plumbing {
+
+        static final void setLabel(Button self, String label) {
+            gtk_button_set_label(pointerOf(self), label);
+        }
+
+        private static native final void gtk_button_set_label(long self, String label);
+    }
+
+
+Of course, running `javah` over that results in a header file which allows
+us to double check that the generated C code matches up.
+
+The JNI function on the C side implementing this is:
+
+    JNIEXPORT void JNICALL
+    Java_org_gnome_gtk_GtkButton_gtk_1button_1set_1label
+            (JNIEnv *env, jclass cls, jlong _self, jstring _label)
+    {
+            ...
+    }
+
+
+This generated C code is very straight forward as well: take the JNI
+parameters and cast them to G ones (trivial in almost every case), calling the
+JNI functions to extract things like Strings, then calling the native
+function, then re-encoding the return value if any.
+
+Discussion
+----------
+
+So, at the end of all this, everything at each layer is nice and clean. It's
+easy to write the API that we present to the public. Since there's a layer
+between the generated code name and the API we present, we have 100% control
+of the API we present and can guarantee our API stability even if people mess
+with the signatures of the underlying functions.
+
+You'll recognize that this code seems to look similar to our existing code
+now. That's not surprising given the nature of the problem space but it's only
+superficial. The handling of parameters, the signatures, and the visibility at
+each layer are deliberately controlled to hide every single implementation
+detail from users. I'm rather pleased with the outcome.
+
+Throughout the design work I've been prototyping with code and testing with an
+experimental application. Pops up a Window with a Button quite nicely, thank
+you very much. I've also put some work into roughing out a code generator, and
+the approach from that side seems quite promising.
+
+And for the occasions that inevitably will arise where we have to do something
+by hand at the layers that are otherwise all generated, the necessary pattern
+is simple to follow. After all, I hand wrote the entire prototype and along
+the way paid close attention to being able to write is simply, easily, with
+brain on but without aggravation.
+
+Conclusion
+==========
+
+I opened this message with "The defining constraint is approachability,
+defined as a) being able to hand write documentation and b) ensuring and
+algorithmic mapping. I also mentioned that I consider it abhorrent to
+expose any implementation machinery to ordinary developers using the
+bindings." These sort of thing is important for -hackers, too: if it's
+too murky, then no one will be able to understand or maintain it.
+
+I'm quite pleased to report that it looks like we've found an
+architecture that will meet these goals.
+
+AfC
+
+_Originally written as an email to java-gnome-hackers by Andrew Cowie on 19
+Sep 06; last modified 25 Sep 07._
+
+<!--
+ 
+  Copyright © 2006-2007 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/START b/doc/design/START
new file mode 100644
index 0000000..f9fc5cf
--- /dev/null
+++ b/doc/design/START
@@ -0,0 +1,150 @@
+START HERE
+
+<style>
+div.box {
+	background-color: #DDDDDD;
+	padding: 15px;
+	border: dashed 3px orange;
+	margin-left: 100px;
+	margin-right: 100px;
+	margin-top: 20px;
+	font-size: x-large;
+}
+</style>
+<div class="box">
+<span class="mono" style="font-size: xx-large; font-weight: bold;">
+Out of date
+</span>
+<p>
+These documents were mostly written in 2006, before java-gnome 4.0 became a
+reality. Two years on most of these decisions have been implemented.  This
+tree will therefore soon be replaced by documents defining the current design
+and architecture.
+</p>
+</div>
+This directory documents the evolution and design of the re-engineered (4.0)
+java-gnome bindings.
+
+Organization of this directory
+------------------------------
+
+The design documents are loosely organized according to the following scheme:
+
+1. Background material:
+
+	* [The Great Owen Thread and other necessary homework](1a-Homework.html)
+	* [Java Native Interface](1b-AllAboutJNI.html)
+
+2. Governing assumptions (our objective as a project, who our audience is, and
+   what constraints we impose on ourselves as we go about our business):
+
+   	* [Objective and Audience](2a-ObjectiveAndAudience.html)
+	* [Design Constraints](2b-DesignConstraints.html)
+
+3. Miscellaneous organizational decisions:
+
+	* [Package Names](3a-PackageNames.html)
+	* [Version Numbering](3b-VersionNumbers.html)
+
+4. Discussion of public APIs:
+
+	* [TreeView, TreeModel](4a-TreeViewAndTreeModel.html)
+	* [GObject properties](4b-ObjectProperties.html)
+
+5. Architecture:
+
+	* [Internal Architecture](5a-Architecture.html)
+
+These numbers correspond to those used to organize the original threads on the
+java-gnome-hackers mailing list. All of these documents started life as emails
+written by Andrew Cowie, so they tend to be written in the first person. That
+will no doubt fade over time as these documents evolve into canonical
+references.
+
+
+About the format of our documentation
+-------------------------------------
+
+These documents are all text files! They are, however, _**lightly**_ marked up
+with the syntax of John Gruber's "[Markdown][markdown]" so that they also
+present nicely as web pages. See [`doc/style/MARKUP`](../style/MARKUP.html)
+for details.
+
+As conventions, we:
+
+* put the title of the document by itself on the first line of the file (the
+  script that renders these to HTML on our website picks this up as `<TITLE>`
+  and top banner `<H1>` heading for the document),
+
+* note, _in italics_, the date of the last significant modification at the
+  bottom of the file, and
+
+* put a `vim` "modeline" on the last line of the document enforcing
+  the word-wrap width (actually, it ends up on the third last line, in the
+  copyright statement footer. Same same).
+
+
+Contribute!
+-----------
+
+This documentation are distributed with java-gnome and are maintained
+alongside (in!) the source code. As such they are living documents and will
+likely evolve over time as new design decisions are taken. If you care to see
+the history behind certain decisions, check the mailing list archives and the
+version history of the files in this directory.
+
+If there is a change you would like to make, check out a copy of the source
+code and send a patch using `bzr bundle`.
+
+Remember, if you want to hack on java-gnome itself, extend it or use it for
+new and miraculous things, you're best off doing so alongside the community.
+Certainly join our mailing lists, but most of all hang with us online, at
+`#java-gnome` on `irc.gimp.org`.
+
+
+About this directory's name
+---------------------------
+
+Incidentally, this directory was named at [foss.in][] 2006 by several
+students gathered around after Andrew Cowie gave a talk about the java-gnome
+4.0 prototype. When asked what they thought a directory containing all the
+background, instructions, architecture, and other answers to anything you'd
+want to know should be called, Srichand Pendyala replied:
+
+> "Why don't you call it 42?"
+
+Awesome! Alas, "42" is a bit of an inside joke, and given our goal of
+approachability for newcomers, `doc/42/` wouldn't really be obvious as the
+location of the design documentation.
+
+So `doc/design/` it is, but such enthusiasm is to be rewarded: I promised him
+that his idea would live on in our documentation. Cheers Srichand!
+
+AfC
+
+_Last modified 7 Dec 06_
+
+[markdown]: http://daringfireball.net/projects/markdown/basics
+[foss.in]: http://foos.in/2006/
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/design/TheGreatOwenThread.html b/doc/design/TheGreatOwenThread.html
new file mode 100644
index 0000000..3a4b660
--- /dev/null
+++ b/doc/design/TheGreatOwenThread.html
@@ -0,0 +1,1796 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>The Great Owen Thread</title>
+        <meta http-equiv="content-type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+        <table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Owen Taylor <otaylor at re...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11579420"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Some notes on Java-GNOME</a>   
+		2005-04-25 12:30
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ I spent some time looking at the Java-GNOME implementation this
+ weekend, and had some concerns that I was pressed to write up.
+ 
+ I"d divide my concerns into three main areas:
+ 
+  - Events
+  - Memory management
+  - Completeness and consistency of the mapping
+ 
+ Events
+ ======
+ 
+ There are two problems with signal handling ... one problem is that it
+ is just clumsy:
+ 
+   button.addListener (new ButtonListener () {
+      public void buttonEvent (ButtonEvent event) {
+          if (event.isOfType(ButtonEvent.Type.CLICK) {
+            System.out.println("Button was clicked");
+          }
+      }
+   });
+ 
+ In Python, say, this is:
+ 
+  def onClick (button):
+     print "Button was clicked";
+  
+  button.connect ("clicked", onClick);
+ 
+ Obviously, there is a syntax barrier for Java, but there is no real 
+ reason it couldn"t be:
+ 
+  button.connectClicked (new ButtonClickedListener () {
+     public void run(Button button) {
+       System.out.println("Button was clicked");
+     }  
+  }
+ 
+ Creating one helper class for each signal might be a bit
+ expensive... there are other cheaper mechanisms with less type
+ safety. For example:
+ 
+  button.connectClicked (new SignalListener () {
+     public Object run(Object[] args) {
+       System.out.println("Button was clicked");
+       return null;
+     }  
+  }
+ 
+ You could have convenience implementations predefined for common
+ cases:
+ 
+  button.connectDestroyEvent (new EventListener () {
+     public boolean run(Widget widget, Event event) {
+        // show a "save changes dialog
+        return true;
+     }
+  }
+ 
+  button.connectClicked (new SimpleListener () {
+     public void run(Object object) {
+        System.out.println("Button was clicked");
+     }
+  }
+ 
+ Another approach would be to take the addEventHandler() approach
+ that currently exists and extend it to use the closure data
+ about argument types, so you could do something like:
+ 
+  button.connectDestroyEvent (new Object () {
+     public boolean destroyEvent(Widget widget, Event event) {
+        // show a "save changes dialog
+        return true;
+     }
+  }
+ 
+ What *all* of these share is that there is an algorithmic mapping to
+ the underlying signals. That is the second problem with the current
+ approach; there is no way that someone familiar with the C or Python
+ interface on an object can guess the way the Java events are set up on
+ that object.
+ 
+ Not only does this make things hard on people who already know a
+ GTK+ from a different language or are reading documentation that uses
+ a different language, it also makes it impossible to do automatic
+ generation of language bindings.
+ 
+ Memory Management
+ =================
+ 
+ One problem with memory management in gtk-java can be
+ expressed with a simple grep command:
+ 
+  libgtk-java$ find -name "*.c" | xargs grep g_object_unref
+  libgtk-java$
+ 
+ If I create a PangoLayout object through the java-gnome APIs,
+ there is no way it will ever be freed.
+ 
+ But this isn"t the only problem with memory management of 
+ GObject ... 
+ 
+  Window window = new Window (WindowType.TOPLEVEL);
+  Button button = new Button ("Hello");
+  window.add (button);
+  window.remove (button);
+  window.add (button);
+ 
+ Will segfault or at least produce warnings as the underlying
+ GtkObject is freed when the button is removed from the window
+ and the Java object is left holding an invalid pointer.
+ 
+ Fixing this, within the constraints of the JNI is admittedly not
+ easy. In fact, I don"t know an entirely satisfactory way of doing so
+ without extending GObject. (I"m going to propose such an addition to
+ GObject for 2.8.) But you can do somewhat better. For example,
+ the approach that gtk# takes is to use strong reference from
+ the CLR object to the GObject and a weak reference in the 
+ opposite direction. 
+ 
+ (The main problem of this is "denaturation"...  if you drop the last
+ reference to a language object that is a subclass of Button, then 
+ if you get the object back from GTK+ what you get is a normal
+ Button, not your subclass.)
+ 
+ 
+ Completeness and Consistency of the Mapping
+ ===========================================
+ 
+ The Java-GNOME bindings seem largely done by hand. This approach
+ is going to cause problems with both completeness and with
+ consistency. A few examples:
+ 
+  pango_layout_set_wrap()
+  pango_layout_get_wrap()
+  pango_layout_set_justify()
+  pango_layout_get_justify()
+  
+ Are wrapped as:
+ 
+  Layout.setWrapStyle()
+  Layout.getWrapMode()
+  Layout.setJustification()
+  Layout.GetJustified()
+ 
+ void pango_layout_set_markup            (PangoLayout    *layout,
+                                          const char     *markup,
+                                          int             length);
+ void pango_layout_set_markup_with_accel (PangoLayout    *layout,
+                                          const char     *markup,
+             	                         int             length,
+ 		        	         gunichar        accel_marker,
+                                          gunichar       *accel_char);
+ are wrapped as:
+ 
+ 
+   public void setMarkup(String markup);
+   public void setMarkup(String markup,
+   	                char   accelMarker); (*)
+ 
+ While using overloading might make sense here, where did the accel_char
+ return from set_markup_with_accel() go?
+ 
+ These examples are from PangoLayout, which is probably newer and rawer
+ then much of Java-GNOME (after all, you can"t free one), but there are
+ problems elsewhere as well. (gdk.Window.getWindowAt, 
+ gdk.Window.setTransientOf, for examples.)
+ 
+ Any language binding is a compromise between sticking close to the
+ library being bound and being truly natural in the language. 
+ Conceptually, GTK+ is composed of two pieces:
+  
+  A) Pieces that are language bindable
+  B) Pieces that are C specific convenience glue
+ 
+ The goal of the GTK+ design is that everything *can* be done using
+ only A). I think a good goal for any language binding is that piece
+ A) is transformed into the language in a way that is completely
+ algorithmic and predictable and then, as necessary, language specific
+ glue is added to make up for piece B).
+ 
+ The introspection facilities in Glib/GTK+-2.8 will provide a canonical
+ description of the GTK+ interfaces. I think it would be good
+ if Java-GNOME could be switched at that point to be primarily
+ autogenerated from the introspection information.
+ 
+ (*) Side note: char isn"t the right mapping for gunichar. It should
+     be int instead. See:
+ 
+ <a href="http://java.sun.com/developer/technicalArticles/Intl/Supplementary/" target="_NEW">http://java.sun.com/developer/technicalArticles/Intl/Supplementary/</a>
+ 
+ [ Note: I"m not subscribed, so please Cc: me on any replies ]
+</pre>
+			</pre>
+		</td>
+	</tr>
+</tbody></table>
+        
+        
+
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Jeff Morgan <kuzman at gm...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11579838"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-25 18:42
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> On 4/25/05, Owen Taylor <otaylor at re...> wrote:
+ > I spent some time looking at the Java-GNOME implementation this
+ > weekend, and had some concerns that I was pressed to write up.
+ 
+ First of all I would like to thank you very much for taking the time
+ to look at Java-GNOME and express your concerns.   There are numerous
+ areas where these bindings need improvement (perhaps significant
+ rewrite).  Over the life of this project it has been a constant struggle 
+ trying to balance our need to improve the bindings, support our current
+ users, and trying to stay somewhat current with the upstream libraries
+ with our extremely limited developer resources.  Those who have been
+ users of this project over that time will say that we have made constant
+ steady (although slow) progress on all of those fronts.   Below I am 
+ going to try to comment on several of the items you listed.
+ 
+ > Events
+ > ======
+ > 
+ > There are two problems with signal handling ... one problem is that it
+ > is just clumsy:
+ > 
+ >   button.addListener (new ButtonListener () {
+ >      public void buttonEvent (ButtonEvent event) {
+ >          if (event.isOfType(ButtonEvent.Type.CLICK) {
+ >            System.out.println("Button was clicked");
+ >          }
+ >      }
+ >   });
+ 
+ 
+ The history of event handling in Java-GNOME is important here.  
+ My initial attempt at signal handling was quite similar to the C 
+ implementation.  There was a collection of methods similar to:
+ 
+ public native int addEventHandler(String name, String func, Object cbrecv)
+ 
+ so the implementation for a button would be:
+ 
+ public void onClick() {
+   System.out.println("Button was clicked");
+ }
+ 
+ button.addEventHandler("clicked", "onClick", this);
+ 
+ As Java developers started to use the bindings I received many 
+ comments stating that the event handling was not very "javalike" 
+ meaning it was not like awt or swing.  After taking a poll of the users
+ it was obvious that the majority of Java developers liked the listener 
+ approach to events.  I proceeded to add this new approach but have 
+ never deprecated the old style of event handling. 
+ 
+ > Obviously, there is a syntax barrier for Java, but there is no real
+ > reason it couldn"t be:
+ > 
+ >  button.connectClicked (new ButtonClickedListener () {
+ >     public void run(Button button) {
+ >       System.out.println("Button was clicked");
+ >     }
+ >  }
+ > 
+ > Creating one helper class for each signal might be a bit
+ > expensive... there are other cheaper mechanisms with less type
+ > safety. For example:
+ > 
+ >  button.connectClicked (new SignalListener () {
+ >     public Object run(Object[] args) {
+ >       System.out.println("Button was clicked");
+ >       return null;
+ >     }
+ >  }
+ > 
+ > You could have convenience implementations predefined for common
+ > cases:
+ > 
+ >  button.connectDestroyEvent (new EventListener () {
+ >     public boolean run(Widget widget, Event event) {
+ >        // show a "save changes dialog
+ >        return true;
+ >     }
+ >  }
+ > 
+ >  button.connectClicked (new SimpleListener () {
+ >     public void run(Object object) {
+ >        System.out.println("Button was clicked");
+ >     }
+ >  }
+ > 
+ > Another approach would be to take the addEventHandler() approach
+ > that currently exists and extend it to use the closure data
+ > about argument types, so you could do something like:
+ > 
+ >  button.connectDestroyEvent (new Object () {
+ >     public boolean destroyEvent(Widget widget, Event event) {
+ >        // show a "save changes dialog
+ >        return true;
+ >     }
+ >  }
+ 
+ These are all interesting ideas.
+ 
+ > What *all* of these share is that there is an algorithmic mapping to
+ > the underlying signals. That is the second problem with the current
+ > approach; there is no way that someone familiar with the C or Python
+ > interface on an object can guess the way the Java events are set up on
+ > that object.
+ > 
+ > Not only does this make things hard on people who already know a
+ > GTK+ from a different language or are reading documentation that uses
+ > a different language, it also makes it impossible to do automatic
+ > generation of language bindings.
+ 
+ The automatic generation of language bindings is an interesting topic.
+ Java-GNOME started out five years ago by generating all code (Java and 
+ JNI).  At that time there were many inconsistencies in gtk, etc (and my
+ understand of those libraries was even less than it is today).  Over time 
+ the code generation became so complex (to handle all of the exceptions)
+ that it was not maintainable.  Eventually I made the change over to 
+ manually writing the code.  Since that time the upstream libraries have 
+ matured and I am quite interested in the introspection work being done.  
+ I must admit that I do not have enough time to be directly involved or
+ contribute ideas.  I would like to be more involved but I guess it is not to 
+ be.  At some point I will find the time to learn the new API and try to see
+ how it fits with Java-GNOME.
+ 
+ 
+ > Memory Management
+ > =================
+ > 
+ > One problem with memory management in gtk-java can be
+ > expressed with a simple grep command:
+ > 
+ >  libgtk-java$ find -name "*.c" | xargs grep g_object_unref
+ >  libgtk-java$
+ > 
+ > If I create a PangoLayout object through the java-gnome APIs,
+ > there is no way it will ever be freed.
+ 
+ The original idea here (quite naive perhaps) was to have a running
+ Java-GNOME application behave like a GTK C application with a thin
+ Java veneer.  For GObjects we should construct them via their
+ _new method and allow GTK to reclaim their memory when their 
+ container destroyed them.  For objects that did not inherit from GObject
+ we tried to research to determine who managed the memory
+ (was this a struct returned from a Widget where the Widget
+ was responsible for managing the memory or was the caller
+ responsible for managing the memory).   I know we got some of
+ this wrong.
+ 
+ > But this isn"t the only problem with memory management of
+ > GObject ...
+ > 
+ >  Window window = new Window (WindowType.TOPLEVEL);
+ >  Button button = new Button ("Hello");
+ >  window.add (button);
+ >  window.remove (button);
+ >  window.add (button);
+ > 
+ > Will segfault or at least produce warnings as the underlying
+ > GtkObject is freed when the button is removed from the window
+ > and the Java object is left holding an invalid pointer.
+ 
+ This is a problem we have discussed on several occasions.  Two
+ issues have caused us to not address this problem; (1) we have
+ not come up with a design that we feel is clean (robust?) and
+ (2) we have not had the manpower to undertake such a massive
+ change (the vast majority of the time this project has had 1-2
+ part-time developers).
+ 
+ > Fixing this, within the constraints of the JNI is admittedly not
+ > easy. In fact, I don"t know an entirely satisfactory way of doing so
+ > without extending GObject. (I"m going to propose such an addition to
+ > GObject for 2.8.) But you can do somewhat better. For example,
+ > the approach that gtk# takes is to use strong reference from
+ > the CLR object to the GObject and a weak reference in the
+ > opposite direction.
+ > 
+ > (The main problem of this is "denaturation"...  if you drop the last
+ > reference to a language object that is a subclass of Button, then
+ > if you get the object back from GTK+ what you get is a normal
+ > Button, not your subclass.)
+ 
+ Please - lets discuss this idea further.
+ 
+ 
+ > Completeness and Consistency of the Mapping
+ > ===========================================
+ > 
+ > The Java-GNOME bindings seem largely done by hand. This approach
+ > is going to cause problems with both completeness and with
+ > consistency. A few examples:
+ > 
+ >  pango_layout_set_wrap()
+ >  pango_layout_get_wrap()
+ >  pango_layout_set_justify()
+ >  pango_layout_get_justify()
+ > 
+ > Are wrapped as:
+ > 
+ >  Layout.setWrapStyle()
+ >  Layout.getWrapMode()
+ >  Layout.setJustification()
+ >  Layout.GetJustified()
+ > 
+ > void pango_layout_set_markup            (PangoLayout    *layout,
+ >                                          const char     *markup,
+ >                                          int             length);
+ > void pango_layout_set_markup_with_accel (PangoLayout    *layout,
+ >                                          const char     *markup,
+ >                                          int             length,
+ >                                          gunichar        accel_marker,
+ >                                          gunichar       *accel_char);
+ > are wrapped as:
+ > 
+ >   public void setMarkup(String markup);
+ >   public void setMarkup(String markup,
+ >                         char   accelMarker); (*)
+ 
+ I am sad to see this (at the same time I must admit that I
+ laughed when I saw the example you provided - it is sooo
+ bad).  There has been a lot of work over the past couple
+ of years trying to cleanup the bindings.  One of the first
+ areas you would look at (pango) is one of the last areas 
+ to be addressed (largely due to my shallow understanding
+ of how pango works).  atk and pango are mentioned as
+ two areas of focus during our current development cycle.
+ We know there is still more work to do but I feel we are
+ making good progress on this issue.
+ 
+ > 
+ > While using overloading might make sense here, where did the accel_char
+ > return from set_markup_with_accel() go?
+ > 
+ > These examples are from PangoLayout, which is probably newer and rawer
+ > then much of Java-GNOME (after all, you can"t free one), but there are
+ > problems elsewhere as well. (gdk.Window.getWindowAt,
+ > gdk.Window.setTransientOf, for examples.)
+ > 
+ > Any language binding is a compromise between sticking close to the
+ > library being bound and being truly natural in the language.
+ > Conceptually, GTK+ is composed of two pieces:
+ > 
+ >  A) Pieces that are language bindable
+ >  B) Pieces that are C specific convenience glue
+ > 
+ > The goal of the GTK+ design is that everything *can* be done using
+ > only A). I think a good goal for any language binding is that piece
+ > A) is transformed into the language in a way that is completely
+ > algorithmic and predictable and then, as necessary, language specific
+ > glue is added to make up for piece B).
+ > 
+ > The introspection facilities in Glib/GTK+-2.8 will provide a canonical
+ > description of the GTK+ interfaces. I think it would be good
+ > if Java-GNOME could be switched at that point to be primarily
+ > autogenerated from the introspection information.
+ > 
+ > (*) Side note: char isn"t the right mapping for gunichar. It should
+ >     be int instead. See:
+ > 
+ > <a href="http://java.sun.com/developer/technicalArticles/Intl/Supplementary/" target="_NEW">http://java.sun.com/developer/technicalArticles/Intl/Supplementary/</a>
+ > 
+ > [ Note: I"m not subscribed, so please Cc: me on any replies ]
+ > 
+ > 
+ -- 
+ Jeffrey Morgan
+</pre></pre>
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Owen Taylor <otaylor at re...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11585031"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 07:32
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ On Mon, 2005-04-25 at 21:42 -0400, Jeff Morgan wrote:
+ 
+ > > Events
+ > > ======
+ > > 
+ > > There are two problems with signal handling ... one problem is that it
+ > > is just clumsy:
+ > > 
+ > >   button.addListener (new ButtonListener () {
+ > >      public void buttonEvent (ButtonEvent event) {
+ > >          if (event.isOfType(ButtonEvent.Type.CLICK) {
+ > >            System.out.println("Button was clicked");
+ > >          }
+ > >      }
+ > >   });
+ > 
+ > 
+ > The history of event handling in Java-GNOME is important here.  
+ > My initial attempt at signal handling was quite similar to the C 
+ > implementation.  There was a collection of methods similar to:
+ > 
+ > public native int addEventHandler(String name, String func, Object cbrecv)
+ > 
+ > so the implementation for a button would be:
+ > 
+ > public void onClick() {
+ >   System.out.println("Button was clicked");
+ > }
+ > 
+ > button.addEventHandler("clicked", "onClick", this);
+ > 
+ > As Java developers started to use the bindings I received many 
+ > comments stating that the event handling was not very "javalike" 
+ > meaning it was not like awt or swing.  After taking a poll of the users
+ > it was obvious that the majority of Java developers liked the listener 
+ > approach to events.  I proceeded to add this new approach but have 
+ > never deprecated the old style of event handling. 
+ 
+ Not that I really know much about what is "javalike", but it does
+ make sense to me that a typesafe approach using listener interfaces
+ and delegate objects fits in better with Java expectations.
+ 
+ However, starting from that point, there seems to be a fair bit
+ of wriggle room to do create something that is both convenient and
+ can be mapped consistently onto the GTK+ signal system.
+ 
+ I don"t think signal handlers in GTK+ can work exactly like event
+ handlers in Swing ... even to the point of the name ... "Event"
+ means something very specific in GDK and reusing it for something
+ else is going to confuse things. But neither does widget layout
+ in GTK+ work exactly like widget layout in Swing.
+ 
+ > > Not only does this make things hard on people who already know a
+ > > GTK+ from a different language or are reading documentation that uses
+ > > a different language, it also makes it impossible to do automatic
+ > > generation of language bindings.
+ > 
+ > The automatic generation of language bindings is an interesting topic.
+ > Java-GNOME started out five years ago by generating all code (Java and 
+ > JNI).  At that time there were many inconsistencies in gtk, etc (and my
+ > understand of those libraries was even less than it is today).  Over time 
+ > the code generation became so complex (to handle all of the exceptions)
+ > that it was not maintainable.  Eventually I made the change over to 
+ > manually writing the code.  Since that time the upstream libraries have 
+ > matured and I am quite interested in the introspection work being done.  
+ > I must admit that I do not have enough time to be directly involved or
+ > contribute ideas.  I would like to be more involved but I guess it is not to 
+ > be.  At some point I will find the time to learn the new API and try to see
+ > how it fits with Java-GNOME.
+ 
+ What I hope we can do with the introspection work is turn the work
+ of writing a language binding from one of writing a large amount of
+ tedious code into one of writing a small amount of difficult code :-)
+ 
+ While the initial work may be harder, hopefully the job of continued
+ maintenance will be much less.
+ 
+ > > Memory Management
+ > > =================
+ > > 
+ > > One problem with memory management in gtk-java can be
+ > > expressed with a simple grep command:
+ > > 
+ > >  libgtk-java$ find -name "*.c" | xargs grep g_object_unref
+ > >  libgtk-java$
+ > > 
+ > > If I create a PangoLayout object through the java-gnome APIs,
+ > > there is no way it will ever be freed.
+ > 
+ > The original idea here (quite naive perhaps) was to have a running
+ > Java-GNOME application behave like a GTK C application with a thin
+ > Java veneer.  For GObjects we should construct them via their
+ > _new method and allow GTK to reclaim their memory when their 
+ > container destroyed them.  For objects that did not inherit from GObject
+ > we tried to research to determine who managed the memory
+ > (was this a struct returned from a Widget where the Widget
+ > was responsible for managing the memory or was the caller
+ > responsible for managing the memory).   I know we got some of
+ > this wrong.
+ 
+ Hmm, as long as the C program doesn"t require g_object_ref/unref
+ this works. But for something like PangoLayout, or GdkGC, or 
+ many other non-widget GObjects, a C program needs to call
+ ref() and unref() itself to manage the memory. 
+ 
+ Now, you could bind g_object_unref() and expose it to Java 
+ programs, but all the other language bindings I"m familiar with 
+ have tried to make things more automatic (and thus more robust)
+ than that.
+ 
+ > 
+ > > But this isn"t the only problem with memory management of
+ > > GObject ...
+ > > 
+ > >  Window window = new Window (WindowType.TOPLEVEL);
+ > >  Button button = new Button ("Hello");
+ > >  window.add (button);
+ > >  window.remove (button);
+ > >  window.add (button);
+ > > 
+ > > Will segfault or at least produce warnings as the underlying
+ > > GtkObject is freed when the button is removed from the window
+ > > and the Java object is left holding an invalid pointer.
+ > 
+ > This is a problem we have discussed on several occasions.  Two.
+ > issues have caused us to not address this problem; (1) we have
+ > not come up with a design that we feel is clean (robust?) and
+ > (2) we have not had the manpower to undertake such a massive
+ > change (the vast majority of the time this project has had 1-2
+ > part-time developers).
+ 
+ I think you could do some basic fixes for memory management of
+ GObject without affecting most of your code.
+ 
+ [...]
+ 
+ > cy of the Mapping
+ > > ===========================================
+ > > 
+ > > The Java-GNOME bindings seem largely done by hand. This approach
+ > > is going to cause problems with both completeness and with
+ > > consistency. A few examples:
+ > > 
+ > >  pango_layout_set_wrap()
+ > >  pango_layout_get_wrap()
+ > >  pango_layout_set_justify()
+ > >  pango_layout_get_justify()
+ > > 
+ > > Are wrapped as:
+ > > 
+ > >  Layout.setWrapStyle()
+ > >  Layout.getWrapMode()
+ > >  Layout.setJustification()
+ > >  Layout.GetJustified()
+ > > 
+ > > void pango_layout_set_markup            (PangoLayout    *layout,
+ > >                                          const char     *markup,
+ > >                                          int             length);
+ > > void pango_layout_set_markup_with_accel (PangoLayout    *layout,
+ > >                                          const char     *markup,
+ > >                                          int             length,
+ > >                                          gunichar        accel_marker,
+ > >                                          gunichar       *accel_char);
+ > > are wrapped as:
+ > > 
+ > >   public void setMarkup(String markup);
+ > >   public void setMarkup(String markup,
+ > >                         char   accelMarker); (*)
+ > 
+ > I am sad to see this (at the same time I must admit that I
+ > laughed when I saw the example you provided - it is sooo
+ > bad).  There has been a lot of work over the past couple
+ > of years trying to cleanup the bindings.  One of the first
+ > areas you would look at (pango) is one of the last areas 
+ > to be addressed (largely due to my shallow understanding
+ > of how pango works).  atk and pango are mentioned as
+ > two areas of focus during our current development cycle.
+ > We know there is still more work to do but I feel we are
+ > making good progress on this issue.
+ 
+ I don"t mean to pick on PangoLayout in particular, it just happened
+ to be the class I picked to review, since I have it more memorized
+ than much of the rest of GTK.
+ 
+ My point was mostly that with a manually maintained binding, you
+ have to become an expert in everybody"s favorite widget ... with
+ more automation, hopefully the PangoLayout binding can be right
+ with almost no specific work.
+ 
+ Regards,
+ 						Owen
+</pre>
+			</pre>
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Jeff Morgan <kuzman at gm...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11589040"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 13:30
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> On 4/26/05, Owen Taylor <otaylor at re...> wrote:
+ > On Mon, 2005-04-25 at 21:42 -0400, Jeff Morgan wrote:
+ > > The automatic generation of language bindings is an interesting topic.
+ > > Java-GNOME started out five years ago by generating all code (Java and
+ > > JNI).  At that time there were many inconsistencies in gtk, etc (and my
+ > > understand of those libraries was even less than it is today).  Over time
+ > > the code generation became so complex (to handle all of the exceptions)
+ > > that it was not maintainable.  Eventually I made the change over to
+ > > manually writing the code.  Since that time the upstream libraries have
+ > > matured and I am quite interested in the introspection work being done.
+ > > I must admit that I do not have enough time to be directly involved or
+ > > contribute ideas.  I would like to be more involved but I guess it is not to
+ > > be.  At some point I will find the time to learn the new API and try to see
+ > > how it fits with Java-GNOME.
+ > 
+ > What I hope we can do with the introspection work is turn the work
+ > of writing a language binding from one of writing a large amount of
+ > tedious code into one of writing a small amount of difficult code :-)
+ > 
+ > While the initial work may be harder, hopefully the job of continued
+ > maintenance will be much less.
+ 
+ Owen, I could not agree more with this goal.  
+ 
+ > I don"t mean to pick on PangoLayout in particular, it just happened
+ > to be the class I picked to review, since I have it more memorized
+ > than much of the rest of GTK.
+ > 
+ > My point was mostly that with a manually maintained binding, you
+ > have to become an expert in everybody"s favorite widget ... with
+ > more automation, hopefully the PangoLayout binding can be right
+ > with almost no specific work.
+ 
+ The key to a successful bindings implementation based upon code 
+ generation is to, as you stated above,  generate as much of the code 
+ as possible (remove most if not all of the tedious work).  At the same
+ time it is critical that the development team has the flexibility to shape
+ the final public API.  For Java-GNOME this means that you would 
+ definitely generate the JNI binding code and the Java native method 
+ declarations (this is not that difficult).  Generation of the public API is
+ a harder nut to crack.
+ 
+ There are several approaches to consider for the public API generation:
+ 
+ The peanut version - Do not generate any of the public API.  This allows
+ the most flexibility for the API design but still has the developer performing
+ a lot of tedious work and we are subject to inconsistencies (human error).
+ For Java-GNOME the structure would look something like:
+ 
+ Button.c   --> generated JNI layer
+ GtkButton.java  --> generated native declarations for JNI layer
+ Button.java  --> Hand coded public API that delegates all native calls to
+     GtkButton.
+ 
+ 
+ The cashew version - Generate all of the public API.  This provides less
+ flexibility for the API design.  It does eliminate the need for all of the
+ tedious work.  If done right developers could then take the resulting
+ code and add additional methods to the classes to enhance the
+ overall usability of the bindings.  For Java-GNOME the structure
+ would look like:
+ 
+ Button.c  --> generated JNI layer
+ GtkButton.java  --> generated native declarations for JNI and generated
+     public API.  This class would maintain the GObject hierarchy.
+ Button.java  --> Class that inherits from GtkButton (thus exposing all of
+     the generated public API) which can be used to add additional capabilities.
+ 
+ It would also be possible to merge GtkButton and Button into a single class
+ by having the generator merge generated and non-generated code.
+ 
+ 
+ The walnut version - Generate the JNI code and Java native declarations.
+ Also generate the public API using a style sheet concept for the code.
+ The style sheet would include information such as whether a specific native
+ method should generate a public API, is there any special handing for
+ this method (should it be a constructor, etc.), what data types should be
+ used for the parameters, javadoc comments, and anything else that is
+ needed to define a robust API.  A global style sheet could be used to
+ manage data type conversions.  Even this is not enough to eliminate
+ the need for coding.  If the bindings wish to provide higher-level methods
+ to simplify complex widgets (the tree control comes to mind) there
+ has to be a place where hand written code can be inserted.  Maintaining
+ the style sheet might be a pain in the <...>.  You could have the generator
+ create the initial style sheet for you.  The generator could also perform a
+ merge when the API for a widget changes.  In Java-GNOME the structure
+ would be similar to the cashew version.
+ 
+ 
+ There is another problem that exists.  Since we are part of the platform
+ bindings we have to adhere to API stability rules.  It is likely that the
+ generated code (if we generate to public API) will not exactly match
+ our current API (we can only hope).  How can this be handled?
+ 
+ 
+ Of course all of this depends upon the introspection work and our decision
+ to move in this direction.  I know introspection is going to be included
+ in gtk 2.8 but code generation is currently not even on our radar. I am 
+ putting these ideas forward for discussion purposes only at this time.
+ 
+ -Jeff
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Joao Victor <jvital at gm...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11583770"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 05:40
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> Hey, thanks for the suggestions/problems pointed out.... now some comments:
+ 
+ > Events
+ > ======
+ > [...]
+ 
+ I"m glad you brought this up; a couple of months ago we actually had a
+ quick discussion over this, and i think everybody kinda agreed that
+ the best way would be to make Adapter classes
+ (<a href="http://sourceforge.net/mailarchive/message.php?msg_id=10900057" target="_NEW">http://sourceforge.net/mailarchive/message.php?msg_id=10900057</a>).
+ 
+ We just haven"t had the time yet to sit and really *decide* what we"re
+ going to do about it; maybe this is time now we should decide...
+ 
+ > Memory Management
+ > =================
+ > [...]
+ > One problem with memory management in gtk-java can be
+ > expressed with a simple grep command:
+ > Fixing this, within the constraints of the JNI is admittedly not
+ > easy. In fact, I don"t know an entirely satisfactory way of doing so
+ > without extending GObject. (I"m going to propose such an addition to
+ > GObject for 2.8.) But you can do somewhat better. For example,
+ > the approach that gtk# takes is to use strong reference from
+ > the CLR object to the GObject and a weak reference in the
+ > opposite direction.
+ 
+ Hmmm... we should think of some way to address this issue. I think i
+ didn"t understand very well what you said about what gtk# does; that
+ is, what"s the weak reference in the opposite direction? I need to
+ investigate this....
+ 
+ > Completeness and Consistency of the Mapping
+ > ===========================================
+ > 
+ > The Java-GNOME bindings seem largely done by hand. This approach
+ > is going to cause problems with both completeness and with
+ > consistency. A few examples:
+ > [...]
+ 
+ Awwww some "horrible" examples you picked there :P Ok, what you
+ pointed out are definitely bugs which need to be fixed... i"m going to
+ file a bug report on that.
+ 
+ Jeff, i think we should write some guidelines/recommendations in the
+ wiki about doing the bindings; you know, what method names to choose,
+ etc.
+ 
+ Cheers,
+ J.V.
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Owen Taylor <otaylor at re...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11586388"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 06:44
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ On Tue, 2005-04-26 at 12:40 +0000, Joao Victor wrote:
+ > Hey, thanks for the suggestions/problems pointed out.... now some comments:
+ > 
+ > > Events
+ > > ======
+ > > [...]
+ > 
+ > I"m glad you brought this up; a couple of months ago we actually had a
+ > quick discussion over this, and i think everybody kinda agreed that
+ > the best way would be to make Adapter classes
+ > (<a href="http://sourceforge.net/mailarchive/message.php?msg_id=10900057" target="_NEW">http://sourceforge.net/mailarchive/message.php?msg_id=10900057</a>).
+ 
+ Something along those lines occurred to me, and having a 
+ WidgetListener interface with all the different callbacks for
+ Widget has a certain elegance, but there are some sticky 
+ points as well:
+ 
+ One problem I see is that you lose a lot of compile time
+ safety ... 
+ 
+  widget.addListener (new WidgetAdapter() {
+    boolean destroy (Widget widget, event e) {
+        return false;
+     }
+  } 
+ 
+ Will compile correctly, but do nothing or throw an exception
+ at runtime (should be destroyEvent). You haven"t gained very
+ much over the addEventHandler() approach in terms of type safety.
+ WidgetAdapter() above might as well be Object(). (*)
+ 
+ On the GTK+ side, the problem with the code above is that Java-GNOME
+ will have to connect to all 60+ signals on Widget to get one signal.
+ This is horribly inefficient, and also can in some cases cause semantic
+ changes (look at the input/output signals on GtkSpinButton.) Java-GNOME
+ has this problem currently to some extent with things like
+ ButtonListener.
+ 
+ Maybe you could use introspection to figure out what methods
+ of WidgetAdapter have been overridden and just connect those signals.
+ Failing that, you"d need to do something like:
+ 
+  widget.addDestroyEventListener (new WidgetAdapter() {
+     boolean destroyEvent (Widget widget, event e) {
+        return false;
+     }
+  } 
+ 
+ Which isn"t too bad though it creates further problems not caught
+ at compile-time.
+ 
+ > > Memory Management
+ > > =================
+ > > [...]
+ > > One problem with memory management in gtk-java can be
+ > > expressed with a simple grep command:
+ > > Fixing this, within the constraints of the JNI is admittedly not
+ > > easy. In fact, I don"t know an entirely satisfactory way of doing so
+ > > without extending GObject. (I"m going to propose such an addition to
+ > > GObject for 2.8.) But you can do somewhat better. For example,
+ > > the approach that gtk# takes is to use strong reference from
+ > > the CLR object to the GObject and a weak reference in the
+ > > opposite direction.
+ > 
+ > Hmmm... we should think of some way to address this issue. I think i
+ > didn"t understand very well what you said about what gtk# does; that
+ > is, what"s the weak reference in the opposite direction? I need to
+ > investigate this....
+ 
+ Currently, what Java-GNOME does is have a strong reference from GObject
+ to Java object. Graphically:
+ 
+              |
+     Proxy  <---  GObject
+              |
+ 
+ As long as the GObject stays alive, the proxy stays alive. But the
+ reverse is generally more important. If you only had the link in the
+ opposite direction
+ 
+              |
+     Proxy   --->  GObject
+              |
+ 
+ It would work OK for things like PangoLayout, but other things become
+ strange ... say you have a subclass of Window, MyWindow.
+ 
+  mywindow.add(button);
+  window2 = button.getParent();
+ 
+ Then window2 is a Window not a  MyWindow. Creating both references
+ strong causes memory leaks (see my toggle references mail). An
+ almost-as-good approach is to use a weak reference in from the GObject
+ to the Proxy object.
+ 
+             |
+    Proxy  <---  GObject 
+            ...>
+             |
+ 
+ The "..." represents a weak reference. You could implement the weak
+ reference with a JNI global weak reference (it would clear a pointer
+ stored in the GObjects object data)  or out of the finalizer
+ of the Proxy object. (it would clear an object data key)... either
+ way the idea is that we can go back from GObject to Proxy object as
+ long as the Proxy object is still kept alive from Java.
+ 
+ The main problem with this is that if all Java references to the Proxy
+ go away, then the Proxy is freed, and if recreated from the GObject , it
+ will be a Window not a MyWindow and will have lost any data fields
+ in the object.
+ 
+ Regards,
+ 						Owen
+ 
+ (*) You do gain a little bit ...I originally was going to mess up the
+     return value instead of the function name, but it occurred to
+     me that that would be caught since you can"t overload on return
+     type.
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Joao Victor <jvital at gm...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11583771"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 06:33
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 2005/4/25, Owen Taylor <otaylor at re...>:
+ >  Window window = new Window (WindowType.TOPLEVEL);
+ >  Button button = new Button ("Hello");
+ >  window.add (button);
+ >  window.remove (button);
+ >  window.add (button);
+ > 
+ > Will segfault or at least produce warnings as the underlying
+ > GtkObject is freed when the button is removed from the window
+ > and the Java object is left holding an invalid pointer.
+ 
+ If we "float" the object in the gtk.Button constructor, and unref it
+ in the gtk.Button.finalize() method, would it solve this problem?
+ 
+ Cheers,
+ J.V.
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Mark Howard <mh at ti...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11586389"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 06:57
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> Quoting Joao Victor <jvital at gm...>:
+ > If we "float" the object in the gtk.Button constructor, and unref it
+ > in the gtk.Button.finalize() method, would it solve this problem?
+ 
+ If by "float" you mean g_object_ref, then no. We would have a java reference
+ from the gobject to the java object for the signal handler, so neither object
+ would be freed.
+ We must have a standard reference from gobject to java object to allow for
+ anonymous classes as callbacks.
+ 
+ --
+    .""`. Mark Howard
+   : :" :
+   `. `"  <a href="http://www.tildemh.com/" target="_NEW">http://www.tildemh.com</a>
+     `-   mh at de... | mh at ti...
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table><p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Owen Taylor <otaylor at re...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=11586390"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Some notes on Java-GNOME</a>   
+		2005-04-26 07:00
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ On Tue, 2005-04-26 at 13:33 +0000, Joao Victor wrote:
+ > 2005/4/25, Owen Taylor <otaylor at re...>:
+ > >  Window window = new Window (WindowType.TOPLEVEL);
+ > >  Button button = new Button ("Hello");
+ > >  window.add (button);
+ > >  window.remove (button);
+ > >  window.add (button);
+ > > 
+ > > Will segfault or at least produce warnings as the underlying
+ > > GtkObject is freed when the button is removed from the window
+ > > and the Java object is left holding an invalid pointer.
+ > 
+ > If we "float" the object in the gtk.Button constructor, and unref it
+ > in the gtk.Button.finalize() method, would it solve this problem?
+ 
+ I think you mean "sink". If you do that and leave the current JNI
+ global reference, you"ll create a memory leak, because the GObject
+ will reference the Java object and vice versa.
+ 
+ So you need to *also* do something like make the reference from GObject
+ to the Java object weak (see my last mail)
+ 
+ Regards,
+ 					Owen
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Owen Taylor <otaylor at re...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=12873373"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Signals redux [was Re: Some notes on Java-GNOME]</a>   
+		2005-09-07 06:46
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ [ This was held for moderation since I wasn't subscribed. Reposting,
+   hopefully people won't get duplicate copies later ]
+ 
+ I did some more fooling around today, and wanted to revisit an old
+ discussion:
+ 
+ On Mon, 2005-04-25 at 15:36 -0400, Owen Taylor wrote:
+ 
+ > Events
+ > ======
+ > 
+ > There are two problems with signal handling ... one problem is that it
+ > is just clumsy:
+ > 
+ >   button.addListener (new ButtonListener () {
+ >      public void buttonEvent (ButtonEvent event) {
+ >          if (event.isOfType(ButtonEvent.Type.CLICK) {
+ >            System.out.println("Button was clicked");
+ >          }
+ >      }
+ >   });
+ > 
+ > In Python, say, this is:
+ > 
+ >  def onClick (button):
+ >     print "Button was clicked";
+ >  
+ >  button.connect ("clicked", onClick);
+ > 
+ > Obviously, there is a syntax barrier for Java, but there is no real 
+ > reason it couldn't be:
+ > 
+ >  button.connectClicked (new ButtonClickedListener () {
+ >     public void run(Button button) {
+ >       System.out.println("Button was clicked");
+ >     }  
+ >  }
+ > 
+ > Creating one helper class for each signal might be a bit
+ > expensive... there are other cheaper mechanisms with less type
+ > safety. [...]
+ 
+ With some more thought I think it can be even nicer than the above:
+ 
+  button.connect(new Button.Clicked() {
+      public void clicked(Button button) {
+          System.out.println("Button was clicked");
+      }
+  });
+ 
+ Using a nested interface removes much of the clutter when browsing the
+ class hierarchy and in import statements. Method overloading also helps.
+ The signal name is reused for the callback method to for greater
+ flexibility; a delegate can be used for multiple signals. (Maybe use
+ 'onClicked' rather than 'clicked' as the method name?)
+ 
+ Is this approach expensive? Some quick testing indicates that the
+ overhead for doing signals this way is about 350 bytes per signal
+ definition (in the compressed jar file). Since there are < 250 public
+ signals in GTK+, that's about 90k overall. I doubt other approaches are
+ significantly cheaper.
+ 
+ (I'm assuming an implementation done with GObject and Java
+ introspection; if per-signal native marshalers are used, then the 
+ code-size overhead is, of course, more.)
+ 
+ So, to review:
+ 
+  - Consistent and predictable mapping from GTK+ signals. (Noticed today
+    that the basic ::destroy signal wasn't bound in libgtk-java,
+    LifeCycleEvent.Type.DESTROY is actually ::destroy-event...)
+ 
+  - Reasonably compact syntax
+ 
+  - Allows more efficient implementation than the current system or
+    adapter classes since we never have to connect to unnecessary 
+    signals.
+ 
+  - While the approach isn't AWT-like, or Swing-like, it seems OK on
+    being Java-like. And will remove the announce of Eclipse quick-fix
+    wanting to import java.awt.event.MouseListener rather than
+    org.gnu.gtk.MouseListener :-)
+ 
+ Regards,
+ 						Owen
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Ben Konrath <ben at ba...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13091009"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux [was Re: Some notes on
+    Java-GNOME]</a>   
+		2005-09-26 18:06
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ Hi, 
+ 
+ On Wed, 2005-07-09 at 09:46 -0400, Owen Taylor wrote:
+ <snip>
+ >  - While the approach isn't AWT-like, or Swing-like, it seems OK on
+ >    being Java-like. And will remove the announce of Eclipse quick-fix
+ >    wanting to import java.awt.event.MouseListener rather than
+ >    org.gnu.gtk.MouseListener :-)
+ 
+ You can stop this from happening by adding an access rule to your
+ project settings that forbids access to awt classes - this is what I did
+ in the Java-GNOME plugin. You can do this as follows:
+ 
+ Right click on the JRE System Library in your project -> Build Path ->
+ Configure Build path ... -> Libraries tab -> expand the JRE System
+ Library -> "Access rules" -> "Edit ..." -> "Add ..." -> select Forbidden
+ in the "Resolution" combo and then add **/awt/** to the "Rule Pattern"
+ 
+ I realize this isn't your main point, I just thought I'd let you know
+ how to make your life a little easier with eclipse :)
+ 
+ Cheers, Ben
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Andrew Cowie <andrew at op...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13725566"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-01 22:11
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> A long time ago, on Mon, 2005-05-09 at 14:44 -0400, Owen Taylor wrote:
+ > I did some more fooling around today, and wanted to revisit an old
+ > discussion: [signal handling]
+ 
+ I've been saving this message for a long time, hoping I'd have a chance
+ to address it. So it's been almost 6 months. Oh well. First I'll write
+ my views on the subject, then inline reply to some of his comments.
+ 
+ Owen's basic concern seems to be the verbosity and clumsiness of the
+ Listener/Event pattern. When I first saw this pattern in java-gnome, I
+ freaked, something along the lines of "Oh my lord, what the hell is
+ this?" :)
+ 
+ But my GUI programming in Java predates Java 1.1. When I learned AWT, it
+ used a very basic event handling pattern. One of the reasons I never did
+ port that code from Java 1.0.2 (we're talking 1998 here) was that I was
+ completely mystified by the Listener/Event thing that the AWT in Java
+ 1.1 introduced.
+ 
+ ... time ... passes ...
+ 
+ As I understand it from Mark Howard and Jeff Morgan, they added the
+ Listener/Event pattern for signal handling to Java because they felt it
+ was the more familiar idiom for experienced Java programmer, especially
+ those coming from Swing or AWT. 
+ 
+ I believe that this was absolutely the correct decision to make. In
+ fact, as I've looked around a bit (and over enterprise code that I've
+ run (though didn't write - I'm an operations guy) I've realized just how
+ prevalent this pattern is in the Java world. It's everywhere - EJB, JMS,
+ all over the J2EE stack.
+ 
+ And so, even though it's somewhat (ok, very) cumbersome **especially
+ from the viewpoint of someone coming from the GTK C world**, it is
+ natural indeed for someone coming from the Java world, and that
+ (unscientifically) is the bulk of our userbase.
+ 
+ ++
+ 
+ Ok. So I've said that it's ok. But that doesn't mean it can't be
+ improved - or ditched. To be honest, I'd like to see a better model.
+ 
+ But switching will be tricky indeed. We already have 2 1/2 APIs for
+ signal handling. [the Listener/Event pattern which most of us use, then
+ the raw Event handling which happens to be exposed, and also method name
+ hookups if you care to use Glade for that]
+ 
+ When I was in Toronto last week I met with some of the guys (and Hiro,
+ who came up from Waterloo!) and discussed this issue among others. The
+ biggest problem I see is that we already are close to the boundary of
+ having unmaintained/unsupported APIs, and if we don't do a clean break
+ (not just deprecating but hard and fast REMOVING the old APIs in favour
+ of the new one) then we will end up with an even worse situation.
+ 
+ The only possible place for us to make such a break is at a major
+ version number jump (ie libgtk-java moves from 2.x.y to 3.w.z) ... which
+ is hard to do unilaterally as we are now somewhat historically tied to
+ following the underlying GTK release numbers. [Note to self - moving
+ from java-gnome 0.8.3 to java-gnome 2.4.x was probably a bad idea - we
+ lost the freedom to make a major API change on our own schedule]. 
+ 
+ To be honest, I don't much care about this - in the modern software
+ world, 1.2 to 1.4 IS a major release. So if we need to change the signal
+ handling we can probably do so whenever, but we should do so with lots
+ of warning and RIP OUT whatever old models we're no longer going to
+ support.
+ 
+ ++
+ 
+ Now on to specifics. If we do change (and incur all this administrative
+ burden I've just been talking about, not to mention forcing a port of
+ any and all applications), then we should make it a good one. There are
+ all sorts of areas of the API that could do with improvement & redesign.
+ 
+ In the case of signal handling, there seem to be two broad option paths,
+ revolving around typing.
+ 
+ The present system is strongly typed. We have KeyListeners and KeyEvents
+ and TreeViewListeners and TreeViewEvents and also interfaces with
+ similar APIs, eg   TreeModelFilterVisibleMethod. The advantage of this
+ is that we allow ourselves to take advantage of the strengths of the
+ Java language, getting appropriate methods for appropriate events, and
+ having being able at compile time to catch wrong API mistakes.
+ 
+ The other branch of options involve not using the type safety system at
+ all, and doing all the lookups by strings. This is more "traditional"
+ GTK, but also is less ideal programming practice because it means that
+ you have to wait until runtime to find out if you misspelled a signal
+ name. The usual result of such a bug is that simply nothing happens, but
+ likewise situations where the wrong method gets called arise. Worst of
+ all you loose any support that IDEs like Eclipse can give you both at
+ code writing time and also at debugging time (call stacks become a
+ mess). The upside is that the API is really simple, although not quite
+ as simple as in C or Perl as one has to fight through a class / object
+ somewhere to get to the method name you're trying to call.
+ 
+ For me the promise of absolute simplicity is not worth the cost of not
+ leveraging the strongly typed character of the language we're working
+ in. But in the end, I'd make my vote on the basis of how elegant our
+ proposed new system would be in use. 
+ 
+ ++
+ 
+ To close, some replies to Owen's comments: his first suggestion
+ 
+ > >  button.connectClicked (new ButtonClickedListener () {
+ > >     public void run(Button button) {
+ > >       System.out.println("Button was clicked");
+ > >     }  
+ > >  }
+ 
+ Isn't too bad. Strongly typed.
+ 
+ > > Creating one helper class for each signal might be a bit
+ > > expensive... 
+ 
+ Expensive in authoring and a little less so in maintenance to be sure.
+ But in runtime terms Java is already stacked full of objects. 20-300 for
+ signals isn't going to hurt anything.
+ 
+ Owen's second message notes that this is nicer:
+ 
+ >  button.connect(new Button.Clicked() {
+ >      public void clicked(Button button) {
+ >          System.out.println("Button was clicked");
+ >      }
+ >  });
+ 
+ and I agree, although in general I would note that even something as
+ simple as Button has a plethora of signals that need implementing: from
+ Button.Type I see ACTIVATE, CLICK, ENTER, LEAVE, PRESS, and RELEASE. For
+ all I know there are more down in GTK that we haven't yet properly
+ wrapped.
+ 
+ > (Maybe use
+ > 'onClicked' rather than 'clicked' as the method name?)
+ 
+ [is click or clicked the underlying event-signal name?]
+ 
+ Not sure. Java's APIs (and java-gnome's) are schitzo in this regard.
+ You've got stuff like next() and item() and present() and activate()
+ floating around, but then set*, get*, and is* prevails for all the
+ property accessors and mutators. Perhaps on* as a family name isn't a
+ bad idea.
+ 
+ I have some thoughts on the API design sweepstakes, but this email is
+ already too long as it is. I'll follow up if there is indeed interest in
+ radically changing things. Otherwise, if we're just going to leave
+ things be, then let's just keep things well maintained and work on
+ fixing, if nothing else, the JavaDoc for all the bloody nested Type
+ statics. I remember how hard it was to learn our event handling API,
+ even with some examples to follow.
+ 
+ AfC
+ Bangalore
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Ismael Juma <ismael at ju...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13727268"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-02 00:57
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> On Wed, 2005-11-02 at 10:12 +0530, Andrew Cowie wrote:
+ [...]
+ > As I understand it from Mark Howard and Jeff Morgan, they added the
+ > Listener/Event pattern for signal handling to Java because they felt it
+ > was the more familiar idiom for experienced Java programmer, especially
+ > those coming from Swing or AWT. 
+ [...]
+ 
+ I would like to mention that the Listener/Event pattern used in
+ Java-Gnome isn't the same as the one used in Swing/AWT. It's more
+ verbose and less safe. More verbose because it includes having to check
+ the type of the Event, instead of just overriding the methods required.
+ It is less safe because overloading is used for the addListener methods.
+ In Java/Swing, those methods are called addActionListener,
+ addWindowListener, etc. Using overloading where the number of parameters
+ is the same and the objects can potentially be cast into each other is
+ not recommended practice according to Joshua Bloch's Effective Java, for
+ reasons that he explains in detail there.
+ 
+ Regards,
+ Ismael
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Joao Victor <jvital at gm...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13729329"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-02 06:26
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 2005/11/2, Ismael Juma <ismael at ju...>:
+ > On Wed, 2005-11-02 at 10:12 +0530, Andrew Cowie wrote:
+ > I would like to mention that the Listener/Event pattern used in
+ > Java-Gnome isn't the same as the one used in Swing/AWT. It's more
+ > verbose and less safe. More verbose because it includes having to check
+ > the type of the Event, instead of just overriding the methods required.
+ > It is less safe because overloading is used for the addListener methods.
+ > In Java/Swing, those methods are called addActionListener,
+ > addWindowListener, etc.
+ 
+ Yeah, that's what i was just going to write. I think we should try and
+ change JG to do it the Java-way, or to some "similar" solution. An
+ example of "similar" solution was given by Owen:
+ 
+ --------
+  button.connectClicked (new ButtonClickedListener () {
+     public void run(Button button) {
+        System.out.println("Button was clicked");
+     }
+ }
+ --------
+ 
+ In that example you have the safety, and it's not verbose. The downside is that:
+ 
+ a) It's not 100% Java-like (which may look weird to newcomers)
+ b) You'll tend to have many more (listener) objects instantiated,
+ since you've got an object for every event.
+ 
+ The upside is:
+ a) If you like implementing listeners with annon classes, your code
+ will probably be cleaner
+ b) Sometimes different (from the Java-way) can be good/better =)
+ 
+ BTW, maybe someone should CC/notify to Owen so he see the replies to
+ his thread..
+ 
+ Cheers,
+ J.V.
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Andrew Cowie <andrew at op...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13730468"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-02 08:19
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> On Wed, 2005-02-11 at 12:25 -0200, Joao Victor wrote:
+ > I think we should try and
+ > change JG to ....
+ 
+ [aside]
+ 
+ Just keep in mind if we're going to change this at all, it's a MASSIVE
+ change. I don't think that should stop us, but likewise I don't think we
+ should be trying to maintain **or even expose** two different APIs so
+ this will end up requiring any and every application (and example) to be
+ ported to the new design.
+ 
+ In Gentoo, I've got java-gnome slotted, so (for example) java-gnome
+ series 2.12 and a hypothetical 3.0 can be installed simultaneously -
+ thus apps written against libgtk-java 2.8 would still work after
+ java-gnome 3.0 comes out. But the apps themselves will still have to be
+ forward ported if the event handling model changes in a non API
+ compatible way
+ 
+ To re-iterate: I think we *should* redesign this API. In fact, let's
+ figure out what else needs redesign and wedge it in at the same time.
+ 
+ Incidentally, now is the time to plan something like this. And, I'd go
+ so far as to suggest that if it takes 1.5 or 2 six month cycles, so be
+ it. As I've mentioned before, if we need to skip an official gnome
+ release date, no biggie. The question is whether we have the time and
+ energy to do something of this magnitude in the next 4-10 months?
+ 
+ Otherwise, even if the answer is "no, not right now", a worthy
+ conversation. We can design the API and plan the changes, and then
+ reconsider our window of opportunity as each 6 months passes.
+ 
+ AfC
+ Bangalore
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Ismael Juma <ismael at ju...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13732632"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-02 08:48
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> On Wed, 2005-11-02 at 21:49 +0530, Andrew Cowie wrote:
+ [...]
+ > Incidentally, now is the time to plan something like this. 
+ [...]
+ > The question is whether we have the time and
+ > energy to do something of this magnitude in the next 4-10 months?
+ [...]
+ 
+ I think this is the key point. We must agree on a plan for the next
+ releases. An IRC meeting would be helpful in this regard I think.
+ 
+ Regards,
+ Ismael
+</pre>
+			</pre>
+			
+			
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Joao Victor <jvital at gm...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13761357"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-05 03:55
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 2005/11/2, Ismael Juma <ismael at ju...>:
+ > I think this is the key point. We must agree on a plan for the next
+ > releases. An IRC meeting would be helpful in this regard I think.
+ 
+ Yes, i agree with you both.
+ 
+ But, i think, signals shouldn't be the focus of the next release,
+ IMHO. I think the focus should be: getting things done more
+ automatically. However, like you said, that doesn't mean we can't
+ starting _planning_ it now.
+ 
+ Cheers,
+ J.V.
+</pre>
+			</pre>
+		</td>
+	</tr>
+</tbody></table>
+<p>
+</p><table border="0" width="100%">
+	<tbody><tr>
+	<td bgcolor="#dddddd" nowrap="nowrap">From: Owen Taylor <otaylor at re...> 
+		<a href="http://sourceforge.net/mailarchive/message.php?msg_id=13762066"><img src="owen.html_content/msg.gif" alt="" height="12" width="10"> Re: Signals redux</a>   
+		2005-11-05 07:27
+	</td>
+</tr>
+	<tr>
+		<td>
+			<pre><pre> 
+ 
+ 
+ On Wed, 2005-11-02 at 10:12 +0530, Andrew Cowie wrote:
+ > A long time ago, on Mon, 2005-05-09 at 14:44 -0400, Owen Taylor wrote:
+ > > I did some more fooling around today, and wanted to revisit an old
+ > > discussion: [signal handling]
+ > 
+ > I've been saving this message for a long time, hoping I'd have a chance
+ > to address it. So it's been almost 6 months. Oh well. First I'll write
+ > my views on the subject, then inline reply to some of his comments.
+ 
+ Thanks for the reply; my hope was mostly to get some ideas out in
+ the air rather than looking for instant feedback.
+ 
+ > Owen's basic concern seems to be the verbosity and clumsiness of the
+ > Listener/Event pattern. When I first saw this pattern in java-gnome, I
+ > freaked, something along the lines of "Oh my lord, what the hell is
+ > this?" :)
+ 
+ Well, I wouldn't characterize that as my core objection ... my core
+ objection is really the lack of a consistent and predictable mapping
+ between the GObject signature of an object and the Java signature.
+ 
+ [...]
+ 
+ > I believe that this was absolutely the correct decision to make. In
+ > fact, as I've looked around a bit (and over enterprise code that I've
+ > run (though didn't write - I'm an operations guy) I've realized just how
+ > prevalent this pattern is in the Java world. It's everywhere - EJB, JMS,
+ > all over the J2EE stack.
+ > 
+ > And so, even though it's somewhat (ok, very) cumbersome **especially
+ > from the viewpoint of someone coming from the GTK C world**, it is
+ > natural indeed for someone coming from the Java world, and that
+ > (unscientifically) is the bulk of our userbase.
+ 
+ The better the Java/GNOME bindings are,the more likely they
+ are to attract people from the C world :-) Eclipse as a Java IDE
+ far surpasses any other development environment out there for Linux
+ for any language; that is (or should be) a pretty powerful attractive
+ force.
+ 
+ > To be honest, I don't much care about this - in the modern software
+ > world, 1.2 to 1.4 IS a major release. So if we need to change the signal
+ > handling we can probably do so whenever, but we should do so with lots
+ > of warning and RIP OUT whatever old models we're no longer going to
+ > support.
+ 
+ I'd think incompatible changes are more constrained by messaging and 
+ setting up to allow parallel installs of old and new versions (should
+ be pretty easy for Java) than by version numbers. GTK+ 1.0 to 1.2 
+ was an incompatible change, GTK+-2.x to 3.0, when/if that happens, may
+ well *not* be an incompatible change.
+ 
+ [...]
+ 
+ > Owen's second message notes that this is nicer:
+ > 
+ > >  button.connect(new Button.Clicked() {
+ > >      public void clicked(Button button) {
+ > >          System.out.println("Button was clicked");
+ > >      }
+ > >  });
+ > 
+ > and I agree, although in general I would note that even something as
+ > simple as Button has a plethora of signals that need implementing: from
+ > Button.Type I see ACTIVATE, CLICK, ENTER, LEAVE, PRESS, and RELEASE. For
+ > all I know there are more down in GTK that we haven't yet properly
+ > wrapped.
+ 
+ That's partly my concern about the non-automatable mapping :-), it's
+ easy to miss stuff. From the stats in my last mail, there are about
+ 250 signals total in GTK+. That certainly encourages not doing them
+ one-by-one by hand, and the use of nested interfaces to group them,
+ but I don't think it's unmanageable.
+ 
+ > > (Maybe use
+ > > 'onClicked' rather than 'clicked' as the method name?)
+ > 
+ > [is click or clicked the underlying event-signal name?]
+ 
+ It's 'clicked'; the general, though far from universal naming convention
+ in GTK+ is that signals that are pure notification are in the past tense
+ ('clicked', 'state-changed', while signals that expect an action from
+ the handler are present tense 'popup-menu', 'show-help')
+ 
+ > Not sure. Java's APIs (and java-gnome's) are schitzo in this regard.
+ > You've got stuff like next() and item() and present() and activate()
+ > floating around, but then set*, get*, and is* prevails for all the
+ > property accessors and mutators. Perhaps on* as a family name isn't a
+ > bad idea.
+ 
+ I think the main reason to add the 'on' would be to support
+ self-delegation:
+ 
+  class MyButton extends Button implements Button.Clicked {
+      MyButton() {
+ 	super("Hello World!");
+ 	connectClicked(this);
+      }
+ 
+      void onClicked() {
+ 	// do something 
+      }
+  }
+   
+ This doesn't work without the 'on' because Button has a clicked()
+ method already. But you could achieve much the same thing with 
+ one inner class. I think there are quite a few workable variants - 
+ the main thing I'd push is "one listener interface per GObject 
+ signal".
+ 
+ Regards,
+ 						Owen
+</pre>
+			</pre>
+		</td>
+	</tr>
+</tbody></table>
+
+	</body></html>
diff --git a/doc/examples/START b/doc/examples/START
new file mode 100644
index 0000000..b2dfcc3
--- /dev/null
+++ b/doc/examples/START
@@ -0,0 +1,166 @@
+EXAMPLES
+
+These files are examples of specific parts of the java-gnome API worked up as
+complete Java programs.
+
+Source code, especially Java source code, doesn't always lend itself to being
+_read_, certainly not from top to bottom. We have attempted, however, to create
+some examples which are non-trivial but nonetheless are still readable.
+
+----
+<img src="button/ExamplePressMe.png" class="right"/>
+### Button in a Window
+
+* [`ExamplePressMe.java`](button/ExamplePressMe.html)  
+It doesn't get any simpler than this. A [Label][] and a [Button][] in a
+[Window][], showing how to connect a listener to handle a
+[`Button.Clicked`][Button.Clicked] signal from the Button and how to ensure
+your application terminates when the Window is [deleted][Window.DeleteEvent].
+Incidentally, this is what runs if you type `make demo` in a fresh java-gnome
+build.
+
+[Button]: /doc/api/4.1/org/gnome/gtk/Button.html
+[Label]: /doc/api/4.1/org/gnome/gtk/Label.html
+[Window]: /doc/api/4.1/org/gnome/gtk/Window.html
+[Button.Clicked]: /doc/api/4.1/org/gnome/gtk/Button.Clicked.html
+[Window.DeleteEvent]: /doc/api/4.1/org/gnome/gtk/Window.DeleteEvent.html
+
+----
+<img src="keyboard/ExampleSnooping.png" class="right"/>
+### Handling keystrokes
+
+* [`ExampleSnooping.java`](keyboard/ExampleSnooping.html)  
+Handling keyboard input is more complicated than it reasonably ought to be. In
+most cases the existing GTK Widgets already do everything that needs doing
+(when you type text into an Entry, the text does indeed go into that Entry),
+focus handling, etc. However, if you need to intercept a keystroke so you can
+do something special, then you need to work with the [Keyval][] and
+[ModifierType][] classes in response to the
+[`Widget.KeyPressEvent`][Widget.KeyPressEvent] signal. This is how.
+
+[Keyval]: /doc/api/4.1/org/gnome/gdk/Keyval.html
+[ModifierType]: /doc/api/4.1/org/gnome/gdk/ModifierType.html
+[Widget.KeyPressEvent]: /doc/api/4.1/org/gnome/gtk/Widget.KeyPressEvent.html
+
+<pre style="max-width:600px;">
+Pressed: Keyval.ControlLeft, Modifier: ModifierType.NONE 
+Pressed: Keyval.c, Modifier: ModifierType.CONTROL_MASK 
+</pre>
+
+----
+<a name="ExampleTrailHeads"></a>
+<img src="treeview/ExampleTrailHeads.png" class="right"/>
+### TreeView and TreeModel
+
+* [`ExampleTrailHeads.java`](treeview/ExampleTrailHeads.html)  
+While not a complete tutorial, we have an example of a small application which
+uses a TreeView backed by a ListStore called `ExampleTrailHeads`.  It is
+heavily commented and meant to serve as an introduction of the incredibly
+powerful yet very complex [TreeView][] / [TreeModel][] system. It should be
+read in conjunction with the API documentation for these types. You'll also
+want to read about how to setup a [ListStore][] and the explanation of
+available column types in [DataColumn][].
+
+[TreeView]: /doc/api/4.1/org/gnome/gtk/TreeView.html
+[TreeModel]: /doc/api/4.1/org/gnome/gtk/TreeModel.html
+[ListStore]: /doc/api/4.1/org/gnome/gtk/ListStore.html
+[DataColumn]: /doc/api/4.1/org/gnome/gtk/DataColumn.html
+
+----
+<a name="ExampleInstantMessenger"></a>
+<img src="textview/ExampleInstantMessenger.png" class="right"/>
+### TextView and TextBuffer 
+
+* [`ExampleInstantMessenger.java`](textview/ExampleInstantMessenger.html)  
+This is a more involved sample illustrating use of the [TextView][] /
+[TextBuffer][] multi-line text display and editing Widget. We set up a
+conversation window like you'd see in an instant messaging program, and then
+simulate a conversation with someone -- all as a means of demonstrating
+setting up the view, doing text insertion into the buffer with [TextIter][] as
+well as more advanced features like managing text formatting via [TextTag][]s.
+The example is more or less readable from the top, but the program is quite
+dynamic and the most fun will be had if you _run_ the thing.
+
+[TextView]: /doc/api/4.1/org/gnome/gtk/TextView.html
+[TextBuffer]: /doc/api/4.1/org/gnome/gtk/TextBuffer.html
+[TextIter]: /doc/api/4.1/org/gnome/gtk/TextIter.html
+[TextTag]: /doc/api/4.1/org/gnome/gtk/TextTag.html
+
+----
+<a name="ExampleDrawingInExposeEvent"></a>
+<img src="cairo/ExampleCairoDrawingBlends.png" class="right"/>
+### Drawing with Cairo 
+
+* [`ExampleDrawingInExposeEvent.java`](cairo/ExampleDrawingInExposeEvent.html)  
+FIXME _this needs a better name. For that matter, it needs something more
+interesting._  
+Using the Cairo Graphics library to draw within a GTK program means following
+the idiom shown in this example. This program demonstrates drawing lines,
+rectangles, and gradients using a drawing [Context][] as obtained within a
+Widget's [Widget.ExposeEvent][] signal handler.
+
+[Context]: /doc/api/4.1/org/freedesktop/cairo/Context.html
+[Widget.ExposeEvent]: /doc/api/4.1/org/gnome/gtk/Widget.ExposeEvent.html
+
+----
+<a name="ExampleLinedPaper"></a>
+<img src="cairo/ExampleLinedPaper.png" class="right"/>
+### Creating PDFs with Cairo and drawing text with Pango
+
+* [`ExampleLinedPaper.java`](cairo/ExampleLinedPaper.html)  
+All text drawing in java-gnome is done with GNOME's powerful text rendering
+library, Pango. This example uses the [Layout][] class to lay out the standard
+_lorem ipsum_ typesetting text. To make it more interesting we have drawn
+horizontal rules at the font baseline and a red line at the left margin to
+create the effect of lined three-hole punch paper, all with Cairo of course.
+<br><br>
+In this case we have not used Cairo to draw a Widget -- we have created a
+program that writes out a PDF file using Cairo's [PdfSurface][] and drawn our
+text there instead!
+<br><br>
+Of course, no one has ever sat through Latin class without doodling on their
+notepad...  to create the effect we use a transparent image as the source
+pattern and paint it onto the surface.
+<br><br>
+_The resultant_ `.pdf` _is shown here as rendered by Evince, GNOME's excellent
+PDF viewing program._
+<br>
+<span class="bottompanel" style="float:none;">
+The tank sketch is used with the permission of the artist, Nathan Strum.
+</span>
+
+[PdfSurface]: /doc/api/4.1/org/freedesktop/cairo/PdfSurface.html
+[Layout]: /doc/api/4.1/org/gnome/pango/Layout.html
+
+
+<style>
+img.right {
+	float: right;
+	padding-bottom: 10px;
+}
+hr {
+	clear: right;
+}
+</style>
+
+<!--
+ 
+  Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/examples/button/ExampleDocumentationLink.java b/doc/examples/button/ExampleDocumentationLink.java
new file mode 100644
index 0000000..c7c67a0
--- /dev/null
+++ b/doc/examples/button/ExampleDocumentationLink.java
@@ -0,0 +1,122 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package button;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.LinkButton;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Example to show the interest of using a LinkButton widget.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.14
+ */
+public class ExampleDocumentationLink
+{
+    public static void main(String[] args) {
+        final Window window;
+        final VBox vbox;
+        final Label label;
+        final LinkButton button;
+        URI link = null;
+
+        /*
+         * Initialize GTK.
+         */
+
+        Gtk.init(args);
+
+        /*
+         * Create a top level Window.
+         */
+
+        window = new Window();
+
+        /*
+         * Connect the signal to close the window
+         */
+
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        /*
+         * Create a container to place a Label and a LinkButton.
+         */
+
+        vbox = new VBox(false, 6);
+
+        /*
+         * Create a Label to inform the user about what he can do.
+         */
+
+        label = new Label(
+                "This window has been made with the <b>java-gnome</b> project.\nTo get more information, you should check out the\ndocumentation by clicking on the following button.");
+        label.setUseMarkup(true);
+        vbox.add(label);
+
+        /*
+         * URI which points on the documentation.
+         */
+
+        try {
+            link = new URI("http://java-gnome.sourceforge.net/4.0/doc/");
+        } catch (URISyntaxException e) {
+            e.printStackTrace();
+        }
+
+        /*
+         * Create the LinkButton. The setLabel(String) method will hide the
+         * link and display friendlier word(s).
+         * 
+         * A click on this button will automatically open the web browser
+         * using the previously given link.
+         */
+
+        button = new LinkButton(link);
+        button.setLabel("Online documentation");
+        vbox.add(button);
+
+        /*
+         * Set the window's title and show all widgets.
+         */
+
+        window.setTitle("Online documentation");
+        window.setBorderWidth(6);
+        window.add(vbox);
+        window.showAll();
+
+        /*
+         * Run the main loop.
+         */
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/button/ExamplePressMe.java b/doc/examples/button/ExamplePressMe.java
new file mode 100644
index 0000000..e3a601f
--- /dev/null
+++ b/doc/examples/button/ExamplePressMe.java
@@ -0,0 +1,162 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package button;
+
+import java.io.FileNotFoundException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A simple Window with a Label and a Button in it. Demonstrates the basics of
+ * initializing GTK, packing Widgets into Containers, and hooking up signals.
+ * 
+ * This example has been around, in one form or another, since the very
+ * beginnings of java-gnome. If you're just starting out with GTK and GNOME
+ * don't worry; we started here too.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public class ExamplePressMe
+{
+    public static void main(String[] args) throws FileNotFoundException {
+        final Window w;
+        final VBox x;
+        final Label l;
+        final Button b;
+        final Pixbuf logo;
+
+        /*
+         * Initialize GTK. You MUST call this to load the library before
+         * trying to use any other elements provided by java-gnome.
+         */
+
+        Gtk.init(args);
+
+        /*
+         * Create a top level Window. It's the Container around which the
+         * window manager draws decorations such as a title bar, minimize and
+         * close buttons, resize edges, etc.
+         */
+
+        w = new Window();
+
+        /*
+         * Since a Window is a Bin, it can only have one child Widget. That's
+         * probably not very useful in most cases. To take that one slot and
+         * turn it into many, we use a VBox, a Container that will stack its
+         * children vertically.
+         */
+
+        x = new VBox(false, 3);
+
+        /*
+         * Create a Label with some text describing the Button that will
+         * follow, then add it to the VBox.
+         */
+
+        l = new Label("Go ahead:\nMake my day");
+        x.add(l);
+
+        /*
+         * Create our Button, with a nice explicit bit of text labelling it
+         * and what you're to do.
+         */
+
+        b = new Button("Press me!");
+        x.add(b);
+
+        /*
+         * Now the magic part. Just sitting there, the Button won't do
+         * anything. You need to hook up a "signal handler" to deal with the
+         * 'clicked' signal. This is how we do it in java-gnome.
+         * 
+         * Button.Clicked is a Java interface. You create an instance of it to
+         * do what you want when the callback happens, and then pass it to the
+         * Button's connect() method.
+         * 
+         * The onClicked() method is what is required by the Button.Clicked
+         * interface. Most IDEs will prompt you asking if you want to "Add
+         * unimplemented methods?" You bet! And ta-da! You have exactly the
+         * signature you need to implement a 'clicked' signal handler.
+         * 
+         * Since we declared b as final we can use it in the anonymous nested
+         * class (yet another reason that final is worth using). If the
+         * situation were otherwise, then the source parameter can be used to
+         * find out what Button was clicked.
+         */
+
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                System.out.println("I was clicked: " + b.getLabel());
+            }
+        });
+
+        /*
+         * Now we pack the VBox into our Window, set the Window's title, and
+         * invoke the command to realize everything onto the screen.
+         */
+
+        w.add(x);
+        w.setTitle("Hello World");
+        w.showAll();
+
+        /*
+         * We would be be done except for one last detail. Closing a Window
+         * does not terminate the application. If that's what you want (and we
+         * do indeed want that here) then you need to hook up a handler to do
+         * something when the 'delete-event' signal is emitted.
+         * 
+         * Again, the method here implements the interface.
+         */
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        /*
+         * Just not much of a program if it doesn't have an icon!
+         */
+
+        logo = new Pixbuf("src/bindings/java-gnome_Icon.png");
+        w.setIcon(logo);
+
+        /*
+         * Now we're ready to run the main loop. The signals we've hooked up
+         * handlers for above won't be emitted until the user does something,
+         * but no events will be processed until the main loop is running;
+         * that's where the signals will come from. This call blocks. You have
+         * finished setting things up and now it's up to your signal handlers
+         * to carry out the program's logic in response to the user's actions;
+         * the essence of event-driven programming.
+         */
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/button/ExampleRadioButton.java b/doc/examples/button/ExampleRadioButton.java
new file mode 100644
index 0000000..1c6edf0
--- /dev/null
+++ b/doc/examples/button/ExampleRadioButton.java
@@ -0,0 +1,158 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package button;
+
+import org.gnome.gdk.Event;
+import org.gnome.glib.Object;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Frame;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.HBox;
+import org.gnome.gtk.RadioButton;
+import org.gnome.gtk.RadioGroup;
+import org.gnome.gtk.ShadowType;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A little example that shows the usage of RadioButtons.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class ExampleRadioButton
+{
+    public static void main(String[] args) {
+        final Window w;
+        final HBox x;
+        final VBox vb;
+        final Frame frame;
+        final Button b;
+        final RadioGroup group;
+        final RadioButton opt1, opt2, opt3;
+
+        Gtk.init(args);
+
+        w = new Window();
+        x = new HBox(false, 10);
+
+        /*
+         * RadioButtons in the same group should be placed together. A Frame
+         * is usually a good alternative to place them altogether. You should
+         * use a descriptive label about the meaning of the options
+         */
+
+        frame = new Frame("Action to execute:");
+        x.add(frame);
+
+        /*
+         * While the Frame outline can be useful in some cases, it is usually
+         * unnecessary, and uses to be visually ugly. A blank space is good
+         * enough.
+         */
+        frame.setBorderWidth(3);
+        frame.setShadowType(ShadowType.NONE);
+
+        /*
+         * RadioButtons should be placed vertically, as this makes them easy
+         * to scan visually. A VBox is the best Container for this:
+         */
+
+        vb = new VBox(false, 2);
+        frame.add(vb);
+
+        /*
+         * Now lets create the RadioButtons. We must create one of then first,
+         * and submit it to the constructor of the others. That way all the
+         * RadioButtons will be in the same group. Note that is is useful to
+         * use a "_" in the label. That will make next character become the
+         * mnemonic for the Button, that allows user to enable it directly
+         * from the keyboard.
+         */
+
+        group = new RadioGroup();
+        opt1 = new RadioButton(group, "_Exit");
+        opt2 = new RadioButton(group, "_Move Window");
+        opt3 = new RadioButton(group, "_Print message");
+
+        /*
+         * And we add the RadioButtons to the VBox
+         */
+
+        vb.add(opt1);
+        vb.add(opt2);
+        vb.add(opt3);
+
+        b = new Button("Execute action");
+        x.add(b);
+
+        /*
+         * Sometimes you want to be notified each time the selection changes.
+         * The RadioGroup.GroupToggled signal is an easy way to do so.
+         * Alternatively you can use the RadioButton.Toggled signal on each
+         * RadioButton.
+         */
+
+        group.connect(new RadioGroup.GroupToggled() {
+            public void onGroupToggled(Object source) {
+                RadioButton button = (RadioButton) source;
+                System.out.println("Chosen: " + button.getLabel());
+            }
+        });
+
+        /*
+         * You can also get the active Button at any time.
+         */
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+
+                /* this returns the active button in the group */
+                RadioButton active = (RadioButton) group.getActive();
+                if (active == opt1) {
+                    /* exit */
+                    Gtk.mainQuit();
+                } else if (active == opt2) {
+                    w.move(0, 0);
+                } else { // active == opt3
+                    System.out.println("This is the message you want to print");
+                }
+            }
+        });
+
+        /*
+         * Now we pack the VBox into our Window, set the Window's title, and
+         * invoke the command to realize everything onto the screen.
+         */
+
+        w.add(x);
+        w.setTitle("RadioButton example");
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/cairo/ExampleDrawingGradients.java b/doc/examples/cairo/ExampleDrawingGradients.java
new file mode 100644
index 0000000..7578b45
--- /dev/null
+++ b/doc/examples/cairo/ExampleDrawingGradients.java
@@ -0,0 +1,115 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package cairo;
+
+import org.freedesktop.cairo.Context;
+import org.freedesktop.cairo.LinearPattern;
+import org.freedesktop.cairo.Pattern;
+import org.freedesktop.cairo.RadialPattern;
+import org.gnome.gdk.Event;
+import org.gnome.gtk.DrawingArea;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Exercise drawing with the Cairo API. If you are rendering a custom Widget
+ * or otherwise drawing stuff with Cairo that is to be presented by GTK, you
+ * are expected to do this in the Widget.ExposeEvent handler for that Widget.
+ * 
+ * @author Andrew Cowie
+ * @author Carl Worth
+ */
+/*
+ * Gradient example from the Cairo Tutorial.
+ */
+public class ExampleDrawingGradients
+{
+    public static void main(String[] args) {
+        final Window w;
+        final DrawingArea d;
+
+        Gtk.init(args);
+
+        w = new Window();
+        w.setTitle("Drawing");
+        w.setDefaultSize(150, 150);
+
+        d = new DrawingArea();
+        w.add(d);
+        w.showAll();
+
+        d.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                final Pattern linear, radial;
+
+                /*
+                 * Do some drawing:
+                 */
+
+                cr.setSource(1.0, 0.1, 0.0, 1.0);
+                cr.moveTo(10, 40);
+                cr.lineTo(120, 145);
+                cr.stroke();
+
+                /*
+                 * If youre used to using RGB triplets, just normalize them to
+                 * the 0.0 to 1.0 range by dividing by 255. It's all the same
+                 * to Cairo, really.
+                 */
+
+                cr.setSource(225 / 255.0, 148 / 255.0, 11 / 255.0, 1.0);
+                cr.rectangle(70, 70, 20, 40);
+                cr.fill();
+
+                /*
+                 * Now a much more complicated example of drawing: a linear
+                 * colour gradiant with a radial alpha mask.
+                 */
+
+                linear = new LinearPattern(0, 0, 150, 150);
+                linear.addColorStopRGB(0.0, 0.0, 0.3, 0.8);
+                linear.addColorStopRGB(1.0, 0.0, 0.8, 0.3);
+
+                radial = new RadialPattern(75, 75, 15, 75, 75, 60);
+                radial.addColorStopRGBA(0, 0.0, 0.0, 0.0, 0.0);
+                radial.addColorStopRGBA(1, 0.0, 0.0, 0.0, 1.0);
+
+                cr.setSource(linear);
+                cr.mask(radial);
+
+                return true;
+            }
+        });
+
+        /*
+         * And that's it. Conclude with connecting the usual tear-down
+         * handler, and then fire up the main loop.
+         */
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/cairo/ExampleDrawingPenguins.java b/doc/examples/cairo/ExampleDrawingPenguins.java
new file mode 100644
index 0000000..33950a6
--- /dev/null
+++ b/doc/examples/cairo/ExampleDrawingPenguins.java
@@ -0,0 +1,80 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package cairo;
+
+import java.io.FileNotFoundException;
+
+import org.freedesktop.cairo.Context;
+import org.gnome.gdk.Event;
+import org.gnome.gtk.DrawingArea;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+import org.gnome.rsvg.DimensionData;
+import org.gnome.rsvg.Handle;
+import org.gnome.rsvg.Rsvg;
+
+/**
+ * Draw an SVG iamge to a Cairo surface.
+ * 
+ * @author Andrew Cowie
+ */
+public class ExampleDrawingPenguins
+{
+    public static void main(String[] args) throws FileNotFoundException {
+        final Window w;
+        final DrawingArea d;
+        final Handle graphic;
+        final DimensionData size;
+        final int width, height;
+
+        Gtk.init(args);
+        Rsvg.init();
+
+        w = new Window();
+        w.setTitle("Tux");
+
+        graphic = new Handle("tests/bindings/org/gnome/rsvg/Linux_Tux.svg");
+
+        size = graphic.getDimensions();
+        width = size.getWidth();
+        height = size.getHeight();
+        w.setDefaultSize(width, height);
+
+        d = new DrawingArea();
+        w.add(d);
+        w.showAll();
+
+        d.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                cr.showHandle(graphic);
+                return true;
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/cairo/ExampleDrawingText.java b/doc/examples/cairo/ExampleDrawingText.java
new file mode 100644
index 0000000..79c057a
--- /dev/null
+++ b/doc/examples/cairo/ExampleDrawingText.java
@@ -0,0 +1,122 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package cairo;
+
+import org.freedesktop.cairo.Context;
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Image;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+import org.gnome.pango.Alignment;
+import org.gnome.pango.FontDescription;
+import org.gnome.pango.Layout;
+
+/**
+ * Little example of how to draw text with Pango and Cairo.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ExampleDrawingText
+{
+    public static void main(String[] args) {
+        final Window w;
+        final Image i;
+
+        Gtk.init(args);
+
+        w = new Window();
+        w.setTitle("Simple Pango example");
+        w.setDefaultSize(150, 150);
+
+        i = new Image();
+        w.add(i);
+        w.showAll();
+
+        i.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                final Layout layout;
+                final FontDescription desc;
+
+                /*
+                 * ...that we use to create a Pango Layout. The Context
+                 * represents the backend where the text will be actually
+                 * drawn. The Layout represents the text and its format
+                 * attributes.
+                 */
+                layout = new Layout(cr);
+
+                /*
+                 * You can set the default font description.
+                 */
+                desc = new FontDescription("DejaVu Serif, Book 12");
+                layout.setFontDescription(desc);
+
+                /*
+                 * The usage of Pango markup is an easy way to get text
+                 * formatted.
+                 */
+                layout.setMarkup("<big>Hello</big>!\n"
+                        + "This is an example of a how to write a <i>paragraph</i> "
+                        + "of text with Pango, and how to <span foreground=\"#0000FF\">"
+                        + "format</span> it with <span font_desc=\"Sans Italic 12\">Pango Markup</span>");
+
+                /*
+                 * You can set the alignment of the Layout. Note that you
+                 * should set its width too.
+                 */
+                layout.setWidth(150.0);
+                layout.setAlignment(Alignment.CENTER);
+
+                /*
+                 * If you want to ensure the full text fits in the Widget,
+                 * setting the size-request is generally useful.
+                 */
+                source.setSizeRequest(layout.getPixelWidth(), layout.getPixelHeight());
+
+                /*
+                 * We can also specify some attributes (such as the color)
+                 * with usual Cairo functions.
+                 */
+                cr.setSource(0.1, 0.5, 0.7);
+
+                /*
+                 * And finally, we draw the text!
+                 */
+                cr.showLayout(layout);
+                return false;
+            }
+        });
+
+        /*
+         * And that's it. Conclude with connecting the usual tear-down
+         * handler, and then fire up the main loop.
+         */
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/cairo/ExampleLinedPaper.java b/doc/examples/cairo/ExampleLinedPaper.java
new file mode 100644
index 0000000..1fdb4ae
--- /dev/null
+++ b/doc/examples/cairo/ExampleLinedPaper.java
@@ -0,0 +1,222 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ * Copyright © 2008      Nathan Strum
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package cairo;
+
+/*
+ * The image sketch is included with java-gnome with permission of its author,
+ * Nathan Strum, for the express purpose of illustrating this example.
+ */
+
+import java.io.IOException;
+
+import org.freedesktop.cairo.Context;
+import org.freedesktop.cairo.PdfSurface;
+import org.freedesktop.cairo.Surface;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.PaperSize;
+import org.gnome.gtk.Unit;
+import org.gnome.pango.FontDescription;
+import org.gnome.pango.Layout;
+import org.gnome.pango.LayoutLine;
+import org.gnome.pango.Rectangle;
+
+import static java.lang.Math.PI;
+import static textview.LoremIpsum.text;
+
+/**
+ * Some poor kid sitting through latin class doodling on his lined paper.
+ * 
+ * This is an example of using Pango to render text along side Cairo drawing
+ * primitives, and using Cairo's PdfSurface back end to produce a PDF that can
+ * subsequently be previewd or printed to paper.
+ * 
+ * The blue lines actually represent the baseline of the font (the calls to
+ * Context's showLayout() draw LayoutLines with their baseline at the current
+ * Cairo point); if you go to a high level of zoom you'll see the overshoot
+ * that some glyphs are designed with. The red line is the left margin, and
+ * unlike the baseline (which is just an arbitrary point midway into the
+ * font's extents), nothing bleeds left past the margin line.
+ * 
+ * @author Andrew Cowie
+ * @author Nathan Strum
+ */
+public class ExampleLinedPaper
+{
+    public static void main(String[] args) throws IOException {
+        final Surface surface;
+        final Context cr;
+        final Layout layout;
+        final FontDescription desc;
+        final String[] paras;
+        final LayoutLine first;
+        final PaperSize paper;
+        final double pageWidth, pageHeight;
+        final double topMargin, leftMargin, rightMargin;
+        final Rectangle rect;
+        final double[] holes;
+        double y, v, b;
+        final Pixbuf pixbuf;
+
+        Gtk.init(args);
+
+        paper = PaperSize.getDefault();
+        pageWidth = paper.getWidth(Unit.POINTS);
+        pageHeight = paper.getHeight(Unit.POINTS);
+        topMargin = 25;
+        leftMargin = 45;
+        rightMargin = 20;
+
+        surface = new PdfSurface("doc/examples/cairo/ExampleLinedPaper.pdf", pageWidth, pageHeight);
+        cr = new Context(surface);
+
+        cr.moveTo(leftMargin, topMargin);
+
+        layout = new Layout(cr);
+        desc = new FontDescription("Liberation Serif, 12");
+        layout.setFontDescription(desc);
+
+        /*
+         * Before we start rendering, we need some information about the line
+         * height. Given that all lines are going to be rendered in the same
+         * font, we can get the metrics of a piece of arbitrary text and then
+         * use that height to do the line spacing for both the text and the
+         * lines.
+         */
+
+        layout.setText("Lorem");
+        first = layout.getLineReadonly(0);
+        rect = first.getExtentsLogical();
+        v = rect.getHeight();
+        b = rect.getAscent();
+
+        /*
+         * Draw the horizontal rules in blue. These will cunningly be drawn on
+         * the font baseline, and given that the LayoutLines below will be
+         * drawn with reference to this latitude it will end up looking like
+         * the person writing is very good at staying between the lines.
+         */
+
+        y = topMargin + b;
+        while (y < pageHeight) {
+            cr.moveTo(0, y);
+            cr.lineTo(pageWidth, y);
+
+            y += v;
+        }
+
+        cr.setSource(0, 0, 199.0 / 255.0);
+        cr.setLineWidth(0.1);
+        cr.stroke();
+
+        /*
+         * Draw a vertical red line as the left margin rule.
+         */
+
+        cr.moveTo(leftMargin, 0);
+        cr.lineTo(leftMargin, pageHeight);
+        cr.setSource(255.0 / 255.0, 0.0, 0.0);
+        cr.stroke();
+
+        /*
+         * Now draw the "holes" making this three-hole punched lined paper.
+         * The holes array are fractions of the page height which is where we
+         * will draw the circles with arc(). We wil preserve the path so we
+         * can use it again to full with white, making it look like the paper
+         * was punched out.
+         */
+
+        holes = new double[] {
+            1.0 / 7.0,
+            1.0 / 2.0,
+            6.0 / 7.0
+        };
+
+        cr.setLineWidth(1.0);
+
+        for (double hole : holes) {
+            cr.arc(leftMargin / 2.0, pageHeight * hole, leftMargin / 4.0, 0.0, 2 * PI);
+
+            cr.setSource(1.0, 1.0, 1.0);
+            cr.fillPreserve();
+
+            cr.setSource(0.5, 0.5, 0.5);
+            cr.stroke();
+        }
+
+        /*
+         * And finally we lay out the words. Given some source text, split it
+         * up into individual paragraphs. Pango's Layout is capable of doing
+         * multiple paragraphs at once, but this allows us to control the
+         * spacing between paragraphs.
+         */
+
+        paras = text.split("\n");
+
+        /*
+         * Set a width for the Layouts. This will kick-off word wrapping. And
+         * reset the source colour so that the text will be black.
+         */
+
+        layout.setWidth(pageWidth - (leftMargin + rightMargin));
+
+        cr.setSource(0.0, 0.0, 0.0);
+
+        /*
+         * We did the lines first so that the typeset text will be over the
+         * ruled lines. We go to the trouble of drawing the lines
+         * individually, making it easier to keep things aligned with the
+         * baselines of the rules that we've already drawn.
+         */
+
+        y = topMargin + b;
+        for (String para : paras) {
+            layout.setText(para);
+
+            for (LayoutLine line : layout.getLinesReadonly()) {
+                y += v;
+
+                cr.moveTo(leftMargin, y);
+                cr.showLayout(line);
+            }
+
+            y += v; // blank line between paras
+        }
+
+        /*
+         * Of course, what student in latin class is paying attention? None in
+         * the history of western civilization, we're quite sure. So to
+         * complete our example we have a doodle at the bottom of the page.
+         */
+
+        pixbuf = new Pixbuf("doc/examples/cairo/incoming-sketch.png");
+        cr.setSource(pixbuf, pageWidth - pixbuf.getWidth() - 10, pageHeight - pixbuf.getHeight() + 50);
+        cr.paint();
+
+        /*
+         * Finally, flush the drawing out to the Surface and through it on out
+         * to the PDF document. This is very important! If you don't reach
+         * this point the file on disk will be incomplete and won't render in
+         * a PDF viewer.
+         */
+
+        surface.finish();
+    }
+}
diff --git a/doc/examples/cairo/incoming-sketch.png b/doc/examples/cairo/incoming-sketch.png
new file mode 100644
index 0000000..7f6eca2
Binary files /dev/null and b/doc/examples/cairo/incoming-sketch.png differ
diff --git a/doc/examples/entry/ExampleLoginPrompt.java b/doc/examples/entry/ExampleLoginPrompt.java
new file mode 100644
index 0000000..8b1195c
--- /dev/null
+++ b/doc/examples/entry/ExampleLoginPrompt.java
@@ -0,0 +1,313 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package entry;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.DataColumn;
+import org.gnome.gtk.DataColumnString;
+import org.gnome.gtk.Dialog;
+import org.gnome.gtk.Entry;
+import org.gnome.gtk.EntryCompletion;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.IconSize;
+import org.gnome.gtk.Image;
+import org.gnome.gtk.InfoMessageDialog;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.ListStore;
+import org.gnome.gtk.ResponseType;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.TreeIter;
+import org.gnome.gtk.TreeModel;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A simple program that shows the interest of using EntryCompletion.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.12
+ */
+public class ExampleLoginPrompt
+{
+    public static void main(String[] args) {
+        final Window window;
+        final VBox vbox;
+        final Button button;
+        final Image image;
+        final Label loginLabel;
+        final Label passwordLabel;
+        final Entry loginEntry;
+        final Entry passwordEntry;
+        final EntryCompletion completion;
+        final ListStore model;
+        final DataColumnString column;
+        final String[] words;
+        TreeIter row;
+
+        /*
+         * Initialize GTK.
+         */
+
+        Gtk.init(args);
+
+        /*
+         * Create a top level Window.
+         */
+
+        window = new Window();
+
+        /*
+         * Connect the signal to close the window
+         */
+
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        /*
+         * Create a VBox which will contains a label and an entry completion.
+         */
+
+        vbox = new VBox(false, 3);
+
+        /*
+         * Create Labels with some text describing what the entries are here.
+         */
+
+        image = new Image(Stock.NETWORK, IconSize.DIALOG);
+        loginLabel = new Label("Login");
+        passwordLabel = new Label("Password");
+
+        /*
+         * Create the Entries which will display the text.
+         */
+
+        loginEntry = new Entry();
+        passwordEntry = new Entry();
+
+        /*
+         * The password Entry should hide its text.
+         */
+
+        passwordEntry.setVisibility(false);
+
+        /*
+         * Create the EntryCompletion.
+         */
+
+        completion = new EntryCompletion();
+
+        /*
+         * The completion will use a ListStore as model.
+         */
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+        completion.setModel(model);
+
+        /*
+         * Fill the model with words.
+         */
+
+        words = new String[] {
+            "respawneral at gmail.com",
+            "joe at example.org"
+        };
+
+        for (String word : words) {
+            /*
+             * Append a new row for a new word.
+             */
+
+            row = model.appendRow();
+
+            /*
+             * Add the word to the model.
+             */
+
+            model.setValue(row, column, word);
+        }
+
+        /*
+         * Indicate the column which contains the text in the model. 0 is for
+         * the first.
+         */
+
+        completion.setTextColumn(column);
+
+        /*
+         * Finally, indicate to the entry which completion it has to use.
+         */
+
+        loginEntry.setCompletion(completion);
+
+        /*
+         * When the MatchSelected signal is emitted, it means the user has
+         * selected a text in the list, so we display it in the Entry.
+         */
+
+        completion.connect(new EntryCompletion.MatchSelected() {
+            public boolean onMatchSelected(EntryCompletion source, TreeModel model, TreeIter iter) {
+                final String text;
+                final Entry entry;
+
+                /*
+                 * Get the Entry attached to the EntryCompletion.
+                 */
+
+                entry = source.getEntry();
+
+                /*
+                 * Get the text the user has selected.
+                 */
+
+                text = model.getValue(iter, column);
+
+                /*
+                 * Display the text in the Entry.
+                 */
+
+                entry.setText(text);
+
+                /*
+                 * Let the cursor move to the beginning.
+                 */
+
+                entry.setPosition(-1);
+
+                /*
+                 * Use a fake password
+                 */
+
+                passwordEntry.setText("abcdefgh");
+
+                return true;
+            }
+        });
+
+        /*
+         * Pack everything in the box.
+         */
+
+        vbox.add(image);
+        vbox.add(loginLabel);
+        vbox.add(loginEntry);
+        vbox.add(passwordLabel);
+        vbox.add(passwordEntry);
+
+        /*
+         * Now we create the "connection" button.
+         */
+
+        button = new Button(Stock.CONNECT);
+        vbox.add(button);
+
+        /*
+         * Connect the button to a signal.
+         */
+
+        button.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                /*
+                 * Get the address which was entered in the login Entry.
+                 */
+
+                final String address = loginEntry.getText();
+
+                /*
+                 * Don't do anything if there's no address.
+                 */
+
+                if (address.isEmpty()) {
+                    return;
+                }
+
+                /*
+                 * Display a little message in the dialog.
+                 */
+
+                InfoMessageDialog dialog = new InfoMessageDialog(window, "Login successful",
+                        "You tryed to get login with '" + address
+                                + "' address. Try it again with the same address.");
+
+                /*
+                 * Just close the dialog if we click on its button.
+                 */
+
+                dialog.connect(new Dialog.Response() {
+                    public void onResponse(Dialog source, ResponseType response) {
+                        source.hide();
+                    }
+                });
+
+                dialog.run();
+
+                /*
+                 * Search if the address has already been use.
+                 */
+
+                boolean add = true;
+                TreeIter row = model.getIterFirst();
+                do {
+                    final String text = model.getValue(row, column);
+
+                    if (text.equals(address)) {
+                        add = false;
+                    }
+                } while (row.iterNext() && add);
+
+                /*
+                 * If not, we add it to the completion list.
+                 */
+
+                if (add) {
+                    row = model.appendRow();
+                    model.setValue(row, column, address);
+                }
+
+                /*
+                 * And we reset Entries.
+                 */
+
+                loginEntry.setText("");
+                passwordEntry.setText("");
+            }
+        });
+
+        /*
+         * Now we pack the VBox into our Window and set the Window's title.
+         */
+
+        window.add(vbox);
+        window.setTitle("Login");
+        window.showAll();
+
+        /*
+         * Run the main loop.
+         */
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/entry/ExampleSearchSomeone.java b/doc/examples/entry/ExampleSearchSomeone.java
new file mode 100644
index 0000000..e6cff4d
--- /dev/null
+++ b/doc/examples/entry/ExampleSearchSomeone.java
@@ -0,0 +1,209 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package entry;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.CellRendererText;
+import org.gnome.gtk.DataColumn;
+import org.gnome.gtk.DataColumnString;
+import org.gnome.gtk.Entry;
+import org.gnome.gtk.EntryIconPosition;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.ListStore;
+import org.gnome.gtk.SelectionMode;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.TreeIter;
+import org.gnome.gtk.TreeModel;
+import org.gnome.gtk.TreeModelFilter;
+import org.gnome.gtk.TreeView;
+import org.gnome.gtk.TreeViewColumn;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A simple program that shows the interest of using icon in Entry.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.13
+ */
+public class ExampleSearchSomeone
+{
+    public static void main(String[] args) {
+        final Window window;
+        final VBox vbox;
+        final Entry entry;
+        final DataColumnString textColumn;
+        final ListStore model;
+        final TreeView view;
+        final TreeModelFilter filter;
+        TreeViewColumn vertical;
+        CellRendererText renderer;
+        TreeIter row;
+
+        final String[] contacts = {
+            "Andrew Cowie\nandrew at operationaldynamics.com",
+            "Vreixo Formoso Lopes\nmetalpain2002 at yahoo.es",
+            "Serkan Kaba\nserkan at gentoo.org",
+            "Stefan Schweizer\nsteve.schweizer at gmail.com",
+            "Guillaume Mazoyer\nrespawneral at gmail.com"
+        };
+
+        /*
+         * Initialize GTK.
+         */
+
+        Gtk.init(args);
+
+        /*
+         * Create a top level Window.
+         */
+
+        window = new Window();
+
+        /*
+         * Connect the signal to close the window
+         */
+
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        /*
+         * Create a VBox which will contains everything.
+         */
+
+        vbox = new VBox(false, 3);
+
+        /*
+         * Create the Entry which will display the text.
+         */
+
+        entry = new Entry();
+        vbox.add(entry);
+
+        /*
+         * Add a clear icon to the right and a find icon to the left The find
+         * icon will be just decorative, no action will be done with it.
+         */
+
+        entry.setIconFromStock(EntryIconPosition.PRIMARY, Stock.FIND);
+        entry.setIconActivatable(EntryIconPosition.PRIMARY, false);
+        entry.setIconFromStock(EntryIconPosition.SECONDARY, Stock.CLEAR);
+
+        /*
+         * Build the TreeView model as a ListStore.
+         */
+
+        model = new ListStore(new DataColumn[] {
+            textColumn = new DataColumnString()
+        });
+
+        /*
+         * Add each "contact" to the underlying ListStore
+         */
+
+        for (String contact : contacts) {
+            row = model.appendRow();
+            model.setValue(row, textColumn, contact);
+        }
+
+        /*
+         * Use a filter to display only the good results
+         */
+
+        filter = new TreeModelFilter(model, null);
+        filter.setVisibleCallback(new TreeModelFilter.Visible() {
+            public boolean onVisible(TreeModelFilter source, TreeModel base, TreeIter row) {
+                final String contact;
+                final String search;
+
+                contact = base.getValue(row, textColumn);
+                search = entry.getText();
+
+                if (contact.contains(search)) {
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        });
+
+        /*
+         * Then, we build the TreeView.
+         */
+
+        view = new TreeView(filter);
+        view.setHeadersVisible(false);
+        view.setEnableSearch(false);
+        view.getSelection().setMode(SelectionMode.NONE);
+        view.setCanFocus(false);
+        view.setSizeRequest(300, 200);
+        vbox.add(view);
+
+        /*
+         * Setup visual display of the contact data
+         */
+
+        vertical = view.appendColumn();
+        renderer = new CellRendererText(vertical);
+        renderer.setText(textColumn);
+
+        /*
+         * Connect the signal to enable search when we type.
+         */
+
+        entry.connect(new Entry.Changed() {
+            public void onChanged(Entry source) {
+                /*
+                 * Refilter the view
+                 */
+
+                filter.refilter();
+            }
+        });
+
+        /*
+         * Then connect the signal to the icon to clear the entry.
+         */
+
+        entry.connect(new Entry.IconPress() {
+            public void onIconPress(Entry source, EntryIconPosition position, Event event) {
+                source.setText("");
+            }
+        });
+
+        /*
+         * Finally pack the VBox into our Window and set a title.
+         */
+
+        window.add(vbox);
+        window.setTitle("Search for a contact");
+        window.showAll();
+
+        /*
+         * Run the main loop.
+         */
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/i18n/ExampleTranslation.java b/doc/examples/i18n/ExampleTranslation.java
new file mode 100644
index 0000000..c27b4a6
--- /dev/null
+++ b/doc/examples/i18n/ExampleTranslation.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008      Vreixo Formoso
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package i18n;
+
+import java.util.Calendar;
+
+import org.freedesktop.bindings.Internationalization;
+import org.gnome.gtk.Gtk;
+
+import static org.freedesktop.bindings.Internationalization.N_;
+import static org.freedesktop.bindings.Internationalization._;
+
+/**
+ * Little example of i18n features, still to be improved.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ExampleTranslation
+{
+    /*
+     * With code that will be executed before calling I18n.init(), you need to
+     * use N_() function instead of _(). This just marks the string as
+     * translatable, it does not really translate (it can't!), so when
+     * actually print, you will need to call _()! See below.
+     */
+    private static final String GOODBYE = N_("Goodbye");
+
+    public static void main(String[] args) {
+
+        /* this is called just to link against JNI library */
+        Gtk.init(args);
+
+        Internationalization.init("example", "tmp/locale/");
+
+        /* we can translate simple messages */
+        System.out.println(_("Hello"));
+
+        /* as GOODBYE is marked with N_(), we need to call _() */
+        System.out.println(_(GOODBYE));
+
+        /* or also use messages with parameters */
+        System.out.println(_("User name is {0} and home dir is {1}", System.getProperty("user.name"),
+                System.getProperty("user.home")));
+
+        /*
+         * but also parameters that should be formatted in a locale-dependent
+         * way
+         */
+        System.out.println(_("This costs {0,number,currency}", 1555.45));
+        System.out.println(_("Today is {0,date,long}", Calendar.getInstance().getTime()));
+
+        /* we even have support for advanced usage */
+        System.out.println(_(
+                "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.", 1));
+
+        /*
+         * and of course, we can use not internationalized messages. This
+         * should be done, for example, for debug messages.
+         */
+        System.out.println("Not internationalized");
+    }
+}
diff --git a/doc/examples/keyboard/ExampleSnooping.java b/doc/examples/keyboard/ExampleSnooping.java
new file mode 100644
index 0000000..ebe7deb
--- /dev/null
+++ b/doc/examples/keyboard/ExampleSnooping.java
@@ -0,0 +1,96 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package keyboard;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventKey;
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+import org.gnome.glib.Glib;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Observing the flow of key strokes. This is essentially the code used to
+ * generate the data about sequencing described in {@link ModifierType}.
+ * 
+ * @author Andrew Cowie
+ */
+public class ExampleSnooping
+{
+    public ExampleSnooping() {
+        final Window w;
+        final Label l;
+
+        w = new Window();
+        l = new Label("<b>Start Typing!</b>\n" + "Start typing and details about\n"
+                + "your KeyEvents will\n" + "appear on the console.");
+        l.setUseMarkup(true);
+
+        w.add(l);
+
+        w.connect(new Widget.KeyPressEvent() {
+            public boolean onKeyPressEvent(Widget source, EventKey event) {
+                final Keyval key;
+                final ModifierType mod;
+
+                key = event.getKeyval();
+                mod = event.getState();
+
+                System.out.print("Pressed: " + key.toString() + ", ");
+                System.out.print("Modifier: " + mod.toString() + " ");
+
+                if (mod == ModifierType.SHIFT_MASK) {
+                    System.out.print("That's Shifty!");
+                }
+                if (mod.contains(ModifierType.ALT_MASK)) {
+                    System.out.print("Hooray for Alt!");
+                }
+                if (mod.contains(ModifierType.SUPER_MASK)) {
+                    System.out.print("You're Super!");
+                }
+
+                System.out.println();
+                return false;
+            }
+        });
+
+        w.setTitle("Key snooping");
+        w.setBorderWidth(30);
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        Glib.setProgramName("snooping");
+        Gtk.init(args);
+
+        new ExampleSnooping();
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/menu/ExampleSimpleMenu.java b/doc/examples/menu/ExampleSimpleMenu.java
new file mode 100644
index 0000000..eea2233
--- /dev/null
+++ b/doc/examples/menu/ExampleSimpleMenu.java
@@ -0,0 +1,273 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007      Vreixo Formoso
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package menu;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+import org.gnome.gtk.AcceleratorGroup;
+import org.gnome.gtk.CheckMenuItem;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.ImageMenuItem;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.Menu;
+import org.gnome.gtk.MenuBar;
+import org.gnome.gtk.MenuItem;
+import org.gnome.gtk.SeparatorMenuItem;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * How to use {@link Menu} and related Widgets.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @author Sarah Leibbrand
+ */
+public class ExampleSimpleMenu
+{
+    public ExampleSimpleMenu() {
+        final Window window;
+        final VBox box;
+        final Label label;
+        final Menu fileMenu, editMenu, viewMenu;
+        final MenuItem file, edit, view;
+        final MenuItem save, copy, paste;
+        final ImageMenuItem nouveau, close;
+        final AcceleratorGroup group;
+        final MenuBar bar;
+
+        /*
+         * Begin with the standard VBox in a Window setup:
+         */
+
+        window = new Window();
+        box = new VBox(false, 3);
+        window.add(box);
+
+        label = new Label("Select an action in a menu");
+        label.setWidthChars(30);
+        label.setAlignment(0.0f, 0.5f);
+
+        /*
+         * Most applications will use several Menus in a MenuBar:
+         */
+        fileMenu = new Menu();
+        editMenu = new Menu();
+        viewMenu = new Menu();
+
+        /*
+         * Create all of MenuItems that will be used:
+         */
+        nouveau = new ImageMenuItem(Stock.NEW);
+        save = new MenuItem("_Save");
+        close = new ImageMenuItem(Stock.CLOSE);
+        copy = new MenuItem("_Edit");
+        paste = new MenuItem("_Paste");
+
+        /*
+         * Create the AcceleratorGroup object and add it to the window.
+         */
+
+        group = new AcceleratorGroup();
+        window.addAcceleratorGroup(group);
+
+        /*
+         * Now we add the keybindings for the menu items. This has to be done
+         * before you append them to their Menus.
+         */
+        save.setAccelerator(group, Keyval.s, ModifierType.CONTROL_MASK);
+        copy.setAccelerator(group, Keyval.c, ModifierType.CONTROL_MASK);
+        paste.setAccelerator(group, Keyval.v, ModifierType.CONTROL_MASK);
+
+        /*
+         * For ImageMenuItems you can activate the keybinding that comes with
+         * the Stock item instead.
+         */
+        nouveau.setAccelerator(group);
+
+        /*
+         * Despite 'close' also being an ImageMenuItem we could use the
+         * keybinding that is set for Stock.CLOSE. But since we have already
+         * set Control + C for editCopy we set this one manually to another
+         * keybinding:
+         */
+        close.setAccelerator(group, Keyval.w, ModifierType.CONTROL_MASK);
+
+        /*
+         * To ensure keybindings will work we also have set the
+         * AcceleratorGroup to the menus containing the MenuItems with the
+         * keybindings.
+         * 
+         * Since we have not set a keybinding for hide text MenuItem we also
+         * do not need to set the AcceleratorGroup of the Menu containing this
+         * menu item. Also if a Menu only contains MenuItems with keybindings
+         * set from Stock Items (and not set a keybinding manually) it is also
+         * not needed.
+         */
+        fileMenu.setAcceleratorGroup(group);
+        editMenu.setAcceleratorGroup(group);
+
+        /*
+         * Now you can add MenuItems to the "file" Menu.
+         */
+        fileMenu.append(nouveau);
+        fileMenu.append(save);
+
+        /*
+         * A SeparatorMenuItem can be used to differentiate between unrelated
+         * menu options; in practise, though, only use sparingly.
+         */
+        fileMenu.append(new SeparatorMenuItem());
+
+        /*
+         * And add the rest of the menu items.
+         */
+        fileMenu.append(close);
+        editMenu.append(copy);
+        editMenu.append(paste);
+
+        /*
+         * Usually you will want to connect to the MenuItem.Activate signal,
+         * that is emitted when the user "activates" the menu by either
+         * clicking it with the mouse or navigating to it with the keyboard
+         * and pressing <ENTER>.
+         */
+        nouveau.connect(new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                label.setLabel("You have selected File->New menu.");
+            }
+        });
+        save.connect(new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                label.setLabel("You have selected File->Save.");
+            }
+        });
+
+        close.connect(new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                label.setLabel("You have selected File->Close.");
+            }
+        });
+
+        /*
+         * Given that in most cases you will connect to the MenuItem.Activate
+         * signal on MenuItems, a convenience constructor is provided:
+         */
+        fileMenu.append(new MenuItem("_Quit", new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                Gtk.mainQuit();
+            }
+        }));
+
+        /*
+         * And now add the actions for the items making up the "edit" Menu.
+         */
+        copy.connect(new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                label.setLabel("You have selected Edit->Copy.");
+            }
+        });
+        paste.connect(new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                label.setLabel("You have selected Edit->Paste.");
+            }
+        });
+
+        /*
+         * CheckMenuItems hold a boolean state. One use is to allow users to
+         * hide some parts of the GUI, as in this example which we put into
+         * the "view" Menu:
+         */
+        viewMenu.append(new CheckMenuItem("Hide _text", new CheckMenuItem.Toggled() {
+            public void onToggled(CheckMenuItem source) {
+                if (source.getActive()) {
+                    label.hide();
+                } else {
+                    label.show();
+                }
+            }
+        }));
+
+        /*
+         * A MenuItem can have a "sub-menu", that will be expanded when the
+         * user puts the mouse pointer over it. This is also used in creating
+         * the elements for the top level MenuBar, but you can use it within
+         * normal Menus as well. That said, submenus of Menus are considered
+         * less "discoverable" because the user has to navigate through the
+         * hierarchy to find out what options are available to them, rather
+         * than seeing them at first glance.
+         */
+        file = new MenuItem("_File");
+        file.setSubmenu(fileMenu);
+        edit = new MenuItem("_Edit");
+        edit.setSubmenu(editMenu);
+        view = new MenuItem("_View");
+        view.setSubmenu(viewMenu);
+
+        /*
+         * Finally, most applications make use of a MenuBar that is by
+         * convention located at the top of the application Window. It
+         * contains the top-level MenuItems.
+         */
+        bar = new MenuBar();
+        bar.append(file);
+        bar.append(edit);
+        bar.append(view);
+
+        /*
+         * Finally, pack the Widgets into the VBox, and present.
+         */
+        box.packStart(bar, false, false, 0);
+        box.packStart(label, false, false, 0);
+
+        window.showAll();
+
+        /*
+         * And that's it! One last piece of house keeping, though: it is
+         * always necessary to deal with the user closing (what is in this
+         * case) the last Window in the application; otherwise the Java VM
+         * will keep running even after the (sole) Window is closed - because
+         * the main loop never returned.
+         */
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new ExampleSimpleMenu();
+
+        /*
+         * Yes, you could have written all the Window creation code here in
+         * main() but it is generally good practise to put that setup into a
+         * constructor, as we have here.
+         */
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/menu/ExampleToolbar.java b/doc/examples/menu/ExampleToolbar.java
new file mode 100644
index 0000000..d40eb5b
--- /dev/null
+++ b/doc/examples/menu/ExampleToolbar.java
@@ -0,0 +1,187 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package menu;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.Menu;
+import org.gnome.gtk.MenuItem;
+import org.gnome.gtk.MenuToolButton;
+import org.gnome.gtk.SeparatorToolItem;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.ToggleToolButton;
+import org.gnome.gtk.ToolButton;
+import org.gnome.gtk.ToolItem;
+import org.gnome.gtk.Toolbar;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * How to use {@link Toolbar} and related Widgets.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ExampleToolbar
+{
+    public ExampleToolbar() {
+        final Window w;
+        final VBox x;
+        final Label l;
+        final Toolbar toolbar;
+        final ToolButton buttonNew;
+        final MenuToolButton mtb;
+        final Menu openMenu;
+        final ToolItem item;
+        final ToggleToolButton boldButton, italicButton;
+
+        w = new Window();
+        w.setDefaultSize(400, 150);
+
+        x = new VBox(false, 3);
+        w.add(x);
+
+        /*
+         * Create a Toolbar, and add it at the beginning of the Window. Note
+         * that usually you also want a MenuBar, that is located at the top of
+         * the Window, with the Toolbar just under it.
+         */
+        toolbar = new Toolbar();
+        x.packStart(toolbar, false, false, 0);
+
+        l = new Label("Select an action in a menu");
+        x.add(l);
+
+        /*
+         * Usually you will want to add several ToolButtons to your Toolbar.
+         * You could create ToolButtons from a Stock id. That way, both Icon
+         * and Label are automatically set.
+         */
+        buttonNew = new ToolButton(Stock.NEW);
+        toolbar.add(buttonNew);
+
+        /*
+         * You can respond to user clicks in the ToolButton connecting to the
+         * ToolButton.Clicked signal.
+         */
+        buttonNew.connect(new ToolButton.Clicked() {
+            public void onClicked(ToolButton source) {
+                l.setLabel("You have clicked NEW ToolButton");
+            }
+        });
+
+        /*
+         * Sometimes you need a ToolButton that also has a dropdown Menu, to
+         * allow the user select alternative actions. You can do that with a
+         * MenuToolButton.
+         */
+        mtb = new MenuToolButton(Stock.OPEN);
+        toolbar.add(mtb);
+
+        /*
+         * You can add your Menu to this kind of ToolButtons
+         */
+        openMenu = new Menu();
+        openMenu.append(new MenuItem("File _A", new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                l.setLabel("You have selected File A in the Menu");
+            }
+        }));
+        openMenu.append(new MenuItem("File _B", new MenuItem.Activate() {
+            public void onActivate(MenuItem source) {
+                l.setLabel("You have selected File B in the Menu");
+            }
+        }));
+        openMenu.showAll();
+        mtb.setMenu(openMenu);
+
+        /*
+         * You also can respond to user clicks in the MenuToolButton itself
+         */
+        mtb.connect(new ToolButton.Clicked() {
+            public void onClicked(ToolButton source) {
+                l.setLabel("You have clicked the Open MenuToolButton");
+            }
+        });
+
+        /*
+         * To group together related items, you put a SeparatorToolItem
+         * between then
+         */
+        toolbar.add(new SeparatorToolItem());
+
+        /*
+         * ToggleToolButtons can be used to let users enable/disable some
+         * options.
+         */
+        boldButton = new ToggleToolButton(Stock.BOLD);
+        italicButton = new ToggleToolButton(Stock.ITALIC);
+
+        toolbar.add(boldButton);
+        toolbar.add(italicButton);
+
+        /* In some cases you want the Button in a active state */
+        boldButton.setActive(true);
+
+        /*
+         * the changes in the active state can be tracked by connecting to the
+         * ToggleToolButton.Toggled signal.
+         */
+        boldButton.connect(new ToggleToolButton.Toggled() {
+            public void onToggled(ToggleToolButton source) {
+                /* You can get the state with the getActive() method */
+                if (source.getActive()) {
+                    l.setLabel("Bold has been enabled");
+                } else {
+                    l.setLabel("Bold has been disabled");
+                }
+            }
+        });
+
+        toolbar.add(new SeparatorToolItem());
+
+        /*
+         * Finally, you can add another kind of Widgets to your Toolbar, after
+         * adding them to a ToolItem
+         */
+        item = new ToolItem();
+
+        // TODO replace the Label with a more useful Widget
+        item.add(new Label("This is a label"));
+        toolbar.add(item);
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+        w.showAll();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new ExampleToolbar();
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/notify/ExampleLowBattery.java b/doc/examples/notify/ExampleLowBattery.java
new file mode 100644
index 0000000..b24a2d2
--- /dev/null
+++ b/doc/examples/notify/ExampleLowBattery.java
@@ -0,0 +1,105 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package notify;
+
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.StatusIcon;
+import org.gnome.notify.Notification;
+import org.gnome.notify.Notify;
+import org.gnome.notify.Urgency;
+
+/**
+ * A simple program that sits in tray and displays a low battery warning.
+ * 
+ * @author Serkan Kaba
+ * @since 4.0.12
+ */
+public class ExampleLowBattery
+{
+    public static void main(String[] args) {
+        final StatusIcon icon;
+        final Notification notification;
+
+        /*
+         * Initialize GTK.
+         */
+
+        Gtk.init(args);
+
+        /*
+         * Initialize notification system.
+         */
+
+        Notify.init("low-battery-example");
+
+        /*
+         * Create a StatusIcon with GNOME Power Manager icon. Note that
+         * StatusIcon can not be directly constructed with an icon name.
+         */
+
+        icon = new StatusIcon();
+        icon.setFromIconName("gnome-power-manager");
+
+        /*
+         * Create a notification with a warning icon, attached to StatusIcon.
+         */
+
+        notification = new Notification("Low Battery Example", "Your battery is low!",
+                "messagebox_warning");
+
+        /*
+         * Quit the application after notification disappears.
+         */
+
+        notification.connect(new org.gnome.notify.Notification.Closed() {
+            public void onClosed(Notification source) {
+                Notify.uninit();
+                Gtk.mainQuit();
+            }
+        });
+
+        /*
+         * Make it play the warning sound from gnome-sound. Note that this may
+         * change in distributions. Normally this hint should be set if the
+         * server supports sounds. But unfortunately notification-daemon
+         * doesn't report its sound capability although it supports sounds.
+         * 
+         * See http://trac.galago-project.org/ticket/187
+         */
+
+        notification.setHint("sound-file", "/usr/share/sounds/warning.wav");
+
+        /*
+         * Make the notification critical.
+         */
+        notification.setUrgency(Urgency.CRITICAL);
+
+        /*
+         * Display the notification.
+         */
+
+        notification.show();
+
+        /*
+         * Run the main loop.
+         */
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/sourceview/ExampleEditor.java b/doc/examples/sourceview/ExampleEditor.java
new file mode 100644
index 0000000..d9e3f2d
--- /dev/null
+++ b/doc/examples/sourceview/ExampleEditor.java
@@ -0,0 +1,210 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package sourceview;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.PolicyType;
+import org.gnome.gtk.ScrolledWindow;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.TextBuffer;
+import org.gnome.gtk.ToolButton;
+import org.gnome.gtk.Toolbar;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+import org.gnome.pango.FontDescription;
+import org.gnome.sourceview.Language;
+import org.gnome.sourceview.LanguageManager;
+import org.gnome.sourceview.SourceBuffer;
+import org.gnome.sourceview.SourceView;
+
+/**
+ * A simple text editor demonstrating the GtkSourceView API.
+ * 
+ * @author Stefan Schweizer
+ */
+public class ExampleEditor
+{
+    private final SourceView view;
+
+    private final SourceBuffer buffer;
+
+    private final ToolButton buttonUndo;
+
+    private final ToolButton buttonRedo;
+
+    private ExampleEditor() {
+        final Window w;
+        final VBox x;
+        final Toolbar toolbar;
+        final ScrolledWindow scroll;
+        final LanguageManager manager;
+        final Language lang;
+        final FontDescription desc;
+
+        w = new Window();
+        w.setTitle("java-gnome editor");
+        w.setDefaultSize(550, 600);
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        x = new VBox(false, 3);
+        w.add(x);
+
+        /*
+         * Create a toolbar with buttons for undo and redo.
+         */
+
+        toolbar = new Toolbar();
+        buttonUndo = new ToolButton(Stock.UNDO);
+        buttonRedo = new ToolButton(Stock.REDO);
+        toolbar.add(buttonUndo);
+        toolbar.add(buttonRedo);
+        x.packStart(toolbar, false, false, 0);
+
+        /*
+         * Create the SourceBuffer and SourceView. Setup syntax highlighting
+         * and configure the view to meet our coding standards.
+         */
+
+        buffer = new SourceBuffer();
+
+        manager = LanguageManager.getDefault();
+        lang = manager.getLanguage("java");
+        buffer.setLanguage(lang);
+
+        view = new SourceView(buffer);
+        view.setShowLineNumbers(true);
+        view.setHighlightCurrentLine(true);
+        view.setShowRightMargin(true);
+        view.setRightMarginPosition(105);
+        view.setTabWidth(4);
+        view.setInsertSpacesInsteadOfTabs(true);
+        view.setAutoIndent(true);
+
+        desc = new FontDescription("Deja Vu Sans Mono, 11");
+        view.overrideFont(desc);
+
+        scroll = new ScrolledWindow();
+        scroll.setPolicy(PolicyType.AUTOMATIC, PolicyType.ALWAYS);
+        scroll.add(view);
+        x.add(scroll);
+
+        /*
+         * Whenever the buffer is changed, recheck if there are actions that
+         * can be undone or redone. Update the sensivity of the buttons
+         * accordingly.
+         */
+
+        buffer.connect(new TextBuffer.Changed() {
+            public void onChanged(TextBuffer source) {
+                updateButtons();
+            }
+        });
+
+        /*
+         * Connect handlers for undo and redo buttons. It is important to
+         * check if there is something to undo first to prevent a Gtk
+         * exception.
+         */
+
+        buttonUndo.connect(new ToolButton.Clicked() {
+            public void onClicked(ToolButton source) {
+                if (buffer.canUndo()) {
+                    buffer.undo();
+                }
+                updateButtons();
+            }
+        });
+
+        buttonRedo.connect(new ToolButton.Clicked() {
+            public void onClicked(ToolButton source) {
+                if (buffer.canRedo()) {
+                    buffer.redo();
+                }
+                updateButtons();
+            }
+        });
+
+        w.showAll();
+
+        /*
+         * Load the source file into the editor. The user should not be able
+         * to undo that, that is why the call to setText() is marked as an
+         * undoable action.
+         */
+
+        buffer.beginNotUndoableAction();
+        buffer.setText(readFile("doc/examples/sourceview/ExampleEditor.java"));
+        buffer.endNotUndoableAction();
+
+        /*
+         * Move the cursor to the start of the file.
+         */
+
+        buffer.placeCursor(buffer.getIter(0));
+        view.grabFocus();
+    }
+
+    private void updateButtons() {
+        buttonUndo.setSensitive(buffer.canUndo());
+        buttonRedo.setSensitive(buffer.canRedo());
+    }
+
+    private String readFile(String filename) {
+        final StringBuilder content;
+        BufferedReader reader = null;
+
+        content = new StringBuilder();
+
+        try {
+            reader = new BufferedReader(new FileReader(filename));
+            for (int c = reader.read(); c != -1; c = reader.read()) {
+                content.append((char) c);
+            }
+        } catch (IOException ioe) {
+            content.append(ioe.getMessage());
+        } finally {
+            try {
+                if (reader != null) {
+                    reader.close();
+                }
+            } catch (IOException e) {
+            }
+        }
+
+        return content.toString();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        new ExampleEditor();
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/textview/ExampleFontHeights.java b/doc/examples/textview/ExampleFontHeights.java
new file mode 100644
index 0000000..479c43f
--- /dev/null
+++ b/doc/examples/textview/ExampleFontHeights.java
@@ -0,0 +1,119 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package textview;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.TextBuffer;
+import org.gnome.gtk.TextIter;
+import org.gnome.gtk.TextTag;
+import org.gnome.gtk.TextView;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+import org.gnome.gtk.WrapMode;
+import org.gnome.pango.FontDescription;
+import org.gnome.pango.Style;
+
+/**
+ * Are all the characters in the rendered text the same height? Not all fonts
+ * behave in this regard.
+ * 
+ * <p>
+ * Run this as:
+ * 
+ * <pre>
+ * $ java -client -ea -classpath tmp/gtk-4.0.jar:tmp/tests textview.ExampleFontHeight 10
+ * </pre>
+ * 
+ * to see the 10pt problem on buggy distros like Ubuntu.
+ * 
+ * @author Andrew Cowie
+ */
+public final class ExampleFontHeights
+{
+    private ExampleFontHeights(int pt) {
+        final Window w;
+        final TextView view;
+        final FontDescription desc;
+        final TextBuffer buffer;
+        final TextTag filename, function, classname;
+        TextIter pointer;
+
+        w = new Window();
+
+        view = new TextView();
+
+        desc = new FontDescription("DejaVu Serif, " + pt);
+        view.overrideFont(desc);
+
+        buffer = new TextBuffer();
+
+        filename = new TextTag();
+        filename.setFamily("DejaVu Sans Mono, " + pt);
+        filename.setStyle(Style.ITALIC);
+        filename.setForeground("darkgreen");
+
+        function = new TextTag();
+        function.setFamily("DejaVu Sans Mono, " + pt);
+
+        classname = new TextTag();
+        classname.setFamily("DejaVu Sans, " + pt);
+        classname.setForeground("darkblue");
+
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "Accessing the ");
+        buffer.insert(pointer, "/tmp", filename);
+        buffer.insert(pointer, " directory directly is fine, but the ");
+        buffer.insert(pointer, "File", classname);
+        buffer.insert(pointer, " class has a ");
+        buffer.insert(pointer, "createTempFile()", function);
+        buffer.insert(pointer, " function that you are often better off using.");
+
+        view.setBuffer(buffer);
+        view.setWrapMode(WrapMode.WORD);
+        view.setSizeRequest(250, -1);
+        w.add(view);
+
+        w.setTitle("DejaVu " + pt + "pt");
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        final int pt;
+
+        Gtk.init(args);
+
+        if (args.length == 1) {
+            pt = Integer.parseInt(args[0]);
+        } else {
+            pt = 11;
+        }
+
+        new ExampleFontHeights(pt);
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/textview/ExampleInstantMessenger.java b/doc/examples/textview/ExampleInstantMessenger.java
new file mode 100644
index 0000000..74efe35
--- /dev/null
+++ b/doc/examples/textview/ExampleInstantMessenger.java
@@ -0,0 +1,394 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package textview;
+
+/*
+ * The smiley image used in this program is from the Tango Icon Theme, whose
+ * authors make available under the Creative Commons Attribution Share-Alike
+ * licence version 2.5. See http://tango-project.org/ for more details.
+ */
+
+import java.io.FileNotFoundException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventKey;
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.IconSize;
+import org.gnome.gtk.ScrolledWindow;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.TextBuffer;
+import org.gnome.gtk.TextIter;
+import org.gnome.gtk.TextTag;
+import org.gnome.gtk.TextView;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+import org.gnome.pango.Style;
+import org.gnome.pango.Weight;
+
+import static org.freedesktop.bindings.Time.formatTime;
+import static org.gnome.gtk.PolicyType.ALWAYS;
+import static org.gnome.gtk.PolicyType.NEVER;
+import static org.gnome.gtk.ShadowType.IN;
+import static org.gnome.gtk.WrapMode.NONE;
+import static org.gnome.gtk.WrapMode.WORD;
+
+/**
+ * An example of rendering multi-line text in an application.
+ * 
+ * There comes a point when it is difficult to demonstrate complex
+ * functionality in a trivial example, so so illustrate usage of the powerful
+ * TextView/TextBuffer APIs, we so we have opted to do something a bit more
+ * involved.
+ * 
+ * This program creates the conversation window you might see in a typical
+ * graphical instant messenger. It has a TextView displaying the conversation
+ * above, and uses various formatting to differentiate between incoming
+ * messages and outgoing ones. There is a second TextView at the bottom where
+ * the user can write the messages and "send" them. Finally, a tiny worker
+ * thread is kicked off to simulate incoming conversation.
+ * 
+ * Enjoy!
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @author Serkan Kaba
+ */
+public class ExampleInstantMessenger
+{
+    private final TextBuffer buffer;
+
+    private final TextView incoming;
+
+    private final TextView outgoing;
+
+    private final Pixbuf smiley;
+
+    private final TextTag grey, italics, blue;
+
+    private ExampleInstantMessenger() {
+        final Window window;
+        final VBox top;
+        final ScrolledWindow scroll1, scroll2;
+        final Thread other;
+        Pixbuf tmp;
+
+        /*
+         * Start with the usual establishment of a Window to contain the
+         * example.
+         */
+
+        window = new Window();
+        window.setTitle("Instant Messaging");
+        window.setDefaultSize(300, 200);
+
+        top = new VBox(false, 3);
+        window.add(top);
+
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        /*
+         * Create a TextView which will display incoming text messages (and
+         * also echo messages as they are sent). It is set up to be read only
+         * and to not have a cursor, thereby conveying the impression that it
+         * is just a display (a cursor especially would suggest that the text
+         * there can be changed).
+         */
+
+        buffer = new TextBuffer();
+
+        incoming = new TextView(buffer);
+        incoming.setEditable(false);
+        incoming.setCursorVisible(false);
+        incoming.setPaddingBelowParagraph(10);
+
+        /*
+         * We want word wrapping, otherwise messages wider that the screen
+         * width will be truncated. We also need to set up vertical scrolling
+         * so that as the conversation continues it won't be inaccessible off
+         * the bottom of the screen.
+         */
+
+        incoming.setWrapMode(WORD);
+
+        scroll1 = new ScrolledWindow();
+        scroll1.setPolicy(NEVER, ALWAYS);
+        scroll1.setShadowType(IN);
+        scroll1.add(incoming);
+
+        top.packStart(scroll1, true, true, 0);
+
+        /*
+         * Create the place for the user to enter messages they want to send.
+         * 
+         * The interesting part here is that when the user presses Enter in
+         * the TextView it "sends" a message and appends it to the log in the
+         * incoming TextView.
+         */
+
+        outgoing = new TextView();
+        outgoing.setSizeRequest(0, 20);
+        outgoing.setAcceptsTab(false);
+        outgoing.setWrapMode(NONE);
+
+        scroll2 = new ScrolledWindow();
+        scroll2.setPolicy(NEVER, NEVER);
+        scroll2.setShadowType(IN);
+        scroll2.add(outgoing);
+
+        top.packStart(scroll2, false, false, 0);
+
+        outgoing.connect(new Widget.KeyPressEvent() {
+            public boolean onKeyPressEvent(Widget source, EventKey event) {
+                if (event.getKeyval() == Keyval.Return) {
+                    final TextBuffer buffer;
+                    final String str;
+
+                    buffer = outgoing.getBuffer();
+                    str = buffer.getText();
+
+                    /*
+                     * Append the text in the TextView to the TextBuffer
+                     * backing the incoming display.
+                     */
+
+                    appendMessage(str, true);
+
+                    /*
+                     * But now clear the TextView so that we can enter another
+                     * message.
+                     */
+
+                    buffer.setText("");
+
+                    /*
+                     * And don't process the keystroke further.
+                     */
+                    return true;
+                }
+                return false;
+            }
+        });
+
+        /*
+         * Add English spellchecking to input TextView.
+         */
+        outgoing.attachSpell("en");
+
+        /*
+         * TextTags are how you apply formatting to content. We'll create a
+         * few for later use in the display.
+         */
+
+        grey = new TextTag();
+        grey.setForeground("#777777");
+
+        italics = new TextTag();
+        italics.setStyle(Style.ITALIC);
+        italics.setForeground("darkgreen");
+
+        blue = new TextTag();
+        blue.setWeight(Weight.BOLD);
+        blue.setForeground("blue");
+
+        /*
+         * Almost there. Quickly load an image that we'll use later to replace
+         * text smileys with. Since people frequently screw up relative paths
+         * when running things, we'll go to some trouble to load the broken
+         * image icon instead if we can't find our smiley.
+         */
+
+        try {
+            tmp = new Pixbuf("doc/examples/textview/face-smile.png");
+        } catch (FileNotFoundException fnfe) {
+            System.err.println("Warning: smiley image " + fnfe.getMessage());
+            tmp = Gtk.renderIcon(window, Stock.MISSING_IMAGE, IconSize.BUTTON);
+        }
+        smiley = tmp;
+
+        /*
+         * Put the Window and all its children on screen.
+         */
+
+        window.showAll();
+
+        /*
+         * Make sure the user's text Entry has the keyboard focus. For a
+         * number of reasons, this won't work until late in the game after
+         * everything else is packed. If you try it earlier something else
+         * will end up with focus despite this call having been made.
+         */
+
+        outgoing.grabFocus();
+
+        /*
+         * And start the "conversation" :)
+         */
+
+        other = new IncomingConversation();
+        other.start();
+    }
+
+    /**
+     * Append a received (or sent) message to the incoming display.
+     */
+    /*
+     * For fun, we translate the smile emoticon into an image, giving us an
+     * opportunity to demonstrate adding non-text elements to a TextBuffer.
+     */
+    private void appendMessage(String msg, boolean outbound) {
+        final TextIter end;
+        final long now;
+        final String timestamp;
+        final TextTag colour;
+        int i;
+        int prev;
+
+        /*
+         * Get a TextIter pointing at the end of the existing text.
+         */
+
+        end = buffer.getIterEnd();
+
+        /*
+         * Start with a paragraph separator and a timestamp. We colour the
+         * timestamp a lighter colour so as to not distract from the text.
+         */
+
+        buffer.insert(end, "\n");
+
+        now = System.currentTimeMillis() / 1000;
+        timestamp = formatTime("%H:%M:%S\t", now);
+        buffer.insert(end, timestamp, grey);
+
+        /*
+         * Loop over what we're going to add, replacing text smileys with
+         * graphical ones. As for the text we write, if the user sent it we'll
+         * make it blue but if incoming we'll leave it black.
+         */
+
+        if (outbound) {
+            colour = blue;
+        } else {
+            colour = null;
+        }
+
+        prev = 0;
+
+        while ((i = msg.indexOf(":)", prev)) != -1) {
+            buffer.insert(end, msg.substring(prev, i), colour);
+            buffer.insert(end, smiley);
+
+            i += 2;
+            prev = i;
+        }
+        buffer.insert(end, msg.substring(prev), colour);
+
+        /*
+         * We would be done, except that we need to scroll the TextView to
+         * show the message just appended. Otherwise the display will stay
+         * scrolled to top despite the fact that more message traffic is
+         * coming in. An instant messenger shows the recently arrived traffic
+         * on screen, letting older messages go off the top.
+         */
+
+        incoming.scrollTo(end);
+    }
+
+    /**
+     * When a conversation starts we want to indicate who it is with.
+     */
+    private void startConversationWith(String who) {
+        final TextIter pointer;
+
+        /*
+         * Place a message at the top of the display indicating who is writing
+         * in.
+         */
+
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "Starting conversation with " + who, italics);
+    }
+
+    /*
+     * We end with the program's main() method where we initialize GTK, call
+     * the constructor to build the GUI and then start the main event loop.
+     */
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new ExampleInstantMessenger();
+
+        Gtk.main();
+    }
+
+    /*
+     * And that's it! The remainder of this file is just some contrived
+     * infrastructure to simulate a conversation. Run this example and you'll
+     * see it all in action!
+     */
+
+    class IncomingConversation extends Thread
+    {
+        private final String[] messages;
+
+        private IncomingConversation() {
+            /*
+             * Mark this thread as a daemon thread, else the main thread
+             * terminating after Gtk.main() returns will not end the program.
+             */
+
+            this.setDaemon(true);
+
+            /*
+             * Some silly messages to use to fake incoming conversation.
+             */
+
+            messages = new String[] {
+                "Hello there!",
+                "Will you be my friend? :)",
+                "I live in Kenya. " + "It's nice here because it is so warm.",
+                "Someday, though, I want to see snow. " + "Perhaps I will go climb Kilimanjaro.",
+                "Did you see the marathon on the last day of the Olympics? "
+                        + "What a run by Samuel Wanjiru! " + "We are all so proud."
+            };
+
+            startConversationWith("Catherine Ojiambo");
+        }
+
+        public void run() {
+            for (int i = 0; i < messages.length; i++) {
+                try {
+                    sleep((int) (1000 + i * 2000 * Math.random()));
+                } catch (InterruptedException ie) {
+                }
+
+                appendMessage(messages[i], false);
+            }
+        }
+    }
+}
diff --git a/doc/examples/textview/LoremIpsum.java b/doc/examples/textview/LoremIpsum.java
new file mode 100644
index 0000000..e156286
--- /dev/null
+++ b/doc/examples/textview/LoremIpsum.java
@@ -0,0 +1,92 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package textview;
+
+/**
+ * "Lorem Ipsum" is the standard dummy text commonly used in the printing and
+ * typesetting industries. We include it here for illustrating populated
+ * TextViews.
+ * 
+ * <p>
+ * The text included in this class was created using the generator at <a
+ * href="http://www.lipsum.com/">http://www.lipsum.com/</a> and then repacked
+ * so as to fit into a series of Java Strings, concatenated.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * By all appearances, the result of using the above mentioned generator is
+ * free to use. If you find this class useful, the author of the generator
+ * appreciates PayPal donations.
+ */
+public final class LoremIpsum
+{
+    public static final String text = "Lorem ipsum dolor sit amet, consectetuer "
+            + "adipiscing elit. Proin adipiscing locus est. Curabitur vel "
+            + "odio. Morbi ipsum sem, viverra eget, tristique tincidunt, "
+            + "mollis vestibulum, nulla. Suspendisse blandit. Fuse bibendum "
+            + "neque at est. Mauris eget turpis. Sed erat. Class aptent "
+            + "taciti sociosqu ad litora torquent per conubia nostra, per "
+            + "inceptos himenaeos. Phasellus in diam. Donec felis. "
+            + "Pellentesque libero libero, interdum et, accumsan quis, "
+            + "interdum quis, odio. Vestibulum nec lacus. Etiam id lacus. "
+            + "Curabitur ornare, felis sit amet auctor iaculis, metus eros "
+            + "feugiat nisl, sed adipiscing nisl urna nec odio. Nam magna. "
+            + "Pellentesque sed ante non massa pulvinar dapibus. Suspendisse "
+            + "at sapien. Sed lobortis, nisi non tempor consequat, nisl ante "
+            + "lobortis dolor, ut hendrerit tortor quam id augue.\nPhasellus "
+            + "mollis, ante quis tincidunt rutrum, augue nisl malesuada "
+            + "ipsum, sit amet condimentum dolor felis nec lorem. Nulla "
+            + "ante. Etiam vulputate lorem quis orci. Duis mattis odio sit "
+            + "amet erat. Maecenas eu sem et nunc mollis dapibus. Quisque a "
+            + "dui. Pellentesque a arcu in eros pellentesque iaculis. "
+            + "Vestibulum ante ipsum primis in faucibus orci luctus et "
+            + "ultrices posuere cubilia Curae; Cras nulla pede, consequat "
+            + "quis, tincidunt eget, fermentum ac, sapien. Integer nec mi. "
+            + "Sed elementum iaculis justo. Suspendisse arcu arcu, facilisis "
+            + "quis, viverra aliquam, dapibus quis, magna. Nulla facilisi. "
+            + "Quisque dui ipsum, eleifend ut, ultrices vel, aliquet ac, "
+            + "turpis. Pellentesque volutpat lorem eget pede. Proin dapibus, "
+            + "ornare suscipit, magna nunc pharetra lorem, eget ornare velit "
+            + "sem vel tortor. Ut dolor. Fusce tincidunt.\nCurabitur "
+            + "viverra. Proin lectus nunc, elementum a, consequat vel, "
+            + "interdum non, mauris. Cras diam. Maecenas magna augue, "
+            + "tristique sed, mollis quis, tincidunt at, ante. Cras in metus "
+            + "eget tortor adipiscing egestas. In aliquet massa sollicitudin "
+            + "quam. Cras arcu. Vestibulum lorem felis, vestibulum laoreet, "
+            + "convallis in, suscipit eu, felis. Integer tincidunt. Nullam  "
+            + "tempor. Phasellus vel lorem. Suspendisse congue odio sit amet "
+            + "ligula. Donec rhoncus eleifend nisl. Fusce congue nunc quis "
+            + "lectus. Quisque vel nisl ornare magna interdum convallis.\nIn "
+            + "tincidunt nunc a leo. In id sem vitae lectus feugiat veh. "
+            + "Donec nisl justo, aliquet lobortis, dignissim non, sagittis "
+            + "eget, orci. Integer iaculis sapien vel diam sollicitudin "
+            + "facilisis. Morbi varius eros quis justo. Vivamus id leo eget "
+            + "metus accumsan dignissim. Nullam a est vitae erat elementum "
+            + "bibendum. Suspendisse a ante at nulla aliquet egestas. Donec "
+            + "ante lectus, ullamcorper id, egestas et, ultricies lacinia, "
+            + "nibh, non tincidunt nibh purus sit amet dui. Congue dictum "
+            + "augue. Donec sit amet velit quis augue aliquam pulvinar.\n"
+            + "Etiam rutrum velit in nunc porta auctor. Nullam fringilla "
+            + "velit volutpat felis. Etiam vestibulum condimentum augue. "
+            + "In ante quis neque laoreet pulvinar. Integer pharetra ligula "
+            + "eget magna. Morbi condimentum lectus commodo nunc. Sed "
+            + "suscipit, elit quis condimentum malesuada, erat arcu pulvinar "
+            + "tortor, vitae rhoncus justo est ut ipsum. Sed sagittis mi sit amet mauris.";
+}
diff --git a/doc/examples/textview/face-smile.png b/doc/examples/textview/face-smile.png
new file mode 100644
index 0000000..91ed0a4
Binary files /dev/null and b/doc/examples/textview/face-smile.png differ
diff --git a/doc/examples/tooltip/ExampleCustomTooltip.java b/doc/examples/tooltip/ExampleCustomTooltip.java
new file mode 100644
index 0000000..7cbe232
--- /dev/null
+++ b/doc/examples/tooltip/ExampleCustomTooltip.java
@@ -0,0 +1,130 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008      Vreixo Formoso
+ * Copyright © 2008-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package tooltip;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Grid;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.IconSize;
+import org.gnome.gtk.Image;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.Tooltip;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * An example showing the usage of Tooltips. Tooltips are little help messages
+ * that are displayed when the use moves the mouse pointer over a Widget.
+ * 
+ * They can also be extended with custom content or have an icon added to the
+ * text.
+ * 
+ * <p>
+ * This code assumes you're already seen the other simple examples that we
+ * ship with java-gnome, in particular {@link button.ExamplePressMe}.
+ * 
+ * @author Vreixo Formoso
+ * @author Sarah Leibbrand
+ * @since 4.1.3
+ */
+public class ExampleCustomTooltip
+{
+    public static void main(String[] args) {
+        final Window w;
+        final VBox x;
+        final Button b1;
+        final Button b2;
+
+        Gtk.init(args);
+
+        w = new Window();
+        x = new VBox(false, 3);
+
+        /*
+         * Create our Buttons. Each will have a help Tooltip. You can define
+         * the content yourself as shown in b2.
+         */
+
+        b1 = new Button("Exit");
+        b1.connect(new Widget.QueryTooltip() {
+            public boolean onQueryTooltip(Widget source, int x, int y, boolean keyboardMode,
+                    Tooltip tooltip) {
+                // set the tooltip text and icon
+                tooltip.setStockIcon(Stock.ABOUT, IconSize.MENU);
+                tooltip.setMarkup("<b>Exit !</b>");
+
+                // show the tooltip
+                return true;
+            }
+        });
+        x.add(b1);
+
+        b2 = new Button("No-op");
+        b2.connect(new Widget.QueryTooltip() {
+            public boolean onQueryTooltip(Widget source, int x, int y, boolean keyboardMode,
+                    Tooltip tooltip) {
+                // create the content for the tooltip, in this case a grid
+                Grid g = new Grid();
+                g.attach(new Label("This button will not exit the example"), 0, 0, 2, 1);
+                g.attach(new Label("This is a custom tooltip"), 0, 1, 2, 1);
+                g.attach(new Label("That you can extend in any kind of way!"), 0, 2, 1, 1);
+                g.attach(new Image(Stock.EXECUTE, IconSize.MENU), 1, 2, 1, 1);
+
+                // show all of the contents or the tooltip will appear empty!
+                g.showAll();
+
+                // set the content
+                tooltip.setCustomWidget(g);
+
+                // show the tooltip.
+                return true;
+            }
+        });
+        x.add(b2);
+
+        /*
+         * The rest of the file is the same as you've seen in the other basic
+         * examples which ship with java-gnome.
+         */
+
+        b1.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                Gtk.mainQuit();
+            }
+        });
+
+        w.add(x);
+        w.setTitle("Custom Tooltip example");
+        w.setSizeRequest(200, 200);
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/tooltip/ExampleTooltip.java b/doc/examples/tooltip/ExampleTooltip.java
new file mode 100644
index 0000000..304c8be
--- /dev/null
+++ b/doc/examples/tooltip/ExampleTooltip.java
@@ -0,0 +1,91 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008      Vreixo Formoso
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package tooltip;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A simple example showing the usage of Tooltips. Tooltips are little help
+ * messages that are displayed when the use moves the mouse pointer over a
+ * Widget.
+ * 
+ * <p>
+ * This code assumes you're already seen the other simple examples that we
+ * ship with java-gnome, in particular {@link button.ExamplePressMe}.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class ExampleTooltip
+{
+    public static void main(String[] args) {
+        final Window w;
+        final VBox x;
+        final Button b1;
+        final Button b2;
+
+        Gtk.init(args);
+
+        w = new Window();
+        x = new VBox(false, 3);
+
+        /*
+         * Create our Buttons. Each will have a help Tooltip. You can use
+         * Pango markup to format your Tooltips, as b2 demonstrates.
+         */
+
+        b1 = new Button("Exit");
+        b1.setTooltipText("Click this Button to exit");
+        x.add(b1);
+
+        b2 = new Button("No-op");
+        b2.setTooltipMarkup("Clicking this Button has <b>no effect</b>");
+        x.add(b2);
+
+        /*
+         * The rest of the file is the same as you've seen in the other basic
+         * examples which ship with java-gnome.
+         */
+
+        b1.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                Gtk.mainQuit();
+            }
+        });
+
+        w.add(x);
+        w.setTitle("Tooltip example");
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/tooltip/ExampleTreeViewTooltips.java b/doc/examples/tooltip/ExampleTreeViewTooltips.java
new file mode 100644
index 0000000..b02cc0d
--- /dev/null
+++ b/doc/examples/tooltip/ExampleTreeViewTooltips.java
@@ -0,0 +1,190 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package tooltip;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.CellRendererText;
+import org.gnome.gtk.DataColumn;
+import org.gnome.gtk.DataColumnStock;
+import org.gnome.gtk.DataColumnString;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.IconSize;
+import org.gnome.gtk.ListStore;
+import org.gnome.gtk.Stock;
+import org.gnome.gtk.Tooltip;
+import org.gnome.gtk.TreeIter;
+import org.gnome.gtk.TreePath;
+import org.gnome.gtk.TreeView;
+import org.gnome.gtk.TreeViewColumn;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A tutorial example of using a TreeView with a tooltip per row.
+ * 
+ * @author Sarah Leibbrand
+ */
+public class ExampleTreeViewTooltips
+{
+
+    private TreeView view;
+
+    private ListStore model;
+
+    private DataColumnString name;
+
+    private TreeViewColumn vertical;
+
+    private DataColumnStock icon;
+
+    public ExampleTreeViewTooltips() {
+        final Window window;
+
+        window = new Window();
+
+        /*
+         * First we create the TreeView
+         */
+        createTreeView();
+
+        /*
+         * Then we have to connect the QueryTooltip handler to the view so it
+         * can display tooltips.
+         */
+        view.connect(new Widget.QueryTooltip() {
+            public boolean onQueryTooltip(Widget source, int x, int y, boolean keyboardMode,
+                    Tooltip tooltip) {
+                TreeIter iter;
+                TreePath path;
+
+                /*
+                 * first we check whether there is anything to show a tooltip
+                 * for, if not we return false so that there won't be any
+                 * tooltip shown.
+                 */
+                if (!view.hasTooltipContext(x, y, keyboardMode)) {
+                    return false;
+                }
+
+                /*
+                 * Now that we know that there can be a tooltip we retrieve
+                 * the TreeIter so we can work with that to get the data:
+                 */
+                iter = view.getTreeIterFromTooltipContext(x, y, keyboardMode, model);
+
+                /*
+                 * Now we can work with the tooltip and place any content we
+                 * would want in it.
+                 * 
+                 * In this example a simple icon and text.
+                 */
+                tooltip.setMarkup(model.getValue(iter, name));
+                tooltip.setStockIcon(model.getValue(iter, icon), IconSize.MENU);
+
+                /*
+                 * Now that we have setup the tooltip we need to set it the
+                 * row or the cell. so it knows it is for that area. This will
+                 * prevent it from continously trying to repaint the tooltip.
+                 * 
+                 * In this example we will bind it the row.
+                 * 
+                 * But for this we need the TreePath which we can also
+                 * retrieve.
+                 */
+                path = view.getTreePathFromTooltipContext(x, y, keyboardMode);
+                view.setTooltipRow(tooltip, path);
+
+                /*
+                 * Now it is time to show the tooltip by returning true;
+                 */
+                return true;
+            }
+        });
+
+        /*
+         * The rest of this file is the usual minimum wrapper to make this
+         * presentable as a Window on the display.
+         */
+
+        window.add(view);
+
+        window.setTitle("TreeView tooltips");
+        window.showAll();
+
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new ExampleTreeViewTooltips();
+
+        Gtk.main();
+    }
+
+    /*
+     * Create a standard TreeView as shown in another example.
+     */
+    private void createTreeView() {
+        DataColumnString index;
+        CellRendererText renderer;
+        TreeIter row;
+
+        model = new ListStore(new DataColumn[] {
+            name = new DataColumnString(),
+            index = new DataColumnString(),
+            icon = new DataColumnStock()
+        });
+
+        view = new TreeView(model);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Index");
+        renderer = new CellRendererText(vertical);
+        renderer.setText(index);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Name");
+        renderer = new CellRendererText(vertical);
+        renderer.setMarkup(name);
+
+        vertical.setSortColumn(index);
+
+        row = model.appendRow();
+        model.setValue(row, name, "The first row of the table\n<small>(with an edit icon)</small>");
+        model.setValue(row, index, "1.");
+        model.setValue(row, icon, Stock.EDIT);
+
+        row = model.appendRow();
+        model.setValue(row, name, "And now the second row\n<small>(with the apply icon)</small>");
+        model.setValue(row, index, "2.");
+        model.setValue(row, icon, Stock.APPLY);
+
+        row = model.appendRow();
+        model.setValue(row, name,
+                "Last but not least, the final row\n<small>(And the last one to convert)</small>");
+        model.setValue(row, index, "3.");
+        model.setValue(row, icon, Stock.CONVERT);
+    }
+}
diff --git a/doc/examples/treeview/ExampleTrailHeads.java b/doc/examples/treeview/ExampleTrailHeads.java
new file mode 100644
index 0000000..cfd9597
--- /dev/null
+++ b/doc/examples/treeview/ExampleTrailHeads.java
@@ -0,0 +1,231 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package treeview;
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.CellRendererText;
+import org.gnome.gtk.DataColumn;
+import org.gnome.gtk.DataColumnBoolean;
+import org.gnome.gtk.DataColumnInteger;
+import org.gnome.gtk.DataColumnString;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.ListStore;
+import org.gnome.gtk.TreeIter;
+import org.gnome.gtk.TreePath;
+import org.gnome.gtk.TreeView;
+import org.gnome.gtk.TreeViewColumn;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A tutorial example of using a TreeView backed by a ListStore. In this
+ * little demonstration, we list a number of famous hiking trails and how to
+ * get to them.
+ * 
+ * @author Andrew Cowie
+ */
+public class ExampleTrailHeads
+{
+    public ExampleTrailHeads() {
+        final Window window;
+        final TreeView view;
+        final ListStore model;
+        TreeIter row;
+        CellRendererText renderer;
+        TreeViewColumn vertical;
+
+        window = new Window();
+
+        // ------------------------------------------------
+
+        final DataColumnString placeName;
+        final DataColumnString trailHead;
+        final DataColumnString elevationFormatted;
+        final DataColumnInteger elevationSort;
+        final DataColumnBoolean accessibleByTrain;
+
+        /*
+         * So we begin our explorations of the TreeView API here. First thing
+         * is to create a model. You'll notice we declared the variables
+         * above. You don't have to do that, of course, but it makes calling
+         * the ListStore constructor more palatable. More generally, you will
+         * frequently have the DataColumns as instance field variables (so
+         * they can be accessed throughout the file), rather than just local
+         * variables. So you'll end up pre-declaring them regardless, and that
+         * makes the constructor call nice and compact:
+         */
+
+        model = new ListStore(new DataColumn[] {
+            placeName = new DataColumnString(),
+            trailHead = new DataColumnString(),
+            elevationFormatted = new DataColumnString(),
+            elevationSort = new DataColumnInteger(),
+            accessibleByTrain = new DataColumnBoolean()
+        });
+
+        /*
+         * You almost never populate your TreeModels with data statically from
+         * your source code. We have done so here to demonstrate the use of
+         * appendRow() to get a new horizontal data row and then the various
+         * forms of setValue() to store data in that row.
+         * 
+         * In practise, however, you will find the setting of data to be
+         * fairly involved; after all, it takes some trouble to decide what
+         * you want to display, extract if from your domain object layer and
+         * format it prior to insertion into the TreeModel for display by a
+         * TreeView.
+         * 
+         * Notice the use of Pango markup in the placeName column. This can be
+         * a powerful way of improving your information density, but be aware
+         * that if some rows have multiple lines and some don't, the row
+         * height will be inconsistent and will look really ugly. So make sure
+         * they all have the same font information and number of newlines. You
+         * would use utility methods to help keep things organized, of course,
+         * but we've kept it straight forward here.
+         */
+
+        row = model.appendRow();
+        model.setValue(row, placeName, "Blue Mountains national park\n<small>(Six Foot Track)</small>");
+        model.setValue(row, trailHead, "Katoomba, NSW, Australia");
+        model.setValue(row, elevationFormatted, "1015 m");
+        model.setValue(row, elevationSort, 1005);
+        model.setValue(row, accessibleByTrain, true);
+
+        row = model.appendRow();
+        model.setValue(row, placeName, "Kilimanjaro\n<small>(Machame route)</small>");
+        model.setValue(row, trailHead, "Nairobi, Kenya");
+        model.setValue(row, elevationFormatted, "5894 m");
+        model.setValue(row, elevationSort, 5894);
+        model.setValue(row, accessibleByTrain, false);
+
+        row = model.appendRow();
+        model.setValue(row, placeName, "Appalachian Trail\n<small>(roller coaster section)</small>");
+        model.setValue(row, trailHead, "Harpers Ferry, West Virginia, USA");
+        model.setValue(row, elevationFormatted, "147 m");
+        model.setValue(row, elevationSort, 147);
+        model.setValue(row, accessibleByTrain, true);
+
+        /*
+         * Now onto the view side. First we need the top level TreeView which
+         * is the master Widget into which everything else is mixed.
+         */
+
+        view = new TreeView(model);
+
+        /*
+         * Now the vertical display columns. The sequence is to get a
+         * TreeViewColumn, then create the CellRenderer to be put into it, and
+         * then set whatever data mappings are appropriate along with any
+         * settings for the vertical TreeViewColumn. This is the heart of the
+         * TreeView/TreeModel API
+         * 
+         * Note that we reuse the renderer and vertical variables; unlike the
+         * DataColumns, there's no need to keep coming up with unique column
+         * names as you rarely need to reference them later.
+         */
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Place");
+        renderer = new CellRendererText(vertical);
+        renderer.setMarkup(placeName);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Nearest town");
+        renderer = new CellRendererText(vertical);
+        renderer.setText(trailHead);
+        renderer.setAlignment(0.0f, 0.0f);
+        vertical.setExpand(true);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Elevation");
+        renderer = new CellRendererText(vertical);
+        renderer.setText(elevationFormatted);
+        renderer.setAlignment(0.0f, 0.0f);
+
+        /*
+         * Because the elevation is a formatted String, it won't sort
+         * properly. So we use a DataColumnInteger populated with the raw
+         * altitude number to indicate the sort order. (If you don't believe
+         * me, try changing the sort column to elevationFormatted instead of
+         * elevationSort, and you'll see it order as 1015, 147, 5894). As
+         * you'll see from the documentation, setSortColumn() also makes the
+         * headers clickable, which saves you having to mess with TreeView's
+         * setHeadersClickable() or TreeViewColumn's setClickable(), although
+         * there are occasional use cases for them.
+         * 
+         * Then we call emitClicked() to force the header we want things to be
+         * sorted on to actually be active. This is especially necessary if
+         * you've defined sorting for more than one vertical column, but if
+         * you want sorting on from the start, you need to call it.
+         */
+
+        vertical.setSortColumn(elevationSort);
+        vertical.emitClicked();
+
+        /*
+         * And that's it! You've now done everything you need to have a
+         * working TreeView.
+         * 
+         * ... except that if it's for more than information, you probably
+         * want something to happen when someone clicks on a row. So, we hook
+         * up a handler to the TreeView.RowActivated signal. The TreePath it
+         * gives you is the useful bit.
+         */
+
+        view.connect(new TreeView.RowActivated() {
+            public void onRowActivated(TreeView source, TreePath path, TreeViewColumn vertical) {
+                final TreeIter row;
+                final String place, height;
+
+                row = model.getIter(path);
+
+                place = model.getValue(row, trailHead);
+                height = model.getValue(row, elevationFormatted);
+
+                System.out.println("You want to go to " + place + " in order to climb to " + height);
+            }
+        });
+
+        /*
+         * The rest of this file is the usual minimum wrapper to make this
+         * presentable as a Window on the display.
+         */
+
+        // ------------------------------------------------
+        window.add(view);
+
+        window.setTitle("Trail Heads");
+        window.showAll();
+
+        window.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new ExampleTrailHeads();
+
+        Gtk.main();
+    }
+}
diff --git a/doc/examples/unique/ExampleBasicApplication.java b/doc/examples/unique/ExampleBasicApplication.java
new file mode 100644
index 0000000..7340111
--- /dev/null
+++ b/doc/examples/unique/ExampleBasicApplication.java
@@ -0,0 +1,109 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package unique;
+
+import org.gnome.gdk.Event;
+import org.gnome.glib.ApplicationFlags;
+import org.gnome.gtk.Application;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A class that demonstrate how to use the Application system of GLib and GTK.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class ExampleBasicApplication
+{
+    public static void main(String[] args) {
+        final Application a;
+        final Window w;
+        final VBox x;
+        final Label l;
+        final Button b;
+        final int s;
+
+        Gtk.init(args);
+
+        a = new Application("org.gnome.TestGtkApp", ApplicationFlags.NONE);
+
+        w = new Window();
+
+        x = new VBox(false, 3);
+
+        l = new Label("Go ahead:\nMake my day");
+        x.add(l);
+
+        b = new Button("Press me!");
+        x.add(b);
+
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                System.out.println("I was clicked: " + b.getLabel());
+            }
+        });
+
+        w.add(x);
+        w.setTitle("Hello World");
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                /*
+                 * Calling quit() will end the application. This can also be
+                 * done by removing the windows attached to an application
+                 * with removeWindow().
+                 */
+
+                a.quit();
+                return false;
+            }
+        });
+
+        a.connect(new Application.Startup() {
+            public void onStartup(Application source) {
+                /*
+                 * It is very important to link the window to the application
+                 * or the application will stop immediately after begin
+                 * started.
+                 */
+
+                a.addWindow(w);
+            }
+        });
+
+        a.connect(new Application.Activate() {
+            public void onActivate(Application source) {
+                /*
+                 * Present the window to the user.
+                 */
+
+                w.showAll();
+            }
+        });
+
+        s = a.run(args);
+
+        System.exit(s);
+    }
+}
diff --git a/doc/po/es.po b/doc/po/es.po
new file mode 100644
index 0000000..e658d51
--- /dev/null
+++ b/doc/po/es.po
@@ -0,0 +1,39 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: example 0.1\n"
+"PO-Revision-Date: 2008-03-22 17:19+0100\n"
+"Last-Translator: Vreixo Formoso <metalpain2002 at yahoo.es>\n"
+"Language-Team: Español <translation-team-es at lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../ExampleTranslation.java:30
+msgid "Goodbye"
+msgstr "Adiós"
+
+#: ../ExampleTranslation.java:40
+msgid "Hello"
+msgstr "Hola"
+
+#: ../ExampleTranslation.java:45
+#, java-format
+msgid "User name is {0} and home dir is {1}"
+msgstr "El nombre de usuario es {0} y su directorio personal es {1}"
+
+#: ../ExampleTranslation.java:48
+#, java-format
+msgid "This costs {0,number,currency}"
+msgstr "Esto cuesta {0,number,currency}"
+
+#: ../ExampleTranslation.java:49
+#, java-format
+msgid "Today is {0,date,long}"
+msgstr "Hoy es {0,date,long}"
+
+#: ../ExampleTranslation.java:52
+#, java-format
+msgid ""
+"There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}."
+msgstr "{0,choice,0#No hay archivos|1#Hay un archivo|1<Hay {0,number,integer} archivos}."
diff --git a/doc/po/pt.po b/doc/po/pt.po
new file mode 100644
index 0000000..4c05ef7
--- /dev/null
+++ b/doc/po/pt.po
@@ -0,0 +1,41 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: example 0.1\n"
+"PO-Revision-Date: 2008-03-22 17:04+0100\n"
+"Last-Translator: Vreixo Formoso <metalpain2002 at yahoo.es>\n"
+"Language-Team: Portuguese <translation-team-pt at lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../ExampleTranslation.java:30
+msgid "Goodbye"
+msgstr "Adeus"
+
+#: ../ExampleTranslation.java:40
+msgid "Hello"
+msgstr "Olá"
+
+#: ../ExampleTranslation.java:45
+#, java-format
+msgid "User name is {0} and home dir is {1}"
+msgstr "O nome de usuário é {0} e a pasta pessoal é {1}"
+
+#: ../ExampleTranslation.java:48
+#, java-format
+msgid "This costs {0,number,currency}"
+msgstr "Isto custa {0,number,currency}"
+
+#: ../ExampleTranslation.java:49
+#, java-format
+msgid "Today is {0,date,long}"
+msgstr "Hoje é {0,date,long}"
+
+#: ../ExampleTranslation.java:52
+#, java-format
+msgid ""
+"There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}."
+msgstr ""
+"{0,choice,0#Não há arquivos|1#Há um arquivo|1<Há {0,number,integer} "
+"arquivos}."
diff --git a/doc/style/CodeFormat.txt b/doc/style/CodeFormat.txt
new file mode 100644
index 0000000..470fd2c
--- /dev/null
+++ b/doc/style/CodeFormat.txt
@@ -0,0 +1,85 @@
+Style guide: Source Code
+
+Code Formatting
+===============
+
+The code formatting tools available in modern IDEs are nothing short of
+miraculous.
+
+Eclipse in particular has an outstanding code formatter that is highly
+configurable. This encourages people to tinker and have their code be just the
+way they like it. That's a Good Thing (tm), but it plays havoc when it comes
+time to create diffs as patches to commit to the version control system. So we
+need to share a code format convention.
+
+Java conventions, mostly
+------------------------
+
+We ended up adopting what Eclipse termed the "Java conventions [builtin]",
+with four modifications. Notably, this default Java style is set to convert
+tabs to 4 spaces. I personally prefer `\t` characters, but it makes a mess
+when looking at diffs or raw files because the terminal expands tabs to 8. So
+I'll buy this one -- better that your code looks correct at all times.
+
+The modifications are:
+
+ * The opening brace on a Class statement is on its own line, not on the same
+   line as the declaration. This is largely to provide some visual
+   distinctness to the nested interfaces that contain our signal handler
+   callbacks. Otherwise, they look too much like methods and it's very
+   confusing to read.
+
+ * The code width is 105 characters. The default of 80 causes so much wrapping
+   to render it unreadable - especially in things like the Constant Object
+   declarations in Enums and Flags.
+
+ * Comment with is 78 characters. The default of 80 would be fine, except that
+   when you view the changes to a file with the version control tool's diff
+   command, the `+` and `-` character push the line out past the to the 80
+   character mark, and that's no good in the standard 80 character wide
+   terminal where you ran the command in the first place.
+
+ * empty methods have both braces on the same line. We've got quite a number
+   of private constructors which are empty and just serve to prevent the class
+   showing up as an option when doing `new G`**<COMPLETE>**. An empty method
+   with a blank line in it appears to the eye to be unfinished, and so we want
+   to avoid that distraction.
+
+
+Your patches have a much better chance of being accepted if they produce clean
+diffs, and that's more likely to happen if you stick to these rules. If you're
+using Eclipse, you will find "**The java-gnome Style**" pre-configured in the
+.settings/ directory. Just hitting Format should do the trick.
+
+(Come on Sun boys and girls! Make me believe that NetBeans is better...)
+
+Coding standards
+================
+
+TODO: coding practises. Not really too much to talk about here.
+
+AfC
+
+_Originally written by Andrew Cowie 27 Nov 06. Last modified 9 Dec 06._
+
+<!--
+ 
+  Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/style/CommitMessages.txt b/doc/style/CommitMessages.txt
new file mode 100644
index 0000000..77ada5c
--- /dev/null
+++ b/doc/style/CommitMessages.txt
@@ -0,0 +1,147 @@
+Style guide: Commit Messages
+
+It might seem a bit anal to ask people to follow certain conventions when
+writing their commit messages, but reading code history is a big part of
+debugging, and its a lot easier when things are consistent. So, please keep
+the following in mind:
+
+Complete ideas preferred over one-liners
+----------------------------------------
+
+I'd prefer patches that are complete and comprehensive; one liner bug fixes
+are fine when necessary (ie, if that's all it is) but if, say, you're adding
+support for a new distro to the top level configure script, commit it as one
+complete patch rather than 5 small ones.
+
+Of course at slightly larger levels of aggregation, series of patches chain
+together, and that's what branches are for. It's tempting to try and ensure
+that the eventual `bzr viz` graph looks pretty, but don't worry about it.
+Branches are ultimately just a mechanism for shipping code around between
+developers and we end up doing merges several times a day. I'm not really that
+concerned about what the eventual branch tree ends up looking like, so just
+concentrate on doing your work and we'll let Bazaar take care of things
+from there.
+
+Summary line and revision text
+------------------------------
+
+Bazaar, like all other modern VCS tools, uses the first line of the commit
+message as the summary which appears in email Subject: lines, the `--line`
+output to `bzr log`, etc. So a descriptive yet concise first line is
+important.
+
+For really trivial fixes, that single line as patch name is sufficient; but
+for more comprehensive patches please add a long comment (ie the subject line
+_plus_ some prose describing what you're up to. It doesn't have to be perfect.
+
+Put a single blank line between your summary line and the paragraphs you write
+as the main descriptive text of the revision comment.
+
+Remember that years from now someone will do `bzr log filename` and all the
+revisions which affected that one file will show. So if you can, try to keep
+commits on-topic; you don't have to mention every last little change but try
+your best to summarize the impact on major files if they're somewhat
+tangential to the main thrust of the rest of the commit.
+
+Max message width 70 characters!
+--------------------------------
+
+One problem with standard text editor is that they word wrap at a default of
+the normal terminal width, 80 characters. This is a problem when viewing
+commit messages because VCS tools typically indent the message by a few
+whitespace characters, resulting in insanely ugly wrapping when viewing commit
+logs in a terminal window.
+
+Therefore, **lines in commit messages must be no longer than 70 characters**.
+
+I forgot once and it looks stupid: see `bzr log --short -r 14`. Too late now.
+But to prevent this from happening again, try and ensure your editor knows
+about the width limit. Vim users can put the following fragment in their
+`.vimrc`:
+
+    if expand("%:t") =~ "^bzr_log*"
+        set textwidth=70
+        set filetype=none
+        syn match commitComment "^#.*"
+        hi link commitComment Comment
+    endif
+
+While you're at it, you might want
+
+    if expand("%:e") == "java"
+         set nowrap
+         set ts=4
+    endif
+
+to make sure a casual edit of a Java source file doesn't mess it up.
+
+<a name="id"></a>
+
+Set your user id!
+=================
+
+Keeping the integrity of the author history is important so that you get
+credit for your work. When you make a commit and subsequently send it to us in
+a bundle, we (and the rest of the world) sees who the author of each commit
+was. That's terrific, but we do want to keep it professional for both
+aesthetic and legal reasons. So, one thing that we require is that the name
+and email address of the author be properly set. One of the following will
+take care of it:
+
+### `bzr`'s global configuration file
+
+If you put
+
+    [DEFAULT]
+    email = George Jones <grjones at example.com>
+
+in the `~/.bazaar/bazaar.conf` file, it will be set for all branches and you
+won't have to think about it ever again.
+
+### `bzr whoami`
+
+Or you can run the `bzr whoami` command as follows:
+
+    $ bzr whoami 'George Jones <grjones at example.com>'
+
+Don't forget the single quote to escape those angle brackets!
+
+### Environment variable
+
+Or, you can use the `BZR_EMAIL` environment variable:
+
+    $ export BZR_EMAIL='George Jones <grjones at example.com>'
+
+Whichever you choose, please take the time to do this properly. It will ensure
+that the patch you send is properly attributed and that you will retain the
+full credit you deserve for your contribution. Patches that are not properly
+identified will not be accepted.
+
+And if you try to tell me that your name is George Jones and that you work at
+example.com, I **will** hit you with a large mallet. `:)`
+
+AfC
+
+_Originally written by Andrew Cowie 2 Dec 06. Last modified 23 Apr 08._
+
+<!--
+ 
+  Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/style/Documentation.txt b/doc/style/Documentation.txt
new file mode 100644
index 0000000..0547edb
--- /dev/null
+++ b/doc/style/Documentation.txt
@@ -0,0 +1,128 @@
+Style guide: Documentation
+
+Text files
+==========
+
+Documentation such as design documents and files like this one are almost
+always viewed in terminals using pagers like `less`. It does no one any good
+if the paragraphs run off into the netherworld off the right of the screen
+somewhere.
+
+Therefore, all textual documentation should be word wrapped at 78 characters,
+the same as for JavaDoc comments. If you look at the bottom of this file,
+you'll see a vim modeline which will takes care of it for this file.
+
+The exception, of course, is source code fragments. If they run on past the 78
+character mark, then so be it it.
+
+JavaDoc
+=======
+
+Don't bother putting class names in `<code>` spans. You'd never get anything
+done.
+
+There's no reason to `@link` ever single class name either. JavaDoc is
+already full of cross references. Only put a `@link` tag in when you really
+think that someone should follow the link to the doc snippet you're pointing
+at.
+
+Getters and setters are a bit obvious. If the single sentence you write for
+`getLabel()` is "Get the text of the Label on the Button" and the method
+returns String, then there's not much need to put a `@returns` clause in. If
+unusual things happen in parameters or return values (for example `null` is an
+acceptable argument, or a return of `-1` indicates success) then definitely
+explain it in a `@param` or `@return` clause!
+
+Please take the trouble to write out a bit of supplementary text for a link so
+that you positively control what text appears. Otherwise you can end up with
+fully qualified class names and all sorts of other ugliness which distract
+from the flow of the paragraph. For example, if you just do:
+
+    /**
+     * For more details, see {@link org.gnome.gtk.Button#setLabel(java.lang.String)}.
+     */
+
+You end up with "For more details, see
+<u>org.gnome.gtk.Button.setLabel(java.gnome.String)</u>." Bleh! So try adding
+a bit of extra text to make it more natural:
+
+    /**
+     * For more details, see Button's {@link org.gnome.gtk.Button#setLabel(java.lang.String) setLabel()}.
+     */
+
+This will render as "For more details, see Button's <u>setLabel()</u>." Much
+better.
+
+As a matter of consistency, if you are referring to a static method, say:
+
+    Gtk.init()
+    
+but to talk about an instance method, use the possessive, eg:
+
+    Button's setLabel()
+
+Obviously the whole point of java-gnome is to wrap GTK and the other GNOME
+libraries. Unfortunately, however the doxygen documentation for GLib, GTK and
+friends, while extensive, is _quite_ inappropriate for someone brand-new to
+GTK or {Linux,Solaris}. Therefore, in order to achieve the criterion of
+**Approachability** that we defined as our primary goal, considerable
+massaging and indeed complete rewriting is necessary. Use a friendly, casual,
+and colloquial style... and don't forget an example snippet! Methods like
+Widget's [`show()`][show], the entire [Button][button] class, and the signal
+[`Window.DeleteEvent`][delete] are all good examples.
+
+[show]: /4.0/doc/api/org/gnome/gtk/Widget.html#show()
+[button]: /4.0/doc/api/org/gnome/gtk/Button.html
+[delete]: /4.0/doc/api/org/gnome/gtk/Window.DeleteEvent.html
+
+Finally, where it is appropriate to discuss how our implementation varies from
+conventional GTK practise, use a paragraph all in _italics_ at the end of the
+class's JavaDoc to explain the divergence or how java-gnome is implemented.
+The comment at the top of org.gnome.glib.Object is a pretty good example of
+this. But other than these rare observations, don't refer to the translation,
+native, JNI layers or the native library [call] itself at all! Whenever
+possible, we want the implementation details of java-gnome to be invisible.
+They're not `public` after all!
+
+Spelling
+========
+
+And for super bonus points, run a spellchecker over any documentation you
+contribute. Yes, on code too!
+
+We use `LANG=en_CA` around here, but **don't worry if your written English
+isn't very strong** or if you speak American. What matters is that you're
+contributing and a native English speaker like myself will be more than happy
+to fix it up.
+
+An aspell word list is included at the top of a checkout in the file
+`.aspell.en.pws` containing all the custom usages from both documentation
+_and_ Java source code. To use it to spell check `Button.java`, for example,
+try:
+
+    $ cd src/java/org/gnome/gtk
+    $ aspell -x -p `bzr root`/.aspell.en.pws -c Button.java
+
+_Originally written by Andrew Cowie 2 Dec 06. Last modified 2 Jan 09._
+
+<!--
+ 
+  Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/doc/style/MARKUP b/doc/style/MARKUP
new file mode 100644
index 0000000..a7cca47
--- /dev/null
+++ b/doc/style/MARKUP
@@ -0,0 +1,121 @@
+MARKUP
+
+About the format of these documents
+-----------------------------------
+
+As a matter of sound practise, all our documentation is done in text files so
+that a developer can easily read them while browsing the code or working on
+their own projects. When writing our documents, however, we _**lightly**_ mark
+them up with the syntax of John Gruber's "[Markdown][syntax]" so that they
+also present nicely as web pages on our [website][].
+
+Syntax overview
+---------------
+
+In brief, the Markdown works like this: you just write text! Then,
+occasionally, you punctuate things in the way Markdown recognizes, and you get
+the markup you need.
+
+The biggest problem with text documents is that in both spoken and written
+communications we use emphasis but the medium of the traditional terminal and
+Unix command line aren't up to it. So from the early days of Usenet (and long,
+long before wikis), people developed the habit of using extra punctuation
+characters to express themselves: 
+
+    I have a compulsive need to use _italics_ and **bold** in my writing
+
+results in "I have a compulsive need to use _italics_ and **bold** in my
+writing".
+
+To mark program names, file names, variables, etc in a constant width font you
+simply use backticks:
+
+    `filename`
+
+which puts the `filename` in a `<code>` span.
+
+If you write
+
+    Heading
+    -------
+
+you get an `<H2>` heading. Using `===` (which is visually a bit stronger)
+creates an `<H1>` heading, which makes sense and looks awesome in text.
+
+To do code snippets we use:
+
+    <TAB>Mark a section as being a preformatted
+    <TAB>code block, ignoring any _markup_ present.
+    <TAB>
+
+As you would expect, the result is a preformatted block like this:
+
+    Mark a section as being a preformatted
+    code block, ignoring any _markup_ present.
+
+This works with either a `<TAB>` or `4 spaces` as the indent character. We used
+to use two tabs to create the appearance of indent from the left margin so it
+would look better when doing code snippets, but now we just use CSS to put some
+`margin` and `padding` around `PRE` blocks.
+
+Note that Markdown is actually quite a bit richer than this. It has all kinds
+of conveniences such as an easy and natural link (href) syntax, bullet lists
+and ordered lists, images, everything you need. It does The Right Thing (tm)
+when you'd expect it to, and doesn't bother you about strictness -- it just
+lets you get on with writing what looks like a nice readable text file.
+
+Check it out!
+
+Download
+--------
+
+John Gruber's [original Markdown is a Perl program][perl] intended for blogs
+and wikis; Michel Fortin [ported Markdown to PHP][php]. We use the latter
+version to render our documentation as HTML, working off the latest documents
+as checked into the mainline branch of the source code.
+
+Convenient rendering
+--------------------
+
+One way you can quickly look at the result of your markup is to create a simple
+script in a virtual host on your local web server and have it call markdown on
+the file you're working on. In PHP it is as simple as:
+
+        include_once "markdown.php";
+
+        $text = file_get_contents("README");
+        echo Markdown($text);
+
+An example is included in the source code as [`view.php`][view].
+
+[view]: http://research.operationaldynamics.com/bzr/java-gnome/mainline/web/local/view.php
+
+
+_Last modified 14 Aug 07_
+
+[syntax]: http://daringfireball.net/projects/markdown/basics
+[website]: http://java-gnome.sourceforge.net/docs/design/
+[perl]: http://daringfireball.net/projects/markdown/
+[php]: http://www.michelf.com/projects/php-markdown/
+
+<!--
+ 
+  Copyright © 2006 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/java-gnome.doap b/java-gnome.doap
new file mode 100644
index 0000000..f8bf722
--- /dev/null
+++ b/java-gnome.doap
@@ -0,0 +1,24 @@
+<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+         xmlns:foaf="http://xmlns.com/foaf/0.1/"
+         xmlns:gnome="http://api.gnome.org/doap-extensions#"
+         xmlns="http://usefulinc.com/ns/doap#">
+
+  <name xml:lang="en">java-gnome</name>
+  <shortdesc xml:lang="en">Java bindings for the GTK widget toolkit and for the rich family of libraries making up the GNOME desktop</shortdesc>
+  <description>The official Java bindings for GTK and GNOME. They feature robust engineering design, completely generated internals, a lovingly crafted layer presenting the public API. Developers can use java-gnome to develop sophisticated user interfaces for Linux applications so that they richly integrate with the GNOME Desktop while leveraging their expertise with the Java language.</description>
+  <homepage rdf:resource="http://java-gnome.sourceforge.net/" />
+  <mailing-list rdf:resource="https://lists.sourceforge.net/lists/listinfo/java-gnome-hackers" />
+  <download-page rdf:resource="http://download.gnome.org/sources/java-gnome/" />
+  <bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=java-gnome" />
+
+  <category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
+
+  <maintainer>
+    <foaf:Person>
+      <foaf:name>Andrew Cowie</foaf:name>
+      <foaf:mbox rdf:resource="mailto:andrew at operationaldynamics.com" />
+      <gnome:userid>afcowie</gnome:userid>
+    </foaf:Person>
+  </maintainer>
+</Project>
diff --git a/src/bindings/java-gnome_Icon.png b/src/bindings/java-gnome_Icon.png
new file mode 100644
index 0000000..a916a29
Binary files /dev/null and b/src/bindings/java-gnome_Icon.png differ
diff --git a/src/bindings/org/freedesktop/bindings/BlacklistedMethodError.java b/src/bindings/org/freedesktop/bindings/BlacklistedMethodError.java
new file mode 100644
index 0000000..516b423
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/BlacklistedMethodError.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * Thrown by a generated method which is actually (dangerously) incomplete due
+ * to the fact that information about one or more native types was lacking
+ * when the bindings were generated. This Error is made visible as a last
+ * ditch programatic measure to draw attention to the fact that this method
+ * cannot be called; hopefully the {@link FIXME} in the method signature would
+ * catch your attention first. This represents a wonderful opportunity for you
+ * to contribtue to the java-gnome bindings.
+ * 
+ * <p>
+ * hackers: don't even <b>think</b> about exposing a method that throws this
+ * in java-gnome's public API.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public final class BlacklistedMethodError extends Error
+{
+    private static final long serialVersionUID = 1L;
+
+    public BlacklistedMethodError(String gType) {
+        super("\nNo information about " + gType);
+    }
+
+}
diff --git a/src/bindings/org/freedesktop/bindings/Constant.java b/src/bindings/org/freedesktop/bindings/Constant.java
new file mode 100644
index 0000000..2cf0e96
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Constant.java
@@ -0,0 +1,107 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * Representation of enumerated constants. Enums are very fundamental in most
+ * libraries but are ordinal integers handled by the compiler as constants;
+ * they are <i>not</i> passed around by pointer. For that, we have the
+ * {@link Proxy} class.
+ * 
+ * <p>
+ * Note that this has nothing to do with the <code>enum</code> mechanism
+ * introduced in Java 1.5.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+/*
+ * Note for GLib based libraries: these are our representation of integer
+ * constants and are not org.gnome.glib.Values instances. So for the case of a
+ * GValue containing an G_TYPE_ENUM, we have extract it from the Value; see
+ * getEnum() in org.gnome.glib.GValue
+ */
+public abstract class Constant
+{
+
+    /*
+     * This is package visible so that Plumbing can see it, and final so that
+     * only the constructor here can set it.
+     */
+    final int ordinal;
+
+    /**
+     * A text version of the name of the constant representing this enum. This
+     * is mostly registered so that if the developer has need to output
+     * <i>which</i> particular constant they are using while debugging, they
+     * can do so.
+     * 
+     * <p>
+     * The pattern of passing a name up when constructing constants as an
+     * explicit debugging measure is inspired by "Constant Objects" in Robert
+     * Simmons, Jr's <i>Hardcore Java<i> (O'Reilly, 2004), page 170.
+     */
+    /*
+     * In GTK, enums are frequently registered as <code>GEnumValues</code>
+     * with <code>g_enum_register_static()</code>. This, however, is not done
+     * consistently, and cannot be relied upon.
+     */
+    final String nickname;
+
+    /**
+     * The order is ordinal, nickname so that the code completion comes first
+     * and copying the name of the constant to the nickname becomes a trivial
+     * exercise, as opposed to having to figure out what the nickname should
+     * be before you've completed from the generated code.
+     */
+    protected Constant(int ordinal, String nickname) {
+        this.ordinal = ordinal;
+        this.nickname = nickname;
+
+        Plumbing.registerConstant(this);
+    }
+
+    /**
+     * Return the name of the Constant class and the name of the constant
+     * itself. For example,
+     * 
+     * <pre>
+     * WindowType.POPUP
+     * </pre>
+     * 
+     * @since 4.0.1
+     */
+    public String toString() {
+        return this.getClass().getSimpleName() + "." + nickname;
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Debug.java b/src/bindings/org/freedesktop/bindings/Debug.java
new file mode 100644
index 0000000..fc1e9d6
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Debug.java
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+package org.freedesktop.bindings;
+
+/**
+ * Conditionally control internal aspects of the java-gnome libraries. Much as
+ * conditional compilation is frowned upon, sometimes you have to switch
+ * things on or off. <b>This is not for ./configure time selection of
+ * features!</b>
+ * 
+ * <p>
+ * You use these as follows:
+ * 
+ * <pre>
+ * if (Debug.WALK) {
+ *     // on the wild side
+ * }
+ * </pre>
+ * 
+ * Remember that you <b>must</b> <code>make clean</code> and rebuild the
+ * <i>entire</i> project if you change any value in here, otherwise classes
+ * that are already compiled with these constants will not be affected.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.2
+ */
+public final class Debug
+{
+    private Debug() {}
+
+    /**
+     * Do you want debug output every time a Proxy object is finalized?
+     */
+    /*
+     * FIXME for the moment, this has no effect on the JNI side. It would be
+     * much better if we could turn this into a compile time constant in a
+     * header file. For now, the twin of this is in bindings_java.h
+     */
+    public static final boolean MEMORY_MANAGEMENT = false;
+}
diff --git a/src/bindings/org/freedesktop/bindings/DoubleConstant.java b/src/bindings/org/freedesktop/bindings/DoubleConstant.java
new file mode 100644
index 0000000..c0d25f1
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/DoubleConstant.java
@@ -0,0 +1,61 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * Internal base class which is the parent of strongly typed constants that
+ * are of type <code>double</code>.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ * @see Constant
+ */
+/*
+ * This is, obviously, a clone of the Constant class. Extract the value this
+ * class wraps using Plumbing.numOf()
+ */
+public abstract class DoubleConstant
+{
+    final double value;
+
+    final String nickname;
+
+    protected DoubleConstant(double value, String nickname) {
+        this.value = value;
+        this.nickname = nickname;
+    }
+
+    public String toString() {
+        return this.getClass().getSimpleName() + "." + nickname;
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Environment.c b/src/bindings/org/freedesktop/bindings/Environment.c
new file mode 100644
index 0000000..f960f12
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Environment.c
@@ -0,0 +1,186 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "bindings_java.h"
+#include "org_freedesktop_bindings_Environment.h"
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Environment.getenv(String variableName)
+ */
+JNIEXPORT jobject JNICALL
+Java_org_freedesktop_bindings_Environment_getenv
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _name
+)
+{
+	const gchar* name;
+	gchar* result;
+
+	// convert parameter name
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return NULL; /* OutOfMemoryError already thrown */
+	}
+
+	// call function
+	result = (gchar*) g_getenv(name);
+
+	// clean up name
+	bindings_java_releaseString(name);
+
+	// and return	
+	return bindings_java_newString(env, result);
+}
+
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Environment.setenv(String variableName, String value)
+ */
+JNIEXPORT void  JNICALL
+Java_org_freedesktop_bindings_Environment_setenv
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _name,
+	jstring _value
+)
+{
+	const gchar* name;
+	const gchar* value;
+
+	// convert parameter name
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return; /* OutOfMemoryError already thrown */
+	}
+
+	// convert parameter value
+	value =  bindings_java_getString(env, _value);
+	if (value == NULL) {
+		return; /* OutOfMemoryError already thrown */
+	}
+
+	// call function
+	if (g_setenv(name, value, 1) == -1) {
+		bindings_java_throw(env, "\nsetenv() failed: Insufficient space in environment");
+	}
+	
+	// clean up name
+	bindings_java_releaseString(name);
+
+	// clean up name
+	bindings_java_releaseString(value);
+}
+
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Environment.unsetenv(String variableName)
+ */
+JNIEXPORT void  JNICALL
+Java_org_freedesktop_bindings_Environment_unsetenv
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _name
+)
+{
+	const gchar* name;
+
+	// convert parameter name
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return; /* OutOfMemoryError already thrown */
+	}
+
+	// call function
+	g_unsetenv(name);
+
+	// clean up name
+	bindings_java_releaseString(name);
+}
+
+
+
+
+/*
+ * Will implement
+ *   org.freedesktop.bindings.Environment.getWidth()
+ */
+JNIEXPORT jint JNICALL
+Java_org_freedesktop_bindings_Environment_getWidth
+(
+	JNIEnv *env,
+	jclass cls
+)
+{
+	// TODO how can we do this?
+	return (jint) 0;
+}
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Environment.getpid()
+ */
+JNIEXPORT jint JNICALL
+Java_org_freedesktop_bindings_Environment_getpid
+(
+	JNIEnv *env,
+	jclass cls
+)
+{
+	return getpid();
+}
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Environment.isatty(int fd)
+ */
+JNIEXPORT jint JNICALL
+Java_org_freedesktop_bindings_Environment_isatty
+(
+        JNIEnv *env,
+        jclass cls,
+        jint _fd
+)
+{
+        return isatty(_fd);
+}
diff --git a/src/bindings/org/freedesktop/bindings/Environment.java b/src/bindings/org/freedesktop/bindings/Environment.java
new file mode 100644
index 0000000..6f674fd
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Environment.java
@@ -0,0 +1,151 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2005-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * Retrieve values from environment.
+ * 
+ * @author Andrew Cowie
+ * @author Michael Culbertson
+ * @since 4.0.2
+ */
+public class Environment
+{
+    /**
+     * Get an environment variable from the inherited (Linux or Unix)
+     * environment. This is here because the {@link System#getenv(String)}
+     * call was deprecated for a while and later threw Error in several JDKs
+     * [so much for ABI stability, the bastards]. So we reimplement the same
+     * thing with our own JNI call.
+     * 
+     * @param variableName
+     *            the name of the environment variable you want to look up
+     * @return the value of the environment variable, or <code>null</code> if
+     *         empty or not found.
+     * @since 4.0.2
+     */
+    public static String getEnv(final String variableName) {
+        String candidate;
+
+        if ((variableName == null) || (variableName.equals(""))) {
+            throw new IllegalArgumentException("Can't get an empty or null environment variable");
+        }
+
+        try {
+            candidate = Environment.getenv(variableName);
+        } catch (UnsatisfiedLinkError ule) {
+            /*
+             * Fallback for the rare but legitimate cases when this is being
+             * called before Gtk.init(). Of course, given the original premise
+             * of this method being here this too might fail, but as of Sun
+             * Java 1.5 it was working again, so give it a shot.
+             */
+            candidate = System.getenv(variableName);
+        }
+
+        if ((candidate == null) || (candidate.equals(""))) {
+            return null;
+        } else {
+            return candidate;
+        }
+    }
+
+    private static native final String getenv(String variableName);
+
+    /**
+     * Set a value in the environment. See {@link #getEnv(String) getEnv()}
+     * for further details.
+     * 
+     * <p>
+     * If a value of <code>null</code> is passed as the <code>value</code>,
+     * then that variable will be <b>deleted</b> from the environment.
+     * 
+     * @since 4.0.7
+     */
+    public static void setEnv(String variableName, String value) {
+        if ((variableName == null) || (variableName.equals(""))) {
+            throw new IllegalArgumentException("Can't set an empty or null environment variable");
+        }
+
+        if (value == null) {
+            unsetenv(variableName);
+        } else {
+            setenv(variableName, value);
+        }
+    }
+
+    private static native final void setenv(String variableName, String value);
+
+    private static native final void unsetenv(String variableName);
+
+    /**
+     * Get the system PID of this program. This is useful for forming
+     * temporary filenames.
+     * 
+     * @since 4.0.18
+     */
+    /*
+     * Got tired of Java not providing this
+     */
+    public static int getProcessID() {
+        return getpid();
+    }
+
+    private static native final int getpid();
+
+    /**
+     * Is this program running in a terminal or was it launched by the user
+     * from the desktop? If it was launched from the GNOME system menu or by
+     * Nautilus then this will return <code>false</code>.
+     * 
+     * <p>
+     * <i>This calls</i> <code>isatty()</code> <i>on the file descriptor for
+     * stdin, so obviously if you've closed</i> <code>System.in</code> <i>this
+     * will return false regardless.</i>
+     * 
+     * @since 4.0.19
+     */
+    public static boolean isTTY() {
+        final int result;
+
+        result = isatty(0);
+
+        if (result == 1) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private static native final int isatty(int fd);
+}
diff --git a/src/bindings/org/freedesktop/bindings/FIXME.java b/src/bindings/org/freedesktop/bindings/FIXME.java
new file mode 100644
index 0000000..7d23729
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/FIXME.java
@@ -0,0 +1,56 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * A type for which we had no data at bindings generation time! In order to
+ * fix this, you will need to either
+ * <ol>
+ * <li>Add an appropriate (define...) block to define the type in a new .defs
+ * file
+ * <li>Add a hardcoded type in Thing's <code>static {}</code> block (probably
+ * a FundamentalThing), or
+ * <li>worst case, you will have to improve the architecture of java-gnome as
+ * a whole to deal with the situation represented by this parameter or return
+ * type.
+ * </ol>
+ * This is marked as a public type, but clearly this is an artifact of the
+ * code generation process and is not for developer consumption.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public final class FIXME
+{
+    private FIXME() {}
+}
diff --git a/src/bindings/org/freedesktop/bindings/FatalError.java b/src/bindings/org/freedesktop/bindings/FatalError.java
new file mode 100644
index 0000000..ddf46d6
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/FatalError.java
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * A general error. These are thrown when an unexpected state is encountered
+ * in the process of binding an underlying native library, and are intended to
+ * be fatal. We throw a Java Error this in hopes of getting a stack trace
+ * rather than the segmentation fault that will inevitably occur if execution
+ * goes much further. Sometimes we even get it right.
+ * 
+ * <p>
+ * In most cases these are instantiated by java-gnome's internal native code
+ * and thrown from there.
+ * 
+ * <p>
+ * See {@link org.gnome.glib.FatalError} for the Throwable emitted when
+ * "critical" and other fatal problems occur within GLib, GTK, and the other
+ * GNOME libraries.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class FatalError extends java.lang.Error
+{
+    private static final long serialVersionUID = 1;
+
+    protected FatalError() {
+        super();
+    }
+
+    protected FatalError(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Flag.java b/src/bindings/org/freedesktop/bindings/Flag.java
new file mode 100644
index 0000000..3408d78
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Flag.java
@@ -0,0 +1,108 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * Representation of an enum that is used to bit-pack option flags. A flag is
+ * a Constant that can be bitwise OR'd with another flag of the same type
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * The presence of bitwise operations here is of some concern; given the
+ * contract we have established to treat binary data from the native side as
+ * opaque, I am not convinced that these instructions are safe. Vreixo has
+ * contributed unit tests establishing some confidence, so we will keep it for
+ * now. Move to JNI calls if any byte order problems are encountered.
+ */
+public abstract class Flag extends Constant
+{
+
+    protected Flag(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Helper method to enable the implementation of or() in subclasses.
+     */
+    protected final static Flag orTwoFlags(Flag a, Flag b) {
+        if (a.getClass() != b.getClass()) {
+            throw new IllegalArgumentException(
+                    "Both arguments need to be an instances of the same concrete Flags class");
+        }
+
+        return Plumbing.flagFor(a.getClass(), a.ordinal | b.ordinal);
+    }
+
+    /**
+     * Utility function to determine whether a Flags instance has the bit
+     * embodied by <code>setting</code> set. An example of this in action is:
+     * 
+     * <pre>
+     * WindowState s;
+     * ...
+     *     
+     * if (s.contains(WindowState.STICKY)) {
+     *     // get a cloth to clean up the mess
+     * }
+     * </pre>
+     * 
+     * You can only use this on instances of the same class!
+     */
+    public final boolean contains(Flag setting) {
+        if (this.getClass() != setting.getClass()) {
+            throw new IllegalArgumentException("Argument needs to be an instance of " + this.getClass());
+        }
+
+        return (this.ordinal & setting.ordinal) != 0;
+    }
+
+    protected final static Flag andTwoFlags(Flag a, Flag b) {
+        if (a.getClass() != b.getClass()) {
+            throw new IllegalArgumentException(
+                    "Both arguments need to be an instances of the same concrete Flags class");
+        }
+
+        return Plumbing.flagFor(a.getClass(), a.ordinal & b.ordinal);
+    }
+
+    /**
+     * Remove b from a
+     */
+    protected final static Flag maskTwoFlags(Flag a, Flag b) {
+        return Plumbing.flagFor(a.getClass(), a.ordinal & (a.ordinal ^ b.ordinal));
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Internationalization.c b/src/bindings/org/freedesktop/bindings/Internationalization.c
new file mode 100644
index 0000000..2148633
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Internationalization.c
@@ -0,0 +1,188 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <libintl.h>
+#include <locale.h>
+#include <jni.h>
+#include "bindings_java.h"
+#include "org_freedesktop_bindings_Internationalization.h"
+
+/**
+ * Implements
+ *   org.freedesktop.bindings.Internationalization.gettext(String msg)
+ * called from
+ *   org.freedesktop.bindings.Internationalization._(String msg, java.lang.Object ...parameters)
+ */
+JNIEXPORT jstring JNICALL
+Java_org_freedesktop_bindings_Internationalization_gettext
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _msg
+)
+{	
+	const char* msg;
+	char* result;
+
+	// convert parameter msg
+	msg = bindings_java_getString(env, _msg);
+	if (msg == NULL) {
+		return NULL; // expeption already thrown
+	}
+
+	// call function
+	result = gettext(msg);
+
+	/*
+	 * If there was no translation, so just return the input String, This
+	 * avoids corrupting the statically allocated char* returned by
+	 * gettext().
+	 *
+	 * If there is a translation, allocate a new String for it, and
+	 * return it.
+	 */
+
+	// convert and return
+	if (result == msg) {
+		bindings_java_releaseString(msg);
+		return _msg;
+	} else {
+		bindings_java_releaseString(msg);
+		return bindings_java_newString(env, result);
+	}
+}
+
+/**
+ * Implements
+ *   org.freedesktop.bindings.Internationalization.dgettext(String domain, String name)
+ * called from
+ *   org.freedesktop.bindings.Internationalization._country(String name)
+ * and
+ *   org.freedesktop.bindings.Internationalization._language(String name)
+ */
+JNIEXPORT jstring JNICALL
+Java_org_freedesktop_bindings_Internationalization_dgettext
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _domain,
+	jstring _name
+)
+{	
+	const char* domain;
+	const char* name;
+	char* result;
+
+	// convert parameter name
+	domain = bindings_java_getString(env, _domain);
+	if (domain == NULL) {
+		return NULL; // expeption already thrown
+	}
+
+	// convert parameter name
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return NULL; // expeption already thrown
+	}
+
+	// call function
+	result = dgettext(domain, name);
+
+	/*
+	 * See comment in gettext() above
+	 */
+
+	// convert and return
+	if (result == name) {
+		bindings_java_releaseString(name);
+		return _name;
+	} else {
+		bindings_java_releaseString(name);
+		return bindings_java_newString(env, result);
+	}
+}
+
+JNIEXPORT void JNICALL
+Java_org_freedesktop_bindings_Internationalization_bindtextdomain
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _packageName,
+	jstring _localeDir
+)
+{
+	const char* packageName;
+	const char* localeDir;
+
+	// convert parameter packageName
+	packageName = bindings_java_getString(env, _packageName);
+	if (packageName == NULL) {
+		return; // expeption already throw
+	}
+
+	// convert parameter localeDir
+	localeDir = bindings_java_getString(env, _localeDir);
+	if (localeDir == NULL) {
+		return; // expeption already throw
+	}
+
+	/*
+	 * Initialize internationalization and localization libraries. The
+	 * second argument to setlocale() being "" means to pull settings
+	 * from the environment.
+	 */
+
+	if (setlocale(LC_ALL, "") == NULL) {
+		bindings_java_throw(env, "\nCall to setlocale() to initialize the program's locale failed");
+		return;
+	}
+	if (bindtextdomain(packageName, localeDir) == NULL) {
+		bindings_java_throw(env, "\nCall to bindtextdomain() to set the locale base dir failed");
+		return;
+	}
+	if (bind_textdomain_codeset(packageName, "UTF-8") == NULL) {
+		bindings_java_throw(env, "\nCall to bind_textdomain_codeset() to set UTF-8 failed");
+		return;
+	}
+	if (textdomain(packageName) == NULL) {
+		bindings_java_throw(env, "\nCall to textdomain() to set message source failed");
+		return;
+	}
+
+	// cleanup parameter packageName
+	bindings_java_releaseString(packageName);
+
+	// cleanup parameter localeDir
+	bindings_java_releaseString(localeDir);
+}
diff --git a/src/bindings/org/freedesktop/bindings/Internationalization.java b/src/bindings/org/freedesktop/bindings/Internationalization.java
new file mode 100644
index 0000000..f467abe
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Internationalization.java
@@ -0,0 +1,557 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008      Vreixo Formoso
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+import java.io.File;
+import java.text.MessageFormat;
+
+/**
+ * Internationalization support for java-gnome. A few definitions:
+ * 
+ * <p>
+ * <dl>
+ * <dt>Locale</dt>
+ * <dd>The combination of translations into a specific language along with
+ * formatting as used in a given country are collectively referred to as a
+ * <i>locale</i>.
+ * <dt>Internationalization</dt>
+ * <dd><i>Internationalization</i> is the process of preparing applications to
+ * support multiple languages. You will frequently see this abbreviated as "
+ * <code>i18n</code>".</dd>
+ * <dt>Localization</dt>
+ * <dd>Whereby other people convert your software into their own locale.
+ * <i>Localization</i>, as this is process is referred to, involves more than
+ * just translating words but also involves reformatting expressions of dates
+ * and numbers so they look "correct" in that locale. Frequently abbreviated
+ * as "<code>l10n</code>".</dd>
+ * </dl>
+ * 
+ * <p>
+ * The objective is that messages be shown to the user in his or her native
+ * language, not in English (or whatever language the developer was working
+ * in). Note that internationalization does not actually mean that you, as an
+ * application developer, need to translate your software to all the locales
+ * where it is planned to be used. This is done later, by translators.
+ * Applications developers just need to be aware of this, and prepare their
+ * software to be localized later. This preparation is what we call
+ * internationalization.
+ * 
+ * <p>
+ * First of all, we need to allow for message translation. This simply means
+ * not outputting hard coded English Strings directly and instead calling a
+ * function that will redirect to the message translation. Similarly, the
+ * other aspects of internationalization such as the way dates, numbers,
+ * currency, etc are formatted is locale-dependent. The functions in this
+ * class will enable you to prepare your application for translation.
+ * 
+ * <h2>Use translatable Strings instead of hard coded Strings</h2>
+ * 
+ * <p>
+ * Let's take the following Java code as a typical example:
+ * 
+ * <pre>
+ * greeting = new Label("Good morning");
+ * </pre>
+ * 
+ * Fortunately, you do not need to know how this message is written in all
+ * languages of the world! You let the translators take care of that.
+ * 
+ * <p>
+ * One approach would have been to give your sources to each translation team
+ * and have them hunt through the code for each and every String. This would
+ * be quite a nightmare, of course, and worse would require the translators to
+ * be a programmer on par with yourself. Worst of all, it would require a copy
+ * of the application specific to each locale to be distributed, which of
+ * course would be ridiculous.
+ * 
+ * <p>
+ * The people doing translations tend <i>not</i> to be hard-core developers
+ * but they are making a very valuable contribution to your software by
+ * offering to translate it. So we undertake internationalization in a way
+ * that enables them to do the localization without needing to be Java
+ * programmers.
+ * 
+ * <p>
+ * Instead of the hard coded String shown above, we wrap it in the translation
+ * function as follows:
+ * 
+ * <pre>
+ * greeting = new Label(_("Good morning"));
+ * </pre>
+ * 
+ * The {@link #_(String, Object...) Internationalization._()} function takes
+ * care of looking up your String in the translation database and will return
+ * the same message localized to the user's native language. Obviously using
+ * the static import:
+ * 
+ * <pre>
+ * import static org.freedesktop.bindings.Internationalization._;
+ * </pre>
+ * 
+ * will make things clean and elegant.
+ * 
+ * <p>
+ * In java-gnome, internationalizing your apps is as easy as the code above.
+ * You should use the <code>_()</code> function with any message you want to
+ * show to the user. Messages intended for developers only (such as debug
+ * messages going to the log) do not need to be localized.
+ * 
+ * <h2>Positional parameters</h2>
+ * 
+ * <p>
+ * Matters become somewhat more complicated when you need to concatenate
+ * various parameters into a composite String. Consider the common use of the
+ * <code>+</code> operator:
+ * 
+ * <pre>
+ * System.out.println("The file " + filename + " was modified on " + date);
+ * </pre>
+ * 
+ * This code is not internationalized at all. Not only do we need to allow the
+ * message to be translated, but we must also allow for the the date to be
+ * formatted appropriately. In java-gnome, you do this as follows:
+ * 
+ * <pre>
+ * System.out.println(_("The file {0} was modified on {1,date,long}", filename, date));
+ * </pre>
+ * 
+ * The added complexity comes from the need to cater for the "positional
+ * parameters" (here <code>filename</code> and <code>date</code>) which may
+ * have a different order when rendered in someone else's language. Again, you
+ * don't need to know the specifics for every possible target locale, you just
+ * need to supply the information in a form that can be localized.
+ * 
+ * <p>
+ * To format these parameters, you use the {@link MessageFormat} syntax. Put
+ * briefly, you will:
+ * 
+ * <ul>
+ * <li>Refer to any parameter with a <code>{n}</code> in your message, where
+ * <code>n</code> is the <code>0</code>-based index of the parameter as you
+ * submitted to the <code>_()</code> function.</li>
+ * <li>If the parameter needs to be formatted (numbers, dates, currency, etc)
+ * you pass a format type parameter ("<code>number</code>", "<code>date</code>
+ * ", "<code>time</code>") and optionally a format style qualifier (in the
+ * above example, "<code>long</code>", indicating a longer form). See the
+ * MessageFormat documentation for further details.</li>
+ * </ul>
+ * 
+ * <p>
+ * Of course, computers don't make magic (still), so you still need a
+ * translation process to actually localize your messages. However, with this
+ * approach this is done outside the code, in files named "message catalogues"
+ * where the translated messages are stored. In fact, the <code>_()</code>
+ * function will look up the given message in that catalogues, to show the
+ * translated version to the user. As a developer, you don't need to create
+ * them, it is the task of translator. However, knowledge of that process is
+ * useful, so we outline it below.
+ * 
+ * <h2>Locales</h2>
+ * 
+ * Most users are not aware of this, but having selected a "language" when
+ * they first logged in they initialize their <code>LANG</code> and
+ * <code>LC_MESSAGES</code> environment variables.
+ * 
+ * <p>
+ * Examples of locales include:
+ * <dl>
+ * <dt><code>en_CA.UTF-8</code>
+ * <dd>English as written and used in Canada
+ * <dt><code>en_UK.UTF-8</code>
+ * <dd>English as written and used in Britain
+ * <dt><code>en</code>
+ * <dd>English (generic)
+ * <dt><code>es_ES.UTF-8</code>
+ * <dd>Spanish as written and used in Spain
+ * <dt><code>es</code>
+ * <dd>Spanish (generic)
+ * <dt><code>fr_CA.UTF-8</code>
+ * <dd>French as used in Canada
+ * <dt><code>fr_FR.UTF-8</code>
+ * <dd>French as used in France
+ * <dt><code>fr</code>
+ * <dd>French (generic)
+ * </dl>
+ * etc. You'll note the addition of qualifiers like <code>.UTF-8</code> which
+ * are how a locale indicates support for specific character sets.
+ * 
+ * <p>
+ * There is also one other locale you will see:
+ * <dl>
+ * <dt><code>C</code>
+ * <dd>the untranslated domain, typically expressed in English.
+ * </dl>
+ * which is what you write in your programs.
+ * 
+ * <p>
+ * Note that <b>nothing</b> requires you to to use English for the
+ * untranslated messages in your source code. English is, however, the
+ * <i>lingua franca</i> of our age, and more to the point is the language
+ * which most translation teams understand and translate from. If you are
+ * doing your own translations, then go right ahead and program in whatever
+ * language you want. On the other hand, if you wish to leverage the GNOME
+ * Translation Project's expertise, we recommend that your untranslated
+ * Strings be in basic English.
+ * 
+ * <p>
+ * Indeed, using uncomplicated English Strings will mean that you will be less
+ * likely to "break" Strings (thereby causing the translation teams'
+ * localizations to no longer work). Even if you are a native English speaker,
+ * we recommend that you localize your own work into (say) <code>en_AU</code>
+ * or <code>en_CA</code> as this will cause you to be aware of translation
+ * issues - and will minimize String breaks.
+ * 
+ * <p>
+ * As you can imagine, the gettext and glibc libraries fallback in a
+ * predictable order. They try to find a translation that is appropriate for
+ * your locale, starting with the fully qualified <code>LANG</code> variable
+ * and then steadily degrading. For example, if your
+ * <code>LANG=fr_CA.UTF-8</code>, you could expect the following sequence of
+ * locales to be searched:
+ * 
+ * <ul>
+ * <li>fr_CA.UTF-8
+ * <li>fr_CA
+ * <li>fr.UTF-8
+ * <li>fr
+ * <li>C
+ * </ul>
+ * 
+ * <h2>Employing gettext</h2>
+ * 
+ * <p>
+ * java-gnome uses the GNU <a
+ * href="http://www.gnu.org/software/gettext/">gettext</a> suite, which is the
+ * same translation infrastructure that GNOME and most other Linux
+ * applications use. The process used by <code>gettext</code> to generate the
+ * message catalogues is as follows:
+ * 
+ * <p>
+ * First of all, the messages used in your code need to be extracted. This is
+ * done by the <code>xgettext</code> command. It is able to distinguish
+ * between translatable messages and other Strings because the former are
+ * marked with the calls to <code>_()</code>. So, the following call:
+ * 
+ * <pre>
+ * $ xgettext -o myapp.pot --omit-header --keyword=_ --keyword=N_ path/to/TYPE.java
+ * </pre>
+ * 
+ * will extract the messages used in the TYPE.java class to a file called
+ * <code>myapp.pot</code>. A POT file is a template with the list of
+ * translatable messages which translators will use to know the message they
+ * must translate. With the command:
+ * 
+ * <pre>
+ * $ msginit -i myapp.pot -o ${LANG}.po
+ * </pre>
+ * 
+ * they can generate a PO file for their particular language which is where
+ * the messages will be translated. PO files contain the translated messages.
+ * There is one PO file per locale, named with the standard scheme
+ * <code>language_COUNTRY</code>. Examples are <code>en_CA.po</code>,
+ * <code>es_ES.po</code>, <code>fr.po</code>, <code>pt.po</code>,
+ * <code>pt_BR.po</code>.... Typically, the PO files of a given project are
+ * stored in a directory named <code>po/</code>.
+ * 
+ * <p>
+ * To be used by gettext, those files need to be "compiled" to a binary form,
+ * known as MO files. That is done with the <code>msgfmt</code> command:
+ * 
+ * <pre>
+ * $ msgfmt -o myapp.mo es.po
+ * </pre>
+ * 
+ * MO files are installed together with other application artifacts, usually
+ * under
+ * <code>/usr/share/locale/${locale}/LC_MESSAGES/${packageName}.mo</code>,
+ * where <code>${locale}</code> is the locale and <code>${packageName}</code>
+ * is a unique identifier for the program, usually your application name. This
+ * name is needed because when installed to the system, MO files are stored
+ * under a directory common to all installed apps. For example, localized
+ * messages for the <code>pt_BR</code> locale of the <code>myapp</code>
+ * application will be packaged as
+ * <code>/usr/share/locale/pt_BR/LC_MESSAGES/myapp.mo</code>.
+ * 
+ * <p>
+ * As you can imagine, you will need to tell gettext where those files are
+ * physically located. This is done with the {@link #init(String, String)
+ * init()} method. This <b>must</b> be called before any usage of java-gnome
+ * internationalization infrastructure.
+ * 
+ * <pre>
+ * public void main(String[] args) {
+ *     Gtk.init(args);
+ *     Internationalization.init("myapp", "share/locale/");
+ *     ...
+ * }
+ * </pre>
+ * 
+ * <p>
+ * In some cases, this might be a problem. If you have messages stored in a
+ * static array initializer use the {@link #N_(String) N_()} function to mark
+ * these messages, then use <code>_()</code> later on the variable carrying
+ * the constant. See <code>N_()</code> for more details.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public final class Internationalization
+{
+    private Internationalization() {}
+
+    /**
+     * Translate and format a given message according to user locale.
+     * 
+     * <p>
+     * This attempts to translate a text string into the user's native
+     * language. You just need to call it with the message in <code>C</code>,
+     * as follows:
+     * 
+     * <pre>
+     * String translated = _("Hello");
+     * </pre>
+     * 
+     * <p>
+     * The java-gnome implementation of <code>_()</code> also supports message
+     * formatting and concatenation in a language-neutral way. For example,
+     * let's suppose we want to print the following message: "The file
+     * 'data.log' has been modified at March 21, 2008 at 5:27:22 PM". This
+     * message actually has two parameters, the filename, and the date of
+     * modification. This data is locale-dependent, as the dates are
+     * represented differently depending on language and country. We could get
+     * the internationalized message with:
+     * 
+     * <pre>
+     * String filename;
+     * Date date;
+     * _("The file '{0}' has been modified on {1,date,long} at {1,time}", filename, date);
+     * </pre>
+     * 
+     * As you can see, it is easy to construct a given message from several
+     * parameters, even when some parameters need locale-dependent formatting.
+     * 
+     * <p>
+     * The actual formatting is done by {@link MessageFormat}, so take a look
+     * at its documentation for all available format options. Translation is
+     * done handled by gettext before the message is passed to MessageFormat
+     * for further handling of the positional parameters.
+     * 
+     * @param msg
+     *            The message to print. This is the untranslated message,
+     *            usually in English.
+     * @param parameters
+     *            Parameters of the message
+     * @return The message translated and properly formatted. If no
+     *         translation is found, the original English is returned.
+     * @since 4.0.7
+     */
+    public static final String _(String msg, java.lang.Object... parameters) {
+        if (msg == null) {
+            return null;
+        }
+        /*
+         * gettext()'s behaviour is undefined if given an empty String
+         */
+        if (msg.equals("")) {
+            return msg;
+        }
+
+        if (parameters.length == 0) {
+            return gettext(msg);
+        } else {
+            return MessageFormat.format(gettext(msg), parameters);
+        }
+    }
+
+    /**
+     * Translate a language name. For example, if you are in
+     * <code>LANG="es_ES.UTF-8"</code> and do:
+     * 
+     * <pre>
+     * lang = translateCountryName("Japanese");
+     * </pre>
+     * 
+     * you will get <code>"Japonés"</code>.
+     * 
+     * <p>
+     * In order to use this function, you must already have done the lookup of
+     * the ISO 639 language code (<code>jp</code> in this case to what the
+     * standard has the name in English as. Unfortunately there's no automated
+     * way to do this, however the <code>iso-codes</code> package countains an
+     * XML file at <code>/usr/share/xml/iso-codes/iso_639.xml</code> with this
+     * data.
+     * 
+     * <p>
+     * Beware that you really need to use the proper name; <code>es</code>
+     * (which is Spanish to mere mortals) is <code>"Spanish; Castilian"</code>
+     * in the XML data [and hence in the message catalogues].
+     * 
+     * <p>
+     * <i>This function uses</i> <code>dgetttext()</code> <i>and the</i>
+     * <code>"iso_639"</code> <i>translation domain. Translations for
+     * languages in this standard should already be available on your
+     * system.</i>
+     * 
+     * @since 4.0.17
+     */
+    public static final String translateLanguageName(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException();
+        }
+
+        return dgettext("iso_639", name);
+    }
+
+    /**
+     * Translate a country name. For example, if you are in
+     * <code>LANG="fr_CA"</code>,
+     * 
+     * <pre>
+     * lang = translateCountryName("United Kingdom");
+     * </pre>
+     * 
+     * will get you <code>"Royaume-Uni"</code>.
+     * 
+     * <p>
+     * To use this function you must already have done the lookup of the ISO
+     * 3166 country code to its name in English. Unfortunately there's no
+     * automated way to do this. The <code>iso-codes</code> package, however,
+     * countains an XML file at
+     * <code>/usr/share/xml/iso-codes/iso_3166.xml</code> with the necessary
+     * data.
+     * 
+     * <p>
+     * <i>This function uses</i> <code>dgetttext()</code> <i>and the</i>
+     * <code>"iso_3166"</code> <i>translation domain. Translations for
+     * countries in this standard should already be available on your
+     * system.</i>
+     * 
+     * @since 4.0.17
+     */
+    public static final String translateCountryName(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException();
+        }
+
+        return dgettext("iso_3166", name);
+    }
+
+    private static native final String gettext(String msg);
+
+    private static native final String dgettext(String domain, String msg);
+
+    /**
+     * Mark the given message as translatable, without actually translating
+     * it. This is used for static fields that are initialized before
+     * Internationalization is initialized:
+     * 
+     * <pre>
+     * private static final String BUTTON_MESSAGE = N_("Press me!");
+     * </pre>
+     * 
+     * You still need to call <code>_()</code> later, to actually translate
+     * the message.
+     * 
+     * <pre>
+     * button.setLabel(_(BUTTON_MESSAGE));
+     * </pre>
+     * 
+     * Obviously the problem now is to come up with constant names that are
+     * unobtrusive. There are various different naming schemes that can be
+     * employed; all are somewhat ugly. In general this leads to people not
+     * using Strings in static initializers as much as they might have been
+     * used to. Indeed, the whole point of abstracting out such Strings (so
+     * that they are in one place at the "top" of the file) is less relevant
+     * given that the gettext tools will be extracting all your messages
+     * anyway.
+     * 
+     * @param msg
+     *            The message to mark as translatable
+     * @return The <code>msg</code> argument, <i>not</i> translated. Remember,
+     *         <code>N_()</code> is only used to mark a String as translatable
+     *         so that <code>xgettext</code> can extract it.
+     * @since 4.0.7
+     */
+    public static final String N_(String msg) {
+        return msg;
+    }
+
+    /**
+     * Initialize internationalization support. You <b>must</b> call this
+     * function before any other usage of the methods on the
+     * Internationalization class, ie:
+     * 
+     * <pre>
+     * public void main(String[] args) {
+     *     Gtk.init(args);
+     *     Internationalization.init("myapp", "/usr/share/locale/");
+     *     ...
+     * }
+     * </pre>
+     * 
+     * 
+     * @param packageName
+     *            Application name
+     * @param localeDir
+     *            Directory where to find the message catalogues (usually
+     *            <code>/usr/share/locale</code>) The actually message
+     *            catalogue is found at
+     *            <code>${localeDir}/${locale}/LC_MESSAGES/${packageName}.mo</code>
+     *            For example:
+     *            <code>/usr/share/locale/pt_BR/LC_MESSAGES/myapp.mo</code>.
+     *            It is not compulsory to use an absolute path for the
+     *            <code>localeDir</code> parameter.
+     * @since 4.0.7
+     */
+    public static final void init(String packageName, String localeDir) {
+        final File locale;
+
+        if (((packageName == null) || packageName.equals(""))) {
+            throw new IllegalArgumentException("packageName cannot be null or empty");
+        }
+
+        if (localeDir == null) {
+            throw new IllegalArgumentException("localeDir cannot be null");
+        }
+        locale = new File(localeDir);
+        if (!locale.isDirectory()) {
+            throw new FatalError("\nThe supplied locale base dir \"" + localeDir + "\" is not found");
+        }
+
+        bindtextdomain(packageName, localeDir);
+    }
+
+    private static native final void bindtextdomain(String packageName, String localeDir);
+}
diff --git a/src/bindings/org/freedesktop/bindings/Plumbing.c b/src/bindings/org/freedesktop/bindings/Plumbing.c
new file mode 100644
index 0000000..e27df73
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Plumbing.c
@@ -0,0 +1,109 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include "bindings_java.h"
+#include "org_freedesktop_bindings_Plumbing.h"
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Plumbing.createPointer(Class type, long pointer)
+ */
+JNIEXPORT jobject JNICALL
+Java_org_freedesktop_bindings_Plumbing_createPointer
+(
+	JNIEnv *env,
+	jclass cls,
+	jclass type,
+	jlong pointer
+)
+{
+	jmethodID constructor;
+	jobject proxy;
+	
+	constructor = (*env)->GetMethodID(env, type, "<init>", "(J)V");
+	if (constructor == NULL) {
+		g_critical("Constructor methodID not found");
+		return NULL;
+	}
+	
+	proxy = (*env)->NewObject(env, type, constructor, pointer);
+	return proxy;
+}
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Plumbing.createFlag(Class type, int ordinal, String nickname)
+ */
+JNIEXPORT jobject JNICALL
+Java_org_freedesktop_bindings_Plumbing_createFlag
+(
+	JNIEnv *env,
+	jclass cls,
+	jclass type,
+	jint ordinal,
+	jstring nickname
+)
+{
+	jmethodID constructor;
+	jobject flag;
+	
+	constructor = (*env)->GetMethodID(env, type, "<init>", "(ILjava/lang/String;)V");
+	if (constructor == NULL) {
+		g_critical("Constructor methodID not found");
+		return NULL;
+	}
+	
+	flag = (*env)->NewObject(env, type, constructor, ordinal, nickname);
+	return flag;
+}
+
+
+/*
+ * Implements
+ *   org.freedesktop.bindings.Plumbing.toHexString(long pointer)
+ */
+JNIEXPORT jstring JNICALL
+Java_org_freedesktop_bindings_Plumbing_toHexString
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _pointer
+)
+{
+	const gchar* result;
+	
+	result = bindings_java_memory_pointerToString((gpointer) _pointer);
+	
+	return bindings_java_newString(env, result);
+}
diff --git a/src/bindings/org/freedesktop/bindings/Plumbing.java b/src/bindings/org/freedesktop/bindings/Plumbing.java
new file mode 100644
index 0000000..609f852
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Plumbing.java
@@ -0,0 +1,555 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import java.util.HashMap;
+
+import org.gnome.gtk.Gtk;
+
+import static org.freedesktop.bindings.Version.getVersion;
+
+/**
+ * Parent of all classes in the translation layer of a bindings library. This
+ * class provides the infrastructure (or, "plumbing") that the generated code
+ * can access the native values held within Proxy, Constant, etc.
+ * 
+ * <p>
+ * <i><b>No one using developing applications which happen to use bindings
+ * based on this package should ever need to see, use, or subclass, this.</b>
+ * People hacking on the bindings themselves will end up call generated or
+ * crafted methods in the translation layer, but they too will never have to
+ * use these mechanisms directly. Note that individual library families will
+ * likely subclass this to extend its instance lookup behaviour in a manner
+ * appropriate to the type systems in use within those libraries.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.0
+ */
+public abstract class Plumbing
+{
+    protected Plumbing() {}
+
+    /**
+     * Every Proxy that gets created gets added to this Map so that if a call
+     * down to the native layer returns an object that has already been
+     * created Java side that instance is returned rather than creating a new
+     * one.
+     */
+    static final HashMap<Long, WeakReference<Proxy>> knownProxies;
+
+    /**
+     * When Enums get created, we add them to this Map so we can find an
+     * appropriate instance for a given ordinal. The table is two tier:
+     * 
+     * Class => ArrayList[Constant+]
+     */
+    /*
+     * Neither keys nor values are to be weak references here; we are not
+     * unloading Constant classes so the Class keys will stay strongly
+     * reachable; the Constant instances themselves will always be present by
+     * virtue of their being in this two tier table.
+     */
+    static final HashMap<Class<? extends Constant>, HashMap<Integer, Constant>> knownConstants;
+
+    /**
+     * The ClassLoader in use. This is for use by the various places where
+     * Class.forName() is being called.
+     */
+    protected static final ClassLoader loader;
+
+    static {
+        /*
+         * TODO: any particular reason to pick a starting array size?
+         */
+        knownProxies = new HashMap<Long, WeakReference<Proxy>>();
+        knownConstants = new HashMap<Class<? extends Constant>, HashMap<Integer, Constant>>();
+        loader = Plumbing.class.getClassLoader();
+
+        loadNativeCode();
+    }
+
+    /**
+     * Was java-gnome safely initialized by properly calling Gtk.init()?
+     */
+    /*
+     * This class does NOT call this, and nor dies Glib's Plumbing; there are
+     * methods there that are allowed on the pre-init code path. And the
+     * boolean being checked here is set BEFORE the call to GtkMain.init()
+     * fires off the static initializers in the Plumbing classes, which is it
+     * will be set if Gtk.init() has been called.
+     */
+    protected static void isLibraryReady() {
+        if (!Gtk.isInitialized()) {
+            throw new FatalError(
+                    "\n\nYou *must* call Gtk.init() before using anything else in java-gnome!\n");
+
+        }
+    }
+
+    private static final String LIBDIR_FILE = ".libdir";
+
+    /**
+     * Load the native library. The governing assumption is that the .jar
+     * created "in-place" does NOT have the libdir file; it is appended to the
+     * .jar during the `make install` step.
+     * 
+     * <p>
+     * The root name "libgtkjni" is historical. We've left it as is because
+     * there's no burning need to further pollute the system library space
+     * (although we will change it if we ever start constructing different .so
+     * for different dependencies).
+     */
+    /*
+     * We go through quite some hoop jumping in the fallback case. If we were
+     * just concerned with things being run from a java-gnome checkout, then
+     * libdir could hae been set to relative path "tmp" and been done with it.
+     * 
+     * But since an "in-place" build can be used from an arbitrary external
+     * location, we need to work out the URL of the .jar file that was
+     * referenced in the first place and use that to find the directory to use
+     * as libdir.
+     * 
+     * The code path to do this is insane, but not to worry - this stuff is
+     * already loaded by the VM so it doesn't cost anything being here.
+     * 
+     * Conveniently, this also works if you have tmp/bindings/ as the
+     * classpath, as getParent() extracts the URL of that to .../tmp/ which is
+     * what we want.
+     */
+    private static final void loadNativeCode() {
+        final InputStream in;
+        final BufferedReader reader;
+        String libdir;
+        final ProtectionDomain domain;
+        final CodeSource source;
+        final URL url;
+        String jar;
+        final File library;
+        final String path;
+
+        try {
+            /*
+             * Attmept to load the .libdir file and use its contents as the
+             * directory which we will load our shared library from.
+             */
+            in = loader.getResourceAsStream(LIBDIR_FILE);
+            if (in == null) {
+                throw new FileNotFoundException(); // ok
+            }
+            reader = new BufferedReader(new InputStreamReader(in));
+            libdir = reader.readLine();
+            reader.close();
+        } catch (Exception e) {
+            /*
+             * If that fails, it means we're running on an "in-place" (built
+             * but not installed) copy of java-gnome. We need to work out the
+             * path to tmp/ that the .jar file came from in the first place.
+             */
+            domain = Plumbing.class.getProtectionDomain();
+            source = domain.getCodeSource();
+            url = source.getLocation();
+            jar = url.getPath();
+            try {
+                jar = URLDecoder.decode(jar, System.getProperty("file.encoding"));
+            } catch (UnsupportedEncodingException e1) {
+                // Try loading unescaped String
+            }
+
+            libdir = new File(jar).getParent();
+        }
+
+        library = new File(libdir, "libgtkjni-" + getVersion() + ".so");
+        if (!library.exists()) {
+            throw new UnsatisfiedLinkError("\n\n"
+                    + "We anticipated loading the native portion of java-gnome from:\n" + library + "\n"
+                    + "but didn't find the library there.\n");
+        }
+
+        path = library.getPath();
+        System.load(path);
+    }
+
+    /*
+     * Proxy handling ------------------------------------
+     */
+
+    /**
+     * When a Proxy is created, it must call this method so that other methods
+     * that need that to return that particular Proxy (but, coming from the
+     * native side, only know the pointer address) can do so by doing a
+     * lookup.
+     */
+    static final void registerProxy(Proxy obj) {
+        final WeakReference<Proxy> ref;
+        final Long box;
+
+        box = new Long(obj.pointer);
+        ref = new WeakReference<Proxy>(obj);
+
+        synchronized (knownProxies) {
+            knownProxies.put(box, ref);
+        }
+    }
+
+    /**
+     * Called by the release() function of a Proxy object, this method cleans
+     * up any entries of the Proxy in the Plumbings internals.
+     */
+    static final void unregisterProxy(Proxy obj) {
+        final Long box;
+
+        box = new Long(obj.pointer);
+
+        synchronized (knownProxies) {
+            knownProxies.remove(box);
+        }
+    }
+
+    /**
+     * Get the memory address which is the location of the Object or Structure
+     * that a given Pointer represents. That doesn't mean anything on the Java
+     * side so don't try to interpret it - it's for use by the translation
+     * layer as they marshal objects through to the native layer.
+     * 
+     * @return opaque data to be passed to native methods only.
+     */
+    /*
+     * We go to considerable effort to keep this method out of the visibility
+     * of public users which is why translation layer code subclass this
+     * org.freedesktop.bindings.Pluming which has package visibility of
+     * Pointer and Constant. Even more, there's nothing we can do about this
+     * being protected, so we choose a method name other than getPointer() to
+     * keep it totally of out of view from get<COMPLETE>.
+     */
+    protected static final long pointerOf(Pointer reference) {
+        return reference == null ? 0L : reference.pointer;
+    }
+
+    /**
+     * Like {@link #pointerOf(Pointer)}, but acts over an array of Pointers.
+     * 
+     * @return opaque data to be passed to native methods only.
+     */
+    protected static final long[] pointersOf(Pointer[] references) {
+        if (references == null) {
+            return null;
+        }
+        long[] pointers = new long[references.length];
+        for (int i = 0; i < references.length; ++i) {
+            pointers[i] = (references[i] == null ? 0L : references[i].pointer);
+        }
+        return pointers;
+    }
+
+    /**
+     * Given a pointer, find out if we already have a Proxy for it Java side.
+     * 
+     * <p>
+     * This will return the Proxy instance already created by a concrete
+     * constructor if one was created Java side. This is sufficient if you are
+     * only using this for Proxies that were created as a result of objects
+     * being constructed in Java. If, on the other hand, you are calling this
+     * from a native to Java code path, then you need to account for the fact
+     * that it is likely that a returned pointer will not yet have a Proxy
+     * here. You don't need to override this method with your own
+     * <code>instanceFor()</code> implementation so much as implement custom
+     * variants: call this method to find out if there is a Proxy already;
+     * then if not take appropriate action to create (and in so doing,
+     * register) a new Proxy object.
+     * 
+     * <p>
+     * Note that under this architecture, denaturation should <b>not</b> occur
+     * because if we created the type, then we will already and always have a
+     * reference to it. Regardless if our type is a much derived subclass of
+     * whatever the native library's equivalent is, any look up of that
+     * pointer will be routed to our Proxy subtype.
+     * 
+     * <p>
+     * <i><b>This must be overridden by any library using these bindings, or
+     * you will only be able to get instances for objects created Java
+     * side.</b></i>.
+     * 
+     * @param pointer
+     *            opaque memory reference as passed from the C side.
+     * @return the instance corresponding to a given pointer, or null if that
+     *         pointer isn't registered.
+     */
+    /*
+     * This is a skeleton implementation with the necessary functionality of
+     * looking up existing Proxies but nevertheless this is, in effect, an
+     * "abstract" method; if you are using java-gnome to wrap a non GLib based
+     * library, you will need to implement an instanceFor() that knows how to
+     * create appropriate Proxy instances based on something that can be
+     * looked up.
+     */
+    protected static Proxy instanceFor(long pointer) {
+        final WeakReference<Proxy> ref;
+        final Long box;
+
+        box = new Long(pointer);
+
+        synchronized (knownProxies) {
+            ref = knownProxies.get(box);
+        }
+
+        if (ref == null) {
+            return null;
+        } else {
+            return ref.get();
+        }
+    }
+
+    /**
+     * By design, the protected <init>(long) constructors in the various Proxy
+     * subclasses are not publicly visible. Unfortunately, that means that
+     * Plumbing subclasses in other packages cannot see them. So, we use the
+     * trick of calling JNI (where visibility rules are ignored) to create
+     * Proxy instances.
+     */
+    protected static native Pointer createPointer(Class<?> type, long pointer);
+
+    /*
+     * Constant handling ----------------------------------
+     */
+
+    /**
+     * When a Constant (ie, our Enum wrapper) is created, this must be called
+     * to ensure the appropriate constant object can be retrieved on request
+     * when all that is known is type and ordinal.
+     * 
+     * <p>
+     * Note that there is no need for an <code>unregisterConstant()</code>;
+     * once loaded Constant objects are expected to be around for the lifetime
+     * of the VM.
+     */
+    /*
+     * TODO It would be cool if we had a way of sizing the map perfectly on
+     * allocation.
+     */
+    static final void registerConstant(Constant obj) {
+        final Class<? extends Constant> type;
+        HashMap<Integer, Constant> map;
+
+        type = obj.getClass();
+
+        map = knownConstants.get(type);
+
+        if (map == null) {
+            // TODO is 8 a good initial capacity?
+            map = new HashMap<Integer, Constant>(8);
+            knownConstants.put(type, map);
+        }
+
+        map.put(new Integer(obj.ordinal), obj);
+    }
+
+    /**
+     * Get the ordinal number corresponding to the enum that a given Constant
+     * represents. That value is deliberately obscured on the Java side
+     * because by itself it doesn't mean anything without an enclosing
+     * Constant class and the machinery to handle it. This method is for use
+     * by the translation layer only as it marshals objects through to the
+     * native layer.
+     * 
+     * @return opaque data to be passed to native methods only
+     */
+    /*
+     * Like pointerOf(), this is carefully shielded from hackers writing the
+     * public API layer of the bindings.
+     */
+    protected static final int numOf(Constant reference) {
+        return reference.ordinal;
+    }
+
+    /**
+     * Like {@link #numOf(Constant) numOf()} but acts over an array of
+     * Constants.
+     * 
+     * @return opaque data to be passed to native methods only.
+     */
+    protected static final int[] numsOf(Constant[] references) {
+        int[] ordinals = new int[references.length];
+        for (int i = 0; i < references.length; ++i) {
+            /*
+             * Here we need to check for null, as in output parameters we
+             * don't want to initialize the array!
+             */
+            ordinals[i] = references[i] == null ? 0 : references[i].ordinal;
+        }
+        return ordinals;
+    }
+
+    /**
+     * Given a Class and an ordinal number, lookup the Constant object that
+     * corresponds to that native enum.
+     * 
+     * @throws IllegalArgumentException
+     *             if it can't find a Constant object corresponding to the
+     *             Class, ordinal combination you've requested.
+     */
+    protected static Constant enumFor(Class<?> type, int ordinal) {
+        Constant obj;
+
+        obj = getRegisteredConstant(type, ordinal);
+        if (obj == null) {
+            throw new IllegalArgumentException("You asked for ordinal " + ordinal
+                    + " which is not known for the requested Constant type " + type.getName());
+        }
+
+        return obj;
+    }
+
+    /**
+     * Retrieve the ordinals corresponding to several constants, and fill a
+     * Constant array with them.
+     * 
+     * @see #enumFor(Class, int)
+     */
+    protected static void fillEnumArray(Class<? extends Constant> type, Constant[] enums, int[] ordinals) {
+        for (int i = 0; i < enums.length; ++i) {
+            enums[i] = enumFor(type, ordinals[i]);
+        }
+    }
+
+    /**
+     * Given a Class and an ordinal number, try to lookup the Constant object
+     * that corresponds to that flag. If there's no registered constant that
+     * matches the given ordinal, then it corresponds to a OR'd flag, so a new
+     * Constant object is created and registered.
+     */
+    /*
+     * TODO the result of toString should match the ordered
+     */
+    protected static Flag flagFor(Class<?> type, int ordinal) {
+        Flag obj;
+        String name;
+
+        obj = (Flag) getRegisteredConstant(type, ordinal);
+
+        /*
+         * In many circumstances, Flags are used like enums, and so the
+         * returned value will match one of the cardinal values. Too easy:
+         */
+
+        if (obj != null) {
+            return obj;
+        }
+
+        /*
+         * Otherwise, we need a new one to represent this bit pattern.
+         */
+
+        if (ordinal == 0) {
+            name = "UNSET";
+        } else {
+            name = null;
+            for (int i = 1; i != 0; i <<= 1) {
+                if ((ordinal & i) != 0) {
+                    Constant c = enumFor(type, i);
+                    name = (name == null ? "" : name + "|") + c.nickname;
+                }
+            }
+        }
+
+        obj = createFlag(type, ordinal, name);
+        return obj;
+    }
+
+    /**
+     * Retrieve the ordinals corresponding to several flags, and fill a Flag
+     * array with them.
+     * 
+     * @see #flagFor(Class, int)
+     */
+    protected static void fillFlagArray(Class<? extends Flag> type, Flag[] flags, int[] ordinals) {
+        for (int i = 0; i < flags.length; ++i) {
+            flags[i] = flagFor(type, ordinals[i]);
+        }
+    }
+
+    /**
+     * Lookup a Constant that corresponds to the given type and ordinal.
+     */
+    private static Constant getRegisteredConstant(Class<?> type, int ordinal) {
+        final HashMap<Integer, Constant> map;
+        Constant obj;
+
+        assert (type != null);
+
+        try {
+            Class.forName(type.getName(), true, loader);
+        } catch (ClassNotFoundException cnfe) {
+            throw new FatalError("\n" + "No class for Constants of type " + type.getName() + " found");
+        }
+
+        map = knownConstants.get(type);
+        if (map == null) {
+            throw new IllegalArgumentException("\n" + "No Constants of type " + type.getName()
+                    + " are registered");
+        }
+
+        obj = map.get(ordinal);
+        return obj;
+    }
+
+    /**
+     * The Constants (both enums and flags), are instantiated and registered
+     * at class load time. However, the flags can be combined (OR'ed)
+     * together, thus creating new flags at runtime. This method add a new
+     * flag, invocating the protected constructor on the given flag class. To
+     * prevent visibility problems, we use the trick of calling JNI (where
+     * visibility rules are ignored) to create Proxy instances.
+     */
+    private static native Flag createFlag(Class<?> type, int ordinal, String nickname);
+
+    static final native String toHexString(long pointer);
+
+    /**
+     * Get the value encoded by a DoubleConstant instance.
+     */
+    protected static final double numOf(DoubleConstant reference) {
+        return reference.value;
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Pointer.java b/src/bindings/org/freedesktop/bindings/Pointer.java
new file mode 100644
index 0000000..ea3648b
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Pointer.java
@@ -0,0 +1,105 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * A proxy object representing a native resource. Specifically, this is a
+ * wrapper around a pointer.
+ * 
+ * <p>
+ * <i><b>This is implementation, and you will never need to use it
+ * directly</b></i>
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.9
+ */
+/*
+ * And so the magic happens. This is where the pointer that this class proxies
+ * is held. The JNI layer reaches up to this class and reads the pointer field
+ * to get the address of the proxied GValue, etc. This is in its own library
+ * as a means to keep the pointer handling isolated and cleanly installable.
+ * Also useful given that Cairo doesn't actually depend on Glib.
+ */
+public abstract class Pointer
+{
+    /*
+     * This is an opaque representation of a memory address. It's a Java long,
+     * which means it's 64 bits wide which in turn means it can hold an
+     * address on a 64 bit system, but any interpretation that the Java
+     * language might assign to a long (ie, that it's signed) is meaningless
+     * and incorrect! This is package public so that Plumbing can see it, and
+     * final so that once constructed it is immutable.
+     */
+    final long pointer;
+
+    /**
+     * Create a new proxy object with the specified address as its pointer.
+     * This it the top of the constructor chain.
+     */
+    protected Pointer(long pointer) {
+        if (pointer == 0L) {
+            throw new RuntimeException("Cannot make a Java proxy for the NULL pointer!");
+        }
+        this.pointer = pointer;
+    }
+
+    /**
+     * Parent release function. Will be called by the Java garbage collector
+     * when it invokes the finalizer, so this is the time to release
+     * references and free memory on the C side.
+     */
+    protected abstract void release();
+
+    /*
+     * This is a placeholder to remind us of the cleanup actions that will be
+     * necessary, irrespective of the finalizer technique used.
+     */
+    protected void finalize() {
+        release();
+    }
+
+    public String toString() {
+        if (Debug.MEMORY_MANAGEMENT) {
+            StringBuilder result;
+            result = new StringBuilder();
+            result.append(Plumbing.toHexString(pointer));
+            result.append("*");
+            result.append(this.getClass().getName());
+
+            return result.toString();
+        } else {
+            return this.getClass().getName();
+        }
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Proxy.java b/src/bindings/org/freedesktop/bindings/Proxy.java
new file mode 100644
index 0000000..117288a
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Proxy.java
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * A proxy object representing a native resource that has a unique identity
+ * and can be looked up.
+ * 
+ * <p>
+ * <i><b>This is implementation, and you will never need to use it
+ * directly</b></i>
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.0
+ */
+public abstract class Proxy extends Pointer
+{
+    /**
+     * Create a new proxy object with the specified address as its pointer.
+     */
+    protected Proxy(long pointer) {
+        super(pointer);
+        Plumbing.registerProxy(this);
+    }
+
+    /*
+     * This is a placeholder to remind us of the cleanup actions that will be
+     * necessary, irrespective of the finalizer technique used.
+     */
+    protected void finalize() {
+        Plumbing.unregisterProxy(this);
+        super.finalize();
+    }
+}
diff --git a/src/bindings/org/freedesktop/bindings/Time.c b/src/bindings/org/freedesktop/bindings/Time.c
new file mode 100644
index 0000000..1e24849
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Time.c
@@ -0,0 +1,166 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * This code imported from the SlashTime project's wrapper around the C time
+ * functions at src/java/com/operationaldynamics/slashtime/Time.c
+ */
+
+#include <jni.h>
+#include <stdlib.h>
+#include <time.h>
+#include <glib.h>
+#include "bindings_java.h"
+#include "org_freedesktop_bindings_Time.h"
+
+#define MAXWIDTH 64
+
+
+JNIEXPORT void JNICALL
+Java_org_freedesktop_bindings_Time_tzset
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _zoneinfo
+)
+{
+	/*
+	 * Carry out the magic to switch zones by calling tzset(). It doesn't
+	 * have parameters - it pulls TZ from the environment.
+	 */
+
+	const char *zoneinfo;
+	int ok;
+
+	zoneinfo = bindings_java_getString(env, _zoneinfo);
+	if (zoneinfo == NULL) {
+		return; /* OutOfMemoryError already thrown */
+	}
+
+	ok = g_setenv("TZ", zoneinfo, 1);
+
+	bindings_java_releaseString(zoneinfo);
+	if (ok != 0) {
+		// throw exception
+		return;
+	}
+
+	tzset();
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_freedesktop_bindings_Time_strftime
+(
+	JNIEnv *env,
+	jclass klass,
+	jstring _format,
+	jlong _timestamp
+)
+{
+	/*
+	 * Call strftime() to generate the string in the desired format. We
+	 * pass in size as the max, and the return value indicates how much was
+	 * used.
+	 */
+
+	const char *format;
+	size_t size;
+	char buf[MAXWIDTH];
+	struct tm *brokendown;
+	time_t timestamp;
+
+	size = MAXWIDTH;
+
+	format = bindings_java_getString(env, _format);
+	if (format == NULL) {
+		return NULL; /* OutOfMemoryError already thrown */
+	}
+
+	timestamp = (time_t) _timestamp;
+
+	brokendown = localtime(&timestamp);
+
+	size = strftime(buf, size, format, brokendown);
+
+	bindings_java_releaseString(format);
+	if (size == 0) {
+		// throw exception instead!
+		return bindings_java_newString(env, "Nothing returned!\0");
+	}
+
+	return bindings_java_newString(env, buf);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_freedesktop_bindings_Time_mktime
+(
+	JNIEnv *env,
+	jclass cls,
+	jint _year,
+	jint _month,
+	jint _day,
+	jint _hour,
+	jint _minute,
+	jint _second
+)
+{
+	struct tm brokendown = { 0, };
+	time_t timestamp;
+
+	brokendown.tm_year = _year - 1900;
+	brokendown.tm_mon = _month - 1;
+	brokendown.tm_mday = _day;
+	brokendown.tm_hour = _hour;
+	brokendown.tm_min = _minute;
+	brokendown.tm_sec = _second;
+
+	timestamp = mktime(&brokendown);
+
+#ifdef DEBUG
+	fprintf(stderr, "JNI: %s\n", g_getenv("TZ"));
+	size_t size;
+	char buf[MAXWIDTH];
+	strftime(buf, size, "%a, %d %b %Y %H:%M:%S %z %Z", localtime(&timestamp));
+	fprintf(stderr, "JNI: %d; %s and %d\n", (int) timestamp, buf, brokendown.tm_isdst);
+	fflush(stderr);
+#endif
+
+	/*
+	 * Bizarre bug that mktime adds an hour of DST to the displayed time if in DST.
+	 */
+	if (brokendown.tm_isdst == 1) {
+		timestamp -= 3600;
+	}
+		
+	return (jlong) timestamp;
+}
diff --git a/src/bindings/org/freedesktop/bindings/Time.java b/src/bindings/org/freedesktop/bindings/Time.java
new file mode 100644
index 0000000..299f074
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Time.java
@@ -0,0 +1,197 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/*
+ * This code imported into java-gnome from the SlashTime project's
+ * com.operationaldynamics.slashtime.NativeTime; it's mostly here because we
+ * needed access to three (and only three) native functions from the C library
+ * in the `slashtime` program, and making that application's build
+ * infrastructure native aware was a lot of pain for not much benefit. So here
+ * they are, java-gnome style.
+ */
+
+/**
+ * Utility functions to format date/time groups in timezone aware fashion.
+ * These methods work off the timezone data installed on your system and are
+ * accessed directly through the standard C library.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class Time
+{
+    private Time() {}
+
+    /**
+     * Adjust the timezone being used for formatted time/date output
+     * calculations.
+     * 
+     * <p>
+     * <b>This will change the timezone as far as the entire program is
+     * concerned.</b> If you have some reason to restore the original setting,
+     * use {@link Environment#getEnv(String) getEnv()}.
+     * 
+     * <p>
+     * <i>This works by changing the environment variable <code>TZ</code> and
+     * then calling <code>tzset()</code>. That may or may not be what you
+     * want. We've made it static since this impacts the <b>entire</b>
+     * process. If someone can figure out a way to change the timezone that
+     * <code>strftime()</code> thinks it is in without doing this, then please
+     * let us know.</i>
+     * 
+     * @param zoneinfo
+     *            A String of the form "Australia/Sydney", "America/Toronto",
+     *            "America/New_York", or "Europe/London", etc. Some zones have
+     *            definitive abbreviations, notably Universal Time,
+     *            Co-ordinated as "UTC". In case it wasn't obvious, these are
+     *            files in <code>/usr/share/zoneinfo/</code> and are relative
+     *            to that path.
+     * @see <a
+     *      href="http://manpages.courier-mta.org/htmlman3/tzset.3.html">tzset(3)</a>
+     */
+    /*
+     * TODO Figure out what affect this has on the Java Date and Calendar
+     * classes, if any.
+     */
+    public static void setTimeZone(final String zoneinfo) {
+        if (zoneinfo == null) {
+            throw new IllegalArgumentException("zoneinfo can't be null");
+        }
+        if (zoneinfo.equals("")) {
+            throw new IllegalArgumentException("zoneinfo can't be blank");
+        }
+
+        tzset(zoneinfo);
+    }
+
+    private static final native void tzset(String zoneinfo);
+
+    /**
+     * Output the date per the descriptor given in the <code>format</code>
+     * parameter.
+     * 
+     * <p>
+     * Feel free to call this several times to get isolated Strings with just
+     * the bits you want. For example, we do
+     * 
+     * <pre>
+     * long when;
+     * 
+     * when = System.currentTimeMillis();
+     * 
+     * ... = formatTime("%H:%M", when);
+     * ... = formatTime("%a,%e %b %y", when);
+     * ... = formatTime("%Z", when);
+     * </pre>
+     * 
+     * in quick succession to get time, date, and timezone, respectively, just
+     * the way we like it.
+     * 
+     * <p>
+     * <i>This is a wrapper around <code>strftime()</code> from the standard C
+     * library. It is exposed because the formatting is done according to the
+     * value of the <code>TZ</code> environment variable, which in turn draws
+     * from the system zoneinfo libraries, data which is <b>much</b> more up
+     * to date than what Java offers.</i>
+     * 
+     * @param when
+     *            the number of seconds since Epoch being the date/time group
+     *            you wish to present according to <code>format</code>.
+     * @see <a
+     *      href="http://manpages.courier-mta.org/htmlman3/strftime.3.html">strftime(3)</a>
+     */
+    public static String formatTime(final String format, final long when) {
+        if (format == null) {
+            throw new IllegalArgumentException("format can't be null");
+        }
+        if (format.equals("")) {
+            throw new IllegalArgumentException(
+                    "Not really much point in a format String with nothing in it");
+        }
+        return strftime(format, when);
+    }
+
+    private static final native String strftime(String format, long timestamp);
+
+    /**
+     * Compose a timestamp (the number of seconds since epoch) from individual
+     * components of a date/time group. Takes into account the current system
+     * timezone setting.
+     * 
+     * <p>
+     * <i>This is essentially a wrapper around <code>mktime()</code>.</i>
+     * 
+     * @param year
+     *            the year, four digits
+     * @param month
+     *            the month, range <code>1-12</code>
+     * @param day
+     *            the day, range <code>1-{28,29,30,31}</code> (depending on
+     *            the month, of course)
+     * @param hour
+     *            the hour, range <code>0-23</code>
+     * @param minute
+     *            the minute, <code>0-59</code>
+     * @param second
+     *            the second, <code>0-59</code>
+     * @see <a
+     *      href="http://manpages.courier-mta.org/htmlman3/ctime.3.html">mktime(3)</a>
+     */
+    public static long makeTime(final int year, final int month, final int day, final int hour,
+            final int minute, final int second) {
+        if (year < 0) {
+            throw new IllegalArgumentException("Year");
+        }
+        if ((month < 1) || (month > 12)) {
+            throw new IllegalArgumentException("Month");
+        }
+        if ((day < 1) || (day > 31)) {
+            throw new IllegalArgumentException("Day");
+        }
+        if ((hour < 0) || (hour > 23)) {
+            throw new IllegalArgumentException("Hour");
+        }
+        if ((minute < 0) || (minute > 59)) {
+            throw new IllegalArgumentException("Minute");
+        }
+        if ((second < 0) || (second > 59)) {
+            throw new IllegalArgumentException("Second");
+        }
+
+        return mktime(year, month, day, hour, minute, second);
+    }
+
+    private static final native long mktime(int year, int month, int day, int hour, int minute,
+            int second);
+}
diff --git a/src/bindings/org/freedesktop/bindings/Version.java b/src/bindings/org/freedesktop/bindings/Version.java
new file mode 100644
index 0000000..0fd499e
--- /dev/null
+++ b/src/bindings/org/freedesktop/bindings/Version.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2013 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.bindings;
+
+/**
+ * Version constants for the java-gnome library. The top level
+ * <code>.config</code> Makefile fragment depends on this file and the
+ * <code>./configure</code> of Equivalence extracts the values for the library
+ * API version and (pending) release version from the constants defined
+ * herein.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.2
+ */
+/*
+ * This data was formerly in org.gnome.gtk.Gtk; moved here so that hacking on
+ * that file's code does not require re-configuring every time it is saved.
+ * Later renamed from org.gnome.gtk.Version
+ * 
+ * We now go to the trouble of wrapping these in getters because otherwise
+ * foreign classes will inline these values, making propegating the changes a
+ * nightmare.
+ */
+public final class Version
+{
+    private static final String APIVERSION = "4.1";
+
+    private static final String VERSION = "4.1.3";
+
+    /**
+     * The full (usually three digit) version of java-gnome. This is used in a
+     * number of the examples and screenshots, but far more critically it is
+     * used to precisely identify which version of the shared library with the
+     * native code is to be loaded.
+     */
+    public static final String getVersion() {
+        return VERSION;
+    }
+
+    /**
+     * The API version (also known as "SLOT") of the java-gnome library.
+     * Notably, this is used to name the <code>.jar</code> file.
+     */
+    public static final String getAPI() {
+        return APIVERSION;
+    }
+
+    private Version() {}
+}
diff --git a/src/bindings/org/freedesktop/cairo/Antialias.java b/src/bindings/org/freedesktop/cairo/Antialias.java
new file mode 100644
index 0000000..37b4be2
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Antialias.java
@@ -0,0 +1,91 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008      Vreixo Formoso
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The type of antialiasing to do when rendering text or shapes.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class Antialias extends Constant
+{
+    private Antialias(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Use the default antialiasing for the subsystem and target device.
+     * Assuming your X server is hehaving, this will Just Work (tm) properly,
+     * and is what you want.
+     */
+    public static final Antialias DEFAULT = new Antialias(CairoAntialias.DEFAULT, "DEFAULT");
+
+    /**
+     * Perform single-color antialiasing.
+     * 
+     * <p>
+     * <i>This means (for example) "using shades of gray for black text on a
+     * white background".</i>
+     */
+    /*
+     * FIXME what does this actually mean, really?
+     */
+    public static final Antialias GRAY = new Antialias(CairoAntialias.GRAY, "GRAY");
+
+    /**
+     * Don't do antialiasing.
+     * 
+     * <p>
+     * <i>Strictly, this means using a "bilevel alpha mask".</i>
+     */
+    public static final Antialias NONE = new Antialias(CairoAntialias.NONE, "NONE");
+
+    /**
+     * Perform antialiasing based on the subpixel ordering.
+     * 
+     * <p>
+     * When the layout of the individual colour elements making up each
+     * individual pixel on an LCD panel is known, then Cairo is able to do an
+     * even more subtle job of antialiasing.
+     * 
+     * <p>
+     * This has no effect on CRT monitors, where the pixels are rendered as
+     * unique points by the ray gun, and are not the result of the cumulative
+     * effect of three different co-located light sources at each pixel.
+     */
+    public static final Antialias SUBPIXEL = new Antialias(CairoAntialias.SUBPIXEL, "SUBPIXEL");
+}
diff --git a/src/bindings/org/freedesktop/cairo/CairoMatrixOverride.c b/src/bindings/org/freedesktop/cairo/CairoMatrixOverride.c
new file mode 100644
index 0000000..3cf58f4
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/CairoMatrixOverride.c
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_freedesktop_cairo_CairoMatrixOverride.h"
+
+/*
+ * Allocates a CairoMatrix by calling the boxed's _copy() function on a local
+ * struct variable. See GtkTreeIterOverride.c for discussion and possible
+ * remedies.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_freedesktop_cairo_CairoMatrixOverride_cairo_1matrix_1init_1identity
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	cairo_matrix_t* result;
+	
+	// allocate a matrix. No need to 0 it
+	result = g_slice_new(cairo_matrix_t);
+
+	// because we call an initializing function
+	cairo_matrix_init_identity(result);
+
+	// and finally
+	return (jlong) result;
+}
+
+JNIEXPORT void JNICALL
+Java_org_freedesktop_cairo_CairoMatrixOverride_cairo_1matrix_1free
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	cairo_matrix_t* self;
+
+	// convert self
+	self = (cairo_matrix_t*) _self;
+	
+	// call function
+	g_slice_free(cairo_matrix_t, self);
+}
diff --git a/src/bindings/org/freedesktop/cairo/CairoMatrixOverride.java b/src/bindings/org/freedesktop/cairo/CairoMatrixOverride.java
new file mode 100644
index 0000000..05901ce
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/CairoMatrixOverride.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Expose an allocator for cairo_matrix_t.
+ * 
+ * @author Andrew Cowie
+ */
+final class CairoMatrixOverride extends Plumbing
+{
+    static final long createMatrixIdentity() {
+        synchronized (lock) {
+            return cairo_matrix_init_identity();
+        }
+    }
+
+    private static native final long cairo_matrix_init_identity();
+
+    static final void free(Matrix self) {
+        synchronized (lock) {
+            cairo_matrix_free(pointerOf(self));
+        }
+    }
+
+    private static native final void cairo_matrix_free(long self);
+}
diff --git a/src/bindings/org/freedesktop/cairo/CairoPatternOverride.c b/src/bindings/org/freedesktop/cairo/CairoPatternOverride.c
new file mode 100644
index 0000000..9881568
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/CairoPatternOverride.c
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_freedesktop_cairo_CairoPatternOverride.h"
+
+JNIEXPORT jlong JNICALL
+Java_org_freedesktop_cairo_CairoPatternOverride_cairo_1pattern_1get_1surface
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	cairo_status_t result;
+	cairo_pattern_t* self;
+	cairo_surface_t* surface;
+
+	// convert parameter self
+	self = (cairo_pattern_t*) _self;
+
+	// call function
+	result = cairo_pattern_get_surface(self, &surface);
+
+	// cleanup parameter self
+
+	/*
+	 * Check return value
+	 */
+	if (result != CAIRO_STATUS_SUCCESS) {
+		bindings_java_throwByName(env, "org/freedesktop/cairo/FatalError", "Not a SurfacePatten!");
+		return 0L;
+	}
+
+	return (jlong) surface;
+}
diff --git a/src/bindings/org/freedesktop/cairo/CairoPatternOverride.java b/src/bindings/org/freedesktop/cairo/CairoPatternOverride.java
new file mode 100644
index 0000000..40fab57
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/CairoPatternOverride.java
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * cairo_pattern_get_surface() uses an out parameter. Annoying, and better to
+ * use this than misusing the .defs data.
+ * 
+ * @author Andrew Cowie
+ */
+class CairoPatternOverride extends Plumbing
+{
+    /*
+     * Implementation inspired by CairoContext.getTarget().
+     */
+    static final Surface getSurface(Pattern self) {
+        long result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = cairo_pattern_get_surface(pointerOf(self));
+
+            return (Surface) entityFor(Surface.class, result);
+        }
+    }
+
+    /**
+     * @throws org.freedesktop.cairo.FatalError
+     */
+    private static native final long cairo_pattern_get_surface(long self);
+}
diff --git a/src/bindings/org/freedesktop/cairo/CairoSurfaceOverride.c b/src/bindings/org/freedesktop/cairo/CairoSurfaceOverride.c
new file mode 100644
index 0000000..94396e5
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/CairoSurfaceOverride.c
@@ -0,0 +1,142 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_freedesktop_cairo_CairoSurfaceOverride.h"
+
+/*
+ * Transfer struct to carry two parameters needed for the call to
+ * ReleaseByteArrayElements to cleanup our mess.
+ */
+
+typedef struct
+{
+	jbyteArray array;
+	jbyte* data;
+} ImageCleanup;
+
+/*
+ * Signature is (*cairo_destroy_funct_t) meeting the requirements of the
+ * fifth parameter of cairo_surface_set_mime_data() below.
+ */
+static void
+release_image_data
+(
+	void* pointer
+)
+{
+	ImageCleanup* cleanup;
+	JNIEnv* env;
+	jbyteArray array;
+	jbyte* data;
+
+	cleanup = (ImageCleanup*) pointer;
+	array = (jbyteArray) cleanup->array;
+	data = (jbyte*) cleanup->data;
+
+	env = bindings_java_getEnv();
+
+	// call function to free image data
+	(*env)->ReleaseByteArrayElements(env, array, data, JNI_ABORT);
+
+	// drop reference
+ 	(*env)->DeleteGlobalRef(env, array);
+
+	// cleanup transfer struct
+	g_free(cleanup);
+}
+
+
+JNIEXPORT void JNICALL
+Java_org_freedesktop_cairo_CairoSurfaceOverride_cairo_1surface_1set_1mime_1data
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jstring _mimeType,
+	jbyteArray _data
+)
+{
+	cairo_status_t result;
+	cairo_surface_t* self;
+	const char* mimeType;
+	unsigned char* data;
+	long length;
+	ImageCleanup* cleanup;
+
+	// convert parameter self
+	self = (cairo_surface_t*) _self;
+
+	// convert parameter mimeType
+	mimeType = (const char*) bindings_java_getString(env, _mimeType);
+	if (mimeType == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	// convert parameter data
+	// set up the data and length parameters.
+	length = (*env)->GetArrayLength(env, _data);
+	data = (unsigned char*) (*env)->GetByteArrayElements(env, _data, NULL);
+	if (data == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	/*
+	 * Setup transfer object
+	 */
+
+	cleanup = g_malloc(sizeof(ImageCleanup));
+	cleanup->array = (jbyteArray) (*env)->NewGlobalRef(env, _data);
+	cleanup->data = (jbyte*) data;
+
+	// call function
+	result = cairo_surface_set_mime_data(self, mimeType, data, length, release_image_data, cleanup);
+
+	// cleanup parameter self
+
+	// cleanup parameter mimeType
+	bindings_java_releaseString(mimeType);
+
+	// cleanup parameter data
+	// done in callback
+
+	/*
+	 * Check return value
+	 */
+	if (result != CAIRO_STATUS_SUCCESS) {
+		bindings_java_throwByName(env, "org/freedesktop/cairo/FatalError", "Out of memory");
+		return;
+	}
+}
diff --git a/src/bindings/org/freedesktop/cairo/CairoSurfaceOverride.java b/src/bindings/org/freedesktop/cairo/CairoSurfaceOverride.java
new file mode 100644
index 0000000..b5c10ff
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/CairoSurfaceOverride.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Handle calling setMimeData().
+ * 
+ * @author Andrew Cowie
+ */
+class CairoSurfaceOverride extends Plumbing
+{
+    static final void setMimeData(Surface self, MimeType type, byte[] data) {
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        if (data == null) {
+            throw new IllegalArgumentException("data can't be null");
+        }
+
+        synchronized (lock) {
+            cairo_surface_set_mime_data(pointerOf(self), type.getMimeType(), data);
+        }
+    }
+
+    /**
+     * @throws org.freedesktop.cairo.FatalError
+     */
+    private static native final void cairo_surface_set_mime_data(long self, String mimeType, byte[] data);
+}
diff --git a/src/bindings/org/freedesktop/cairo/Content.java b/src/bindings/org/freedesktop/cairo/Content.java
new file mode 100644
index 0000000..8f5075d
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Content.java
@@ -0,0 +1,66 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants to specify the colour space that will apply when creating a new
+ * Surface based on an existing one. Used when you call Surface's
+ * {@link Surface#createSimilar(Content, int, int) createSimilar()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class Content extends Flag
+{
+    private Content(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Surface will hold colour content only.
+     */
+    public static final Content COLOR = new Content(CairoContent.COLOR, "COLOR");
+
+    /**
+     * Surface will hold alpha content only.
+     */
+    public static final Content ALPHA = new Content(CairoContent.ALPHA, "ALPHA");
+
+    /**
+     * Surface will hold full data, colour and alpha both.
+     */
+    public static final Content COLOR_ALPHA = new Content(CairoContent.COLOR_ALPHA, "COLOR_ALPHA");
+
+}
diff --git a/src/bindings/org/freedesktop/cairo/Context.java b/src/bindings/org/freedesktop/cairo/Context.java
new file mode 100644
index 0000000..13613a4
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Context.java
@@ -0,0 +1,922 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gdk.RGBA;
+import org.gnome.gdk.Window;
+import org.gnome.pango.Layout;
+import org.gnome.pango.LayoutLine;
+import org.gnome.rsvg.Handle;
+
+/**
+ * Carry out drawing operations with the Cairo Graphics library. The current
+ * Context contains the state of the rendering engine, including the
+ * co-ordinates of as yet undrawn elements.
+ * 
+ * <h2>Constructing</h2>
+ * 
+ * Graphics will be rendered to the Surface specified when you construct the
+ * Context:
+ * <ul>
+ * <li>If creating an image to be written to a file, start with an
+ * {@link ImageSurface}, do your drawing, and then use Surface's writeToPNG()
+ * to output your image.
+ * <li>If drawing to the screen in a user interface application, you get a
+ * Context in your Widget's {@link org.gnome.gtk.Widget.Draw Widget.Draw}
+ * signal, and do your drawing there.
+ * </ul>
+ * 
+ * See the links above for examples of each use case.
+ * 
+ * <h2>Drawing Operations</h2>
+ * 
+ * Context has numerous methods allowing you to draw shapes, patterns, and
+ * images to the Surface you are drawing on. These operations are all quite
+ * low level, but give you very fine grained control over what is drawn and
+ * where.
+ * 
+ * <p>
+ * It is somewhat traditional to call your Context <code>cr</code>.
+ * 
+ * <p>
+ * All of the methods on Context take arguments of type <code>double</code> to
+ * represent co-ordinates, angles, colours, transparency levels, etc. Colours
+ * are represented as values between <code>0.0</code> and <code>0.1</code>,
+ * for example:
+ * 
+ * <pre>
+ * cr.setSource(1.0, 0.0, 0.0);
+ * </pre>
+ * 
+ * for solid red. In the case of co-ordinates, you can simply specify the
+ * pixel address you wish to move to or draw to: <img src="Context-line.png"
+ * class="snapshot">
+ * 
+ * <pre>
+ * cr.moveTo(10, 10);
+ * cr.lineTo(90, 50);
+ * cr.stroke();
+ * </pre>
+ * 
+ * where stroke draws the current path with the current line thickness.
+ * 
+ * <p>
+ * Various other drawing operations are done by creating a shape and then
+ * filling it in: <img src="Context-rectangle.png" class="snapshot">
+ * 
+ * <pre>
+ * cr.rectangle(30, 20, 60, 60);
+ * cr.fill();
+ * </pre>
+ * 
+ * and so on.
+ * 
+ * <p>
+ * <i>Obviously this is only the beginning of our documentation for Cairo.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Carl Worth
+ * @author Behdad Esfahbod
+ * @author Vreixo Formoso
+ * @author Zak Fenton
+ * @since 4.0.7
+ * @see <a href="http://www.cairographics.org/documentation/">Cairo Graphics
+ *      documentation</a>
+ */
+public class Context extends Entity
+{
+    protected Context(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        CairoContext.destroy(this);
+    }
+
+    /**
+     * Construct a new "Cairo Context". You supply the Surface that you are
+     * drawing to.
+     * 
+     * @since 4.0.7
+     */
+    public Context(Surface target) {
+        super(CairoContext.createContext(target));
+    }
+
+    /**
+     * Check the status of the Cairo Context, and fail with an exception if it
+     * is other than SUCCESS. This should be called by each method in our
+     * Cairo bindings.
+     * 
+     * <p>
+     * <i>The the fact that errors are not checked for after each operation is
+     * a C API convenience only.</i>
+     */
+    void checkStatus() {
+        checkStatus(CairoContext.status(this));
+    }
+
+    /**
+     * Construct a new "Cairo Context" related to a Window. This is the magic
+     * glue which allows you to link between GTK's Widgets and Cairo's drawing
+     * operations.
+     * 
+     * <p>
+     * You may find yourself needing to get at the Surface that is being drawn
+     * on. Use {@link #getTarget() getTarget()}.
+     * 
+     * <p>
+     * <i>Strictly speaking, this method is a part of GDK. We expose it here
+     * as we are, from the Java bindings' perspective, constructing a Cairo
+     * Context. So a constructor it is.</i>
+     * 
+     * @since 4.1.1
+     */
+    public Context(Window window) {
+        super(GdkCairoSupport.createContext(window));
+        checkStatus();
+    }
+
+    /**
+     * Makes a copy of the current state of the Context and saves it on an
+     * internal stack. The saved state is recovered using {@link #restore()}.
+     * 
+     * <p>
+     * The utility of this function is to preserve a configuration that will
+     * be temporary modified. For example, if you are drawing something with a
+     * given color, line width, etc. and you need to change some of those
+     * properties, draw something else, and then go back to the original
+     * state. Instead of changing back all properties again, you can just
+     * invoke <code>save()</code> before modifying them, and then
+     * <code>restore()</code> later, once you want to use the original
+     * configuration again.
+     * 
+     * <p>
+     * Multiple calls to <code>save()</code> and <code>restore()</code> can be
+     * nested. Each call to <code>restore()</code> restores the state from the
+     * matching paired <code>save()</code>.
+     * 
+     * @since 4.0.10
+     */
+    public void save() {
+        CairoContext.save(this);
+        checkStatus();
+    }
+
+    /**
+     * Restores the Context to the last (nested) saved state.
+     * 
+     * @throws IllegalStateException
+     *             If there is no matching previous call to
+     *             <code>save()</code>.
+     * 
+     * @since 4.0.10
+     */
+    public void restore() {
+        CairoContext.restore(this);
+        Status status = CairoContext.status(this);
+        if (status == Status.INVALID_RESTORE) {
+            throw new IllegalStateException("No matching call to save()");
+        }
+        checkStatus(status);
+    }
+
+    /**
+     * Applies a scale transformation. It scales X and Y axis by sx and sy,
+     * respectively.
+     * 
+     * <p>
+     * The effect of this is that the points you submit are scaled by sx, sy.
+     * For example, the following sequence:
+     * 
+     * <pre>
+     * Context cr;
+     * 
+     * cr.scale(2.0, 3.0);
+     * cr.moveTo(1.0, 1.0);
+     * cr.lineTo(2.0, 2.0);
+     * cr.stroke();
+     * </pre>
+     * 
+     * Will actually draw a line from (2.0, 3.0) to (4.0, 6.0) in the target
+     * Surface.
+     * 
+     * <p>
+     * Note that you can also use negative numbers. Do not scale by 0.
+     * 
+     * <p>
+     * See {@link Matrix} for the full suite of affine transformations
+     * available.
+     * 
+     * @since 4.0.12
+     */
+    public void scale(double sx, double sy) {
+        CairoContext.scale(this, sx, sy);
+        checkStatus();
+    }
+
+    /**
+     * Applies a translation transformation. What this does is move the point
+     * of origin so that <code>(0, 0)</code> is now at a new position.
+     * 
+     * <pre>
+     * cr.translate(20,50);
+     * cr.moveTo(20,20);    // This is now 40,70
+     *  ...
+     * </pre>
+     * 
+     * <p>
+     * See {@link Matrix} for the full suite of affine transformations
+     * available.
+     * 
+     * @since 4.0.10
+     */
+    public void translate(double tx, double ty) {
+        CairoContext.translate(this, tx, ty);
+    }
+
+    /**
+     * Applies a rotate transformation. This rotates the co-ordinates of
+     * subsequent drawing operations through a given angle (in radians). The
+     * rotation happens around the origin <code>(0, 0)</code>. To rotate
+     * around a different point, try the following:
+     * 
+     * <pre>
+     * cr.translate(x, y);
+     * cr.rotate(r);
+     * cr.translate(-x, -y);
+     * </pre>
+     * 
+     * <p>
+     * See {@link Matrix} for the full suite of affine transformations
+     * available.
+     * 
+     * @since 4.0.10
+     */
+    public void rotate(double r) {
+        CairoContext.rotate(this, r);
+    }
+
+    /**
+     * Set the source pattern within this Context to the given RGBA colour.
+     * 
+     * @since 4.1.1
+     */
+    public void setSource(RGBA color) {
+        GdkCairoSupport.setSourceRgba(this, color);
+        checkStatus();
+    }
+
+    /**
+     * Set the source pattern within this Context to an opaque colour. The
+     * parameters each take the range <code>0.0</code> to <code>1.0</code>.
+     * 
+     * @since 4.0.10
+     */
+    public void setSource(double red, double green, double blue) {
+        CairoContext.setSourceRgb(this, red, green, blue);
+        checkStatus();
+    }
+
+    /**
+     * Set the source pattern within this Context to a translucent colour. The
+     * parameters each take the range <code>0.0</code> to <code>1.0</code>.
+     * For the <code>alpha</code> parameter, a value of <code>0.0</code>
+     * indicates full transparency, and <code>1.0</code> is full opacity (ie,
+     * normal).
+     * 
+     * @since 4.0.10
+     */
+    public void setSource(double red, double green, double blue, double alpha) {
+        CairoContext.setSourceRgba(this, red, green, blue, alpha);
+        checkStatus();
+    }
+
+    /**
+     * Add a line from the current location to <code>x</code>,<code>y</code>.
+     * After the call the current point will be <code>x</code>,<code>y</code>.
+     * 
+     * @since 4.0.7
+     */
+    public void lineTo(double x, double y) {
+        CairoContext.lineTo(this, x, y);
+        checkStatus();
+    }
+
+    /**
+     * Set the line width for this Context. This will have effect in next call
+     * to {@link #stroke()}. Default value is <code>2.0</code>.
+     * 
+     * @since 4.0.7
+     */
+    public void setLineWidth(double width) {
+        CairoContext.setLineWidth(this, width);
+        checkStatus();
+    }
+
+    /**
+     * Get the line width for this Context.
+     * 
+     * @since 4.0.12
+     */
+    public double getLineWidth() {
+        return CairoContext.getLineWidth(this);
+    }
+
+    /**
+     * Set the antialiasing mode of the rasterizer used for drawing shapes.
+     * This value is a hint, and a particular backend may or may not support a
+     * particular value.
+     * 
+     * @since 4.0.7
+     */
+    public void setAntialias(Antialias antialias) {
+        CairoContext.setAntialias(this, antialias);
+        checkStatus();
+    }
+
+    /**
+     * Move to a new location without drawing, beginning a new sub-path. After
+     * the call the current point will be <code>x</code>,<code>y</code>.
+     * 
+     * @since 4.0.7
+     */
+    public void moveTo(double x, double y) {
+        CairoContext.moveTo(this, x, y);
+        checkStatus();
+    }
+
+    /**
+     * Draw the current path as a line.
+     * 
+     * @since 4.0.7
+     */
+    public void stroke() {
+        CairoContext.stroke(this);
+        checkStatus();
+    }
+
+    /**
+     * Confines subsequent drawing operations to the inside area of the
+     * current path.
+     * 
+     * @since 4.0.10
+     */
+    public void clip() {
+        CairoContext.clip(this);
+        checkStatus();
+    }
+
+    /**
+     * Confines subsequent drawing operations to the inside area of the
+     * current path, leaving the path intact for subsequent reuse.
+     * 
+     * @since 4.0.10
+     */
+    public void clipPreserve() {
+        CairoContext.clipPreserve(this);
+        checkStatus();
+    }
+
+    /**
+     * Draw the current path as a line, preserving the path such that it can
+     * be used used again. If you have drawn a shape and want to
+     * <code>fill()</code> it, you are better off calling
+     * {@link #fillPreserve() fillPreserve()} and, changing source and then
+     * calling {@link #stroke() stroke()}; otherwise your fill will blot out
+     * the inside of your stroke.
+     * 
+     * @since 4.0.10
+     */
+    public void strokePreserve() {
+        CairoContext.strokePreserve(this);
+        checkStatus();
+    }
+
+    /**
+     * Get the current source Pattern for this Context.
+     * 
+     * @since 4.0.7
+     */
+    public Pattern getSource() {
+        final Pattern result;
+
+        result = CairoContext.getSource(this);
+        checkStatus();
+
+        return result;
+    }
+
+    /**
+     * Get the Surface that this Context is drawing on.
+     * 
+     * <p>
+     * <i>Yes, this method has a stupid name. It really should be
+     * <code>getSurface()</code>. So many people have a hard time finding the
+     * generic method that allows you to get to the Surface that they're
+     * considering renaming this to <code>cairo_get_surface</code> in Cairo
+     * itself, but until they do, we'll stick with the algorithmic mapping of
+     * <code>cairo_get_target</code>.</i>
+     * 
+     * @since 4.0.7
+     */
+    public Surface getTarget() {
+        final Surface result;
+
+        result = CairoContext.getTarget(this);
+        checkStatus();
+
+        return result;
+    }
+
+    /**
+     * Set the operation that will govern forthcoming compositing actions.
+     * 
+     * <p>
+     * One particularly useful sequence is clearing the Surface to all
+     * transparent pixels:
+     * 
+     * <pre>
+     * cr.setOperator(Operator.CLEAR);
+     * cr.paint();
+     * </pre>
+     * 
+     * @since 4.0.7
+     */
+    public void setOperator(Operator op) {
+        CairoContext.setOperator(this, op);
+        checkStatus();
+    }
+
+    /**
+     * Paint the current source everywhere within the current clip region.
+     * 
+     * @since 4.0.7
+     */
+    public void paint() {
+        CairoContext.paint(this);
+        checkStatus();
+    }
+
+    /**
+     * Create a Pattern from a Surface, and then use it in this Context. This
+     * is a convenience method.
+     * 
+     * <p>
+     * <code>x</code>,<code>y</code> define where, in user-space coordinates,
+     * that the Pattern should appear.
+     * 
+     * <p>
+     * You can get the Pattern that was created internally by calling this
+     * with {@link #getSource() getSource()} and manipulate it further if you
+     * need to change the defaults.
+     * 
+     * @since 4.0.10
+     */
+    public void setSource(Surface surface, double x, double y) {
+        CairoContext.setSourceSurface(this, surface, x, y);
+        checkStatus();
+    }
+
+    /**
+     * Draw a (closed) rectangular sub-path. The rectangle will be at
+     * <code>x</code>,<code>y</code> in user-space coordinates of the given
+     * <code>width</code> and <code>height</code>.
+     * 
+     * @since 4.0.7
+     */
+    public void rectangle(double x, double y, double width, double height) {
+        CairoContext.rectangle(this, x, y, width, height);
+        checkStatus();
+    }
+
+    /**
+     * Adds a circular arc of the given radius to the current path. The arc is
+     * centered at <code>xc,yc</code>, begins at <code>angle1</code> and
+     * proceeds in the direction of increasing angles to end at
+     * <code>angle2</code>. If <code>angle2</code> is less than
+     * <code>angle1</code> it will be progressively increased by
+     * <code>2π</code> until it is greater than <code>angle1</code>.
+     * 
+     * <p>
+     * If there is a current point, an initial line segment will be added to
+     * the path to connect the current point to the beginning of the arc.
+     * 
+     * <p>
+     * Angles are measured in radians. An angle of <code>0.0</code> is in the
+     * direction of the positive <i>x</i> axis. An angle of
+     * <code>π/2</code> radians (90°) is in the direction of the
+     * positive <i>y</i> axis. Angles increase in the direction from the
+     * positive <i>x</i> axis toward the positive <i>y</i> axis, increasing in
+     * a clockwise direction. <img class="snapshot" src="Context-arc.png">
+     * 
+     * <p>
+     * The 60° arc shown is from angle <code>0</code> through
+     * <code>+π/3</code> radians, and was achieved with the following call:
+     * 
+     * <pre>
+     * cr.arc(50.0, 50.0, 30.0, 0.0, Math.PI / 3.0);
+     * </pre>
+     * 
+     * The illustration has its axis centred at position <code>50</code>,
+     * <code>50</code>. The key point to note is that positive <i>y</i> is
+     * towards the <b>bottom</b>, and that increasing angles as drawn by this
+     * function go <b>clockwise</b> which is backwards from the Cartesian or
+     * Polar co-ordinates you're probably used to using in mathematics.
+     * 
+     * <p>
+     * See {@link #arcNegative(double, double, double, double, double)
+     * arcNegative()} to draw arcs that go in the other direction.
+     * 
+     * @since 4.0.7
+     */
+    public void arc(double xc, double yc, double radius, double angle1, double angle2) {
+        CairoContext.arc(this, xc, yc, radius, angle1, angle2);
+        checkStatus();
+    }
+
+    /**
+     * Adds a circular arc of the given radius to the current path. The arc is
+     * centered at <code>xc</code>,<code>yc</code>, will begin at
+     * <code>angle1</code> and proceeds in the direction of decreasing angles
+     * to end at <code>angle2</code>. If <code>angle2</code> is greater than
+     * <code>angle1</code> it will be progressively decreased by
+     * <code>2π</code> until it is less than <code>angle1</code>. <img
+     * class="snapshot" src="Context-arcNegative.png">
+     * 
+     * <p>
+     * This 135° arc shown in the illustration goes from <code>0</code> to
+     * <code>-3/4&pi</code> radians:
+     * 
+     * <pre>
+     * cr.arcNegative(50.0, 50.0, 30.0, 0.0, -Math.PI * 3.0 / 4.0);
+     * </pre>
+     * 
+     * note that in this example the second angle is negative; if
+     * <code>3/4&pi</code> had been specified the arc would have continued to
+     * a point 45° below the <code>-</code><i>x</i> axis.
+     * 
+     * <p>
+     * See {@link #arc(double, double, double, double, double) arc()} for
+     * drawing arcs in the positive, clockwise direction.
+     * 
+     * @since 4.0.7
+     */
+    public void arcNegative(double xc, double yc, double radius, double angle1, double angle2) {
+        CairoContext.arcNegative(this, xc, yc, radius, angle1, angle2);
+        checkStatus();
+    }
+
+    /**
+     * Fill the current path, implicitly closing sub-paths first. The drawing
+     * will be done according to the current FillRule. The path will be
+     * cleared after calling <code>fill()</code>; if you want to keep it use
+     * {@link #fillPreserve() fillPreserve()} instead.
+     * 
+     * @since 4.0.7
+     */
+    public void fill() {
+        CairoContext.fill(this);
+        checkStatus();
+    }
+
+    /**
+     * Sets the dash pattern used in lines drawn with {@link #stroke()
+     * stroke()}.
+     * 
+     * <p>
+     * The pattern is specified by an array of double values. Each value
+     * provides the length of alternate "on" and "off" portions of the stroke.
+     * 
+     * @since 4.0.12
+     */
+    /*
+     * TODO the offset seems not very useful, so I always use 0. Later we may
+     * want to expose setDash(double[], double) to allow offset specification
+     */
+    public void setDash(double[] dashes) {
+        CairoContext.setDash(this, dashes, dashes.length, 0);
+        checkStatus();
+    }
+
+    /**
+     * Fill the current path, preserving the path such that it can be used
+     * used again. This is useful if you have drawn a shape and want to
+     * {@link #stroke() stroke()} it with a different colour as an outline.
+     * 
+     * @since 4.0.7
+     */
+    public void fillPreserve() {
+        CairoContext.fillPreserve(this);
+        checkStatus();
+    }
+
+    /**
+     * Draw a paragraph of text. The top-left corner of the Layout's rendered
+     * extents will be drawn at the current Context point.
+     * 
+     * <p>
+     * The text to draw and its format is specified in a Pango {@link Layout},
+     * previously constructed with this Context.
+     * 
+     * @since 4.0.10
+     */
+    public void showLayout(Layout layout) {
+        CairoContext.showLayout(this, layout);
+        checkStatus();
+    }
+
+    /**
+     * Draw a single line of text as extracted from a Layout.
+     * 
+     * <p>
+     * Unlike the <code>showLayout()</code> taking a full Layout, this method
+     * draws the base line of the extent (its Rectangle's <code>x</code>,
+     * <code>y</code> origin) at the current Context point. See LayoutLine's
+     * {@link LayoutLine#getExtentsLogical() getExtentsLogical()} method for
+     * details.
+     * 
+     * @since 4.0.10
+     */
+    public void showLayout(LayoutLine line) {
+        CairoContext.showLayoutLine(this, line);
+        checkStatus();
+    }
+
+    /*
+     * This really doesn't belong here, but we don't have anywhere else for it
+     * right now. showLayout() above is lovely, and this is entirely parallel
+     * and complementary to it. So it'll do for now.
+     */
+    public void updateLayout(Layout layout) {
+        CairoContext.updateLayout(this, layout);
+        checkStatus();
+    }
+
+    /**
+     * Set a Pattern to be the source of this Context.
+     * 
+     * @since 4.0.7
+     */
+    public void setSource(Pattern pattern) {
+        CairoContext.setSource(this, pattern);
+        checkStatus();
+    }
+
+    /**
+     * Paint the current source using the alpha channel of
+     * <code>pattern</code> as a mask. This means "opaque areas of the mask
+     * will be painted with the source, whereas transparent areas will not be
+     * painted"
+     * 
+     * @since 4.0.7
+     */
+    public void mask(Pattern pattern) {
+        CairoContext.mask(this, pattern);
+        checkStatus();
+    }
+
+    /**
+     * Paint the current source using the alpha channel of the given
+     * <code>surface</code> as its mask. The Surface will be offset by
+     * <code>x</code> and <code>y</code> before drawing.
+     * 
+     * @since 4.0.10
+     */
+    public void mask(Surface surface, double x, double y) {
+        CairoContext.maskSurface(this, surface, x, y);
+    }
+
+    /**
+     * Given an image already loaded in a Pixbuf, set the current Source to be
+     * that image. For example, to put the image at the bottom right of your
+     * drawing area, you might do something like:
+     * 
+     * <pre>
+     * pixbuf = new Pixbuf(filename);
+     * cr.setSource(pixbuf, pageWidth - pixbuf.getWidth(), pageHeight - pixbuf.getHeight());
+     * cr.paint();
+     * </pre>
+     * 
+     * as <code>paint()</code> paints the current source "everywhere", and so
+     * down goes your image.
+     * 
+     * If you are drawing the same image data to screen frequently, consider
+     * caching the image in video memory. See {@link XlibSurface}.
+     * 
+     * @since 4.0.10
+     */
+    public void setSource(Pixbuf pixbuf, double x, double y) {
+        GdkCairoSupport.setSourcePixbuf(this, pixbuf, x, y);
+    }
+
+    /**
+     * Move to a location relative to the current point.
+     * 
+     * <p>
+     * If the point is at <code>x</code>,<code>y</code> then this will move
+     * the point to <code>x+dx</code>,<code>y+dy</code>.
+     * 
+     * <p>
+     * <i>In the underlying native library this is</i>
+     * <code>cairo_rel_move_to()</code>. <i>We have adjusted the name slightly
+     * to provide for better discoverability in the completion space.</i>
+     * 
+     * @since 4.0.10
+     */
+    public void moveRelative(double dx, double dy) {
+        CairoContext.relMoveTo(this, dx, dy);
+    }
+
+    /**
+     * Move to a location relative to the current point.
+     * 
+     * <p>
+     * If the point is at <code>x</code>,<code>y</code> then this will draw a
+     * line from <code>x</code>,<code>y</code> to <code>x+dx</code>,
+     * <code>y+dy</code>, leaving the point at the latter location.
+     * 
+     * <p>
+     * <i>In the underlying native library this is</i>
+     * <code>cairo_rel_line_to()</code>. <i>We have adjusted the name slightly
+     * to provide for better discoverability in the completion space.</i>
+     * 
+     * @since 4.0.10
+     */
+    public void lineRelative(double dx, double dy) {
+        CairoContext.relLineTo(this, dx, dy);
+    }
+
+    /**
+     * Get the x co-ordinate of the current point.
+     * 
+     * <p>
+     * You'll need to call this if you want to resume drawing at that point
+     * after calling <code>stroke()</code> or <code>fill()</code>, as after
+     * doing their work they clear the current path; the current point goes
+     * along with it.
+     * 
+     * <pre>
+     * // do some drawing
+     * 
+     * x = cr.getCurrentPointX();
+     * y = cr.getCurrentPointY();
+     * 
+     * cr.stroke();
+     * 
+     * cr.moveTo(x, y);
+     * 
+     * // carry on drawing
+     * </pre>
+     * 
+     * @since 4.0.10
+     */
+    public double getCurrentPointX() {
+        double[] x;
+        double[] y;
+
+        x = new double[1];
+        y = new double[1];
+
+        CairoContext.getCurrentPoint(this, x, y);
+
+        return x[0];
+    }
+
+    /**
+     * Get the y co-ordinate of the current point. See
+     * {@link #getCurrentPointX() getCurrentPointX()} for discussion of when
+     * you'd need this.
+     * 
+     * @since 4.0.10
+     */
+    public double getCurrentPointY() {
+        double[] x;
+        double[] y;
+
+        x = new double[1];
+        y = new double[1];
+
+        CairoContext.getCurrentPoint(this, x, y);
+
+        return y[0];
+    }
+
+    /**
+     * Apply the given Matrix to affine transform this Context. See
+     * {@link Matrix} for examples.
+     * 
+     * <p>
+     * Beware that if there is a scaling component, line widths resulting from
+     * <code>stroke()</code> calls will scale too!
+     * 
+     * @since 4.0.10
+     */
+    public void transform(Matrix matrix) {
+        CairoContext.transform(this, matrix);
+    }
+
+    /**
+     * Render an SVG image to this Cairo surface.
+     * 
+     * <p>
+     * <i>In the underlying native library this is</i>
+     * <code>rsvg_handle_render_cairo()</code>. <i>We have placed the call
+     * here to align with other Cairo baesd image and text rendering
+     * methods.</i>
+     * 
+     * @since 4.0.18
+     */
+    public void showHandle(Handle graphic) {
+        CairoContext.showHandle(graphic, this);
+    }
+
+    /**
+     * Close the current path.
+     * 
+     * <p>
+     * This makes the path a closed loop, rather than it being a line with
+     * caps at each end. Call this when you're trying to close a shape.
+     * 
+     * <p>
+     * The current path begins at the point given to the last moveTo() call.
+     * If there's no current point, then this has no effect.
+     * 
+     * @since 4.0.17
+     */
+    public void closePath() {
+        CairoContext.closePath(this);
+    }
+
+    /**
+     * Create a new path within the current one. Although
+     * {@link #moveTo(double, double) moveTo()} also creates a new sub-path,
+     * this allows you to do so without needing destination co-ordinates.
+     * 
+     * @since 4.0.17
+     */
+    public void newSubPath() {
+        CairoContext.newSubPath(this);
+    }
+
+    /**
+     * Change the fill algorithm. The default is {@link FillRule#WINDING
+     * WINDING}.
+     * 
+     * @since 4.0.17
+     */
+    public void setFillRule(FillRule setting) {
+        CairoContext.setFillRule(this, setting);
+    }
+
+    /**
+     * Is the supplied point in the area that would be filled if
+     * {@link #fill() fill()} was called with the current path?
+     * 
+     * @since 4.0.17
+     */
+    public boolean inFill(double x, double y) {
+        return CairoContext.inFill(this, x, y);
+    }
+
+    /**
+     * Is the supplied point in the thickness that would be drawn if
+     * {@link #stroke() stroke()} was called with the current path?
+     * 
+     * @since 4.0.17
+     */
+    public boolean inStroke(double x, double y) {
+        return CairoContext.inStroke(this, x, y);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Entity.java b/src/bindings/org/freedesktop/cairo/Entity.java
new file mode 100644
index 0000000..19434f2
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Entity.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Proxy;
+
+/**
+ * Opaque objects in the Cairo Graphics library.
+ * 
+ * <p>
+ * <i>This is just a base class to provide common functionality to various
+ * classes, notably checking status in a uniform way.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+abstract class Entity extends Proxy
+{
+    protected Entity(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Check that the internal state of Cairo is ok, throwing an exception
+     * otherwise. This is to be called by the bindings after every operation.
+     */
+    /*
+     * FUTURE It might be nice to find a way to get the code generator to
+     * insert this into the JNI code automatically. That's non trivial, if for
+     * no other reason than different parts of Cairo (ie Surface, Font) use
+     * different status checking functions. It doesn't hurt to have it here.
+     */
+    protected void checkStatus(Status status) {
+        if (status != Status.SUCCESS) {
+            throw new FatalError(status.toString() + "\n" + CairoContext.statusToString(status));
+        }
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Extend.java b/src/bindings/org/freedesktop/cairo/Extend.java
new file mode 100644
index 0000000..e1355dd
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Extend.java
@@ -0,0 +1,84 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants specifying what strategy is employed when drawing Patterns larger
+ * than the area intrinsically specified when constructing the Pattern.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class Extend extends Constant
+{
+    private Extend(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Pixels outside the Pattern area are transparent.
+     * 
+     * <p>
+     * This is the default for {@link SurfacePattern}s.
+     * 
+     * @since 4.0.17
+     */
+    public static final Extend NONE = new Extend(CairoExtend.NONE, "NONE");
+
+    /**
+     * Tile the Pattern by repeating it continuously.
+     * 
+     * @since 4.0.17
+     */
+    public static final Extend REPEAT = new Extend(CairoExtend.REPEAT, "REPEAT");
+
+    /**
+     * Tile the Pattern by reflecting it at its edges.
+     * 
+     * @since 4.0.17
+     */
+    public static final Extend REFLECT = new Extend(CairoExtend.REFLECT, "REFLECT");
+
+    /**
+     * Extend the Pattern by continuing (copying) the last pixel at the edges.
+     * 
+     * <p>
+     * This is the default for the gradient based {@link LinearPattern} and
+     * {@link RadialPattern}.
+     * 
+     * @since 4.0.17
+     */
+    public static final Extend PAD = new Extend(CairoExtend.PAD, "PAD");
+}
diff --git a/src/bindings/org/freedesktop/cairo/FatalError.java b/src/bindings/org/freedesktop/cairo/FatalError.java
new file mode 100644
index 0000000..2842a8d
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/FatalError.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Cairo is in an illegal state.
+ * 
+ * <p>
+ * In the java-gnome bindings of Cairo, we check the status of the library
+ * after every call. This is the exception that will be thrown if an error has
+ * occured.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class FatalError extends org.freedesktop.bindings.FatalError
+{
+    private static final long serialVersionUID = 1;
+
+    protected FatalError(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/FillRule.java b/src/bindings/org/freedesktop/cairo/FillRule.java
new file mode 100644
index 0000000..48e76c9
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/FillRule.java
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The rule governing how {@link Context#fill() fill()} works.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class FillRule extends Constant
+{
+    private FillRule(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Counts path crossings; if it crosses left it subtracts one, if it
+     * crosses right it adds one. If the final result is non-zero, then the
+     * region is filled. This is the default.
+     * 
+     * @since 4.0.17
+     */
+    public static final FillRule WINDING = new FillRule(CairoFillRule.WINDING, "WINDING");
+
+    /**
+     * Counts number of intersections; if odd then the region will be filled.
+     * 
+     * @since 4.0.17
+     */
+    public static final FillRule EVEN_ODD = new FillRule(CairoFillRule.EVEN_ODD, "EVEN_ODD");
+}
diff --git a/src/bindings/org/freedesktop/cairo/Filter.java b/src/bindings/org/freedesktop/cairo/Filter.java
new file mode 100644
index 0000000..a441c81
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Filter.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Used to specify the filtering that should be applied when reading pixel
+ * values from patterns. See Pattern's {@link Pattern#setFilter(Filter)
+ * setFilter()} for specifying the desired filter to be used with a particular
+ * pattern.
+ * 
+ * @author Will Temperley
+ * @since 4.0.20
+ */
+public class Filter extends Constant
+{
+    private Filter(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * A high-performance filter, with quality similar to
+     * {@link Filter#NEAREST}
+     */
+    public static final Filter FAST = new Filter(CairoFilter.FAST, "FAST");
+
+    /**
+     * A reasonable-performance filter, with quality similar to
+     * {@link Filter#BILINEAR}
+     */
+    public static final Filter GOOD = new Filter(CairoFilter.GOOD, "GOOD");
+
+    /**
+     * The highest-quality available, performance may not be suitable for
+     * interactive use
+     */
+    public static final Filter BEST = new Filter(CairoFilter.BEST, "BEST");
+
+    /**
+     * Nearest-neighbour filtering
+     */
+    public static final Filter NEAREST = new Filter(CairoFilter.NEAREST, "NEAREST");
+
+    /**
+     * Linear interpolation in two dimensions
+     */
+    public static final Filter BILINEAR = new Filter(CairoFilter.BILINEAR, "BILINEAR");
+
+    /**
+     * This filter value is currently unimplemented, and should not be used in
+     * current code.
+     */
+    public static final Filter GAUSSIAN = new Filter(CairoFilter.GAUSSIAN, "GAUSSIAN");
+
+}
diff --git a/src/bindings/org/freedesktop/cairo/FontOptions.java b/src/bindings/org/freedesktop/cairo/FontOptions.java
new file mode 100644
index 0000000..642d336
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/FontOptions.java
@@ -0,0 +1,98 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Configuration of how hinting will be employed (by Pango, actually) when
+ * rendering text.
+ * 
+ * <p>
+ * This is mostly used to achieve clean linear scaling by chosing
+ * {@link HintMetrics#OFF}. See
+ * {@link org.gnome.pango.Context#setFontOptions(FontOptions)
+ * setFontOptions()} for an example of using this in practice.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+/*
+ * Thanks to Behdad Esfahbod for explaining the need for turning hinting off.
+ */
+public class FontOptions extends Entity
+{
+    protected FontOptions(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a FontOptions instance allowing you to get at various font
+     * rendering configuration parameters.
+     * 
+     * @since 4.0.10
+     */
+    public FontOptions() {
+        super(CairoFontOptions.createFontOptions());
+        checkStatus();
+    }
+
+    protected final void release() {
+        CairoFontOptions.destroy(this);
+    }
+
+    protected void checkStatus() {
+        checkStatus(CairoFontOptions.status(this));
+    }
+
+    /**
+     * Whether or not you want hinting. For normal rendering you certainly do
+     * (and this is likely the default) but for the rare case where you need
+     * multiple versions of the same text to be identical across linear
+     * scaling, then you'll need this {@link HintMetrics#OFF OFF}.
+     * 
+     * @since 4.0.10
+     */
+    public void setHintMetrics(HintMetrics hinting) {
+        CairoFontOptions.setHintMetrics(this, hinting);
+        checkStatus();
+    }
+
+    /**
+     * Which style of hinting to employ.
+     * 
+     * @since 4.0.17
+     */
+    public void setHintStyle(HintStyle hinting) {
+        CairoFontOptions.setHintStyle(this, hinting);
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Format.java b/src/bindings/org/freedesktop/cairo/Format.java
new file mode 100644
index 0000000..16dfc72
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Format.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants specifying what the bit depth of the pixels in an ImageSurface.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+/*
+ * TODO do we need to ramble on about bit orders, pre multiplication of alpha
+ * in ARGB, etc?
+ */
+public class Format extends Constant
+{
+    private Format(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * 32 bits per pixel, being 8 bits for each of red, green, blue,
+     * <i>and</i> and 8 bit alpha (transparency) channel. This is the standard
+     * choice for most work.
+     */
+    public static final Format ARGB32 = new Format(CairoFormat.ARGB32, "ARGB32");
+
+    /**
+     * 24 bits per pixel, being 8 bits in each of red, green, and blue. No
+     * alpha channel.
+     */
+    public static final Format RGB24 = new Format(CairoFormat.RGB24, "RGB24");
+
+    /**
+     * 8 bits per pixel, holding an alpha value (only).
+     */
+    public static final Format A8 = new Format(CairoFormat.A8, "A8");
+
+    /**
+     * A traditional bitmask with a 1 bit alpha value (on or off).
+     */
+    public static final Format A1 = new Format(CairoFormat.A1, "A1");
+}
diff --git a/src/bindings/org/freedesktop/cairo/GdkCairoSupport.c b/src/bindings/org/freedesktop/cairo/GdkCairoSupport.c
new file mode 100644
index 0000000..caaebce
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/GdkCairoSupport.c
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include <cairo.h>
+#include "bindings_java.h"
+#include "org_freedesktop_cairo_GdkCairoSupport.h"
+
+/**
+ * This accesses gdk_cairo_create(), a utility function in GDK allowing you to
+ * get the Cairo cairo_t for a given GdkWindow. We have exposed this in our
+ * bindings as a constructor to Context.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_freedesktop_cairo_GdkCairoSupport_gdk_1cairo_1create
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _window
+)
+{
+	GdkWindow* window;
+	cairo_t* result;
+
+	// convert window
+	window = (GdkWindow*) _window;
+
+	// call function
+	result = gdk_cairo_create(window);
+
+	// cleanup parameter window
+
+	// and finally
+	return (jlong) result;
+}
+
+
+JNIEXPORT void JNICALL
+Java_org_freedesktop_cairo_GdkCairoSupport_gdk_1cairo_1set_1source_1pixbuf
+(
+        JNIEnv* env,
+        jclass cls,
+        jlong _context,
+        jlong _pixbuf,
+        jdouble _x,
+        jdouble _y
+)
+{
+        cairo_t* context;
+        GdkPixbuf* pixbuf;
+        double x;
+        double y;
+
+        // convert context
+        context = (cairo_t*) _context;
+
+        // convert pixbuf
+        pixbuf = (GdkPixbuf*) _pixbuf;
+
+        // convert x
+        x = (double) _x;
+
+        // convert x
+        y = (double) _y;
+
+        // call function
+        gdk_cairo_set_source_pixbuf(context, pixbuf, x, y);
+
+        // cleanup parameter context
+
+        // cleanup parameter pixbuf
+
+        // cleanup parameter x
+
+        // cleanup parameter y
+}
+
+JNIEXPORT void JNICALL
+Java_org_freedesktop_cairo_GdkCairoSupport_gdk_1cairo_1set_1source_1rgba
+(
+        JNIEnv* env,
+        jclass cls,
+        jlong _context,
+        jlong _rgba
+)
+{
+        cairo_t* context;
+        GdkRGBA* rgba;
+
+        // convert context
+        context = (cairo_t*) _context;
+
+        // convert rgba
+        rgba = (GdkRGBA*) _rgba;
+
+        // call function
+        gdk_cairo_set_source_rgba(context, rgba);
+
+        // cleanup parameter context
+
+        // cleanup parameter pixbuf
+}
diff --git a/src/bindings/org/freedesktop/cairo/GdkCairoSupport.java b/src/bindings/org/freedesktop/cairo/GdkCairoSupport.java
new file mode 100644
index 0000000..b4ed224
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/GdkCairoSupport.java
@@ -0,0 +1,96 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gdk.RGBA;
+import org.gnome.gdk.Window;
+
+/**
+ * Hack to allow us to get at various gdk_cairo_*() functions.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * Playing with an alternate naming pattern, suffix "Support" for the really
+ * weird corner cases. We are not, after all, overriding some capability in
+ * CairoContext's generated layers.
+ */
+final class GdkCairoSupport extends Plumbing
+{
+    private GdkCairoSupport() {}
+
+    static final long createContext(Window window) {
+        if (window == null) {
+            /*
+             * This check is, unfortunately, particularly important. If you've
+             * gotten this far with a null Window, that means that the state
+             * you think you're in isn't what it should be - in otherwords,
+             * you don't _really_ have a Window yet.
+             */
+            throw new IllegalArgumentException("window can't be null");
+        }
+
+        synchronized (lock) {
+            return gdk_cairo_create(pointerOf(window));
+        }
+    }
+
+    private static native final long gdk_cairo_create(long window);
+
+    static final void setSourcePixbuf(Context self, Pixbuf pixbuf, double x, double y) {
+        if (pixbuf == null) {
+            throw new IllegalArgumentException("pixbuf can't be null");
+        }
+
+        synchronized (lock) {
+            gdk_cairo_set_source_pixbuf(pointerOf(self), pointerOf(pixbuf), x, y);
+        }
+    }
+
+    private static native final void gdk_cairo_set_source_pixbuf(long context, long pixbuf, double x,
+            double y);
+
+    static final void setSourceRgba(Context self, RGBA color) {
+        if (color == null) {
+            throw new IllegalArgumentException("color can't be null");
+        }
+
+        synchronized (lock) {
+            gdk_cairo_set_source_rgba(pointerOf(self), pointerOf(color));
+        }
+    }
+
+    private static native final void gdk_cairo_set_source_rgba(long context, long color);
+
+}
diff --git a/src/bindings/org/freedesktop/cairo/HintMetrics.java b/src/bindings/org/freedesktop/cairo/HintMetrics.java
new file mode 100644
index 0000000..e114ab1
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/HintMetrics.java
@@ -0,0 +1,81 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Whether to hint the font rendering based on alignment to the integer pixel
+ * grid. Forcing this {@link #OFF OFF} is necessary if you want perfect linear
+ * scaling of your rendered fonts.
+ * 
+ * <p>
+ * The default setting is to be inherited, and while probably <code>ON</code>;
+ * the presence of {@link #DEFAULT DEFAULT} means you can generally leave this
+ * alone and not worry about it.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public class HintMetrics extends Constant
+{
+    private HintMetrics(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Default is like "unset"; the existing value from the surrounding
+     * environment (Context, Surface, Font in use, Font rendering back end,
+     * etc) will be used.
+     * 
+     * @since 4.0.10
+     */
+    public static final HintMetrics DEFAULT = new HintMetrics(CairoHintMetrics.DEFAULT, "DEFAULT");
+
+    /**
+     * Turn <b>metric</b> hinting
+     * 
+     * @since 4.0.10
+     */
+    public static final HintMetrics OFF = new HintMetrics(CairoHintMetrics.OFF, "OFF");
+
+    /**
+     * Hinting font metrics means <i>"quantizing them so that they are integer
+     * values"</i> in the target Surface's physical rendering co-ordinate
+     * space. This is good for visual appearance but breaks perfect smoothness
+     * when doing linear scaling (such as in animation if zooming in).
+     * 
+     * @since 4.0.10
+     */
+    public static final HintMetrics ON = new HintMetrics(CairoHintMetrics.ON, "ON");
+}
diff --git a/src/bindings/org/freedesktop/cairo/HintStyle.java b/src/bindings/org/freedesktop/cairo/HintStyle.java
new file mode 100644
index 0000000..85d67a7
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/HintStyle.java
@@ -0,0 +1,94 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * What style of hinting to apply. Note that not all styles are supported by
+ * all back ends, which is why you probably want {@link #DEFAULT DEFAULT}.
+ * Like HintMetrics, you can generally leave this alone.
+ * 
+ * <p>
+ * Worse, vendors like Canonical patch their distribution's Cairo package in
+ * ways that have voided their support from the upstream Cairo and Pango
+ * authors. So setting {@link #SLIGHT SLIGHT} will unfortunately have varying
+ * and unpredictable effects, depending on what Linux your users are on.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class HintStyle extends Constant
+{
+    private HintStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Default is like "unset"; the existing value from the surrounding
+     * environment (Context, Surface, Font in use, Font rendering back end,
+     * etc) will be used.
+     * 
+     * @since 4.0.17
+     */
+    public static final HintStyle DEFAULT = new HintStyle(CairoHintStyle.DEFAULT, "DEFAULT");
+
+    /**
+     * Turn hinting off, being most faithful to the actual outlines in the
+     * font.
+     * 
+     * @since 4.0.17
+     */
+    public static final HintStyle NONE = new HintStyle(CairoHintStyle.NONE, "NONE");
+
+    /**
+     * Slight hinting.
+     * 
+     * @since 4.0.17
+     */
+    public static final HintStyle SLIGHT = new HintStyle(CairoHintStyle.SLIGHT, "SLIGHT");
+
+    /**
+     * Medium hinting.
+     * 
+     * @since 4.0.17
+     */
+    public static final HintStyle MEDIUM = new HintStyle(CairoHintStyle.MEDIUM, "MEDIUM");
+
+    /**
+     * Full hinting, maximizing contrast.
+     * 
+     * @since 4.0.17
+     */
+    public static final HintStyle FULL = new HintStyle(CairoHintStyle.FULL, "FULL");
+}
diff --git a/src/bindings/org/freedesktop/cairo/ImageSurface.java b/src/bindings/org/freedesktop/cairo/ImageSurface.java
new file mode 100644
index 0000000..e4db985
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/ImageSurface.java
@@ -0,0 +1,88 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A Surface which is an image in memory and can be written to disk. If
+ * drawing to an image you intend to write to a PNG, you would end up doing
+ * something like:
+ * 
+ * <pre>
+ * surface = new ImageSurface(Format.ARGB32, 100, 100);
+ * cr = new Context(surface);
+ * 
+ * // do drawing
+ * 
+ * surface.writeToPNG(filename);
+ * </pre>
+ * 
+ * <p>
+ * While ImageSurfaces are good for writing images out to disk, they are not
+ * optimized per se to be efficient as a back end, nor are they accelerated by
+ * your graphics card. So they are not an appropriate intermediate in drawing
+ * operations; don't be calling <code>setSource()</code> on one of these.
+ * 
+ * <p>
+ * More importantly, ImageSurface is <b>not</b> an image loader! Remember that
+ * Surfaces are what Cairo draws <i>to</i>. If what you are doing is building
+ * up images for display to the screen, then load your images into
+ * {@link XlibSurface}s and use those as sources.
+ * 
+ * <p>
+ * <i>Deep in the guts, Cairo's ImageSurface is like GDK's Pixbuf, a format
+ * that C programmers can directly address directly in memory via pointers.
+ * That's useful for very low level programming, but not needed for
+ * application development. If you're drawing, use Cairo's higher level
+ * drawing primitives; if you need to introspect an image, then load it with
+ * Pixbuf and use Pixbuf's</i> {@link org.gnome.gdk.Pixbuf#getPixels()
+ * getPixels()} <i>to peek around in its data.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class ImageSurface extends Surface
+{
+    protected ImageSurface(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct an ImageSurface of the specified visual depth and size.
+     * 
+     * @since 4.0.7
+     */
+    public ImageSurface(Format format, int width, int height) {
+        super(CairoSurface.createSurface(format, width, height));
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/LinearPattern.java b/src/bindings/org/freedesktop/cairo/LinearPattern.java
new file mode 100644
index 0000000..e20068f
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/LinearPattern.java
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A linear gradient.
+ * 
+ * <p>
+ * Before using the LinearPattern you need to call
+ * {@link Pattern#addColorStopRGBA(double, double, double, double, double)
+ * addColorStopRGBA()} a few times to set up the gradient. For example:
+ * 
+ * <pre>
+ * pat = new LinearPattern(40, 25, 120, 100);
+ * pat.addColorStopRGB(0.0, 0.0, 0.3, 0.8);
+ * pat.addColorStopRGB(1.0, 0.0, 0.8, 0.3);
+ * </pre>
+ * 
+ * and then you can get on with using the Pattern in drawing operations.
+ * 
+ * <pre>
+ * cr.setSource(pat);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class LinearPattern extends Pattern
+{
+    protected LinearPattern(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a Pattern with a linear gradient between co-ordinates
+     * <code>x0</code>,<code>y0</code> and <code>x1</code>,<code>y1</code>.
+     * 
+     * @since 4.0.7
+     */
+    public LinearPattern(double x0, double y0, double x1, double y1) {
+        super(CairoPattern.createPatternLinear(x0, y0, x1, y1));
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Matrix.java b/src/bindings/org/freedesktop/cairo/Matrix.java
new file mode 100644
index 0000000..ca8b637
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Matrix.java
@@ -0,0 +1,164 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A matrix describing an affine transformation.
+ * 
+ * <p>
+ * You can apply this transformation to a Cairo Context with its
+ * {@link Context#transform(Matrix) transform()} method as follows:
+ * 
+ * <pre>
+ * matrix = new Matrix();
+ * matrix.rotate(...);    // and/or
+ * matrix.scale(...);     // and/or
+ * matrix.translate(...); 
+ * 
+ * cr.transform(matrix);
+ * </pre>
+ * 
+ * Calls to the <code>rotate()</code>, <code>scale()</code>, and
+ * <code>translate</code> methods are cumulative on a given Matrix.
+ * 
+ * <p>
+ * Applying a transformation is what take you from <var>device
+ * co-ordinates</var> to <var>user-space co-ordinates</var>; you are in fact
+ * always working in the later but we tend not to focus on this as the default
+ * is naturally no transformation.
+ * 
+ * <h2>Examples</h2>
+ * 
+ * <p>
+ * In each of the illustrations below, we draw a box as follows:
+ * 
+ * <pre>
+ * cr.setSource(0.7, 0.8, 0.8);
+ * cr.rectangle(5, 5, 25, 15);
+ * cr.stroke();
+ * </pre>
+ * 
+ * We then apply the transform shown, change colour to blue, and then draw the
+ * exact same rectangle again:
+ * 
+ * <pre>
+ * cr.setSource(0.0, 0.0, 1.0);
+ * cr.rectangle(5, 5, 25, 15);
+ * cr.stroke();
+ * </pre>
+ * 
+ * Thus both the original rectangle and the result of the matrix operation are
+ * shown.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public class Matrix extends Entity
+{
+    protected Matrix(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        CairoMatrixOverride.free(this);
+    }
+
+    /**
+     * Construct a new transformation matrix with the identity (no-op)
+     * transform.
+     * 
+     * @since 4.0.10
+     */
+    public Matrix() {
+        super(CairoMatrixOverride.createMatrixIdentity());
+    }
+
+    /**
+     * Rotate the transformation by the given angle. As with elsewhere in
+     * Cairo, <code>angle</code> is in radians. <img src="Matrix-rotate.png"
+     * class="snapshot">
+     * 
+     * <pre>
+     * matrix.rotate(-Math.PI / 4.0);
+     * cr.transform(matrix);
+     * </pre>
+     * 
+     * <p>
+     * A negative angle is used in this example for the same reason as
+     * discussed in
+     * {@link Context#arc(double, double, double, double, double) arc()}.
+     * 
+     * @since 4.0.10
+     */
+    public void rotate(double angle) {
+        CairoMatrix.rotate(this, angle);
+    }
+
+    /**
+     * Translate by <code>tx</code> horizontally and <code>ty</code>
+     * vertically. <img src="Matrix-translate.png" class="snapshot">
+     * 
+     * <pre>
+     * matrix.translate(5, 10);
+     * cr.transform(matrix);
+     * </pre>
+     * 
+     * @since 4.0.10
+     */
+    public void translate(double tx, double ty) {
+        CairoMatrix.translate(this, tx, ty);
+    }
+
+    /**
+     * Scale by <code>sx</code> horizontally and <code>sy</code> vertically.
+     * <img src="Matrix-scale.png" class="snapshot">
+     * 
+     * <pre>
+     * matrix.scale(-0.8, 1.6);
+     * cr.transform(matrix);
+     * </pre>
+     * 
+     * Note that in this example the <code>sx</code> argument being negative
+     * results in a reflection through the <i>y</i> axis. Note also that the
+     * line widths are <b>not</b> the same as the original image's were; only
+     * scaling by <code>1.0</code> would have left the widths alone.
+     * 
+     * <p>
+     * Don't scale by <code>0</code>.
+     * 
+     * @since 4.0.10
+     */
+    public void scale(double sx, double sy) {
+        CairoMatrix.scale(this, sx, sy);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/MimeType.java b/src/bindings/org/freedesktop/cairo/MimeType.java
new file mode 100644
index 0000000..825e60b
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/MimeType.java
@@ -0,0 +1,87 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * MIME types specifically supported by the Surface's
+ * {@link Surface#setMimeData(MimeType, byte[]) setMimeData()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.18
+ */
+public class MimeType
+{
+    private String mime;
+
+    /**
+     * For debugging.
+     */
+    private String name;
+
+    private MimeType(String nickname, String mime) {
+        this.name = nickname;
+        this.mime = mime;
+    }
+
+    /**
+     * Normal JPEG format photographic images. ISO/IEC 10918-1.
+     * 
+     * @since 4.0.18
+     */
+    public static final MimeType JPEG = new MimeType("JPEG", "image/jpeg");
+
+    /**
+     * The newer JPEG 2000 format images using wavelet compression. ISO/IEC
+     * 15444-1.
+     * 
+     * @since 4.0.18
+     */
+    public static final MimeType JP2 = new MimeType("JP2", "image/jp2");
+
+    /**
+     * Portable Network Graphic.
+     * 
+     * @since 4.0.18
+     */
+    public static final MimeType PNG = new MimeType("PNG", "image/png");
+
+    public static final MimeType URI = new MimeType("URI", "image/x-uri");
+
+    String getMimeType() {
+        return mime;
+    }
+
+    public String toString() {
+        return "MimeType." + name;
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Operator.java b/src/bindings/org/freedesktop/cairo/Operator.java
new file mode 100644
index 0000000..822902d
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Operator.java
@@ -0,0 +1,269 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants specifying the compositing operating mode in effect. These are
+ * set for a drawing Context using {@link Context#setOperator(Operator)
+ * setOperator()}, and take effect when commands like {@link Context#paint()
+ * paint()} are invoked.
+ * 
+ * <p>
+ * The Context should be created using a cairo {@link Surface}. <i>The
+ * operators don't seem to work correctly when a
+ * {@link org.gnome.gdk.Drawable Drawable}</i> is used instead of a cairo
+ * Surface.
+ * 
+ * <p>
+ * The example images shown below were generated with the following code:
+ * 
+ * <pre>
+ * cr.rectangle(0, 0, 75, 75);
+ * cr.setSource(0.7, 0, 0, 0.8);
+ * cr.fill();
+ * 
+ * cr.setOperator(Operator.FOO);
+ * 
+ * cr.rectangle(40, 40, 75, 75);
+ * cr.setSource(0, 0, 0.9, 0.4);
+ * cr.fill();
+ * </pre>
+ * 
+ * <p>
+ * The drawing operations in cairo are said to be <b>bounded</b> and
+ * <b>unbounded</b> with reguards to the Surface to be drawn to.
+ * 
+ * <p>
+ * When an operator is said to be bounded any cairo mask present determines
+ * where the operation is applied.
+ * 
+ * <p>
+ * When an operator is said to be unbounded the operation is applied ignoring
+ * any present mask. <i>Note: Clipping can still limit an unbounded
+ * operator.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Kenneth Prugh
+ * @author Zak Fenton
+ * @since 4.0.7
+ */
+public class Operator extends Constant
+{
+    private Operator(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Clear a surface to all transparent. <img src="Operator-clear.png"
+     * class="snapshot">
+     * 
+     * <p>
+     * This operator is bounded.
+     * 
+     * @since 4.0.7
+     */
+    public static final Operator CLEAR = new Operator(CairoOperator.CLEAR, "CLEAR");
+
+    /**
+     * Draw over existing pixels as if they were not present. <img
+     * src="Operator-source.png" class="snapshot">
+     * 
+     * <p>
+     * This operator is bounded.
+     * 
+     * <p>
+     * As an example, you could set up the object to be drawn over:
+     * 
+     * <pre>
+     * cr.setSource(0.7, 0, 0, 0.8);
+     * cr.rectangle(15, 10, 50, 50);
+     * cr.fill();
+     * </pre>
+     * 
+     * Now set up the source object that will draw over the area beneath it:
+     * 
+     * <pre>
+     * cr.setSource(0, 0, 0.9, 0.4);
+     * cr.rectangle(35, 35, 50, 50);
+     * cr.setOperator(Operator.SOURCE);
+     * cr.fill();
+     * </pre>
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator SOURCE = new Operator(CairoOperator.SOURCE, "SOURCE");
+
+    /**
+     * Draws the specified source object over the underlying object as if both
+     * objects were two overlapping panels of transparent glass. This only
+     * applies to objects that have an alpha channel; if the objects do not
+     * have an alpha channel, the source object simply paints over the
+     * underlying object. <img class="snapshot" src="Operator-over.png">
+     * 
+     * <p>
+     * This is the default operator.
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.10
+     */
+    public static final Operator OVER = new Operator(CairoOperator.OVER, "OVER");
+
+    /**
+     * Draw only where existing pixels are, clearing the rest of the surface.
+     * <img src="Operator-in.png" class="snapshot">
+     * 
+     * <p>
+     * This operator is unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator IN = new Operator(CairoOperator.IN, "IN");
+
+    /**
+     * Draw only where existing pixels are not present, leaving a shadow
+     * behind where the two overlapped due to transparency. <img
+     * src="Operator-out.png" class="snapshot">
+     * 
+     * <p>
+     * This operator is unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator OUT = new Operator(CairoOperator.OUT, "OUT");
+
+    /**
+     * Draw only where existing pixels are, mixing the color of the
+     * overlapping region. <img src="Operator-atop.png" class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator ATOP = new Operator(CairoOperator.ATOP, "ATOP");
+
+    /**
+     * Any existing pixels are left untouched, while the current drawing is
+     * discarded. <img src="Operator-dest.png" class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator DEST = new Operator(CairoOperator.DEST, "DEST");
+
+    /**
+     * Draw below any existing pixels with similar results to the
+     * {@link #OVER OVER} operator. <img src="Operator-dest_over.png"
+     * class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator DEST_OVER = new Operator(CairoOperator.DEST_OVER, "DEST_OVER");
+
+    /**
+     * Draw below the overlapping region, clearing everything outside the
+     * region similar to the {@link #IN IN} Operator. <img
+     * src="Operator-dest_in.png" class="snapshot">
+     * 
+     * <p>
+     * This operator is unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator DEST_IN = new Operator(CairoOperator.DEST_IN, "DEST_IN");
+
+    /**
+     * Reduce the visibility of the overlapping region. <img
+     * src="Operator-dest_out.png" class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator DEST_OUT = new Operator(CairoOperator.DEST_OUT, "DEST_OUT");
+
+    /**
+     * Draw and clear any existing pixels outside the overlapping region, the
+     * color of the overlapping region is mixed similar to the {@link #ATOP
+     * ATOP} Operator. <img src="Operator-dest_atop.png" class="snapshot">
+     * 
+     * <p>
+     * This operator is unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator DEST_ATOP = new Operator(CairoOperator.DEST_ATOP, "DEST_ATOP");
+
+    /**
+     * XOR the colors of the overlapping region. <img src="Operator-xor.png"
+     * class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator XOR = new Operator(CairoOperator.XOR, "XOR");
+
+    /**
+     * Add the colors of the overlapping region. <img src="Operator-add.png"
+     * class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator ADD = new Operator(CairoOperator.ADD, "ADD");
+
+    /**
+     * Saturate the colors of the overlapping region. <img
+     * src="Operator-saturate.png" class="snapshot">
+     * 
+     * <p>
+     * This operator has the same effect for bounded and unbounded.
+     * 
+     * @since 4.0.16
+     */
+    public static final Operator SATURATE = new Operator(CairoOperator.SATURATE, "SATURATE");
+}
diff --git a/src/bindings/org/freedesktop/cairo/Pattern.java b/src/bindings/org/freedesktop/cairo/Pattern.java
new file mode 100644
index 0000000..b54fbbb
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Pattern.java
@@ -0,0 +1,130 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A Pattern source.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public abstract class Pattern extends Entity
+{
+    protected Pattern(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        CairoPattern.destroy(this);
+    }
+
+    protected void checkStatus() {
+        checkStatus(CairoPattern.status(this));
+    }
+
+    /**
+     * Add a colour stop to a Pattern gradient. Equivalent to calling:
+     * 
+     * <pre>
+     * addColorStopRGBA(offset, red, green, blue, 1.0);
+     * </pre>
+     * 
+     * See {@link #addColorStopRGBA(double, double, double, double, double)
+     * addColorStopRGBA()} for documentation of the <code>offset</code>
+     * parameter. The colour parameters are the same as for
+     * {@link Context#setSource(double, double, double) setSource()}.
+     * 
+     * @since 4.0.7
+     */
+    public void addColorStopRGB(double offset, double red, double green, double blue) {
+        CairoPattern.addColorStopRgb(this, offset, red, green, blue);
+        checkStatus();
+    }
+
+    /**
+     * Add a colour stop to a Pattern gradient.
+     * 
+     * <p>
+     * The <code>offset</code> parameter provides for the ordering of stops.
+     * When a Pattern applies its colour stops, it works through them in the
+     * order specified. If two stops are specified with identical
+     * <code>offset</code> values, they will be sorted according to the order
+     * in which the stops are added, is used for making sharp color
+     * transitions instead of a blend.
+     * 
+     * <p>
+     * Colour stops handle colour arguments the same way as
+     * {@link Context#setSource(double, double, double) setSource()} does.
+     * 
+     * @since 4.0.7
+     */
+    public void addColorStopRGBA(double offset, double red, double green, double blue, double alpha) {
+        CairoPattern.addColorStopRgba(this, offset, red, green, blue, alpha);
+        checkStatus();
+    }
+
+    /**
+     * Specify the strategy to be used when drawing the pattern outside of the
+     * area implicit in the how the Pattern itself is described.
+     * 
+     * <p>
+     * If you're looking at this, it's probably because you're wondering why
+     * your Pattern isn't extending. Call this with {@link Extend#REPEAT
+     * REPEAT}.
+     * 
+     * @since 4.0.17
+     */
+    public void setExtend(Extend extend) {
+        CairoPattern.setExtend(this, extend);
+    }
+
+    /**
+     * Get the Surface backing this Pattern. Obviously this only works with
+     * SurfacePatterns.
+     * 
+     * @since 4.0.18
+     */
+    public Surface getSurface() {
+        return CairoPatternOverride.getSurface(this);
+    }
+
+    /**
+     * Sets the filter that resizing operations should use with this pattern.
+     * 
+     * @since 4.0.20
+     */
+    public void setFilter(Filter filter) {
+        CairoPattern.setFilter(this, filter);
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/PdfSurface.java b/src/bindings/org/freedesktop/cairo/PdfSurface.java
new file mode 100644
index 0000000..9843d00
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/PdfSurface.java
@@ -0,0 +1,115 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import java.io.IOException;
+
+/**
+ * A Surface that will be rendered to a file in the Portable Document Format.
+ * 
+ * <p>
+ * You specify the size of a PdfSurface in points, and all subsequent
+ * operations on a Context based on this Surface will likewise be in points.
+ * If you are used to using Cairo to draw to screen where a device unit equals
+ * a pixel, be aware that here your a distance of <code>1.0</code> is in
+ * points, not pixels.
+ * 
+ * <p>
+ * <i>Cairo's PDF support is still nascent but is improving steadily! Wherever
+ * possible graphics drawn in your Context will be rendered in vector form in
+ * the PDF; when that is not available the PDF backend will fallback to
+ * rendering bitmaps of the desired content.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public class PdfSurface extends Surface
+{
+    protected PdfSurface(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new PdfSurface, supplying the file you want to write to and
+     * the size of the page you are creating. The <code>width</code> and
+     * <code>height</code> parameters are specified in <i>points</i>, where 1
+     * point equals 1/72<sup>nd</sup> of an inch.
+     * 
+     * <p>
+     * A4 paper is 210mm x 297mm, which works out as about:
+     * 
+     * <pre>
+     * surface = new PdfSurface("output.pdf", 595.275, 841.889);
+     * </pre>
+     * 
+     * more generally, you can use get paper size information via GTK's
+     * printing support using [<code>org.gnome.gtk</code>] PaperSize's
+     * {@link org.gnome.gtk.PaperSize#getWidth(org.gnome.gtk.Unit) getWidth()}
+     * and {@link org.gnome.gtk.PaperSize#getHeight(org.gnome.gtk.Unit)
+     * getHeight()} methods, for example:
+     * 
+     * <pre>
+     * paper = PaperSize.getDefault();
+     * width = paper.getWidth(Unit.POINTS);
+     * height = paper.getHeight(Unit.POINTS);
+     * 
+     * surface = new PdfSurface("output.pdf", width, height);
+     * </pre>
+     * 
+     * saving you having to worry about just how big such paper really is.
+     * 
+     * @throws IOException
+     *             If you do not have write permissions on the given file.
+     * @since 4.0.10
+     */
+    public PdfSurface(String filename, double width, double height) throws IOException {
+        super(CairoSurface.createSurfacePdf(filename, width, height));
+        final Status status;
+
+        status = CairoSurface.status(this);
+        if (status == Status.WRITE_ERROR) {
+            throw new IOException("Cairo reports it cannot open " + filename + " for writing");
+        }
+        checkStatus(status);
+    }
+
+    public void showPage() {
+        CairoSurface.showPage(this);
+        checkStatus();
+    }
+
+    public void copyPage() {
+        CairoSurface.copyPage(this);
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Plumbing.c b/src/bindings/org/freedesktop/cairo/Plumbing.c
new file mode 100644
index 0000000..ed60064
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Plumbing.c
@@ -0,0 +1,225 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <cairo.h>
+#include "bindings_java.h"
+#include "org_freedesktop_cairo_Plumbing.h"
+
+/*
+ * Implements
+ *   org.freedesktop.cairo.Plumbing.createPattern(long pointer)
+ */
+JNIEXPORT jobject JNICALL
+Java_org_freedesktop_cairo_Plumbing_createPattern
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _pointer
+)
+{
+	cairo_pattern_t* pattern;
+	jclass found;
+	static jclass SolidPattern = NULL;
+	static jclass SurfacePattern = NULL;	
+	static jclass LinearPattern = NULL;	
+	static jclass RadialPattern = NULL;	
+	jclass type;
+	jmethodID constructor;
+	jobject proxy;
+	
+	// convert pointer
+	pattern = (cairo_pattern_t*) _pointer;
+
+	// increment reference count
+	cairo_pattern_reference(pattern);
+
+	// now figure out Proxy class and create
+	switch (cairo_pattern_get_type(pattern)) {
+	case CAIRO_PATTERN_TYPE_SOLID:
+		if (SolidPattern == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/SolidPattern");
+			SolidPattern = (*env)->NewGlobalRef(env, found);
+		}
+		type = SolidPattern;
+		break;
+
+	case CAIRO_PATTERN_TYPE_SURFACE:
+		if (SurfacePattern == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/SurfacePattern");
+			SurfacePattern = (*env)->NewGlobalRef(env, found);
+		}
+		type = SurfacePattern;
+		break;
+
+	case CAIRO_PATTERN_TYPE_LINEAR:
+		if (LinearPattern == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/LinearPattern");
+			LinearPattern = (*env)->NewGlobalRef(env, found);
+		}
+		type = LinearPattern;
+		break;
+
+	case CAIRO_PATTERN_TYPE_RADIAL:		
+		if (RadialPattern == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/RadialPattern");
+			RadialPattern = (*env)->NewGlobalRef(env, found);
+		}
+		type = RadialPattern;
+		break;
+
+	default:
+		g_critical("Unimplemented pattern type");
+		return NULL;
+	}
+	if (type == NULL) {
+		bindings_java_throw(env, "FindClass() failed");
+		return NULL;
+	}
+
+	constructor = (*env)->GetMethodID(env, type, "<init>", "(J)V");
+	if (constructor == NULL) {
+		g_error("Constructor methodID not found");
+		return NULL;
+	}
+	
+	proxy = (*env)->NewObject(env, type, constructor, _pointer);
+	return proxy;
+}
+
+
+/*
+ * Implements
+ *   org.freedesktop.cairo.Plumbing.createSurface(long pointer)
+ */
+JNIEXPORT jobject JNICALL
+Java_org_freedesktop_cairo_Plumbing_createSurface
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _pointer
+)
+{
+	cairo_surface_t* surface;
+	jclass found;
+	static jclass ImageSurface = NULL;
+	static jclass XlibSurface = NULL;
+	static jclass PdfSurface = NULL;
+	static jclass SvgSurface = NULL;
+	static jclass RecordingSurface = NULL;
+	static jclass UnknownSurface = NULL;
+	jclass type;
+	jmethodID constructor;
+	jobject proxy;
+
+	// convert pointer
+	surface = (cairo_surface_t*) _pointer;
+
+	// increment reference count
+	cairo_surface_reference(surface);
+
+        // now figure out Proxy class and create
+	switch (cairo_surface_get_type(surface)) {
+	case CAIRO_SURFACE_TYPE_IMAGE:
+		if (ImageSurface == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/ImageSurface");
+			ImageSurface = (*env)->NewGlobalRef(env, found);
+		}
+		type = ImageSurface;
+		break;
+		
+	case CAIRO_SURFACE_TYPE_XLIB:
+		if (XlibSurface == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/XlibSurface");
+			XlibSurface = (*env)->NewGlobalRef(env, found);
+		}
+		type = XlibSurface;
+		break;
+
+        case CAIRO_SURFACE_TYPE_PDF:
+		if (PdfSurface == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/PdfSurface");
+			PdfSurface = (*env)->NewGlobalRef(env, found);
+		}
+		type = PdfSurface;
+		break;
+
+        case CAIRO_SURFACE_TYPE_SVG:
+		if (SvgSurface == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/SvgSurface");
+			SvgSurface = (*env)->NewGlobalRef(env, found);
+		}
+		type = SvgSurface;
+		break;
+
+        case CAIRO_SURFACE_TYPE_RECORDING:
+		if (RecordingSurface == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/RecordingSurface");
+			RecordingSurface = (*env)->NewGlobalRef(env, found);
+		}
+		type = RecordingSurface;
+		break;
+
+	default:
+		/*
+		 * This is an unusual scenario. Normally in java-gnome if we
+		 * don't know the type that's a fatal error (and on purpose; if
+		 * we haven't got a concrete Proxy subclass for someone, that's
+		 * it). In Cairo, however, there are a number of cases where
+		 * internal types are exposed (notably MetaSurface, created if
+		 * you call createSimilar() on a vector backend) for which
+		 * there is no publicly available identification. So
+		 * UnknownSurface it is. This, however, obscures the real error
+		 * condition of needing to add a block to this switch statement
+		 * for a newly covered type.
+		 */
+		if (UnknownSurface == NULL) {
+			found = (*env)->FindClass(env, "org/freedesktop/cairo/UnknownSurface");
+			UnknownSurface = (*env)->NewGlobalRef(env, found);
+		}
+		type = UnknownSurface;
+	}
+	if (type == NULL) {
+		bindings_java_throw(env, "FindClass() failed");
+		return NULL;
+	}
+
+	constructor = (*env)->GetMethodID(env, type, "<init>", "(J)V");
+	if (constructor == NULL) {
+		bindings_java_throw(env, "Constructor methodID not found");
+		return NULL;
+	}
+
+	proxy = (*env)->NewObject(env, type, constructor, _pointer);
+	return proxy;
+}
diff --git a/src/bindings/org/freedesktop/cairo/Plumbing.java b/src/bindings/org/freedesktop/cairo/Plumbing.java
new file mode 100644
index 0000000..544cc62
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Plumbing.java
@@ -0,0 +1,100 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gdk.Gdk;
+
+public abstract class Plumbing extends org.freedesktop.bindings.Plumbing
+{
+    protected Plumbing() {}
+
+    /*
+     * Expose access to the global GDK lock.
+     */
+    /*
+     * TODO I'm not sure we need this. In fact, I rather expect that this is
+     * in the way, but we'd have to make the synchronized block output by the
+     * code generator conditional.
+     */
+    protected static final java.lang.Object lock;
+
+    static {
+        isLibraryReady();
+
+        lock = Gdk.lock;
+
+        assert (Status.SUCCESS != null);
+    }
+
+    public static Entity entityFor(Class<?> type, long pointer) {
+        Entity obj;
+
+        obj = (Entity) org.freedesktop.bindings.Plumbing.instanceFor(pointer);
+
+        if (obj != null) {
+            return obj;
+        } else {
+            if (type == Context.class) {
+                obj = createContext(pointer);
+            } else if (type == Surface.class) {
+                obj = createSurface(pointer);
+            } else if (type == Pattern.class) {
+                obj = createPattern(pointer);
+            } else {
+                throw new UnsupportedOperationException("Unhandled type " + type.getName());
+            }
+            return obj;
+        }
+    }
+
+    private static Context createContext(long pointer) {
+        return new Context(pointer);
+    }
+
+    /*
+     * Similar to createProxy() in the superclass, but in Cairo's case we are
+     * forced to go to native in order to navigate the type "forest". Unlike
+     * the g_type_name() based mechanism in org.gnome.glib, we only know the
+     * abstract class as the type argument; however, C side, cairo allows us
+     * to look up the fully qualified type given the abstract and so we can
+     * then map that to the appropriate Java Proxy.
+     * 
+     * Both of these implementations increment the reference count of the
+     * underlying native library object; we are creating our Proxy for the
+     * first time and need to assume an ownership of it.
+     */
+
+    private static native Entity createSurface(long pointer);
+
+    private static native Entity createPattern(long pointer);
+}
diff --git a/src/bindings/org/freedesktop/cairo/RadialPattern.java b/src/bindings/org/freedesktop/cairo/RadialPattern.java
new file mode 100644
index 0000000..2163585
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/RadialPattern.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A radial gradient Pattern.
+ * 
+ * <p>
+ * After calling this and before using the RadialPattern you need to call
+ * {@link Pattern#addColorStopRGBA(double, double, double, double, double)
+ * addColorStopRGBA()} a few times to set up the gradient. For example, to
+ * create an circular alpha blend:
+ * 
+ * <pre>
+ * pattern = new RadialPattern(75, 75, 25, 75, 75, 120);
+ * pattern.addColorStopRGBA(0.0, 0.0, 0.0, 0.0, 0.0);
+ * pattern.addColorStopRGBA(1.0, 0.0, 0.0, 0.0, 1.0);
+ * </pre>
+ * 
+ * and then you can get on with using the Pattern in drawing operations:
+ * 
+ * <pre>
+ * cr.mask(pattern);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class RadialPattern extends Pattern
+{
+    protected RadialPattern(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a Pattern with a radial gradient between two circles. The first
+     * circle is centered at <code>cx0</code>,<code>cy0</code> with a radius
+     * of <code>radius0</code>, and the second circle is centered at
+     * <code>cx1</code>,<code>cy1</code> with a radius of <code>radius1</code>
+     * .
+     * 
+     * <p>
+     * Quite typically, you will want a strict radial pattern from a common
+     * centre, in which case have <code>cx1</code>,<code>cy1</code> equal to
+     * <code>cx0</code>,<code>cy0</code>.
+     * 
+     * @since 4.0.7
+     */
+    public RadialPattern(double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) {
+        super(CairoPattern.createPatternRadial(cx0, cy0, radius0, cx1, cy1, radius1));
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/RecordingSurface.java b/src/bindings/org/freedesktop/cairo/RecordingSurface.java
new file mode 100644
index 0000000..18bd059
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/RecordingSurface.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Intenral Surface type which records operations done to it.
+ * 
+ * @author Andrew Cowie
+ */
+class RecordingSurface extends Surface
+{
+    protected RecordingSurface(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/SolidPattern.java b/src/bindings/org/freedesktop/cairo/SolidPattern.java
new file mode 100644
index 0000000..6f9a971
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/SolidPattern.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A Pattern of a single colour. Note that "solid" does not imply completely
+ * opaque; as with most other colour setting operations in Cairo, you can
+ * specify an level of transparency.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class SolidPattern extends Pattern
+{
+    protected SolidPattern(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a Pattern of a given colour.
+     * 
+     * @since 4.0.7
+     */
+    public SolidPattern(double red, double green, double blue, double alpha) {
+        super(CairoPattern.createPatternRgba(red, green, blue, alpha));
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/Status.java b/src/bindings/org/freedesktop/cairo/Status.java
new file mode 100644
index 0000000..066ec60
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Status.java
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Error constants for problems arising during Cairo drawing operations.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+class Status extends Constant
+{
+    private Status(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * It worked!
+     */
+    public static final Status SUCCESS = new Status(CairoStatus.SUCCESS, "SUCCESS");
+
+    /**
+     * Out of memory. Yikes.
+     */
+    public static final Status NO_MEMORY = new Status(CairoStatus.NO_MEMORY, "NO_MEMORY");
+
+    /**
+     * C side, a <code>NULL</code> was encountered when a valid pointer was
+     * expected.
+     */
+    public static final Status NULL_POINTER = new Status(CairoStatus.NULL_POINTER, "NULL_POINTER");
+
+    /**
+     * The Surface has been marked as finished, so you can't draw to it
+     * anymore.
+     */
+    public static final Status SURFACE_FINISHED = new Status(CairoStatus.SURFACE_FINISHED,
+            "SURFACE_FINISHED");
+
+    /**
+     * Write error, you don't have write permissions to a file.
+     */
+    public static final Status WRITE_ERROR = new Status(CairoStatus.WRITE_ERROR, "WRITE_ERROR");
+
+    /**
+     * There is no current point; numerous operations (notably moving
+     * relative) require you to have established a current point in the
+     * Context.
+     * 
+     * @since 4.0.10
+     */
+    public static final Status NO_CURRENT_POINT = new Status(CairoStatus.NO_CURRENT_POINT,
+            "NO_CURRENT_POINT");
+
+    /**
+     * The transformation matrix is invalid. This can occur if the matrix
+     * collapses points together (is degenerate) or doesn't have an inverse.
+     * 
+     * @since 4.0.10
+     */
+    public static final Status INVALID_MATRIX = new Status(CairoStatus.INVALID_MATRIX, "INVALID_MATRIX");
+
+    /**
+     * Context.restore() misses a previous Context.save() call
+     * 
+     * @since 4.0.12
+     */
+    public static final Status INVALID_RESTORE = new Status(CairoStatus.INVALID_RESTORE,
+            "INVALID_RESTORE");
+}
diff --git a/src/bindings/org/freedesktop/cairo/Surface.java b/src/bindings/org/freedesktop/cairo/Surface.java
new file mode 100644
index 0000000..0cb0659
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/Surface.java
@@ -0,0 +1,254 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import java.io.IOException;
+
+/**
+ * The thing that Cairo will draw on/to. This is the base class for several
+ * concrete back ends.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public abstract class Surface extends Entity
+{
+    protected Surface(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        CairoSurface.destroy(this);
+    }
+
+    /**
+     * Indicate to Cairo that you are finished drawing on this Surface and
+     * that it can release the resources that Cairo has used in association
+     * with it. After you call this, the Surface and any Contexts associated
+     * with it will be in-operative.
+     * 
+     * <p>
+     * While the virtual machine will of course finalize this object when you
+     * no longer have strong Java references to it, garbage collection is
+     * non-deterministic and often takes place long after drawing is
+     * completed. Calling this can allow the underlying library to get on with
+     * releasing the resources involved in what is, after all, meant to be a
+     * very fast and transient operation.
+     * 
+     * @since 4.0.7
+     */
+    public void finish() {
+        CairoSurface.finish(this);
+    }
+
+    /**
+     * Complete any pending drawing operations. If your Surface comes from a
+     * subsystem whose resources are shared with other drawing libraries, then
+     * you need to call this before letting control return to a point where
+     * those libraries might draw on the same backing Surface.
+     * 
+     * <p>
+     * Quoting Carl Worth, the original author of Cairo, <blockquote>This is
+     * really only necessary to call if you want to switch from Cairo-based
+     * rendering to non-Cairo-based rendering to the same underlying thingy
+     * under the Surface (Window, Pixmap, data buffer, etc.).</blockquote>
+     * 
+     * <p>
+     * In other words, if you are the only one drawing on the Surface, then
+     * you don't need this. And that is indeed the case if you are drawing on
+     * your own custom Widget in its <code>Widget.Draw</code> signal handler.
+     * 
+     * <p>
+     * See also {@link #finish() finish()} if you're just trying to say "I'm
+     * done".
+     * 
+     * <p>
+     * <i>Clearly, "thingy" is an advanced graphics term.</i>
+     * 
+     * @since 4.0.7
+     */
+    public void flush() {
+        CairoSurface.flush(this);
+    }
+
+    /**
+     * Output the contents of this Surface to the specified file.
+     * 
+     * @throws IOException
+     *             If the file can't be written.
+     * 
+     * @since 4.0.7
+     */
+    public void writeToPNG(String filename) throws IOException {
+        final Status status;
+
+        status = CairoSurface.writeToPng(this, filename);
+
+        if (status == Status.WRITE_ERROR) {
+            throw new IOException("You cannot write to file " + filename);
+        }
+
+        checkStatus(status);
+    }
+
+    protected void checkStatus() {
+        checkStatus(CairoSurface.status(this));
+    }
+
+    /**
+     * Emit the current page and clear the Surface, allowing you to continue
+     * drawing with your Context but to a new blank page.
+     * 
+     * <p>
+     * If you want to render the current page, but keep the page content in
+     * your Context, then call {@link #copyPage() copyPage()} instead.
+     * 
+     * <p>
+     * This method only applies to Surfaces which are paginated, which in
+     * practise means the PDF backend.
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * While Cairo treats these as a no-op for backends which are not
+     * paginated, throwing UnsupportedOperationException is the more
+     * traditional and accepted Java way of dealing with the case of base
+     * classes which expose a method for which many subclasses do not take
+     * action. Obviously this should be overridden by concrete subclasses
+     * representing backends which are actually paginated.
+     */
+    public void showPage() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Emit the current page, but keep the content of the Surface as the
+     * starting point for the next page.
+     * 
+     * @since 4.0.10
+     */
+    public void copyPage() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Create a new Surface based on this one.
+     * 
+     * <pre>
+     * surface.createSimilar(Content.COLOR_ALPHA, 800, 600);
+     * </pre>
+     * 
+     * <p>
+     * This has enormous application when drawing with image heavy content to
+     * screen.
+     * 
+     * @since 4.0.10
+     */
+    public Surface createSimilar(Content type, int width, int height) {
+        return CairoSurface.createSimilar(this, type, width, height);
+    }
+
+    /**
+     * Attach original image data to a surface. When drawing an image into a
+     * vector Surface such as PDF or SVG, Cairo will draw the decoded image as
+     * a bitmap. Which is <i>hugely</i> inefficient. This method allows you to
+     * add the original image to the surface, and when drawing out Cairo will
+     * use this if it can.
+     * 
+     * <p>
+     * Keep in mind that you attach the data to the <i>intermediate</i>
+     * Surface which is painted onto the target, not the final target Surface
+     * itself.
+     * 
+     * <pre>
+     * pixbuf = new Pixbuf(data);
+     * 
+     * intermediate = new ImageSurface(Format.ARGB32, width, height);
+     * 
+     * second = new Context(intermediate);
+     * second.setSource(pixbuf, 0, 0);
+     * second.paint();
+     * intermediate.setMimeData(MimeType.JPEG, data);
+     * 
+     * cr.setSource(intermediate, 0, 0);
+     * cr.paint();
+     * </pre>
+     * 
+     * or you can go through the implicitly created Pattern:
+     * 
+     * <pre>
+     * pixbuf = new Pixbuf(data);
+     * 
+     * cr.setSource(pixbuf, 0, 0);
+     * pattern = cr.getSource();
+     * implicit = pattern.getSurface();
+     * implicit.setMimeData(MimeType.JPEG, data);
+     * 
+     * cr.paint();
+     * </pre>
+     * 
+     * which seems a bit easier.
+     * 
+     * <p>
+     * <b>NOTE:</b><br/>
+     * You must not make any changes to the intermediate surface after setting
+     * the image data or you will lose the effect of this call.
+     * 
+     * <p>
+     * <i>It would be nice if gdk_cairo_set_source_pixbuf() just did this for
+     * us.</i>
+     * 
+     * 
+     * @since 4.0.18
+     */
+    public void setMimeData(MimeType type, byte[] data) {
+        CairoSurfaceOverride.setMimeData(this, type, data);
+    }
+
+    /**
+     * Set a filename as the MIME data for this surface.
+     * 
+     * @since <span style="color:red">Unstable</span>
+     */
+    /*
+     * FIXME How does this work? Are you supposed to use URI, or the actual
+     * file type, or?
+     */
+    public void setMimeData(MimeType type, String filename) {
+        final byte[] data;
+
+        data = filename.getBytes();
+
+        CairoSurfaceOverride.setMimeData(this, type, data);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/SurfacePattern.java b/src/bindings/org/freedesktop/cairo/SurfacePattern.java
new file mode 100644
index 0000000..dcc1e8d
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/SurfacePattern.java
@@ -0,0 +1,61 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A source Pattern that is derived from another Surface. Creating on of these
+ * allows you to use another Surface you have or are working with as the
+ * "paint" when drawing on a different Surface.
+ * 
+ * <p>
+ * These are created internally if you call
+ * {@link Context#setSource(Surface, double, double) setSource()}.
+ * 
+ * @since 4.0.7
+ */
+public class SurfacePattern extends Pattern
+{
+    protected SurfacePattern(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a Pattern based on an existing Surface.
+     * 
+     * @since 4.0.7
+     */
+    public SurfacePattern(Surface surface) {
+        super(CairoPattern.createPatternForSurface(surface));
+        checkStatus();
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/SvgSurface.java b/src/bindings/org/freedesktop/cairo/SvgSurface.java
new file mode 100644
index 0000000..388abfc
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/SvgSurface.java
@@ -0,0 +1,84 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+import java.io.IOException;
+
+/**
+ * A Surface that you can use to write to a <abbr title="Scalable Vector
+ * Graphics">SVG</abbr> file. You should use it as in the following example:
+ * 
+ * <pre>
+ * surface = new SvgSurface(filename, 100, 100);
+ * cr = new Context(surface);
+ * 
+ * // do drawing
+ * 
+ * // and write to the file
+ * surface.finish();
+ * </pre>
+ * 
+ * It is important to call {@link Surface#finish() finish()} at the end, to
+ * ensure contents are actually written to the file.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.10
+ */
+public class SvgSurface extends Surface
+{
+    protected SvgSurface(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new SvgSurface.
+     * 
+     * @param filename
+     *            The file to write to.
+     * @param width
+     *            width of the surface, in points (1 point == 1/72.0 inch)
+     * @param height
+     *            height of the surface, in points (1 point == 1/72.0 inch)
+     * @throws IOException
+     *             If you do not have write permissions on the given file.
+     */
+    public SvgSurface(String filename, double width, double height) throws IOException {
+        super(CairoSurface.createSurfaceSvg(filename, width, height));
+        Status status = CairoSurface.status(this);
+        if (status == Status.WRITE_ERROR) {
+            throw new IOException("You cannot write to file " + filename);
+        }
+        checkStatus(status);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/UnknownSurface.java b/src/bindings/org/freedesktop/cairo/UnknownSurface.java
new file mode 100644
index 0000000..aa0e3f1
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/UnknownSurface.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Surface type for internal backends. These are not made public by the Cairo
+ * library, so we cannot create a more appropriately typed class.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * In java-gnome if we offer accurate fully derived types, and normally it is
+ * an error if we can't do so (ie, we haven't coverage for something yet).
+ * Cairo has a number of cases where internal types are exposed (notably
+ * MetaSurface for vector backends) for which there is no public
+ * identification. An instance of this class is created in such cases. Be
+ * warned that getting one of these is NOT a workaround for failing to create
+ * a proper Proxy subclass for something that IS public.
+ */
+class UnknownSurface extends Surface
+{
+    protected UnknownSurface(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/XlibSurface.java b/src/bindings/org/freedesktop/cairo/XlibSurface.java
new file mode 100644
index 0000000..948195e
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/XlibSurface.java
@@ -0,0 +1,130 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * A Window as rendered by the X Server. Used internally when drawing to an
+ * application window.
+ * 
+ * <p>
+ * Ordinarily you don't think about creating an XlibSurface; one is implicitly
+ * created for you when you create a Cairo context in order to draw in an
+ * <code>Widget.Draw</code> signal handler:
+ * 
+ * <pre>
+ * gizmo.connect(new Widget.Draw() {
+ *     public boolean onDraw(Widget source, Context cr) {
+ *         Surface surface;
+ *         
+ *         // start drawing
+ *         
+ *         // for interest's sake
+ *         surface = cr.getTarget();
+ *         assert (surface instanceof XlibSurface);
+ *     }
+ * }
+ * </pre>
+ * 
+ * <h2>Efficient caching of image data</h2>
+ * 
+ * <p>
+ * There is a fair bit of work involved in translating from an image in bitmap
+ * form in application memory to the representation that will be used by the X
+ * server in video memory. Thus if you are drawing frequently with the same
+ * Pixbuf, you may find you are dramatically better off caching the image in
+ * the X server.
+ * 
+ * <p>
+ * The best way to do this is to create an XlibSurface with this image in it.
+ * You set that image to be the source pattern with a call to
+ * <code>setSource()</code> and then paint that onto the Context where you are
+ * drawing. The key method involved is <code>createSimilar()</code>, which
+ * allows you to create an X resource as a cache:
+ * 
+ * <pre>
+ * gizmo.connect(new Widget.Draw() {
+ *     private Surface cache;
+ * 
+ *     public boolean onDraw(Widget source, Context cr) {
+ *         final Context cr2;
+ *         final Surface target;
+ *         final Pixbuf pixbuf;
+ *         final double x, y;
+ *         
+ *         // start drawing
+ *         ...
+ *         
+ *         // cache image
+ *         if (cache == null) {
+ *             pixbuf = new Pixbuf(filename);
+ *             
+ *             target = cr.getTarget();
+ *             cache = target.createSimilar(Content.COLOR_ALPHA, pixbuf.getWidth(), pixbuf.getHeight());
+ *             cr2 = new Context(cache);
+ *             cr2.setSource(pixbuf, 0.0, 0.0);
+ *             cr2.paint();
+ *         }
+ *         
+ *         // now we can draw the image
+ *         cr.setSource(cache, x, y);
+ *         cr.paint();
+ *     }
+ * }
+ * </pre>
+ * 
+ * note that this is <i>not</i> an ImageSurface; we've deliberately created
+ * another XlibSurface which is the proxy around the X resource which the X
+ * server can decide how best to blit with efficiently.
+ * 
+ * <p>
+ * <i>Obviously you are consuming X server memory doing this, and it can be
+ * overdone. You'll have to look at your application's performance to decide
+ * whether this is necessary and if so, how much caching to do. Nevertheless,
+ * modern graphics cards are very good at blitting images together so if you
+ * are doing anything image intensive you are best to let the X server do the
+ * work. Cairo is designed with this in mind.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+/*
+ * Thanks to Carl Worth, Davyd Madeley, and Mathias Hasselman for having
+ * explained the code paths involved and the implications of efficiently using
+ * X server memory and it in turn using video memory.
+ */
+public class XlibSurface extends Surface
+{
+    protected XlibSurface(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/freedesktop/cairo/package.html b/src/bindings/org/freedesktop/cairo/package.html
new file mode 100644
index 0000000..7e83138
--- /dev/null
+++ b/src/bindings/org/freedesktop/cairo/package.html
@@ -0,0 +1,35 @@
+<html>
+<head>
+</head>
+<body>
+The Cairo Graphics library is the high performance drawing suite used to do
+custom drawing in GTK. The heart of the library is the <a
+href="Context.html">Context</a> class which is what you use to draw on a
+Surface; look there for information, and for an example of how to get started
+with Widget drawing, see <a
+href="../../../../examples/cairo/ExampleDrawingGradient.html"><code>ExampleDrawingGradient.java</code></a>.
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/org/freedesktop/enchant/Broker.java b/src/bindings/org/freedesktop/enchant/Broker.java
new file mode 100644
index 0000000..6c90f81
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/Broker.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.enchant;
+
+/**
+ * Mechanism used by the Enchant library to manage getting handles to spelling
+ * backends. We present its functionality on the {@link Enchant} class static.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+class Broker extends Entity
+{
+    // this is enchant_broker_init()
+    Broker() {
+        super(EnchantBroker.createBroker());
+    }
+
+    protected void release() {
+        EnchantBroker.free(this);
+    }
+}
diff --git a/src/bindings/org/freedesktop/enchant/Dictionary.java b/src/bindings/org/freedesktop/enchant/Dictionary.java
new file mode 100644
index 0000000..f5a45a6
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/Dictionary.java
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.enchant;
+
+/**
+ * @author Andrew Cowie
+ * @since 4.0.14
+ * 
+ */
+public class Dictionary extends Entity
+{
+    protected Dictionary(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        final Broker broker;
+
+        broker = Enchant.getDefault();
+        EnchantBroker.freeDict(broker, this);
+    }
+
+    /**
+     * Check the spelling of the given word.
+     * 
+     * <p>
+     * Returns <code>true</code> if the word is deemed to be spelt correctly,
+     * <code>false</code> if incorrect.
+     * 
+     * <p>
+     * <i>The underlying library documentation also notes an error state;
+     * should it be encountered we throw an IllegalStateException.</i>
+     * 
+     * @since 4.0.14
+     */
+    public boolean check(String word) {
+        final int result;
+
+        if (word.length() == 0) {
+            /*
+             * Enchant crashes if you try to spell check a zero width string.
+             * So we'll define an empty String to be correctly spelled.
+             */
+            return true;
+        }
+
+        result = EnchantDict.check(this, word, -1);
+
+        if (result == 0) {
+            return true;
+        } else if (result > 0) {
+            return false;
+        } else {
+            throw new IllegalStateException("Internal problem in Enchant wrapper library");
+        }
+    }
+
+    /**
+     * Offer alternate suggestions of how to spell a word.
+     * 
+     * <p>
+     * Beware that you can get suggestions even from a word that is correctly
+     * spelt! This means that you need to call {@link #check(String) check()}
+     * first to find out whether or not to offer a list of corrections.
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * FIXME we need to call enchant_dict_free_string_list() on the C side
+     * char**, but there's no way for the code generator to do that for us. By
+     * having declared caller-owns-return as true in the .defs data we
+     * generate a call to g_strfreev() which is what the enchant code does
+     * internally, so this is not a leak. But we should replace this with an
+     * Override that calls the Enchant function properly.
+     */
+    public String[] suggest(String word) {
+        return EnchantDict.suggest(this, word, -1, null);
+    }
+
+    /**
+     * Add a word to the personal dictionary.
+     * 
+     * @since 4.0.14
+     */
+    public void add(String word) {
+        EnchantDict.add(this, word, -1);
+    }
+
+    /**
+     * Remove a word from the personal dictionary.
+     * 
+     * <p>
+     * <b>FIXME</b><br>
+     * This does remove the word from the Enchant personal word list, but it
+     * then <i>adds</i> it to something called the "exclude" list. What is
+     * that all about?
+     * 
+     * @since 4.0.14
+     */
+    public void remove(String word) {
+        EnchantDict.remove(this, word, -1);
+    }
+}
diff --git a/src/bindings/org/freedesktop/enchant/Enchant.java b/src/bindings/org/freedesktop/enchant/Enchant.java
new file mode 100644
index 0000000..bccf962
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/Enchant.java
@@ -0,0 +1,225 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.enchant;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.gnome.glib.Glib;
+
+/**
+ * Get a handle to an Enchant dictionary for spell checking.
+ * 
+ * <p>
+ * Enchant is not itself a spell checking library; it is, rather a facade to
+ * various common spelling mechanisms. It provides a simple and sufficient API
+ * for doing spelling operations. Which actual back-end provider will be
+ * employed depends on the system and user "ordering" files.
+ * 
+ * <h2>Usage</h2>
+ * 
+ * <p>
+ * Enchant is straight-forward to use. For possibly misspelled
+ * <code>word</code>, you can do
+ * 
+ * <pre>
+ * Enchant.init();
+ * 
+ * dict = Enchant.requestDictionary("en_CA");
+ * 
+ * if (dict.check(word)) {
+ *     return "Spelled correctly!";
+ * } else {
+ *     possibles = dict.suggest(word);
+ *     
+ *     str.append("The word ");
+ *     str.append(word);
+ *     str.append(" was misspelled. You could correct it with one of:\n"
+ *     
+ *     for (i = 0; i < possibles.length; i++) {
+ *         str.append(possibles[i]);
+ *         str.append('\n');
+ *     }
+ *     
+ *     return str.toString();
+ * }
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ * @see <a href="http://www.abisource.com/projects/enchant/">Enchant home
+ *      page</a>
+ */
+/*
+ * This API could have been exposed as an init function returning a Broker,
+ * and then calling the Broker method to get a Dictionary, but that doesn't
+ * really seem to add anything to the experience.
+ */
+public final class Enchant extends Glib
+{
+    private Enchant() {}
+
+    private static Broker defaultBroker;
+
+    /**
+     * @since 4.0.14
+     */
+    /*
+     * Here, or Broker.init()?
+     */
+    public static void init() {
+        if (defaultBroker == null) {
+            defaultBroker = new Broker();
+        }
+    }
+
+    static Broker getDefault() {
+        return defaultBroker;
+    }
+
+    /**
+     * Get a Dictionary for the specified language.
+     * 
+     * <p>
+     * See {@link Enchant#existsDictionary(String) existsDictionary()} for
+     * discussion of valid language values. You probably want to call that if
+     * you're considering user input values.
+     * 
+     * <p>
+     * Returns <code>null</code> if no suitable dictionary was found.
+     * 
+     * @since 4.0.14
+     */
+    public static Dictionary requestDictionary(String lang) {
+        if (lang.equals("")) {
+            throw new IllegalArgumentException();
+        }
+        return EnchantBroker.requestDict(defaultBroker, lang);
+    }
+
+    /**
+     * Get a Dictionary for the specified personal word list.
+     * 
+     * <p>
+     * Word lists are simple files with one word per line. By creating a
+     * Dictionary of a personal word list you can add words to a file that is
+     * independent of a normal spelling engine back-end.
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * TODO Enchant has its own idea of error reporting, which we should check
+     * as well.
+     */
+    public static Dictionary requestPersonalWordList(String filename) throws FileNotFoundException {
+        final File target;
+
+        target = new File(filename);
+        if (!target.exists()) {
+            throw new FileNotFoundException(filename);
+        }
+        return EnchantBroker.requestPwlDict(defaultBroker, filename);
+    }
+
+    /**
+     * Does a dictionary exist for the given "language"?
+     * 
+     * <p>
+     * Languages are indicated in a locale-like form; while you can use just
+     * the language code <code>en</code>, specifying a specific language
+     * variant such as <code>"en_UK"</code> or <code>"fr_CA"</code> is
+     * preferred.
+     * 
+     * @since 4.0.17
+     */
+    public static boolean existsDictionary(String lang) {
+        final int result;
+
+        result = EnchantBroker.dictExists(defaultBroker, lang);
+
+        if (result == 0) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * Get a list of available dictionaries as known to Enchant. This returns
+     * an unsorted array of Strings of the form:
+     * 
+     * <pre>
+     * en
+     * en_AU
+     * en_CA
+     * en_GB
+     * en_US
+     * en_ZA
+     * es
+     * fr_BE
+     * fr_CA
+     * fr_CH
+     * fr_FR
+     * fr_LU
+     * fr_MC
+     * </pre>
+     * 
+     * (that was the list on a computer with English, French, and Spanish
+     * dictionaries installed via packages <code>language-support-en</code>,
+     * <code>language-support-fr</code>, <code>language-support-es</code>
+     * respectively on, in this case, Ubuntu Linux).
+     * 
+     * <p>
+     * You don't necessarily need to callt this function. You can test for the
+     * existance of a dictionary with {@link #existsDictionary(String)
+     * Enchant.existsDictionary()}, or even just get on directly with loading
+     * a dictionary with {@link #requestDictionary(String)
+     * requestDictionary()}.
+     * 
+     * <p>
+     * If you are using the results of this funciton to create a list in a
+     * user interface, you'll probably want to present the language and
+     * country names translated. Use
+     * {@link org.freedesktop.bindings.Internationalization#translateLanguageName(String)
+     * Internationalization.translateLanguageName()} and
+     * {@link org.freedesktop.bindings.Internationalization#translateCountryName(String)
+     * Internationalization.translateCountryName()} although you'll have to
+     * look up the proper ISO 639 and ISO 3166 names in
+     * <code>/usr/share/xml/iso-codes/iso_{639,3166}.xml</code> first.
+     * 
+     * @since 4.0.17
+     */
+    public static String[] listDictionaries() {
+        return EnchantBrokerOverride.listDicts(defaultBroker);
+    }
+}
diff --git a/src/bindings/org/freedesktop/enchant/EnchantBrokerOverride.c b/src/bindings/org/freedesktop/enchant/EnchantBrokerOverride.c
new file mode 100644
index 0000000..167dc86
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/EnchantBrokerOverride.c
@@ -0,0 +1,139 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include <enchant.h>
+#include <libintl.h>
+#include "bindings_java.h"
+#include "org_freedesktop_enchant_EnchantBrokerOverride.h"
+
+static GSList* list;
+
+static void
+enumerate_dictionary
+(
+	const char* const lang_tag,
+	const char* const provider_name,
+	const char* const provider_desc,
+	const char* const provider_file,
+        void* user_data
+)
+{
+	gchar* copy;
+
+	copy = g_strdup(lang_tag);
+	list = g_slist_prepend(list, copy);
+}
+
+/*
+ */
+/*
+ * Signature the prototype of (*EnchantDictDescribeFn), meeting the
+ * requirements to be the second argument to enchant_broker_list_dicts().
+ */
+
+/*
+ * Implements
+ *   org.freedesktop.enchant.EnchantBrokerOverride.enchant_broker_list_dicts()
+ * called from
+ *   org.freedesktop.enchant.EnchantBrokerOverride.listDicts()
+ * called from
+ *   org.freedesktop.enchant.Enchant.listDictionaries()
+ *
+ * This one uses a function pointer to enumerate through the available
+ * dictionaries, so we need to do this here in native code.
+ */
+JNIEXPORT jobjectArray JNICALL
+Java_org_freedesktop_enchant_EnchantBrokerOverride_enchant_1broker_1list_1dicts
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	EnchantBroker* self;
+	GSList* iter;
+	gchar** result;
+	jobjectArray _result;
+	guint size;
+	int i;
+
+	// convert self
+	self = (EnchantBroker*) _self;
+
+
+	/*
+	 * Ideally we would allocate a GList we can use to accumulate results.
+	 * Except that you don't attually allocate a GList :) and we'll use one
+	 * stack allocated here. FIXME Except that I couldn't make that work,
+	 * so we used a global instead.
+	 */
+
+	list = NULL;
+
+	// call function
+	enchant_broker_list_dicts(self, enumerate_dictionary, NULL);
+
+
+	// cleanup parameter self
+
+	/*
+	 * To get this back to Java as a String[] we need a gchar** so we can
+	 * then use our existing utilty function. So we need to transfer the
+	 * strings from the GSList to a temporary gchar** now.
+	 */
+
+	size = g_slist_length(list);
+
+	result = g_malloc((size + 1) * sizeof(gchar*));
+	result[size] = NULL;
+
+	iter = list;
+	for (i = 0; i < size; i++) {
+		result[i] = (gchar*) iter->data;
+		iter = g_slist_next(iter);
+	}
+
+
+	// translate return value to JNI type
+	_result = (jobjectArray) bindings_java_convert_gchararray_to_jarray(env, (const gchar**)result);
+
+	// cleanup return value
+	if (result != NULL) {
+		g_strfreev(result);
+	}
+
+	// and finally
+	return _result;
+}
diff --git a/src/bindings/org/freedesktop/enchant/EnchantBrokerOverride.java b/src/bindings/org/freedesktop/enchant/EnchantBrokerOverride.java
new file mode 100644
index 0000000..4d25d56
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/EnchantBrokerOverride.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.enchant;
+
+/**
+ * Deal with the function pointer for enumerating available dictionaries.
+ * 
+ * @author Andrew Cowie
+ */
+final class EnchantBrokerOverride extends Plumbing
+{
+    static final String[] listDicts(Broker self) {
+        String[] result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = enchant_broker_list_dicts(pointerOf(self));
+
+            return result;
+        }
+    }
+
+    private static native final String[] enchant_broker_list_dicts(long self);
+}
diff --git a/src/bindings/org/freedesktop/enchant/Entity.java b/src/bindings/org/freedesktop/enchant/Entity.java
new file mode 100644
index 0000000..7b21ce6
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/Entity.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.enchant;
+
+import org.freedesktop.bindings.Proxy;
+
+/**
+ * Opaque objects in the Enchant spelling library.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+abstract class Entity extends Proxy
+{
+    protected Entity(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/freedesktop/enchant/Plumbing.java b/src/bindings/org/freedesktop/enchant/Plumbing.java
new file mode 100644
index 0000000..9bb6f07
--- /dev/null
+++ b/src/bindings/org/freedesktop/enchant/Plumbing.java
@@ -0,0 +1,77 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.enchant;
+
+import org.gnome.gdk.Gdk;
+
+abstract class Plumbing extends org.freedesktop.bindings.Plumbing
+{
+    protected Plumbing() {}
+
+    /*
+     * Expose access to the global GDK lock.
+     */
+    /*
+     * TODO I'm not sure we need this. In fact, I rather expect that this is
+     * in the way, but we'd have to make the synchronized block output by the
+     * code generator conditional.
+     */
+    protected static final java.lang.Object lock;
+
+    static {
+        isLibraryReady();
+
+        lock = Gdk.lock;
+    }
+
+    protected static Entity entityFor(Class<?> type, long pointer) {
+        Entity obj;
+
+        if (pointer == 0L) {
+            return null;
+        }
+
+        obj = (Entity) org.freedesktop.bindings.Plumbing.instanceFor(pointer);
+
+        if (obj != null) {
+            return obj;
+        } else {
+            if (type == Dictionary.class) {
+                obj = new Dictionary(pointer);
+            } else if (type == Broker.class) {
+                throw new UnsupportedOperationException("Not yet implemented");
+            }
+            return obj;
+        }
+    }
+}
diff --git a/src/bindings/org/freedesktop/icons/ActionIcon.java b/src/bindings/org/freedesktop/icons/ActionIcon.java
new file mode 100644
index 0000000..d4fe527
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/ActionIcon.java
@@ -0,0 +1,253 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing actions.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class ActionIcon extends Icon
+{
+    protected ActionIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon ADDRESS_BOOK_NEW = new ActionIcon("address-book-new");
+
+    public static final Icon APPLICATION_EXIT = new ActionIcon("application-exit");
+
+    public static final Icon APPOINTMENT_NEW = new ActionIcon("appointment-new");
+
+    public static final Icon BOOKMARK_NEW = new ActionIcon("bookmark-new");
+
+    public static final Icon CALL_START = new ActionIcon("call-start");
+
+    public static final Icon CALL_STOP = new ActionIcon("call-stop");
+
+    public static final Icon CONTACT_NEW = new ActionIcon("contact-new");
+
+    public static final Icon DOCUMENT_NEW = new ActionIcon("document-new");
+
+    public static final Icon DOCUMENT_OPEN = new ActionIcon("document-open");
+
+    public static final Icon DOCUMENT_OPEN_RECENT = new ActionIcon("document-open-recent");
+
+    public static final Icon DOCUMENT_PAGE_SETUP = new ActionIcon("document-page-setup");
+
+    public static final Icon DOCUMENT_PRINT = new ActionIcon("document-print");
+
+    public static final Icon DOCUMENT_PRINT_PREVIEW = new ActionIcon("document-print-preview");
+
+    public static final Icon DOCUMENT_PROPERTIES = new ActionIcon("document-properties");
+
+    public static final Icon DOCUMENT_REVERT = new ActionIcon("document-revert");
+
+    public static final Icon DOCUMENT_SAVE_AS = new ActionIcon("document-save-as");
+
+    public static final Icon DOCUMENT_SAVE = new ActionIcon("document-save");
+
+    public static final Icon DOCUMENT_SEND = new ActionIcon("document-send");
+
+    public static final Icon EDIT_CLEAR = new ActionIcon("edit-clear");
+
+    public static final Icon EDIT_COPY = new ActionIcon("edit-copy");
+
+    public static final Icon EDIT_CUT = new ActionIcon("edit-cut");
+
+    public static final Icon EDIT_DELETE = new ActionIcon("edit-delete");
+
+    public static final Icon EDIT_FIND = new ActionIcon("edit-find");
+
+    public static final Icon EDIT_FIND_REPLACE = new ActionIcon("edit-find-replace");
+
+    public static final Icon EDIT_PASTE = new ActionIcon("edit-paste");
+
+    public static final Icon EDIT_REDO = new ActionIcon("edit-redo");
+
+    public static final Icon EDIT_SELECT_ALL = new ActionIcon("edit-select-all");
+
+    public static final Icon EDIT_UNDO = new ActionIcon("edit-undo");
+
+    public static final Icon FOLDER_NEW = new ActionIcon("folder-new");
+
+    public static final Icon FORMAT_INDENT_LESS = new ActionIcon("format-indent-less");
+
+    public static final Icon FORMAT_INDENT_MORE = new ActionIcon("format-indent-more");
+
+    public static final Icon FORMAT_JUSTIFY_CENTER = new ActionIcon("format-justify-center");
+
+    public static final Icon FORMAT_JUSTIFY_FILL = new ActionIcon("format-justify-fill");
+
+    public static final Icon FORMAT_JUSTIFY_LEFT = new ActionIcon("format-justify-left");
+
+    public static final Icon FORMAT_JUSTIFY_RIGHT = new ActionIcon("format-justify-right");
+
+    public static final Icon FORMAT_TEXT_BOLD = new ActionIcon("format-text-bold");
+
+    public static final Icon FORMAT_TEXT_DIRECTION_LTR = new ActionIcon("format-text-direction-ltr");
+
+    public static final Icon FORMAT_TEXT_DIRECTION_RTL = new ActionIcon("format-text-direction-rtl");
+
+    public static final Icon FORMAT_TEXT_ITALIC = new ActionIcon("format-text-italic");
+
+    public static final Icon FORMAT_TEXT_STRIKETHROUGH = new ActionIcon("format-text-strikethrough");
+
+    public static final Icon FORMAT_TEXT_UNDERLINE = new ActionIcon("format-text-underline");
+
+    public static final Icon GO_BOTTOM = new ActionIcon("go-bottom");
+
+    public static final Icon GO_DOWN = new ActionIcon("go-down");
+
+    public static final Icon GO_FIRST = new ActionIcon("go-first");
+
+    public static final Icon GO_HOME = new ActionIcon("go-home");
+
+    public static final Icon GO_JUMP = new ActionIcon("go-jump");
+
+    public static final Icon GO_LAST = new ActionIcon("go-last");
+
+    public static final Icon GO_NEXT = new ActionIcon("go-next");
+
+    public static final Icon GO_PREVIOUS = new ActionIcon("go-previous");
+
+    public static final Icon GO_TOP = new ActionIcon("go-top");
+
+    public static final Icon GO_UP = new ActionIcon("go-up");
+
+    public static final Icon HELP_ABOUT = new ActionIcon("help-about");
+
+    public static final Icon HELP_CONTENTS = new ActionIcon("help-contents");
+
+    public static final Icon HELP_FAQ = new ActionIcon("help-faq");
+
+    public static final Icon INSERT_IMAGE = new ActionIcon("insert-image");
+
+    public static final Icon INSERT_LINK = new ActionIcon("insert-link");
+
+    public static final Icon INSERT_OBJECT = new ActionIcon("insert-object");
+
+    public static final Icon INSERT_TEXT = new ActionIcon("insert-text");
+
+    public static final Icon LIST_ADD = new ActionIcon("list-add");
+
+    public static final Icon LIST_REMOVE = new ActionIcon("list-remove");
+
+    public static final Icon MAIL_FORWARD = new ActionIcon("mail-forward");
+
+    public static final Icon MAIL_MARK_IMPORTANT = new ActionIcon("mail-mark-important");
+
+    public static final Icon MAIL_MARK_JUNK = new ActionIcon("mail-mark-junk");
+
+    public static final Icon MAIL_MARK_NOTJUNK = new ActionIcon("mail-mark-notjunk");
+
+    public static final Icon MAIL_MARK_READ = new ActionIcon("mail-mark-read");
+
+    public static final Icon MAIL_MARK_UNREAD = new ActionIcon("mail-mark-unread");
+
+    public static final Icon MAIL_MESSAGE_NEW = new ActionIcon("mail-message-new");
+
+    public static final Icon MAIL_REPLY_ALL = new ActionIcon("mail-reply-all");
+
+    public static final Icon MAIL_REPLY_SENDER = new ActionIcon("mail-reply-sender");
+
+    public static final Icon MAIL_SEND = new ActionIcon("mail-send");
+
+    public static final Icon MAIL_SEND_RECEIVE = new ActionIcon("mail-send-receive");
+
+    public static final Icon MEDIA_EJECT = new ActionIcon("media-eject");
+
+    public static final Icon MEDIA_PLAYBACK_PAUSE = new ActionIcon("media-playback-pause");
+
+    public static final Icon MEDIA_PLAYBACK_START = new ActionIcon("media-playback-start");
+
+    public static final Icon MEDIA_PLAYBACK_STOP = new ActionIcon("media-playback-stop");
+
+    public static final Icon MEDIA_RECORD = new ActionIcon("media-record");
+
+    public static final Icon MEDIA_SEEK_BACKWARD = new ActionIcon("media-seek-backward");
+
+    public static final Icon MEDIA_SEEK_FORWARD = new ActionIcon("media-seek-forward");
+
+    public static final Icon MEDIA_SKIP_BACKWARD = new ActionIcon("media-skip-backward");
+
+    public static final Icon MEDIA_SKIP_FORWARD = new ActionIcon("media-skip-forward");
+
+    public static final Icon OBJECT_FLIP_HORIZONTAL = new ActionIcon("object-flip-horizontal");
+
+    public static final Icon OBJECT_FLIP_VERTICAL = new ActionIcon("object-flip-vertical");
+
+    public static final Icon OBJECT_ROTATE_LEFT = new ActionIcon("object-rotate-left");
+
+    public static final Icon OBJECT_ROTATE_RIGHT = new ActionIcon("object-rotate-right");
+
+    public static final Icon PROCESS_STOP = new ActionIcon("process-stop");
+
+    public static final Icon SYSTEM_LOCK_SCREEN = new ActionIcon("system-lock-screen");
+
+    public static final Icon SYSTEM_LOG_OUT = new ActionIcon("system-log-out");
+
+    public static final Icon SYSTEM_RUN = new ActionIcon("system-run");
+
+    public static final Icon SYSTEM_SEARCH = new ActionIcon("system-search");
+
+    public static final Icon SYSTEM_SHUTDOWN = new ActionIcon("system-shutdown");
+
+    public static final Icon TAB_NEW = new ActionIcon("tab-new");
+
+    public static final Icon TOOLS_CHECK_SPELLING = new ActionIcon("tools-check-spelling");
+
+    public static final Icon VIEW_FULLSCREEN = new ActionIcon("view-fullscreen");
+
+    public static final Icon VIEW_REFRESH = new ActionIcon("view-refresh");
+
+    public static final Icon VIEW_RESTORE = new ActionIcon("view-restore");
+
+    public static final Icon VIEW_SORT_ASCENDING = new ActionIcon("view-sort-ascending");
+
+    public static final Icon VIEW_SORT_DESCENDING = new ActionIcon("view-sort-descending");
+
+    public static final Icon WINDOW_CLOSE = new ActionIcon("window-close");
+
+    public static final Icon WINDOW_NEW = new ActionIcon("window-new");
+
+    public static final Icon ZOOM_FIT_BEST = new ActionIcon("zoom-fit-best");
+
+    public static final Icon ZOOM_IN = new ActionIcon("zoom-in");
+
+    public static final Icon ZOOM_ORIGINAL = new ActionIcon("zoom-original");
+
+    public static final Icon ZOOM_OUT = new ActionIcon("zoom-out");
+}
diff --git a/src/bindings/org/freedesktop/icons/ApplicationIcon.java b/src/bindings/org/freedesktop/icons/ApplicationIcon.java
new file mode 100644
index 0000000..d67f55b
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/ApplicationIcon.java
@@ -0,0 +1,110 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing individual applications.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class ApplicationIcon extends Icon
+{
+    protected ApplicationIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon ACCESSORIES_CALCULATOR = new ApplicationIcon("accessories-calculator");
+
+    public static final Icon ACCESSORIES_CHARACTER_MAP = new ApplicationIcon("accessories-character-map");
+
+    public static final Icon ACCESSORIES_DICTIONARY = new ApplicationIcon("accessories-dictionary");
+
+    public static final Icon ACCESSORIES_TEXT_EDITOR = new ApplicationIcon("accessories-text-editor");
+
+    public static final Icon APPLETS_SCREENSHOOTER = new ApplicationIcon("applets-screenshooter");
+
+    public static final Icon HELP_BROWSER = new ApplicationIcon("help-browser");
+
+    public static final Icon LOGVIEWER = new ApplicationIcon("logviewer");
+
+    public static final Icon MULTIMEDIA_VOLUME_CONTROL = new ApplicationIcon("multimedia-volume-control");
+
+    public static final Icon PREFERENCES_DESKTOP_ACCESSIBILITY = new ApplicationIcon(
+            "preferences-desktop-accessibility");
+
+    public static final Icon PREFERENCES_DESKTOP_DISPLAY = new ApplicationIcon(
+            "preferences-desktop-display");
+
+    public static final Icon PREFERENCES_DESKTOP_FONT = new ApplicationIcon("preferences-desktop-font");
+
+    public static final Icon PREFERENCES_DESKTOP_KEYBOARD = new ApplicationIcon(
+            "preferences-desktop-keyboard");
+
+    public static final Icon PREFERENCES_DESKTOP_KEYBOARD_SHORTCUTS = new ApplicationIcon(
+            "preferences-desktop-keyboard-shortcuts");
+
+    public static final Icon PREFERENCES_DESKTOP_LOCALE = new ApplicationIcon(
+            "preferences-desktop-locale");
+
+    public static final Icon PREFERENCES_DESKTOP_REMOTE_DESKTOP = new ApplicationIcon(
+            "preferences-desktop-remote-desktop");
+
+    public static final Icon PREFERENCES_DESKTOP_SCREENSAVER = new ApplicationIcon(
+            "preferences-desktop-screensaver");
+
+    public static final Icon PREFERENCES_DESKTOP_THEME = new ApplicationIcon("preferences-desktop-theme");
+
+    public static final Icon PREFERENCES_DESKTOP_WALLPAPER = new ApplicationIcon(
+            "preferences-desktop-wallpaper");
+
+    public static final Icon PREFERENCES_SYSTEM_WINDOWS = new ApplicationIcon(
+            "preferences-system-windows");
+
+    public static final Icon SYSTEM_FILE_MANAGER = new ApplicationIcon("system-file-manager");
+
+    public static final Icon SYSTEM_SOFTWARE_INSTALL = new ApplicationIcon("system-software-install");
+
+    public static final Icon SYSTEM_SOFTWARE_UPDATE = new ApplicationIcon("system-software-update");
+
+    public static final Icon SYSTEM_USERS = new ApplicationIcon("system-users");
+
+    public static final Icon USER_INFO = new ApplicationIcon("user-info");
+
+    public static final Icon UTILITIES_SYSTEM_MONITOR = new ApplicationIcon("utilities-system-monitor");
+
+    public static final Icon UTILITIES_TERMINAL = new ApplicationIcon("utilities-terminal");
+
+    public static final Icon WEB_BROWSER = new ApplicationIcon("web-browser");
+}
diff --git a/src/bindings/org/freedesktop/icons/CategoryIcon.java b/src/bindings/org/freedesktop/icons/CategoryIcon.java
new file mode 100644
index 0000000..8076e89
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/CategoryIcon.java
@@ -0,0 +1,87 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing application categories.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class CategoryIcon extends Icon
+{
+    protected CategoryIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon APPLICATIONS_ACCESSORIES = new CategoryIcon("applications-accessories");
+
+    public static final Icon APPLICATIONS_DEVELOPMENT = new CategoryIcon("applications-development");
+
+    public static final Icon APPLICATIONS_ENGINEERING = new CategoryIcon("applications-engineering");
+
+    public static final Icon APPLICATIONS_GAMES = new CategoryIcon("applications-games");
+
+    public static final Icon APPLICATIONS_GRAPHICS = new CategoryIcon("applications-graphics");
+
+    public static final Icon APPLICATIONS_INTERNET = new CategoryIcon("applications-internet");
+
+    public static final Icon APPLICATIONS_MULTIMEDIA = new CategoryIcon("applications-multimedia");
+
+    public static final Icon APPLICATIONS_OFFICE = new CategoryIcon("applications-office");
+
+    public static final Icon APPLICATIONS_OTHER = new CategoryIcon("applications-other");
+
+    public static final Icon APPLICATIONS_SCIENCE = new CategoryIcon("applications-science");
+
+    public static final Icon APPLICATIONS_SYSTEM = new CategoryIcon("applications-system");
+
+    public static final Icon APPLICATIONS_UTILITIES = new CategoryIcon("applications-utilities");
+
+    public static final Icon PREFERENCES_DESKTOP_PERIPHERALS = new CategoryIcon(
+            "preferences-desktop-peripherals");
+
+    public static final Icon PREFERENCES_DESKTOP_PERSONAL = new CategoryIcon(
+            "preferences-desktop-personal");
+
+    public static final Icon PREFERENCES_DESKTOP = new CategoryIcon("preferences-desktop");
+
+    public static final Icon PREFERENCES_OTHER = new CategoryIcon("preferences-other");
+
+    public static final Icon PREFERENCES_SYSTEM_NETWORK = new CategoryIcon("preferences-system-network");
+
+    public static final Icon PREFERENCES_SYSTEM = new CategoryIcon("preferences-system");
+
+    public static final Icon SYSTEM_HELP = new CategoryIcon("system-help");
+}
diff --git a/src/bindings/org/freedesktop/icons/DeviceIcon.java b/src/bindings/org/freedesktop/icons/DeviceIcon.java
new file mode 100644
index 0000000..715cd11
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/DeviceIcon.java
@@ -0,0 +1,105 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing devices.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class DeviceIcon extends Icon
+{
+    protected DeviceIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon AC_ADAPTER = new DeviceIcon("ac-adapter");
+
+    public static final Icon AUDIO_CARD = new DeviceIcon("audio-card");
+
+    public static final Icon AUDIO_INPUT_MICROPHONE = new DeviceIcon("audio-input-microphone");
+
+    public static final Icon BATTERY = new DeviceIcon("battery");
+
+    public static final Icon CAMERA_PHOTO = new DeviceIcon("camera-photo");
+
+    public static final Icon CAMERA_VIDEO = new DeviceIcon("camera-video");
+
+    public static final Icon CAMERA_WEB = new DeviceIcon("camera-web");
+
+    public static final Icon COMPUTER = new DeviceIcon("computer");
+
+    public static final Icon DRIVE_HARDDISK = new DeviceIcon("drive-harddisk");
+
+    public static final Icon DRIVE_OPTICAL = new DeviceIcon("drive-optical");
+
+    public static final Icon DRIVE_REMOVABLE_MEDIA = new DeviceIcon("drive-removable-media");
+
+    public static final Icon INPUT_GAMING = new DeviceIcon("input-gaming");
+
+    public static final Icon INPUT_KEYBOARD = new DeviceIcon("input-keyboard");
+
+    public static final Icon INPUT_MOUSE = new DeviceIcon("input-mouse");
+
+    public static final Icon INPUT_TABLET = new DeviceIcon("input-tablet");
+
+    public static final Icon INPUT_TOUCHPAD = new DeviceIcon("input-touchpad");
+
+    public static final Icon MEDIA_FLASH = new DeviceIcon("media-flash");
+
+    public static final Icon MEDIA_FLOPPY = new DeviceIcon("media-floppy");
+
+    public static final Icon MEDIA_OPTICAL = new DeviceIcon("media-optical");
+
+    public static final Icon MEDIA_TAPE = new DeviceIcon("media-tape");
+
+    public static final Icon MODEM = new DeviceIcon("modem");
+
+    public static final Icon MULTIMEDIA_PLAYER = new DeviceIcon("multimedia-player");
+
+    public static final Icon NETWORK_WIRED = new DeviceIcon("network-wired");
+
+    public static final Icon NETWORK_WIRELESS = new DeviceIcon("network-wireless");
+
+    public static final Icon PDA = new DeviceIcon("pda");
+
+    public static final Icon PHONE = new DeviceIcon("phone");
+
+    public static final Icon PRINTER = new DeviceIcon("printer");
+
+    public static final Icon SCANNER = new DeviceIcon("scanner");
+
+    public static final Icon VIDEO_DISPLAY = new DeviceIcon("video-display");
+}
diff --git a/src/bindings/org/freedesktop/icons/EmblemIcon.java b/src/bindings/org/freedesktop/icons/EmblemIcon.java
new file mode 100644
index 0000000..1afe990
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/EmblemIcon.java
@@ -0,0 +1,82 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons with "emblems". These are small images that can be used to
+ * annotate an icon (you might have used these for files in Nautilus).
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class EmblemIcon extends Icon
+{
+    protected EmblemIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon EMBLEM_DEFAULT = new EmblemIcon("emblem-default");
+
+    public static final Icon EMBLEM_DOCUMENTS = new EmblemIcon("emblem-documents");
+
+    public static final Icon EMBLEM_DOWNLOADS = new EmblemIcon("emblem-downloads");
+
+    public static final Icon EMBLEM_FAVORITE = new EmblemIcon("emblem-favorite");
+
+    public static final Icon EMBLEM_GENERIC = new EmblemIcon("emblem-generic");
+
+    public static final Icon EMBLEM_IMPORTANT = new EmblemIcon("emblem-important");
+
+    public static final Icon EMBLEM_MAIL = new EmblemIcon("emblem-mail");
+
+    public static final Icon EMBLEM_NEW = new EmblemIcon("emblem-new");
+
+    public static final Icon EMBLEM_PACKAGE = new EmblemIcon("emblem-package");
+
+    public static final Icon EMBLEM_PHOTOS = new EmblemIcon("emblem-photos");
+
+    public static final Icon EMBLEM_READONLY = new EmblemIcon("emblem-readonly");
+
+    public static final Icon EMBLEM_SHARED = new EmblemIcon("emblem-shared");
+
+    public static final Icon EMBLEM_SYMBOLIC_LINK = new EmblemIcon("emblem-symbolic-link");
+
+    public static final Icon EMBLEM_SYSTEM = new EmblemIcon("emblem-system");
+
+    public static final Icon EMBLEM_UNREADABLE = new EmblemIcon("emblem-unreadable");
+
+    public static final Icon EMBLEM_URGENT = new EmblemIcon("emblem-urgent");
+
+    public static final Icon EMBLEM_WEB = new EmblemIcon("emblem-web");
+}
diff --git a/src/bindings/org/freedesktop/icons/FaceIcon.java b/src/bindings/org/freedesktop/icons/FaceIcon.java
new file mode 100644
index 0000000..2d76571
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/FaceIcon.java
@@ -0,0 +1,92 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons with "smiley faces". Not all of them are smiling
+ * <code>:)</code>
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class FaceIcon extends Icon
+{
+    protected FaceIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon FACE_ANGEL = new FaceIcon("face-angel");
+
+    public static final Icon FACE_ANGRY = new FaceIcon("face-angry");
+
+    public static final Icon FACE_COOL = new FaceIcon("face-cool");
+
+    public static final Icon FACE_CRYING = new FaceIcon("face-crying");
+
+    public static final Icon FACE_DEVILISH = new FaceIcon("face-devilish");
+
+    public static final Icon FACE_EMBARRASSED = new FaceIcon("face-embarrassed");
+
+    public static final Icon FACE_GLASSES = new FaceIcon("face-glasses");
+
+    public static final Icon FACE_KISS = new FaceIcon("face-kiss");
+
+    public static final Icon FACE_LAUGH = new FaceIcon("face-laugh");
+
+    public static final Icon FACE_MONKEY = new FaceIcon("face-monkey");
+
+    public static final Icon FACE_PLAIN = new FaceIcon("face-plain");
+
+    public static final Icon FACE_RASPBERRY = new FaceIcon("face-raspberry");
+
+    public static final Icon FACE_SAD = new FaceIcon("face-sad");
+
+    public static final Icon FACE_SICK = new FaceIcon("face-sick");
+
+    public static final Icon FACE_SMILE_BIG = new FaceIcon("face-smile-big");
+
+    public static final Icon FACE_SMILE = new FaceIcon("face-smile");
+
+    public static final Icon FACE_SMIRK = new FaceIcon("face-smirk");
+
+    public static final Icon FACE_SURPRISE = new FaceIcon("face-surprise");
+
+    public static final Icon FACE_TIRED = new FaceIcon("face-tired");
+
+    public static final Icon FACE_UNCERTAIN = new FaceIcon("face-uncertain");
+
+    public static final Icon FACE_WINK = new FaceIcon("face-wink");
+
+    public static final Icon FACE_WORRIED = new FaceIcon("face-worried");
+}
diff --git a/src/bindings/org/freedesktop/icons/Helper.java b/src/bindings/org/freedesktop/icons/Helper.java
new file mode 100644
index 0000000..42d65f6
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/Helper.java
@@ -0,0 +1,76 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+import java.util.HashMap;
+
+/**
+ * Internal infrastructure supporting named icons.
+ * 
+ * @since <span style="color: red">Not public</span>
+ * @author Andrew Cowie
+ */
+/*
+ * Nothing we can do about visibility because GTK methods need these. But it's
+ * hidden from normal use of the Icon class. Best we can do. We really need a
+ * "library" visibility.
+ */
+public class Helper
+{
+    private Helper() {}
+
+    private static final HashMap<String, Icon> knownIcons;
+
+    static {
+        knownIcons = new HashMap<String, Icon>(128, 1.0f);
+    }
+
+    /**
+     * Get the name of the icon expected by GTK.
+     */
+    public static String getName(Icon icon) {
+        return icon.name;
+    }
+
+    /**
+     * Look up the constant object Icon wrapper for the supplied String id as
+     * used in the underlying library. Returns <code>null</code> if not found.
+     */
+    public static Icon instanceFor(String name) {
+        return knownIcons.get(name);
+    }
+
+    static void registerIcon(Icon icon) {
+        knownIcons.put(icon.name, icon);
+    }
+}
diff --git a/src/bindings/org/freedesktop/icons/Icon.java b/src/bindings/org/freedesktop/icons/Icon.java
new file mode 100644
index 0000000..4727cf8
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/Icon.java
@@ -0,0 +1,106 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons. These constants represent icons that should be available in
+ * the current icon theme.
+ * 
+ * <p>
+ * The named icon standard groups icons in different categories. There is a
+ * subclass of Icon for each of these divisions: common {@link ActionIcon
+ * action}s that can be taken by users, {@link ApplicationIcon applications},
+ * main menu {@link CategoryIcon categoies}, {@link DeviceIcon devices} and
+ * more importantly {@link MimeIcon MIME types}, {@link EmblemIcon emblems}
+ * used to annotate other icons, the all important smiley {@link FaceIcon
+ * faces}, XDG defined {@link PlaceIcon places}, and a list of common
+ * {@link StateIcon states} for various application features.
+ * 
+ * <h2>Usage</h2>
+ * 
+ * <p>
+ * These constants can be used to create an Image using the constructor
+ * {@link org.gnome.gtk.Image#Image(Icon, org.gnome.gtk.IconSize) Image()}
+ * taking an Icon:
+ * 
+ * <pre>
+ * image = new Image(FaceIcon.FACE_SMILE);
+ * </pre>
+ * 
+ * You can also use named icons in TreeViews; DataColumnIcon and a
+ * {@link org.gnome.gtk.TreeModel#setValue(org.gnome.gtk.TreeIter, org.gnome.gtk.DataColumnIcon, Icon)
+ * setValue()} taking an Icon are for specifying a named icon in a TreeModel
+ * and CellRendererPixbuf has a
+ * {@link org.gnome.gtk.CellRendererPixbuf#setIcon(org.gnome.gtk.DataColumnIcon)
+ * setIcon()} where you can specify the column to pull the image from.
+ * 
+ * <p>
+ * Ideally you should always get an icon back when requesting an Image with
+ * one of these constants. There is a fallback mechanism if an image isn't
+ * found, but that is somewhat vague and certainly up to the overall desktop
+ * theme you're using. Worst case you'll get the "broken missing image" icon.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ * @see <a
+ *      href="http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html">Icon
+ *      Naming Specification</a>
+ */
+public class Icon
+{
+    /**
+     * The name used to identify the icon in the theme.
+     */
+    final String name;
+
+    /**
+     * Construct a new Icon constant from a given string.
+     * 
+     * <p>
+     * This is provided so that if we missed a name that you desperately need
+     * a named icon for which isn't in the standardized named icon set, you
+     * can subclass and create a constant of your own for it.
+     * 
+     * <p>
+     * <i>If you find yourself doing this, we'd appreciate it if you'd point
+     * out what it is about that name that you needed, and if appropriate
+     * submit a patch adding it to one of the Icon subclasses instead.</i>
+     * 
+     * @since 4.0.17
+     */
+    protected Icon(String name) {
+        this.name = name;
+        Helper.registerIcon(this);
+    }
+}
diff --git a/src/bindings/org/freedesktop/icons/MimeIcon.java b/src/bindings/org/freedesktop/icons/MimeIcon.java
new file mode 100644
index 0000000..94f5eb2
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/MimeIcon.java
@@ -0,0 +1,93 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing MIME types.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class MimeIcon extends Icon
+{
+    protected MimeIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon APPLICATION_CERTIFICATE = new MimeIcon("application-certificate");
+
+    public static final Icon APPLICATION_X_EXECUTABLE = new MimeIcon("application-x-executable");
+
+    public static final Icon AUDIO_X_GENERIC = new MimeIcon("audio-x-generic");
+
+    public static final Icon FONT_X_GENERIC = new MimeIcon("font-x-generic");
+
+    public static final Icon IMAGE_X_GENERIC = new MimeIcon("image-x-generic");
+
+    public static final Icon PACKAGE_X_GENERIC = new MimeIcon("package-x-generic");
+
+    public static final Icon TEXT_HTML = new MimeIcon("text-html");
+
+    public static final Icon TEXT_X_GENERIC = new MimeIcon("text-x-generic");
+
+    public static final Icon TEXT_X_GENERIC_TEMPLATE = new MimeIcon("text-x-generic-template");
+
+    public static final Icon TEXT_X_PREVIEW = new MimeIcon("text-x-preview");
+
+    public static final Icon TEXT_X_SCRIPT = new MimeIcon("text-x-script");
+
+    public static final Icon VIDEO_X_GENERIC = new MimeIcon("video-x-generic");
+
+    public static final Icon X_OFFICE_ADDRESS_BOOK = new MimeIcon("x-office-address-book");
+
+    public static final Icon X_OFFICE_CALENDAR = new MimeIcon("x-office-calendar");
+
+    public static final Icon X_OFFICE_DOCUMENT = new MimeIcon("x-office-document");
+
+    public static final Icon X_OFFICE_DOCUMENT_TEMPLATE = new MimeIcon("x-office-document-template");
+
+    public static final Icon X_OFFICE_DRAWING = new MimeIcon("x-office-drawing");
+
+    public static final Icon X_OFFICE_DRAWING_TEMPLATE = new MimeIcon("x-office-drawing-template");
+
+    public static final Icon X_OFFICE_PRESENTATION = new MimeIcon("x-office-presentation");
+
+    public static final Icon X_OFFICE_PRESENTATION_TEMPLATE = new MimeIcon(
+            "x-office-presentation-template");
+
+    public static final Icon X_OFFICE_SPREADSHEET = new MimeIcon("x-office-spreadsheet");
+
+    public static final Icon X_OFFICE_SPREADSHEET_TEMPLATE = new MimeIcon(
+            "x-office-spreadsheet-template");
+}
diff --git a/src/bindings/org/freedesktop/icons/PlaceIcon.java b/src/bindings/org/freedesktop/icons/PlaceIcon.java
new file mode 100644
index 0000000..2e7b9fa
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/PlaceIcon.java
@@ -0,0 +1,81 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing folders.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class PlaceIcon extends Icon
+{
+    protected PlaceIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon FOLDER_DOCUMENTS = new PlaceIcon("folder-documents");
+
+    public static final Icon FOLDER_DOWNLOAD = new PlaceIcon("folder-download");
+
+    public static final Icon FOLDER_MUSIC = new PlaceIcon("folder-music");
+
+    public static final Icon FOLDER_PICTURES = new PlaceIcon("folder-pictures");
+
+    public static final Icon FOLDER = new PlaceIcon("folder");
+
+    public static final Icon FOLDER_PUBLICSHARE = new PlaceIcon("folder-publicshare");
+
+    public static final Icon FOLDER_REMOTE = new PlaceIcon("folder-remote");
+
+    public static final Icon FOLDER_SAVED_SEARCH = new PlaceIcon("folder-saved-search");
+
+    public static final Icon FOLDER_TEMPLATES = new PlaceIcon("folder-templates");
+
+    public static final Icon FOLDER_VIDEOS = new PlaceIcon("folder-videos");
+
+    public static final Icon NETWORK_SERVER = new PlaceIcon("network-server");
+
+    public static final Icon NETWORK_WORKGROUP = new PlaceIcon("network-workgroup");
+
+    public static final Icon START_HERE = new PlaceIcon("start-here");
+
+    public static final Icon USER_BOOKMARKS = new PlaceIcon("user-bookmarks");
+
+    public static final Icon USER_DESKTOP = new PlaceIcon("user-desktop");
+
+    public static final Icon USER_HOME = new PlaceIcon("user-home");
+
+    public static final Icon USER_TRASH = new PlaceIcon("user-trash");
+}
diff --git a/src/bindings/org/freedesktop/icons/StateIcon.java b/src/bindings/org/freedesktop/icons/StateIcon.java
new file mode 100644
index 0000000..916079a
--- /dev/null
+++ b/src/bindings/org/freedesktop/icons/StateIcon.java
@@ -0,0 +1,191 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.freedesktop.icons;
+
+/**
+ * Named icons representing status.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.0.17
+ */
+public class StateIcon extends Icon
+{
+    protected StateIcon(String name) {
+        super(name);
+    }
+
+    public static final Icon APPOINTMENT_MISSED = new StateIcon("appointment-missed");
+
+    public static final Icon APPOINTMENT_SOON = new StateIcon("appointment-soon");
+
+    public static final Icon AUDIO_VOLUME_HIGH = new StateIcon("audio-volume-high");
+
+    public static final Icon AUDIO_VOLUME_LOW = new StateIcon("audio-volume-low");
+
+    public static final Icon AUDIO_VOLUME_MEDIUM = new StateIcon("audio-volume-medium");
+
+    public static final Icon AUDIO_VOLUME_MUTED = new StateIcon("audio-volume-muted");
+
+    public static final Icon AVATAR_DEFAULT = new StateIcon("avatar-default");
+
+    public static final Icon BATTERY_CAUTION_CHARGING = new StateIcon("battery-caution-charging");
+
+    public static final Icon BATTERY_CAUTION = new StateIcon("battery-caution");
+
+    public static final Icon BATTERY_CHARGING = new StateIcon("battery-charging");
+
+    public static final Icon BATTERY_EMPTY = new StateIcon("battery-empty");
+
+    public static final Icon BATTERY_FULL_CHARGING = new StateIcon("battery-full-charging");
+
+    public static final Icon BATTERY_FULL = new StateIcon("battery-full");
+
+    public static final Icon BATTERY_GOOD_CHARGING = new StateIcon("battery-good-charging");
+
+    public static final Icon BATTERY_GOOD = new StateIcon("battery-good");
+
+    public static final Icon BATTERY_LOW_CHARGING = new StateIcon("battery-low-charging");
+
+    public static final Icon BATTERY_LOW = new StateIcon("battery-low");
+
+    public static final Icon BATTERY_MISSING = new StateIcon("battery-missing");
+
+    public static final Icon CHANGES_ALLOW = new StateIcon("changes-allow");
+
+    public static final Icon CHANGES_PREVENT = new StateIcon("changes-prevent");
+
+    public static final Icon DIALOG_ERROR = new StateIcon("dialog-error");
+
+    public static final Icon DIALOG_INFORMATION = new StateIcon("dialog-information");
+
+    public static final Icon DIALOG_PASSWORD = new StateIcon("dialog-password");
+
+    public static final Icon DIALOG_QUESTION = new StateIcon("dialog-question");
+
+    public static final Icon DIALOG_WARNING = new StateIcon("dialog-warning");
+
+    public static final Icon FOLDER_DRAG_ACCEPT = new StateIcon("folder-drag-accept");
+
+    public static final Icon FOLDER_OPEN = new StateIcon("folder-open");
+
+    public static final Icon FOLDER_VISITING = new StateIcon("folder-visiting");
+
+    public static final Icon IMAGE_LOADING = new StateIcon("image-loading");
+
+    public static final Icon IMAGE_MISSING = new StateIcon("image-missing");
+
+    public static final Icon MAIL_ATTACHMENT = new StateIcon("mail-attachment");
+
+    public static final Icon MAIL_READ = new StateIcon("mail-read");
+
+    public static final Icon MAIL_REPLIED = new StateIcon("mail-replied");
+
+    public static final Icon MAIL_SIGNED = new StateIcon("mail-signed");
+
+    public static final Icon MAIL_SIGNED_VERIFIED = new StateIcon("mail-signed-verified");
+
+    public static final Icon MAIL_UNREAD = new StateIcon("mail-unread");
+
+    public static final Icon MEDIA_PLAYLIST_REPEAT = new StateIcon("media-playlist-repeat");
+
+    public static final Icon MEDIA_PLAYLIST_SHUFFLE = new StateIcon("media-playlist-shuffle");
+
+    public static final Icon NETWORK_ERROR = new StateIcon("network-error");
+
+    public static final Icon NETWORK_IDLE = new StateIcon("network-idle");
+
+    public static final Icon NETWORK_OFFLINE = new StateIcon("network-offline");
+
+    public static final Icon NETWORK_RECEIVE = new StateIcon("network-receive");
+
+    public static final Icon NETWORK_TRANSMIT = new StateIcon("network-transmit");
+
+    public static final Icon NETWORK_TRANSMIT_RECEIVE = new StateIcon("network-transmit-receive");
+
+    public static final Icon NETWORK_WIRELESS_ENCRYPTED = new StateIcon("network-wireless-encrypted");
+
+    public static final Icon PRINTER_ERROR = new StateIcon("printer-error");
+
+    public static final Icon PRINTER_PRINTING = new StateIcon("printer-printing");
+
+    public static final Icon SECURITY_HIGH = new StateIcon("security-high");
+
+    public static final Icon SECURITY_LOW = new StateIcon("security-low");
+
+    public static final Icon SECURITY_MEDIUM = new StateIcon("security-medium");
+
+    public static final Icon SOFTWARE_UPDATE_AVAILABLE = new StateIcon("software-update-available");
+
+    public static final Icon SOFTWARE_UPDATE_URGENT = new StateIcon("software-update-urgent");
+
+    public static final Icon TASK_DUE = new StateIcon("task-due");
+
+    public static final Icon TASK_PAST_DUE = new StateIcon("task-past-due");
+
+    public static final Icon USER_AVAILABLE = new StateIcon("user-available");
+
+    public static final Icon USER_AWAY = new StateIcon("user-away");
+
+    public static final Icon USER_BUSY = new StateIcon("user-busy");
+
+    public static final Icon USER_IDLE = new StateIcon("user-idle");
+
+    public static final Icon USER_INVISIBLE = new StateIcon("user-invisible");
+
+    public static final Icon USER_OFFLINE = new StateIcon("user-offline");
+
+    public static final Icon USER_TRASH_FULL = new StateIcon("user-trash-full");
+
+    public static final Icon WEATHER_CLEAR_NIGHT = new StateIcon("weather-clear-night");
+
+    public static final Icon WEATHER_CLEAR = new StateIcon("weather-clear");
+
+    public static final Icon WEATHER_FEW_CLOUDS_NIGHT = new StateIcon("weather-few-clouds-night");
+
+    public static final Icon WEATHER_FEW_CLOUDS = new StateIcon("weather-few-clouds");
+
+    public static final Icon WEATHER_FOG = new StateIcon("weather-fog");
+
+    public static final Icon WEATHER_OVERCAST = new StateIcon("weather-overcast");
+
+    public static final Icon WEATHER_SEVERE_ALERT = new StateIcon("weather-severe-alert");
+
+    public static final Icon WEATHER_SHOWERS = new StateIcon("weather-showers");
+
+    public static final Icon WEATHER_SHOWERS_SCATTERED = new StateIcon("weather-showers-scattered");
+
+    public static final Icon WEATHER_SNOW = new StateIcon("weather-snow");
+
+    public static final Icon WEATHER_STORM = new StateIcon("weather-storm");
+}
diff --git a/src/bindings/org/gnome/atk/Action.java b/src/bindings/org/gnome/atk/Action.java
new file mode 100644
index 0000000..fce70bf
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Action.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Action
+{
+}
diff --git a/src/bindings/org/gnome/atk/Component.java b/src/bindings/org/gnome/atk/Component.java
new file mode 100644
index 0000000..7561a1d
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Component.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Component
+{
+}
diff --git a/src/bindings/org/gnome/atk/CoordType.java b/src/bindings/org/gnome/atk/CoordType.java
new file mode 100644
index 0000000..3270274
--- /dev/null
+++ b/src/bindings/org/gnome/atk/CoordType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CoordType extends Constant
+{
+    private CoordType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Document.java b/src/bindings/org/gnome/atk/Document.java
new file mode 100644
index 0000000..163789e
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Document.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Document
+{
+}
diff --git a/src/bindings/org/gnome/atk/EditableText.java b/src/bindings/org/gnome/atk/EditableText.java
new file mode 100644
index 0000000..8243255
--- /dev/null
+++ b/src/bindings/org/gnome/atk/EditableText.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface EditableText
+{
+}
diff --git a/src/bindings/org/gnome/atk/GObjectAccessible.java b/src/bindings/org/gnome/atk/GObjectAccessible.java
new file mode 100644
index 0000000..782889e
--- /dev/null
+++ b/src/bindings/org/gnome/atk/GObjectAccessible.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class GObjectAccessible extends Object
+{
+    protected GObjectAccessible(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Hyperlink.java b/src/bindings/org/gnome/atk/Hyperlink.java
new file mode 100644
index 0000000..ced2860
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Hyperlink.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Hyperlink extends Object
+{
+    protected Hyperlink(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/HyperlinkImpl.java b/src/bindings/org/gnome/atk/HyperlinkImpl.java
new file mode 100644
index 0000000..28a1bd9
--- /dev/null
+++ b/src/bindings/org/gnome/atk/HyperlinkImpl.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others 
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface HyperlinkImpl
+{
+}
diff --git a/src/bindings/org/gnome/atk/HyperlinkStateFlags.java b/src/bindings/org/gnome/atk/HyperlinkStateFlags.java
new file mode 100644
index 0000000..ea8f270
--- /dev/null
+++ b/src/bindings/org/gnome/atk/HyperlinkStateFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class HyperlinkStateFlags extends Constant
+{
+    private HyperlinkStateFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Hypertext.java b/src/bindings/org/gnome/atk/Hypertext.java
new file mode 100644
index 0000000..907b898
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Hypertext.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Hypertext
+{
+}
diff --git a/src/bindings/org/gnome/atk/Image.java b/src/bindings/org/gnome/atk/Image.java
new file mode 100644
index 0000000..f62e0a9
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Image.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Image
+{
+}
diff --git a/src/bindings/org/gnome/atk/ImplementorIface.java b/src/bindings/org/gnome/atk/ImplementorIface.java
new file mode 100644
index 0000000..a8a7db0
--- /dev/null
+++ b/src/bindings/org/gnome/atk/ImplementorIface.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface ImplementorIface
+{
+}
diff --git a/src/bindings/org/gnome/atk/KeyEventType.java b/src/bindings/org/gnome/atk/KeyEventType.java
new file mode 100644
index 0000000..61537e7
--- /dev/null
+++ b/src/bindings/org/gnome/atk/KeyEventType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class KeyEventType extends Constant
+{
+    private KeyEventType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Layer.java b/src/bindings/org/gnome/atk/Layer.java
new file mode 100644
index 0000000..c5158cd
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Layer.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Layer extends Constant
+{
+    private Layer(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/NoOpObject.java b/src/bindings/org/gnome/atk/NoOpObject.java
new file mode 100644
index 0000000..3f41d6d
--- /dev/null
+++ b/src/bindings/org/gnome/atk/NoOpObject.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class NoOpObject extends Object
+{
+    protected NoOpObject(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/NoOpObjectFactory.java b/src/bindings/org/gnome/atk/NoOpObjectFactory.java
new file mode 100644
index 0000000..d61f176
--- /dev/null
+++ b/src/bindings/org/gnome/atk/NoOpObjectFactory.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class NoOpObjectFactory extends ObjectFactory
+{
+    protected NoOpObjectFactory(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Object.java b/src/bindings/org/gnome/atk/Object.java
new file mode 100644
index 0000000..f2e2adc
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Object.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/**
+ * FIXME.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * This class needed special attention due to the usual issues arising from
+ * using Object as the class name.
+ */
+public class Object extends org.gnome.glib.Object
+{
+    protected Object(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/ObjectFactory.java b/src/bindings/org/gnome/atk/ObjectFactory.java
new file mode 100644
index 0000000..f6013a8
--- /dev/null
+++ b/src/bindings/org/gnome/atk/ObjectFactory.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ObjectFactory extends Object
+{
+    protected ObjectFactory(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Plumbing.java b/src/bindings/org/gnome/atk/Plumbing.java
new file mode 100644
index 0000000..c6276ef
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Plumbing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+abstract class Plumbing extends org.gnome.glib.Plumbing
+{
+    static {
+        isLibraryReady();
+    }
+
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/atk/Rectangle.java b/src/bindings/org/gnome/atk/Rectangle.java
new file mode 100644
index 0000000..466fd83
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Rectangle.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Rectangle extends Boxed
+{
+    protected Rectangle(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Registry.java b/src/bindings/org/gnome/atk/Registry.java
new file mode 100644
index 0000000..5a045c0
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Registry.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Registry extends Object
+{
+    protected Registry(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Relation.java b/src/bindings/org/gnome/atk/Relation.java
new file mode 100644
index 0000000..74699f7
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Relation.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Relation extends Object
+{
+    protected Relation(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/RelationSet.java b/src/bindings/org/gnome/atk/RelationSet.java
new file mode 100644
index 0000000..10d4aa6
--- /dev/null
+++ b/src/bindings/org/gnome/atk/RelationSet.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RelationSet extends Object
+{
+    protected RelationSet(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/RelationType.java b/src/bindings/org/gnome/atk/RelationType.java
new file mode 100644
index 0000000..01a5642
--- /dev/null
+++ b/src/bindings/org/gnome/atk/RelationType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RelationType extends Constant
+{
+    private RelationType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Role.java b/src/bindings/org/gnome/atk/Role.java
new file mode 100644
index 0000000..6189dd9
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Role.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Role extends Constant
+{
+    private Role(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Selection.java b/src/bindings/org/gnome/atk/Selection.java
new file mode 100644
index 0000000..90b7db5
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Selection.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Selection
+{
+}
diff --git a/src/bindings/org/gnome/atk/StateSet.java b/src/bindings/org/gnome/atk/StateSet.java
new file mode 100644
index 0000000..0b7b230
--- /dev/null
+++ b/src/bindings/org/gnome/atk/StateSet.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class StateSet extends Object
+{
+    protected StateSet(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/StateType.java b/src/bindings/org/gnome/atk/StateType.java
new file mode 100644
index 0000000..125da1c
--- /dev/null
+++ b/src/bindings/org/gnome/atk/StateType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class StateType extends Constant
+{
+    private StateType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/StreamableContent.java b/src/bindings/org/gnome/atk/StreamableContent.java
new file mode 100644
index 0000000..1b829bc
--- /dev/null
+++ b/src/bindings/org/gnome/atk/StreamableContent.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface StreamableContent
+{
+}
diff --git a/src/bindings/org/gnome/atk/Table.java b/src/bindings/org/gnome/atk/Table.java
new file mode 100644
index 0000000..4529f20
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Table.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Table
+{
+}
diff --git a/src/bindings/org/gnome/atk/Text.java b/src/bindings/org/gnome/atk/Text.java
new file mode 100644
index 0000000..113db4b
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Text.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Text
+{
+}
diff --git a/src/bindings/org/gnome/atk/TextAttribute.java b/src/bindings/org/gnome/atk/TextAttribute.java
new file mode 100644
index 0000000..c7a3e6f
--- /dev/null
+++ b/src/bindings/org/gnome/atk/TextAttribute.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextAttribute extends Constant
+{
+    private TextAttribute(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/TextBoundary.java b/src/bindings/org/gnome/atk/TextBoundary.java
new file mode 100644
index 0000000..d1b20bd
--- /dev/null
+++ b/src/bindings/org/gnome/atk/TextBoundary.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextBoundary extends Constant
+{
+    private TextBoundary(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/TextClipType.java b/src/bindings/org/gnome/atk/TextClipType.java
new file mode 100644
index 0000000..a919191
--- /dev/null
+++ b/src/bindings/org/gnome/atk/TextClipType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextClipType extends Constant
+{
+    private TextClipType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/TextRange.java b/src/bindings/org/gnome/atk/TextRange.java
new file mode 100644
index 0000000..7cad838
--- /dev/null
+++ b/src/bindings/org/gnome/atk/TextRange.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextRange extends Boxed
+{
+    protected TextRange(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/atk/TextRectangle.java b/src/bindings/org/gnome/atk/TextRectangle.java
new file mode 100644
index 0000000..e7394c5
--- /dev/null
+++ b/src/bindings/org/gnome/atk/TextRectangle.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextRectangle extends Boxed
+{
+    protected TextRectangle(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Util.java b/src/bindings/org/gnome/atk/Util.java
new file mode 100644
index 0000000..d30c96d
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Util.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Util extends Object
+{
+    protected Util(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/atk/Value.java b/src/bindings/org/gnome/atk/Value.java
new file mode 100644
index 0000000..0ac811b
--- /dev/null
+++ b/src/bindings/org/gnome/atk/Value.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.atk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface Value
+{
+}
diff --git a/src/bindings/org/gnome/atk/package.html b/src/bindings/org/gnome/atk/package.html
new file mode 100644
index 0000000..d972965
--- /dev/null
+++ b/src/bindings/org/gnome/atk/package.html
@@ -0,0 +1,41 @@
+<html>
+<head>
+</head>
+<body>
+
+ATK is the toolkit that GNOME uses to enable accessibility for users needing
+extra support to make the most of their computers. ATK is used by tools such as
+screen readers, magnifiers, and input devices to permit a rich interaction with
+the desktop through alternative means.
+
+<p>
+ATK has also been used by testing frameworks as the means to introspect Widgets
+and text on the screen allowing the creation of automated function test suites.
+
+<p>
+<b>ATK is not yet implemented in java-gnome</b>
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/org/gnome/gdk/AxisUse.java b/src/bindings/org/gnome/gdk/AxisUse.java
new file mode 100644
index 0000000..72564af
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/AxisUse.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class AxisUse extends Constant
+{
+    private AxisUse(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/CapStyle.java b/src/bindings/org/gnome/gdk/CapStyle.java
new file mode 100644
index 0000000..b3921b2
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/CapStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CapStyle extends Constant
+{
+    private CapStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Colorspace.java b/src/bindings/org/gnome/gdk/Colorspace.java
new file mode 100644
index 0000000..601344f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Colorspace.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Colorspace extends Constant
+{
+    private Colorspace(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/CrossingMode.java b/src/bindings/org/gnome/gdk/CrossingMode.java
new file mode 100644
index 0000000..c014012
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/CrossingMode.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants relating to the nature of the event when a mouse enters or leaves
+ * a GDK Window.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ * @see <a
+ *      href="http://xorg.freedesktop.org/releases/X11R7.0/doc/PDF/xlib.pdf">The
+ *      XLib programming manual, section 10.6</a>
+ */
+/*
+ * FIXME Improve the explanation of these occurrences.
+ */
+public final class CrossingMode extends Constant
+{
+    private CrossingMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The EventCrossing occurred because of pointer motion (by the user).
+     */
+    public static final CrossingMode NORMAL = new CrossingMode(GdkCrossingMode.NORMAL, "NORMAL");
+
+    /**
+     * Event occurred because a grab was activated.
+     */
+    public static final CrossingMode GRAB = new CrossingMode(GdkCrossingMode.GRAB, "GRAB");
+
+    /**
+     * Event occurred because an ungrab happened.
+     */
+    public static final CrossingMode UNGRAB = new CrossingMode(GdkCrossingMode.UNGRAB, "UNGRAB");
+
+    /**
+     * Event occurred because a "GTK grab" happened. FIXME This means what?
+     * How is it different from GRAB?
+     */
+    public static final CrossingMode GTK_GRAB = new CrossingMode(GdkCrossingMode.GTK_GRAB, "GTK_GRAB");
+
+    /**
+     * Event occurred because a "GTK ungrab" happened. FIXME This means what?
+     * How is it different from the previously existing UNGRAB?
+     */
+    public static final CrossingMode GTK_UNGRAB = new CrossingMode(GdkCrossingMode.GTK_UNGRAB,
+            "GTK_UNGRAB");
+
+    /**
+     * Event occurred because a Widget changed state.
+     */
+    public static final CrossingMode STATE_CHANGED = new CrossingMode(GdkCrossingMode.STATE_CHANGED,
+            "STATE_CHANGED");
+}
diff --git a/src/bindings/org/gnome/gdk/Cursor.java b/src/bindings/org/gnome/gdk/Cursor.java
new file mode 100644
index 0000000..7da83fc
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Cursor.java
@@ -0,0 +1,190 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * That which indicateth where your mouse is pointing!
+ * 
+ * <p>
+ * A Cursor object must be bound to a underlying Window before [changing it]
+ * will actually cause what the user sees to change; see
+ * {@link Window#setCursor(Cursor) setCursor()} on the Window here in
+ * <code>org.gnome.gdk</code>.
+ * 
+ * <p>
+ * Quite frequently you want to change the Cursor for the entire application
+ * (in a manner reminiscent of modal behaviour). This is trickier than it
+ * should be, but you've got a couple possibilities. You can either
+ * <ul>
+ * <li>maintain a list of all the significant <code>[org.gnome.gtk]</code>
+ * Windows being displayed by your application and then call
+ * <code>getWindow().setCursor(BLAH)</code> on each of them, or you can
+ * <li>use {@link Window#getToplevels() getToplevels()} on
+ * <code>[org.gnome.gdk]</code> Window and then similarly just call
+ * <code>setCursor(BLAH)</code> as you iterate over the returned set.
+ * </ul>
+ * The first option is a bit more cumbersome, but many people find themselves
+ * maintaining a list of "major" Windows for other purposes, so it can serve.
+ * 
+ * <p>
+ * Almost inevitably the Cursor your want is {@link Cursor#BUSY BUSY} which is
+ * the spinning "busy" pointer. You can revert to "normal" by setting
+ * {@link Cursor#NORMAL NORMAL} directly (which is the default cursor you
+ * spend most of your time looking at), or by passing <code>null</code> to
+ * <code>setCursor()</code>.
+ * 
+ * <p>
+ * Note that different theme engines (let alone different Linux vendors) tend
+ * to screw with the default pointer icons set quite a bit, so you may find
+ * that pointers appear very different for users on different distributions.
+ * 
+ * <p>
+ * <i>Our implementation of Cursor assumes you want to manipulate
+ * <code>GdkCursors</code> on the "default" <code>GdkDisplay</code>. Where
+ * else would you be working?</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class Cursor extends Boxed
+{
+    protected Cursor(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Cursor with the specified CursorType.
+     * 
+     * @since 4.0.6
+     */
+    public Cursor(CursorType type) {
+        super(GdkCursor.createCursor(type));
+    }
+
+    private static Cursor createFromType(CursorType type) {
+        return new Cursor(type);
+    }
+
+    /**
+     * Create a new Cursor from the one so named in the cursor theme.
+     */
+    /*
+     * Returns null for the case where no such named cursor exists. Apparently
+     * this is a problem in some cursor themes.
+     */
+    private static Cursor createFromName(String name) {
+        final long pointer;
+        final Screen screen;
+        final Display display;
+
+        screen = GdkScreen.getDefault();
+        display = GdkScreen.getDisplay(screen);
+
+        pointer = GdkCursor.createCursorFromName(display, name);
+
+        if (pointer != 0) {
+            return new Cursor(pointer);
+        } else {
+            return null;
+        }
+    }
+
+    protected void release() {
+        GdkCursor.unref(this);
+    }
+
+    /**
+     * The normal left-hand pointer.
+     * 
+     * <p>
+     * This is a type {@link CursorType#LEFT_PTR LEFT_PTR}.
+     * 
+     * @since 4.0.14
+     */
+    public final static Cursor NORMAL;
+
+    /**
+     * The spinning cursor showing that the application is busy (and unable to
+     * be responsive to user input).
+     * 
+     * <p>
+     * This is type {@link CursorType#WATCH WATCH}.
+     * 
+     * @since 4.0.14
+     */
+    public final static Cursor BUSY;
+
+    /**
+     * A pointer indicating that a hyperlink can be clicked and followed. Not
+     * used for Buttons.
+     * 
+     * <p>
+     * This is type {@link CursorType#HAND2 HAND2}.
+     * 
+     * @since 4.0.14
+     */
+    public final static Cursor LINK;
+
+    /**
+     * A pointer that also has a busy spinner. This is used to indicate that
+     * the application is working, but that the user can still carry out
+     * actions.
+     * 
+     * <p>
+     * This is <code>"left_ptr_watch"</code> from the cursor theme.
+     * 
+     * @since 4.0.14
+     */
+    public final static Cursor WORKING;
+
+    /**
+     * The vertical bar pointer used in text entry Widgets such as Entry and
+     * TextView.
+     * 
+     * <p>
+     * This is type {@link CursorType#XTERM XTERM}.
+     * 
+     * @since 4.0.14
+     */
+    public final static Cursor TEXT;
+
+    static {
+        NORMAL = createFromType(CursorType.LEFT_PTR);
+        BUSY = createFromType(CursorType.WATCH);
+        LINK = createFromType(CursorType.HAND2);
+        WORKING = createFromName("left_ptr_watch");
+        TEXT = createFromType(CursorType.XTERM);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/CursorType.java b/src/bindings/org/gnome/gdk/CursorType.java
new file mode 100644
index 0000000..5668d19
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/CursorType.java
@@ -0,0 +1,197 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright ©      2009 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants representing the different forms of Cursor that can indicate
+ * where the mouse is pointing. Note that this is distinct from that blinking
+ * vertical bar that is the text position cursor in Entry and TextView
+ * Widgets.
+ * 
+ * <p>
+ * The "normal" Cursor is {@link #LEFT_PTR LEFT_PTR}. That's the one you want
+ * to switch back to if you've changed the Cursor to something exceptional.
+ * 
+ * <p>
+ * <i>The fact that "cursor" is used to name this class and the Cursor class
+ * which manipulates them is a bit strange seeing as how the term used in user
+ * interface design for the thing where your mouse is indicating is
+ * "pointer".</i>
+ * 
+ * <p>
+ * <i>It was quite tempting to mess with the constant names here; after all
+ * <code>LEFT_PTR</code> is a poor substitute for "normal", but that would
+ * screw up the algorithmic mapping of the underlying library that we have
+ * worked so hard to maintain. The names are less than ideal in GDK, but so be
+ * it.</i>.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.6
+ */
+/*
+ * The underlying enum is a zoo, so this is just a start. Frankly, most of the
+ * preexisting Cursor constants are completely unnecessary cruft left over
+ * from the early days of X Windows. Yeech!
+ */
+public final class CursorType extends Flag
+{
+    private CursorType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The standard arrow pointer used by default for most user interface
+     * purposes. This is the one you want to reset the cursor to if you have
+     * been using {@link #WATCH WATCH} as the "busy" pointer.
+     */
+    public static final CursorType LEFT_PTR = new CursorType(GdkCursorType.LEFT_PTR, "LEFT_PTR");
+
+    /**
+     * This is the cursor you change to when you want to show that the
+     * application is "busy"; be aware that different themes shipped by
+     * various Linux distributions override it in many different ways.
+     * 
+     * @since 4.0.6
+     */
+    public static final CursorType WATCH = new CursorType(GdkCursorType.WATCH, "WATCH");
+
+    /**
+     * This is the standard "text" Cursor, used in Widgets which display or
+     * edit text such as Entry and TextView.
+     * 
+     * @since 4.0.6
+     */
+    public static final CursorType XTERM = new CursorType(GdkCursorType.XTERM, "XTERM");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the top left corner of the
+     * Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType TOP_LEFT_CORNER = new CursorType(GdkCursorType.TOP_LEFT_CORNER,
+            "TOP_LEFT_CORNER");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the top right corner of the
+     * Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType TOP_RIGHT_CORNER = new CursorType(GdkCursorType.TOP_RIGHT_CORNER,
+            "TOP_RIGHT_CORNER");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the bottom left corner of the
+     * Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType BOTTOM_LEFT_CORNER = new CursorType(GdkCursorType.BOTTOM_LEFT_CORNER,
+            "BOTTOM_LEFT_CORNER");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the bottom right corner of the
+     * Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType BOTTOM_RIGHT_CORNER = new CursorType(
+            GdkCursorType.BOTTOM_RIGHT_CORNER, "BOTTOM_RIGHT_CORNER");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the bottom side of the Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType BOTTOM_SIDE = new CursorType(GdkCursorType.BOTTOM_SIDE, "BOTTOM_SIDE");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the top side of the Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType TOP_SIDE = new CursorType(GdkCursorType.TOP_SIDE, "TOP_SIDE");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the right side of the Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType RIGHT_SIDE = new CursorType(GdkCursorType.RIGHT_SIDE, "RIGHT_SIDE");
+
+    /**
+     * This Cursor is typically used with Widgets whose size can be changed
+     * manually when the mouse pointer is near the left side of the Widget.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType LEFT_SIDE = new CursorType(GdkCursorType.LEFT_SIDE, "LEFT_SIDE");
+
+    /**
+     * The Cursor used to indicate a "move" operation. It is used when moving
+     * the mouse pointer would cause a Widget to be moved.
+     * 
+     * @since 4.0.12
+     */
+    public static final CursorType FLEUR = new CursorType(GdkCursorType.FLEUR, "FLEUR");
+
+    /**
+     * The hand, open. Suggests something that can be grabbed.
+     * 
+     * @since 4.0.14
+     */
+    public static final CursorType HAND1 = new CursorType(GdkCursorType.HAND1, "HAND1");
+
+    /**
+     * The hand, index finger pointing. Typically used to suggest a clickable
+     * link.
+     * 
+     * @since 4.0.14
+     */
+    public static final CursorType HAND2 = new CursorType(GdkCursorType.HAND2, "HAND2");
+
+    static final CursorType CURSOR_IS_PIXMAP = new CursorType(GdkCursorType.CURSOR_IS_PIXMAP,
+            "CURSOR_IS_PIXMAP");
+}
diff --git a/src/bindings/org/gnome/gdk/Device.java b/src/bindings/org/gnome/gdk/Device.java
new file mode 100644
index 0000000..c6e63a7
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Device.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Device extends Object
+{
+    protected Device(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Display.java b/src/bindings/org/gnome/gdk/Display.java
new file mode 100644
index 0000000..9ef2a4f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Display.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/**
+ * An X display, consisting of a keyboard, mouse, and one or more screens. The
+ * later are modelled as {@link Screen}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Display extends Object
+{
+    protected Display(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/DisplayManager.java b/src/bindings/org/gnome/gdk/DisplayManager.java
new file mode 100644
index 0000000..6bd6984
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/DisplayManager.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class DisplayManager extends Object
+{
+    protected DisplayManager(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/DragAction.java b/src/bindings/org/gnome/gdk/DragAction.java
new file mode 100644
index 0000000..a55d704
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/DragAction.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class DragAction extends Constant
+{
+    private DragAction(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/DragContext.java b/src/bindings/org/gnome/gdk/DragContext.java
new file mode 100644
index 0000000..796644f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/DragContext.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class DragContext extends Object
+{
+    protected DragContext(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/DragProtocol.java b/src/bindings/org/gnome/gdk/DragProtocol.java
new file mode 100644
index 0000000..2759954
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/DragProtocol.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class DragProtocol extends Constant
+{
+    private DragProtocol(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Event.java b/src/bindings/org/gnome/gdk/Event.java
new file mode 100644
index 0000000..6d8e9ea
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Event.java
@@ -0,0 +1,80 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * The events used to communicate data describing the internal details of
+ * activities that occur to or between GDK resources.
+ * 
+ * <p>
+ * <i>C side, <code>GdkEvent</code> is a union of various event structs such
+ * as <code>GdkEventExpose</code> and <code>GdkEventKey</code>. Each struct in
+ * this family starts with the same fields, and these fields are represented
+ * by <code>GdkEventAny</code>. We have exposed those fields here on
+ * Event.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public abstract class Event extends Boxed
+{
+    protected Event(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        GdkEvent.free(this);
+    }
+
+    /**
+     * Get the type of event that occurred. There are fairly tight
+     * relationships between these type constants and the concrete Event
+     * subclasses, see {@link EventType EventType} for an example.
+     * 
+     * @since 4.0.3
+     */
+    public EventType getType() {
+        return GdkEventAny.getType(this);
+    }
+
+    /**
+     * Get the underlying [GDK] Window which received the event.
+     * 
+     * @since 4.0.3
+     */
+    public Window getWindow() {
+        return GdkEventAny.getWindow(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventAny.java b/src/bindings/org/gnome/gdk/EventAny.java
new file mode 100644
index 0000000..d60b6fe
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventAny.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/*
+ * FIXME By rights, this shouldn't be here, but GdkEventType.DELETE doesn't
+ * seem to correspond to a struct in the GdkEvent union. So what do we do with
+ * it, actually?
+ */
+public final class EventAny extends Event
+{
+    protected EventAny(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventButton.java b/src/bindings/org/gnome/gdk/EventButton.java
new file mode 100644
index 0000000..c5fa4b6
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventButton.java
@@ -0,0 +1,94 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Event data describing a button on a pointing device that was pressed or
+ * released. Notably, you can find out which button on the device was clicked
+ * with {@link #getButton() getButton()}, and whether any modifier keys were
+ * being held down by the user with {@link #getState() getState()}.
+ * 
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @since 4.0.6
+ */
+public final class EventButton extends Event
+{
+    protected EventButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Which button on the pointing device was pressed?
+     * 
+     * @since 4.0.6
+     */
+    public MouseButton getButton() {
+        return GdkMouseButtonOverride.enumFor(GdkEventButton.getButton(this));
+    }
+
+    /**
+     * Get the state of the modifier keys. This will be
+     * {@link ModifierType#NONE NONE} if no modifiers are being held down. See
+     * EventKey's {@link EventKey#getState() getState()} and
+     * {@link ModifierType} for usage details.
+     * 
+     * @since 4.0.6
+     */
+    public ModifierType getState() {
+        return GdkKeyvalOverride.flagFor(GdkEventButton.getState(this));
+    }
+
+    /**
+     * Get the horizontal location that this Event occured at, relative to the
+     * <code>[org.gnome.gdk]</code> Window. In most cases you will get an
+     * integral return; in any case, most usages of this return value will
+     * want a whole number of pixels, so cast to <code>int</code> as
+     * necessary.
+     * 
+     * @since 4.0.9
+     */
+    public double getX() {
+        return GdkEventButton.getX(this);
+    }
+
+    /**
+     * Get the vertical location that this Event occured at, relative to the
+     * <code>[org.gnome.gdk]</code> Window.
+     * 
+     * @since 4.0.9
+     */
+    public double getY() {
+        return GdkEventButton.getY(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventConfigure.java b/src/bindings/org/gnome/gdk/EventConfigure.java
new file mode 100644
index 0000000..3485dc4
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventConfigure.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * 
+ * Information about the (possibly changed) size and position of a Window on
+ * screen. This is the object used to convey such data in the
+ * {@link org.gnome.gtk.Window.ConfigureEvent Window.ConfigureEvent} signal.
+ * 
+ * <p>
+ * All dimensions are in pixels.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.8
+ */
+public final class EventConfigure extends Event
+{
+    protected EventConfigure(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * The width of the Window.
+     * 
+     * @since 4.0.8
+     */
+    public int getWidth() {
+        return GdkEventConfigure.getWidth(this);
+    }
+
+    /**
+     * The height of the Window.
+     * 
+     * @since 4.0.8
+     */
+    public int getHeight() {
+        return GdkEventConfigure.getHeight(this);
+    }
+
+    /**
+     * The horizontal co-ordinate relative to the top left corner of the
+     * screen.
+     * 
+     * @since 4.0.8
+     */
+    public int getX() {
+        return GdkEventConfigure.getX(this);
+    }
+
+    /**
+     * The vertical co-ordinate relative to the top left corner of the screen.
+     * 
+     * @since 4.0.8
+     */
+    public int getY() {
+        return GdkEventConfigure.getY(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventCrossing.java b/src/bindings/org/gnome/gdk/EventCrossing.java
new file mode 100644
index 0000000..a0d650f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventCrossing.java
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Event data describing a mouse entering or leaving a Window.
+ * 
+ * <p>
+ * This is used by {@link org.gnome.gtk.Widget.EnterNotifyEvent} and
+ * {@link org.gnome.gtk.Widget.LeaveNotifyEvent}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public final class EventCrossing extends Event
+{
+    protected EventCrossing(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Describes the mode of this EventCrossing: whether the event is a
+     * {@link CrossingMode#NORMAL NORMAL} one or a pseudo-motion one resulting
+     * from a {@link CrossingMode#GRAB GRAB} or {@link CrossingMode#UNGRAB
+     * UNGRAB}.
+     * 
+     * @since 4.0.7
+     */
+    public CrossingMode getMode() {
+        return GdkEventCrossing.getMode(this);
+    }
+
+    /**
+     * Describes the relationship between the Window from which the mouse
+     * pointer left, and the Window which the mouse pointer entered. Most
+     * often you'll see is {@link NotifyType#NONLINEAR NONLINEAR}, which tells
+     * you that the pointer moved between unrelated X Windows.
+     * 
+     * @since 4.0.7
+     */
+    public NotifyType getDetail() {
+        return GdkEventCrossing.getDetail(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventDragAndDrop.java b/src/bindings/org/gnome/gdk/EventDragAndDrop.java
new file mode 100644
index 0000000..a6c172a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventDragAndDrop.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class EventDragAndDrop extends Event
+{
+    protected EventDragAndDrop(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventFocus.java b/src/bindings/org/gnome/gdk/EventFocus.java
new file mode 100644
index 0000000..ef29d09
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventFocus.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class EventFocus extends Event
+{
+    protected EventFocus(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventKey.java b/src/bindings/org/gnome/gdk/EventKey.java
new file mode 100644
index 0000000..e630ba6
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventKey.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Event data describing a key press.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class EventKey extends Event
+{
+    protected EventKey(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the key that was pressed.
+     * 
+     * @since 4.0.6
+     */
+    public Keyval getKeyval() {
+        return GdkKeyvalOverride.enumFor(GdkEventKey.getKeyval(this));
+    }
+
+    /**
+     * Get the Flags object representing what modifiers are being held down,
+     * if any.
+     * 
+     * <p>
+     * If you're only expecting a single modifier to be pressed then you could
+     * compare by equality:
+     * 
+     * <pre>
+     * if (mod == ModifierType.SHIFT_MASK) {
+     *     ...
+     * }
+     * </pre>
+     * 
+     * but if you're looking for more complex combinations, or worried that
+     * more than one modifier could be down, then use <code>contains()</code>:
+     * 
+     * <pre>
+     * if (mod.contains(ModifierType.CONTROL_MASK)) {
+     *     ...
+     * }
+     * </pre>
+     * 
+     * which will always do what you want.
+     * 
+     * @since 4.0.6
+     */
+    public ModifierType getState() {
+        return GdkKeyvalOverride.flagFor(GdkEventKey.getState(this));
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventMask.java b/src/bindings/org/gnome/gdk/EventMask.java
new file mode 100644
index 0000000..e8c9dba
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventMask.java
@@ -0,0 +1,190 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * The events a Widget will receive. You can use the Flags defined here to
+ * control which events will be received by a Widget.
+ * 
+ * <p>
+ * While most common events are enabled by default, some of them need to be
+ * {@link org.gnome.gtk.Widget#addEvents(EventMask) enabled} in order to be
+ * received. Such cases are properly documented together with each event
+ * signal, so unless specified there you usually do not need to worry about
+ * this at all.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.15
+ */
+public final class EventMask extends Flag
+{
+    private EventMask(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Creates a new EventMask flag as the OR'ing or combination of two
+     * EventMask flags.
+     */
+    public static EventMask or(EventMask one, EventMask two) {
+        return (EventMask) Flag.orTwoFlags(one, two);
+    }
+
+    /**
+     * FIXME?
+     */
+    public static final EventMask EXPOSURE = new EventMask(GdkEventMask.EXPOSURE_MASK, "EXPOSURE");
+
+    /**
+     * Enable/disable all {@link org.gnome.gtk.Widget.MotionNotifyEvent
+     * Widget.MotionNotify} events.
+     */
+    public static final EventMask POINTER_MOTION = new EventMask(GdkEventMask.POINTER_MOTION_MASK,
+            "POINTER_MOTION");
+
+    /*
+     * FUTURE this flag needs more researching before exposing it.
+     */
+    static final EventMask POINTER_MOTION_HINT = new EventMask(GdkEventMask.POINTER_MOTION_HINT_MASK,
+            "POINTER_MOTION_HINT");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.MotionNotifyEvent
+     * Widget.MotionNotify} events when any mouse button is pressed.
+     */
+    public static final EventMask BUTTON_MOTION = new EventMask(GdkEventMask.BUTTON_MOTION_MASK,
+            "BUTTON_MOTION");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.MotionNotifyEvent
+     * Widget.MotionNotifyEvent} events when the left button is pressed.
+     */
+    public static final EventMask LEFT_BUTTON_MOTION = new EventMask(GdkEventMask.BUTTON1_MOTION_MASK,
+            "LEFT_BUTTON_MOTION");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.MotionNotifyEvent
+     * Widget.MotionNotifyEvent} when the middle button is pressed.
+     */
+    public static final EventMask MIDDLE_BUTTON_MOTION = new EventMask(GdkEventMask.BUTTON2_MOTION_MASK,
+            "MIDDLE_BUTTON_MOTION");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.MotionNotifyEvent
+     * Widget.MotionNotifyEvent} when the right button is pressed.
+     */
+    public static final EventMask RIGHT_BUTTON_MOTION = new EventMask(GdkEventMask.BUTTON3_MOTION_MASK,
+            "RIGHT_BUTTON_MOTION");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.ButtonPressEvent
+     * Widget.ButtonPressEvent} events.
+     */
+    public static final EventMask BUTTON_PRESS = new EventMask(GdkEventMask.BUTTON_PRESS_MASK,
+            "BUTTON_PRESS");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.ButtonReleaseEvent
+     * Widget.ButtonReleaseEvent} events.
+     */
+    public static final EventMask BUTTON_RELEASE = new EventMask(GdkEventMask.BUTTON_RELEASE_MASK,
+            "BUTTON_RELEASE");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.KeyPressEvent
+     * Widget.KeyPressEvent} events.
+     */
+    public static final EventMask KEY_PRESS = new EventMask(GdkEventMask.KEY_PRESS_MASK, "KEY_PRESS");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.KeyReleaseEvent
+     * Widget.KeyReleaseEvent} events.
+     */
+    public static final EventMask KEY_RELEASE = new EventMask(GdkEventMask.KEY_RELEASE_MASK,
+            "KEY_RELEASE");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.EnterNotifyEvent
+     * Widget.EnterNotifyEvent} events.
+     */
+    public static final EventMask ENTER_NOTIFY = new EventMask(GdkEventMask.ENTER_NOTIFY_MASK,
+            "ENTER_NOTIFY");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.LeaveNotifyEvent
+     * Widget.LeaveNotifyEvent} events.
+     */
+    public static final EventMask LEAVE_NOTIFY = new EventMask(GdkEventMask.LEAVE_NOTIFY_MASK,
+            "LEAVE_NOTIFY");
+
+    /**
+     * Enable/disable focus related events, such as
+     * {@link org.gnome.gtk.Widget.FocusInEvent Widget.FocusInEvent} and
+     * {@link org.gnome.gtk.Widget.FocusOutEvent Widget.FocusOutEvent}.
+     */
+    public static final EventMask FOCUS_CHANGE = new EventMask(GdkEventMask.FOCUS_CHANGE_MASK,
+            "FOCUS_CHANGE");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.VisibilityNotifyEvent
+     * Widget.VisibilityNotifyEvent} events.
+     */
+    public static final EventMask VISIBILITY_NOTIFY = new EventMask(GdkEventMask.VISIBILITY_NOTIFY_MASK,
+            "VISIBILITY_NOTIFY");
+
+    /**
+     * Enable/disable {@link org.gnome.gtk.Widget.ScrollEvent
+     * Widget.ScrollEvent} events.
+     */
+    public static final EventMask SCROLL = new EventMask(GdkEventMask.SCROLL_MASK, "SCROLL");
+
+    public static final EventMask STRUCTURE = new EventMask(GdkEventMask.STRUCTURE_MASK, "STRUCTURE");
+
+    /*
+     * FUTURE the following flags are undocumented for now, as they seem
+     * unneeded or they need more researching.
+     */
+    static final EventMask PROPERTY_CHANGE = new EventMask(GdkEventMask.PROPERTY_CHANGE_MASK,
+            "PROPERTY_CHANGE");
+
+    static final EventMask PROXIMITY_IN = new EventMask(GdkEventMask.PROXIMITY_IN_MASK, "PROXIMITY_IN");
+
+    static final EventMask PROXIMITY_OUT = new EventMask(GdkEventMask.PROXIMITY_OUT_MASK,
+            "PROXIMITY_OUT");
+
+    static final EventMask SUBSTRUCTURE = new EventMask(GdkEventMask.SUBSTRUCTURE_MASK, "SUBSTRUCTURE");
+
+    static final EventMask ALL_EVENTS = new EventMask(GdkEventMask.ALL_EVENTS_MASK, "ALL_EVENTS");
+}
diff --git a/src/bindings/org/gnome/gdk/EventMotion.java b/src/bindings/org/gnome/gdk/EventMotion.java
new file mode 100644
index 0000000..3979717
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventMotion.java
@@ -0,0 +1,70 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Event data describing the position of the mouse in the screen, when it is
+ * moved over a Widget.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.15
+ */
+public final class EventMotion extends Event
+{
+    protected EventMotion(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the horizontal location that this Event occured at, relative to the
+     * <code>[org.gnome.gdk]</code> Window. In most cases you will get an
+     * integral return; in any case, most usages of this return value will
+     * want a whole number of pixels, so cast to <code>int</code> as
+     * necessary.
+     * 
+     * @since 4.0.15
+     */
+    public double getX() {
+        return GdkEventMotion.getX(this);
+    }
+
+    /**
+     * Get the vertical location that this Event occured at, relative to the
+     * <code>[org.gnome.gdk]</code> Window.
+     * 
+     * @since 4.0.15
+     */
+    public double getY() {
+        return GdkEventMotion.getY(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventOwnerChange.java b/src/bindings/org/gnome/gdk/EventOwnerChange.java
new file mode 100644
index 0000000..cc002bf
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventOwnerChange.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Details about a selection that has been taken over.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class EventOwnerChange extends Event
+{
+    protected EventOwnerChange(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the "reason" that this EventOwnerChange occured.
+     * 
+     * @since 4.0.10
+     */
+    public OwnerChange getReason() {
+        return GdkEventOwnerChange.getReason(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventProperty.java b/src/bindings/org/gnome/gdk/EventProperty.java
new file mode 100644
index 0000000..24eacfd
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventProperty.java
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/*
+ * This class probably does not need to be publicly visible.
+ */
+public final class EventProperty extends Event
+{
+    protected EventProperty(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventProximity.java b/src/bindings/org/gnome/gdk/EventProximity.java
new file mode 100644
index 0000000..bce283b
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventProximity.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class EventProximity extends Event
+{
+    protected EventProximity(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventScroll.java b/src/bindings/org/gnome/gdk/EventScroll.java
new file mode 100644
index 0000000..82d8d74
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventScroll.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Event describing a mouse scroll operation. In most cases, it means that the
+ * mouse wheel has been turned.
+ * 
+ * <p>
+ * In fact, this event is related with mouse buttons 4 to 7. In most cases,
+ * buttons 4 and 5 are mapped to the mouse wheel.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.12
+ */
+public final class EventScroll extends Event
+{
+    protected EventScroll(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the state of the modifier keys. This will be
+     * {@link ModifierType#NONE NONE} if no modifiers are being held down. See
+     * EventKey's {@link EventKey#getState() getState()} and
+     * {@link ModifierType} for usage details.
+     */
+    public ModifierType getState() {
+        return GdkKeyvalOverride.flagFor(GdkEventScroll.getState(this));
+    }
+
+    /**
+     * Get the direction of the scroll.
+     */
+    public ScrollDirection getDirection() {
+        return GdkEventScroll.getDirection(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventSelection.java b/src/bindings/org/gnome/gdk/EventSelection.java
new file mode 100644
index 0000000..3100a2f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventSelection.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class EventSelection extends Event
+{
+    protected EventSelection(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventType.java b/src/bindings/org/gnome/gdk/EventType.java
new file mode 100644
index 0000000..129a185
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventType.java
@@ -0,0 +1,304 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The type of a low-level Event received. Although an {@link Event} is
+ * delivered as a parameter of many signals (the "event" signals, in fact), in
+ * general you will rarely need to make use of their information.
+ * 
+ * <p>
+ * <b>WARNING</b> Many of these constants are clearly internal. There's a
+ * strong argument to be made that some or all of these should not be publicly
+ * visible.
+ * 
+ * <p>
+ * TODO Most of these descriptions are terribly sparse and copied from the
+ * underlying documentation. Ordinarily we wouldn't do that, but with any luck
+ * you'll not need to be using these classes directly. If anyone has further
+ * information on the detailed significance of these constants, <i>please</i>
+ * contribute improvements to this class.
+ * 
+ * <p>
+ * <i>This is principally used to discriminate what kind of concrete Event
+ * subclass to create. Note that we are in GDK here; These events refer to the
+ * low level constructs delivered to the <code>GdkWindow</code>s that underlie
+ * Widgets.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * If you need to see the precise mappings of EventTypes to Event subclasses,
+ * see boxedFor() in org.gnome.gdk.Plumbing.
+ */
+public final class EventType extends Constant
+{
+    private EventType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /*
+     * Note that "NOTHING" is not bound; in the C header files it has the
+     * value -1. Eeek! Switch this to a flags instead of an enum if it turns
+     * out we really need this ordinal.
+     */
+
+    /**
+     * The top level Window should be hidden or destroyed, presumably due to
+     * the user having clicked the close window button presented in the window
+     * manager's decorations.
+     */
+    public static final EventType DELETE = new EventType(GdkEventType.DELETE, "DELETE");
+
+    /**
+     * The Window has been destroyed.
+     */
+    public static final EventType DESTROY = new EventType(GdkEventType.DESTROY, "DESTROY");
+
+    /**
+     * Part or all of the Window needs to be redrawn due to its having become
+     * visible.
+     */
+    public static final EventType EXPOSE = new EventType(GdkEventType.EXPOSE, "EXPOSE");
+
+    /**
+     * The pointer has moved.
+     */
+    public static final EventType MOTION_NOTIFY = new EventType(GdkEventType.MOTION_NOTIFY,
+            "MOTION_NOTIFY");
+
+    /**
+     * A mouse button has been pressed. As you would expect, an Event having
+     * this EventType will be a {@link EventButton}.
+     */
+    public static final EventType BUTTON_PRESS = new EventType(GdkEventType.BUTTON_PRESS, "BUTTON_PRESS");
+
+    /**
+     * A mouse button has been double clicked. Each click should also have
+     * generated a {@link EventType#BUTTON_PRESS BUTTON_PRESS} event;
+     * regardless this will be handled in higher level semantics.
+     * 
+     * <p>
+     * <i>Note that this is the constant <code>GDK_2BUTTON_PRESS</code> in the
+     * underlying library; we had to rename it slightly for translation into a
+     * legal Java identifier.</i>
+     */
+    public static final EventType BUTTON_PRESS_DOUBLE = new EventType(GdkEventType.BUTTON_PRESS_DOUBLE,
+            "BUTTON_PRESS_DOUBLE");
+
+    /**
+     * A mouse button has been clicked three times in a brief period. You
+     * would probably see this generated from the sequence:
+     * 
+     * <ul>
+     * <li>click (<code>BUTTON_PRESS</code> emitted),
+     * <li>click (<code>BUTTON_PRESS</code> then
+     * <code>BUTTON_PRESS_DOUBLE</code> emitted),
+     * <li>click (<code>BUTTON_PRESS</code> then
+     * <code>BUTTON_PRESS_TRIPLE</code> emitted).
+     * </ul>
+     * Your results may vary, however, depending on what else might be
+     * intercepting events along the way.
+     * 
+     * <p>
+     * <i>Note that this is the constant <code>GDK_3BUTTON_PRESS</code> in the
+     * underlying library; we had to rename it slightly for translation into a
+     * legal Java identifier.</i>
+     */
+    /*
+     * Thanks to Ryan Lortie for helping document the Event sequence.
+     */
+    public static final EventType BUTTON_PRESS_TRIPLE = new EventType(GdkEventType.BUTTON_PRESS_TRIPLE,
+            "BUTTON_PRESS_TRIPLE");
+
+    /**
+     * A previously pressed mouse button has been released. This EventType
+     * will be found in a {@link EventButton} Event.
+     */
+    public static final EventType BUTTON_RELEASE = new EventType(GdkEventType.BUTTON_RELEASE,
+            "BUTTON_RELEASE");
+
+    /**
+     * A key has been pressed.
+     */
+    public static final EventType KEY_PRESS = new EventType(GdkEventType.KEY_PRESS, "KEY_PRESS");
+
+    /**
+     * A key has been released
+     */
+    public static final EventType KEY_RELEASE = new EventType(GdkEventType.KEY_RELEASE, "KEY_RELEASE");
+
+    /**
+     * The pointer has entered a Window. This corresponds to
+     * {@link EventCrossing}.
+     */
+    public static final EventType ENTER_NOTIFY = new EventType(GdkEventType.ENTER_NOTIFY, "ENTER_NOTIFY");
+
+    /**
+     * The pointer has left a Window. This corresponds to
+     * {@link EventCrossing}.
+     */
+    public static final EventType LEAVE_NOTIFY = new EventType(GdkEventType.LEAVE_NOTIFY, "LEAVE_NOTIFY");
+
+    /**
+     * The keyboard focus has entered or left the Window.
+     */
+    public static final EventType FOCUS_CHANGE = new EventType(GdkEventType.FOCUS_CHANGE, "FOCUS_CHANGE");
+
+    /**
+     * The size, position, or stacking order of a Window has been changed.
+     * Apparently GTK discards these events for child Windows, but then you
+     * won't notice this because you're not using these constants directly
+     * anyway, right?
+     */
+    public static final EventType CONFIGURE = new EventType(GdkEventType.CONFIGURE, "CONFIGURE");
+
+    /**
+     * The Window has been mapped to the screen.
+     */
+    public static final EventType MAP = new EventType(GdkEventType.MAP, "MAP");
+
+    /**
+     * The Window has been unmapped from the screen.
+     */
+    public static final EventType UNMAP = new EventType(GdkEventType.UNMAP, "UNMAP");
+
+    /**
+     * A low level [ie X-windows] property of the Window has been changed or
+     * removed.
+     */
+    public static final EventType PROPERTY_NOTIFY = new EventType(GdkEventType.PROPERTY_NOTIFY,
+            "PROPERTY_NOTIFY");
+
+    /**
+     * Another application has requested a selection.
+     */
+    public static final EventType SELECTION_REQUEST = new EventType(GdkEventType.SELECTION_REQUEST,
+            "SELECTION_REQUEST");
+
+    /**
+     * A selection has been received (from another application?).
+     */
+    public static final EventType SELECTION_NOTIFY = new EventType(GdkEventType.SELECTION_NOTIFY,
+            "SELECTION_NOTIFY");
+
+    /**
+     * The application has been told that it no longer owns a selection.
+     */
+    public static final EventType SELECTION_CLEAR = new EventType(GdkEventType.SELECTION_CLEAR,
+            "SELECTION_CLEAR");
+
+    /**
+     * An input device has moved into contact with a sensing surface (e.g. a
+     * touchscreen or graphics tablet).
+     */
+    public static final EventType PROXIMITY_IN = new EventType(GdkEventType.PROXIMITY_IN, "PROXIMITY_IN");
+
+    /**
+     * An input device has moved out of contact with a sensing surface,
+     * whatever that actually means.
+     */
+    public static final EventType PROXIMITY_OUT = new EventType(GdkEventType.PROXIMITY_OUT,
+            "PROXIMITY_OUT");
+
+    /**
+     * The pointer has entered the Window during a drag operation.
+     */
+    public static final EventType DRAG_ENTER = new EventType(GdkEventType.DRAG_ENTER, "DRAG_ENTER");
+
+    /**
+     * The pointer has left the Window during a drag operation.
+     */
+    public static final EventType DRAG_LEAVE = new EventType(GdkEventType.DRAG_LEAVE, "DRAG_LEAVE");
+
+    /**
+     * The pointer has moved within the Window during a drag operation (why
+     * would you ever care?).
+     */
+    public static final EventType DRAG_MOTION = new EventType(GdkEventType.DRAG_MOTION, "DRAG_MOTION");
+
+    /**
+     * The status of a drag operation initiated by this Window has changed
+     * (TODO to?).
+     */
+    public static final EventType DRAG_STATUS = new EventType(GdkEventType.DRAG_STATUS, "DRAG_STATUS");
+
+    /**
+     * A drop operation onto this Window has started.
+     */
+    public static final EventType DROP_START = new EventType(GdkEventType.DROP_START, "DROP_START");
+
+    /**
+     * The drop operation initiated by the Window has been completed.
+     */
+    public static final EventType DROP_FINISHED = new EventType(GdkEventType.DROP_FINISHED,
+            "DROP_FINISHED");
+
+    /**
+     * A message has been received from another application (TODO meaning
+     * what?).
+     */
+    public static final EventType CLIENT_EVENT = new EventType(GdkEventType.CLIENT_EVENT, "CLIENT_EVENT");
+
+    /**
+     * The Window's visibility status has changed (TODO meaning what?)
+     */
+    public static final EventType VISIBILITY_NOTIFY = new EventType(GdkEventType.VISIBILITY_NOTIFY,
+            "VISIBILITY_NOTIFY");
+
+    /**
+     * The source region was completely available when parts of a drawable
+     * were copied. "This is not very useful" says the underlying API
+     * documentation. Really!
+     */
+    public static final EventType NO_EXPOSE = new EventType(GdkEventType.NO_EXPOSE, "NO_EXPOSE");
+
+    /**
+     * The scroll wheel was turned.
+     */
+    public static final EventType SCROLL = new EventType(GdkEventType.SCROLL, "SCROLL");
+
+    /**
+     * The {@link WindowState state} of a Window has changed.
+     */
+    public static final EventType WINDOW_STATE = new EventType(GdkEventType.WINDOW_STATE, "WINDOW_STATE");
+
+    /**
+     * A setting (TODO what kind of setting?) has been modified.
+     */
+    public static final EventType SETTING = new EventType(GdkEventType.SETTING, "SETTING");
+
+}
diff --git a/src/bindings/org/gnome/gdk/EventVisibility.java b/src/bindings/org/gnome/gdk/EventVisibility.java
new file mode 100644
index 0000000..86b33c4
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventVisibility.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * The data regarding an event related to the visibility of a Widget. In
+ * general this is only relevant when hooked up to a Window, but the
+ * capability is general nevertheless. See
+ * {@link org.gnome.gtk.Widget.VisibilityNotifyEvent
+ * Widget.VisibilityNotifyEvent} for further details.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class EventVisibility extends Event
+{
+    protected EventVisibility(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * This is largely the point of this Event subclass: return the Constant
+     * describing the current visibility of the Window. This is what you use
+     * in a <code>Widget.VisibilityNotifyEvent</code> handler.
+     */
+    public VisibilityState getState() {
+        return GdkEventVisibility.getState(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/EventWindowState.java b/src/bindings/org/gnome/gdk/EventWindowState.java
new file mode 100644
index 0000000..9951480
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/EventWindowState.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class EventWindowState extends Event
+{
+    protected EventWindowState(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/ExtensionMode.java b/src/bindings/org/gnome/gdk/ExtensionMode.java
new file mode 100644
index 0000000..a80c448
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/ExtensionMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class ExtensionMode extends Constant
+{
+    private ExtensionMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Fill.java b/src/bindings/org/gnome/gdk/Fill.java
new file mode 100644
index 0000000..a564ec3
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Fill.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Fill extends Constant
+{
+    private Fill(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/FillRule.java b/src/bindings/org/gnome/gdk/FillRule.java
new file mode 100644
index 0000000..4e835a5
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/FillRule.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FillRule extends Constant
+{
+    private FillRule(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/FilterReturn.java b/src/bindings/org/gnome/gdk/FilterReturn.java
new file mode 100644
index 0000000..dd01cce
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/FilterReturn.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FilterReturn extends Constant
+{
+    private FilterReturn(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Function.java b/src/bindings/org/gnome/gdk/Function.java
new file mode 100644
index 0000000..64e247d
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Function.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class Function extends Constant
+{
+    private Function(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Gdk.java b/src/bindings/org/gnome/gdk/Gdk.java
new file mode 100644
index 0000000..fc085c9
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Gdk.java
@@ -0,0 +1,136 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * The backend to GTK which talks to the actual screen is GDK. There are
+ * various classes with the prefix <code>Gdk...</code> which give you access
+ * to lower level drawing constructs; these are mapped in java-gnome as the
+ * various classes within package <code>org.gnome.gdk</code>.
+ * 
+ * <p>
+ * This particular class, on the other hand, simply contains some of the
+ * infrastructure necessary to permit multi-threaded access to GDK, GTK, and
+ * other GNOME libraries.
+ * 
+ * <h2>Thread safety in java-gnome</h2>
+ * 
+ * <p>
+ * None of the other Java graphical toolkits out there let you make GUI calls
+ * from threads other than the "main" one; they're all single threaded. Even
+ * if all you want to do is a quick worker thread to carry out some input
+ * validation in the background after the user presses "OK", you have to jump
+ * through horrific contortions to do so safely, resulting in cumbersome,
+ * clunky code. By contrast, the java-gnome 4.0 bindings of GTK are
+ * <b>transparently thread safe</b>. We integrate properly with the underlying
+ * GDK thread lock and as a result you can safely make calls to various GTK
+ * methods from worker threads.
+ * 
+ * <p>
+ * <i>Threading and GNOME is tricky. This class mostly exists for the purpose
+ * of holding an object to serve as the global threading monitor and so that
+ * when the lock appears in thread dumps it has a useful name.</i>
+ * 
+ * <p>
+ * <i>Every call made to the native libraries is protected by entering "the
+ * master GDK lock"; those familiar with the C side of things would be used to
+ * doing this via <code>gdk_threads_enter()</code> and
+ * <code>gdk_threads_leave()</code>. When you initialize your java-gnome
+ * program with</i> {@link org.gnome.gtk.Gtk#init(String[]) Gtk.init()}<i>,
+ * GDK is carefully configured so that the lock used is actually a Java side
+ * monitor and therefore reentrant; nested calls all behave properly.</i>
+ * 
+ * <p>
+ * <i>Note that when in a signal handler callback the GDK lock is already held
+ * (you're "in" the main loop when a callback happens), but since it just
+ * works transparently you don't need to worry about it. If you do find a need
+ * to take the lock into account explicitly in your own code, the object is
+ * available here,</i> {@link Gdk#lock Gdk.lock}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * TODO can we just move this into Plumbing somehow?
+ */
+public class Gdk
+{
+    /**
+     * The global monitor used to regulate access to GTK functions. Any time
+     * you call a java-gnome function you will enter the lock on this object.
+     * As it happens, when you receive a callback you are "in" the main loop,
+     * and thus within the lock held on this object. Because Java
+     * <code>synchronized</code> monitors are reentrant you can proceed with
+     * calling other java-gnome methods transparently, but keep in mind that
+     * you <i>are</i> blocking the main loop during signal callbacks.
+     * 
+     * <p>
+     * Most of the time you simply don't need to know about this; but should
+     * you have some reason to take the global GDK lock yourself, you can
+     * access it via this field.
+     */
+    /*
+     * If you're not a java-gnome bindings hacker whoreally knows what they're
+     * doing, DO NOT TOUCH THIS.
+     */
+    public static final Lock lock;
+
+    static {
+        lock = new Lock();
+    }
+
+    /**
+     * An inner class for the purely cosmetic purpose of giving an explicit
+     * name to the global GDK lock. By using this, we end up having
+     * 
+     * <pre>
+     * "waiting on ..., a Gdk$Lock"
+     * </pre>
+     * 
+     * appear in thread dumps. Otherwise, it could just as well have been
+     * java.lang.Object. There is no reason to ever instantiate one of these
+     * yourself, so there's no public constructor. In fact, you probably can
+     * forget you ever read this.
+     * 
+     * @author Andrew Cowie
+     */
+    public static final class Lock
+    {
+        private Lock() {}
+    }
+
+    /*
+     * Utility class. No instantiation.
+     */
+    private Gdk() {}
+}
diff --git a/src/bindings/org/gnome/gdk/GdkColorOverride.c b/src/bindings/org/gnome/gdk/GdkColorOverride.c
new file mode 100644
index 0000000..d09b0d5
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkColorOverride.c
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include "bindings_java.h"
+#include "org_gnome_gdk_GdkColorOverride.h"
+
+/*
+ * TODO This should really be replaced with generated code once the codegen
+ * takes care of allocating Boxeds, although having the setters direct in the
+ * constructor is handy.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gdk_GdkColorOverride_gdk_1color_1new
+(
+	JNIEnv* env,
+	jclass cls,
+	jint _red,
+	jint _green,
+	jint _blue
+)
+{
+	GdkColor blank = { 0, };
+	GdkColor* result;
+	
+	// blank is allocated locally on the stack
+	
+	blank.red = (gint) _red;
+	blank.green = (gint) _green;
+	blank.blue = (gint) _blue;
+
+	// copy blank
+	result = gdk_color_copy(&blank);
+
+	// and finally
+	return (jlong) result;
+}
diff --git a/src/bindings/org/gnome/gdk/GdkColorOverride.java b/src/bindings/org/gnome/gdk/GdkColorOverride.java
new file mode 100644
index 0000000..2684186
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkColorOverride.java
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+final class GdkColorOverride extends Plumbing
+{
+    /*
+     * Create a GdkColor via gdk_color_copy() to support subsequent release
+     * via gdk_color_free(). TODO this is another Boxed type that should
+     * really have its allocator generated.
+     */
+    static final long createColor(int red, int green, int blue) {
+        synchronized (lock) {
+            return gdk_color_new(red, green, blue);
+        }
+    }
+
+    private static native final long gdk_color_new(int red, int green, int blue);
+}
diff --git a/src/bindings/org/gnome/gdk/GdkKeyvalOverride.java b/src/bindings/org/gnome/gdk/GdkKeyvalOverride.java
new file mode 100644
index 0000000..979c1f1
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkKeyvalOverride.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * See also GtkResponseTypeOverride where we had to pull a similar stunt. This
+ * makes two, but still ok.
+ */
+final class GdkKeyvalOverride extends Plumbing
+{
+    private GdkKeyvalOverride() {}
+
+    /**
+     * Somewhat unusually for the enumFor case, if the ordinal (keyval in this
+     * case) isn't known, then a new Constant will be created [and thus
+     * registered] for it.
+     */
+    static Keyval enumFor(int keyval) {
+        try {
+            return (Keyval) Plumbing.enumFor(Keyval.class, keyval);
+        } catch (IllegalArgumentException iae) {
+            return new Keyval(keyval, GdkKeyval.name(keyval));
+        }
+    }
+
+    /**
+     * Again, there are lots of native values we don't have explicit constants
+     * registered for, so just duck around the problem rather than having
+     * Exceptions thrown.
+     */
+    static ModifierType flagFor(int state) {
+        try {
+            return (ModifierType) Plumbing.flagFor(ModifierType.class, state);
+        } catch (IllegalArgumentException iae) {
+            return new ModifierType(state, "UNKNOWN_" + state);
+        }
+    }
+
+    /*
+     * This is mostly for unit testing
+     */
+    static int numOf(Keyval key) {
+        return Plumbing.numOf(key);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/GdkMouseButtonOverride.java b/src/bindings/org/gnome/gdk/GdkMouseButtonOverride.java
new file mode 100644
index 0000000..6ce89e0
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkMouseButtonOverride.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+final class GdkMouseButtonOverride extends Plumbing
+{
+    private GdkMouseButtonOverride() {}
+
+    static final MouseButton enumFor(int ordinal) {
+        return (MouseButton) org.freedesktop.bindings.Plumbing.enumFor(MouseButton.class, ordinal);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/GdkPixbufOverride.c b/src/bindings/org/gnome/gdk/GdkPixbufOverride.c
new file mode 100644
index 0000000..e908826
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkPixbufOverride.c
@@ -0,0 +1,245 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include "bindings_java.h"
+#include "org_gnome_gdk_GdkPixbufOverride.h"
+
+JNIEXPORT jbyteArray JNICALL
+Java_org_gnome_gdk_GdkPixbufOverride_gdk_1pixbuf_1get_1pixels
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GdkPixbuf* self;
+	int rowstride;
+	int width;
+	int height;
+	int n_channels;
+	int bits_per_sample;
+	guchar* data;
+	jbyteArray result;
+	int size;
+	int j, p;
+
+
+	// convert parameter self
+	self = (GdkPixbuf*) _self;
+
+	/*
+	 * We need to know how much image data there is. The rowstride gives
+	 * us the width of each row, but the last row is *not* this wide. The
+	 * formula is in the GDK docs [and more to the point, in the source
+	 * code of gdk_pixbuf_new()] but, as finally implemented, we don't
+	 * need it since we're extracting the rows individually, thereby
+	 * jettisoning the padding.
+	 */
+
+	width = gdk_pixbuf_get_width(self);
+	height = gdk_pixbuf_get_height(self);
+	rowstride = gdk_pixbuf_get_rowstride(self);
+	n_channels = gdk_pixbuf_get_n_channels(self);
+	bits_per_sample = gdk_pixbuf_get_bits_per_sample(self);
+
+	// length =  ((height - 1) * rowstride) + (width * ((n_channels * bits_per_sample + 7) / 8));
+
+	if (bits_per_sample != 8) {
+		bindings_java_throw(env, "This algorithm only supports 8 bits per channel");
+		/*
+		 * If this is hit, then the algorithm made below [and
+		 * descirbed in our description of Pixbuf's getPixels()] that
+		 * each channel is a single byte will need to be reworked.
+		 */
+		return NULL;
+	}
+
+	/*
+	 * Now we can extract the image data, and return it.
+	 */
+
+	// call function
+	data = gdk_pixbuf_get_pixels(self);
+
+
+	/*
+	 * Now copy the bytes of each pixel out row by row. Most of the time
+	 * size will match rowstride, but not always. The net effect of this
+	 * is to return a cartesian array without padding and without the
+	 * dangling last row. We orginally had this in Pixbuf.java, but this
+	 * turns out to be 20% faster under heavy load.
+	 */
+
+	size = width * n_channels;
+
+	result = (*env)->NewByteArray(env, height * size);
+
+	p = 0;
+
+	for (j = 0; j < height; j++) {
+		(*env)->SetByteArrayRegion(env, result, p, size, (jbyte*) data);
+
+		data += rowstride;
+		p += size;
+	}
+
+	// and finally
+	return result;
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gdk_GdkPixbufOverride_gdk_1pixbuf_1new_1from_1stream
+(
+	JNIEnv* env,
+	jclass cls,
+	jbyteArray _data,
+	jint _width,
+	jint _height,
+	jboolean _preserveAspectRatio,
+	jboolean _scale
+)
+{
+	GInputStream *input_stream;
+	gssize len;
+	void *data;
+	int width;
+	int height;
+	gboolean preserveAspectRatio;
+	GdkPixbuf* result;
+	GError* error = NULL;
+
+	// set up the length and input stream parameters.
+	len = (*env)->GetArrayLength(env, _data);
+	data = (*env)->GetByteArrayElements(env, _data, NULL);
+	width = (int) _width;
+	height = (int) _height;
+	preserveAspectRatio = (gboolean) _preserveAspectRatio;
+
+	/*
+	 * Jump through the necessary hoops to feed an array of bytes to the
+	 * GdkPixbuf constructor. This code a wrapper around two native
+	 * functions; we use the last boolean across the function call stack to
+	 * decide which to call.
+	 */
+
+	input_stream = g_memory_input_stream_new_from_data(data, len, NULL);
+	if (_scale) {
+		result = gdk_pixbuf_new_from_stream_at_scale(input_stream, width, height, preserveAspectRatio, NULL, &error);
+	} else {
+		result = gdk_pixbuf_new_from_stream(input_stream, NULL, &error);
+	}
+
+	g_input_stream_close(input_stream, NULL, NULL);
+	g_object_unref(input_stream);
+
+	// cleanup parameter data
+	(*env)->ReleaseByteArrayElements(env, _data, data, 0);
+
+	// cleanup return value
+	if (result != NULL) {
+		bindings_java_memory_cleanup((GObject*)result, TRUE);
+	}
+
+	// check for a GError
+	if (error) {
+		bindings_java_throwGlibException(env, error);
+		return 0L;
+	}
+
+	return (jlong) result;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_gnome_gdk_GdkPixbufOverride_gdk_1pixbuf_1get_1file_1info_1X
+(
+	JNIEnv* env,
+	jclass cls,
+	jstring _filename
+)
+{
+	const GdkPixbufFormat* format;
+	const gchar* filename;
+	int x;
+
+	// convert parameter filename
+	filename = (const gchar*) bindings_java_getString(env, _filename);
+	if (filename == NULL) {
+		return 0; // Java Exception already thrown
+	}
+
+	// call function
+	format = gdk_pixbuf_get_file_info(filename, &x, NULL);
+	if (format == NULL) {
+		x = -1;
+	}
+
+	// cleanup parameter filename
+	bindings_java_releaseString(filename);
+
+	// translate return value to JNI type
+	return (jint) x;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_gnome_gdk_GdkPixbufOverride_gdk_1pixbuf_1get_1file_1info_1Y
+(
+	JNIEnv* env,
+	jclass cls,
+	jstring _filename
+)
+{
+	const GdkPixbufFormat* format;
+	const gchar* filename;
+	int y;
+
+	// convert parameter filename
+	filename = (const gchar*) bindings_java_getString(env, _filename);
+	if (filename == NULL) {
+		return 0; // Java Exception already thrown
+	}
+
+	// call function
+	format = gdk_pixbuf_get_file_info(filename, NULL, &y);
+	if (format == NULL) {
+		y = -1;
+	}
+
+	// cleanup parameter filename
+	bindings_java_releaseString(filename);
+
+	// translate return value to JNI type
+	return (jint) y;
+}
+
diff --git a/src/bindings/org/gnome/gdk/GdkPixbufOverride.java b/src/bindings/org/gnome/gdk/GdkPixbufOverride.java
new file mode 100644
index 0000000..150b318
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkPixbufOverride.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.GlibException;
+
+final class GdkPixbufOverride extends Plumbing
+{
+    private GdkPixbufOverride() {}
+
+    static final byte[] getPixels(Pixbuf self) {
+        synchronized (lock) {
+            return gdk_pixbuf_get_pixels(pointerOf(self));
+        }
+    }
+
+    private static native final byte[] gdk_pixbuf_get_pixels(long self);
+
+    static final long createPixbufFromArray(byte[] data, int width, int height,
+            boolean preserveAspectRatio, boolean scale) throws GlibException {
+        if (data == null) {
+            throw new IllegalArgumentException("byte array can't be null");
+        }
+
+        synchronized (lock) {
+            return gdk_pixbuf_new_from_stream(data, width, height, preserveAspectRatio, scale);
+        }
+    }
+
+    private static native final long gdk_pixbuf_new_from_stream(byte[] data, int width, int height,
+            boolean preserveAspectRatio, boolean scale) throws GlibException;
+
+    static final int getFileInfoX(String filename) {
+        if (filename == null) {
+            throw new IllegalArgumentException("filename can't be null");
+        }
+
+        synchronized (lock) {
+            return gdk_pixbuf_get_file_info_X(filename);
+        }
+    }
+
+    private static native final int gdk_pixbuf_get_file_info_X(String filename);
+
+    static final int getFileInfoY(String filename) {
+        if (filename == null) {
+            throw new IllegalArgumentException("filename can't be null");
+        }
+
+        synchronized (lock) {
+            return gdk_pixbuf_get_file_info_Y(filename);
+        }
+    }
+
+    private static native final int gdk_pixbuf_get_file_info_Y(String filename);
+}
diff --git a/src/bindings/org/gnome/gdk/GdkRGBAOverride.c b/src/bindings/org/gnome/gdk/GdkRGBAOverride.c
new file mode 100644
index 0000000..cbccde3
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkRGBAOverride.c
@@ -0,0 +1,70 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include "bindings_java.h"
+#include "org_gnome_gdk_GdkRGBAOverride.h"
+
+/*
+ * TODO This should really be replaced with generated code once the codegen
+ * takes care of allocating Boxeds, although having the setters direct in the
+ * constructor is handy.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gdk_GdkRGBAOverride_gdk_1rgba_1new
+(
+	JNIEnv* env,
+	jclass cls,
+	jdouble _red,
+	jdouble _green,
+	jdouble _blue,
+	jdouble _alpha
+)
+{
+	GdkRGBA blank = { 0, };
+	GdkRGBA* result;
+	
+	// blank is allocated locally on the stack
+	
+	blank.red = (gdouble) _red;
+	blank.green = (gdouble) _green;
+	blank.blue = (gdouble) _blue;
+	blank.alpha = (gdouble) _alpha;
+
+	// copy blank
+	result = gdk_rgba_copy(&blank);
+
+	// and finally
+	return (jlong) result;
+}
diff --git a/src/bindings/org/gnome/gdk/GdkRGBAOverride.java b/src/bindings/org/gnome/gdk/GdkRGBAOverride.java
new file mode 100644
index 0000000..bca8ef2
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkRGBAOverride.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+final class GdkRGBAOverride extends Plumbing
+{
+    /*
+     * Create a GdkRGBA via gdk_rgba_copy() to support subsequent release via
+     * gdk_rgba_free().
+     */
+    static final long createRGBA(double red, double green, double blue, double alpha) {
+        synchronized (lock) {
+            return gdk_rgba_new(red, green, blue, alpha);
+        }
+    }
+
+    private static native final long gdk_rgba_new(double red, double green, double blue, double alpha);
+}
diff --git a/src/bindings/org/gnome/gdk/GdkRectangleOverride.c b/src/bindings/org/gnome/gdk/GdkRectangleOverride.c
new file mode 100644
index 0000000..0da93c9
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkRectangleOverride.c
@@ -0,0 +1,104 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include "bindings_java.h"
+#include "org_gnome_gdk_GdkRectangleOverride.h"
+
+/*
+ * Allocator and release function for GdkRectangle structs. Most of the time
+ * we are just allocating a blank, so 0 are passed knowing full well the
+ * struct will be populated by the next function call. We've saved ourself
+ * some trouble by having one function for both that case and the case where
+ * the developer needs to create one themselves.
+ */
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gdk_GdkRectangleOverride_gdk_1rectangle_1new
+(
+	JNIEnv* env,
+	jclass cls,
+	jint _x,
+	jint _y,
+	jint _width,
+	jint _height
+)
+{
+	gint x;
+	gint y;
+	gint width;
+	gint height;
+	GdkRectangle* result;
+	
+	// convert parameters
+
+	x = (gint) _x;
+	y = (gint) _y;
+	width = (gint) _width;
+	height = (gint) _height;
+	
+	/*
+	 * This is a dynamic allocation.
+	 */	
+	result = g_slice_new0(GdkRectangle);
+
+	result->x = x;
+	result->y = y;
+	result->width = width;
+	result->height = height;
+		
+	// cleanup parameter self
+
+	// and finally
+	return (jlong) result;
+}
+
+JNIEXPORT void JNICALL
+Java_org_gnome_gdk_GdkRectangleOverride_gdk_1rectangle_1free
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GdkRectangle* self;
+	
+	// convert paramter self
+	self = (GdkRectangle*) _self;
+	
+	// call function
+	g_slice_free(GdkRectangle, self);
+	
+	// cleanup parameter self
+}
diff --git a/src/bindings/org/gnome/gdk/GdkRectangleOverride.java b/src/bindings/org/gnome/gdk/GdkRectangleOverride.java
new file mode 100644
index 0000000..92ac6e0
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GdkRectangleOverride.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * @author Andrew Cowie
+ */
+final class GdkRectangleOverride extends Plumbing
+{
+    private GdkRectangleOverride() {}
+
+    /*
+     * As an implementation detail, somewhat unusually we have overloaded
+     * here. Our allocator takes four arguments in case you need to set the
+     * fields, but most of the time you're just allocating a blank struct to
+     * pass in to be set by something else.
+     */
+    static final long createRectangle() {
+        synchronized (lock) {
+            return gdk_rectangle_new(0, 0, 0, 0);
+        }
+    }
+
+    static final long createRectangle(int x, int y, int width, int height) {
+        synchronized (lock) {
+            return gdk_rectangle_new(x, y, width, height);
+        }
+    }
+
+    private static native final long gdk_rectangle_new(int x, int y, int width, int height);
+
+    static final void free(Rectangle self) {
+        synchronized (lock) {
+            gdk_rectangle_free(pointerOf(self));
+        }
+    }
+
+    private static native final void gdk_rectangle_free(long self);
+}
diff --git a/src/bindings/org/gnome/gdk/Geometry.java b/src/bindings/org/gnome/gdk/Geometry.java
new file mode 100644
index 0000000..7d26eb0
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Geometry.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Geometry extends Boxed
+{
+    protected Geometry(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/GrabStatus.java b/src/bindings/org/gnome/gdk/GrabStatus.java
new file mode 100644
index 0000000..ded4e5e
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/GrabStatus.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class GrabStatus extends Constant
+{
+    private GrabStatus(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Gravity.java b/src/bindings/org/gnome/gdk/Gravity.java
new file mode 100644
index 0000000..bb47114
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Gravity.java
@@ -0,0 +1,124 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Gravity determines the location of the reference point in root window
+ * co-ordinates and which point of the Window is positioned at the reference
+ * point. This impacts the co-ordinates used when moving Windows with
+ * {@link org.gnome.gtk.Window#move(int, int) move()}. The gravity for a
+ * Window is set by {@link org.gnome.gtk.Window#setGravity(Gravity)
+ * setGravity()}.
+ * 
+ * <p>
+ * <i>It turns out the whole gravity concept is unreliable; luckily you don't
+ * really need it for much. And in any case, if you're trying to move the
+ * Window around; what you probably want is</i>
+ * {@link org.gnome.gtk.Window#setPosition(org.gnome.gtk.WindowPosition)
+ * setPosition()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public final class Gravity extends Constant
+{
+    private Gravity(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Orientation to the top left corner of the screen and co-ordinates
+     * running right and down. <b>This is the default</b> gravity and matches
+     * what you'd normally expect <code>x</code>,<code>y</code> to mean on an
+     * X display: horizontal and vertical distance from the top-left corner.
+     */
+    public static final Gravity NORTH_WEST = new Gravity(GdkGravity.NORTH_WEST, "NORTH_WEST");
+
+    public static final Gravity SOUTH_WEST = new Gravity(GdkGravity.SOUTH_WEST, "SOUTH_WEST");
+
+    public static final Gravity NORTH_EAST = new Gravity(GdkGravity.NORTH_EAST, "NORTH_EAST");
+
+    public static final Gravity SOUTH_EAST = new Gravity(GdkGravity.SOUTH_EAST, "SOUTH_EAST");
+
+    /**
+     * Reference point is with respect to the center of the screen. If you're
+     * trying to center your Window on the screen this probably isn't what you
+     * want; see Window's
+     * {@link org.gnome.gtk.Window#setPosition(org.gnome.gtk.WindowPosition)
+     * setPosition()} with an argument of
+     * {@link org.gnome.gtk.WindowPosition#CENTER CENTER} or
+     * {@link org.gnome.gtk.WindowPosition#CENTER_ALWAYS CENTER_ALWAYS}
+     * instead.
+     */
+    public static final Gravity CENTER = new Gravity(GdkGravity.CENTER, "CENTER");
+
+    /**
+     * Co-ordinates are with respect to the center of the top edge of the
+     * Window. This is rarely useful.
+     */
+    public static final Gravity NORTH = new Gravity(GdkGravity.NORTH, "NORTH");
+
+    /**
+     * Co-ordinates are with respect to the center of the bottom edge of the
+     * Window. This is rarely useful.
+     */
+    public static final Gravity SOUTH = new Gravity(GdkGravity.SOUTH, "SOUTH");
+
+    /**
+     * Co-ordinates are with respect to the center of the right-hand edge of
+     * the Window. This is rarely useful.
+     */
+    public static final Gravity EAST = new Gravity(GdkGravity.EAST, "EAST");
+
+    /**
+     * Co-ordinates are with respect to the center of the left-hand edge of
+     * the Window. This is rarely useful.
+     */
+    public static final Gravity WEST = new Gravity(GdkGravity.WEST, "WEST");
+
+    /**
+     * This is a weird one: it is in reference to the top-left corner of the
+     * Window itself (like {@link #NORTH_WEST} but ignoring whatever
+     * decorations etc have been added outside by the window manager. At first
+     * this would seem brilliantly useful, but since it ignores window
+     * decorations, moving to the co-ordinates returned by
+     * {@link org.gnome.gtk.Window#getPositionX() getPosition()} will actually
+     * cause the Window to move slightly on the screen, rather than staying
+     * still as you might have expected. So even when you think you want this,
+     * you really want NORTH_WEST, which is why it's the default.
+     */
+    public static final Gravity STATIC = new Gravity(GdkGravity.STATIC, "STATIC");
+
+}
diff --git a/src/bindings/org/gnome/gdk/InputMode.java b/src/bindings/org/gnome/gdk/InputMode.java
new file mode 100644
index 0000000..e556aed
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/InputMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class InputMode extends Constant
+{
+    private InputMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/InputSource.java b/src/bindings/org/gnome/gdk/InputSource.java
new file mode 100644
index 0000000..0808bb2
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/InputSource.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class InputSource extends Constant
+{
+    private InputSource(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/InterpType.java b/src/bindings/org/gnome/gdk/InterpType.java
new file mode 100644
index 0000000..fbb686c
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/InterpType.java
@@ -0,0 +1,107 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 1999-2003 Free Software Foundation, Inc
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * Descriptions of the interpolation algorithms are adapted from text in the
+ * gdk-pixbuf library's documentation, which is licenced by its authors under
+ * the terms of the "GNU Free Documentation Licence, version 1.1 or later".
+ */
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Interpolation algorithms available in GDK. These are used to control the
+ * choice of algorithm that will be applied when scaling an image with
+ * Pixbuf's {@link Pixbuf#scale(int, int, InterpType) scale()} method. In
+ * general use it is recommended that you use the {@link #BILINEAR BILINEAR}
+ * algorithm.
+ * 
+ * <p>
+ * <i>The details of the implementations of the interpolation techniques made
+ * available here are obviously highly technical, and so are adapted directly
+ * from the gdk-pixbuf library's documentation.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class InterpType extends Constant
+{
+    private InterpType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Interpolate by "nearest neighbour" sampling. This is a fast algorithm
+     * which, unfortunately, results in really ugly images when scaling down.
+     */
+    public static final InterpType NEAREST = new InterpType(GdkInterpType.NEAREST, "NEAREST");
+
+    /**
+     * Use the bilinear interpolation method. When scaling up, this choice is
+     * equivalent to point-sampling the ideal bilinear-interpolated image. For
+     * scaling down, it is equivalent to laying down small tiles and
+     * integrating over the coverage area. This is considered the best choice
+     * in normal situations, providing a decent balance between speed and
+     * quality.
+     */
+    public static final InterpType BILINEAR = new InterpType(GdkInterpType.BILINEAR, "BILINEAR");
+
+    /**
+     * Each pixel is rendered as a tiny parallelogram of solid color, the
+     * edges of which are implemented with antialiasing. The result is similar
+     * to {@link #NEAREST NEAREST} if scaling up, and to {@link #BILINEAR
+     * BILINEAR} if scaling down.
+     * 
+     * <p>
+     * <i>This is supposedly an accurate simulation of the PostScript's image
+     * operator (without any interpolation enabled).</i>
+     */
+    public static final InterpType TILES = new InterpType(GdkInterpType.TILES, "TILES");
+
+    /**
+     * A hyperbolic filtering algorithm. This is a refinement of Wolberg's
+     * digital image warping. This method is the slowest of the available
+     * choices, but generally gives the highest quality results.
+     * 
+     * <p>
+     * The filter is idempotent for 1:1 pixel mapping.
+     * 
+     * <p>
+     * <i>According to the GDK documentation, this algorithm is formally
+     * defined as the "hyperbolic-filter sampling the ideal hyperbolic-filter
+     * interpolated image". Good thing they let us know that.</i>
+     */
+    public static final InterpType HYPER = new InterpType(GdkInterpType.HYPER, "HYPER");
+}
diff --git a/src/bindings/org/gnome/gdk/JoinStyle.java b/src/bindings/org/gnome/gdk/JoinStyle.java
new file mode 100644
index 0000000..ff7665f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/JoinStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class JoinStyle extends Constant
+{
+    private JoinStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Keymap.java b/src/bindings/org/gnome/gdk/Keymap.java
new file mode 100644
index 0000000..20e3f9c
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Keymap.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class Keymap extends Object
+{
+    protected Keymap(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/KeymapKey.java b/src/bindings/org/gnome/gdk/KeymapKey.java
new file mode 100644
index 0000000..257df2a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/KeymapKey.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class KeymapKey extends Boxed
+{
+    protected KeymapKey(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/KeypadKeyval.java b/src/bindings/org/gnome/gdk/KeypadKeyval.java
new file mode 100644
index 0000000..1fd77c6
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/KeypadKeyval.java
@@ -0,0 +1,123 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Constants describing the keys on a keypad (also known as a number pad).
+ * 
+ * <p>
+ * This file serves mostly as an example of how Keyval can be subclassed to
+ * make additional Key constants available that you may need.
+ * 
+ * <p>
+ * <i>Beware that this class has to be loaded for these constants to be
+ * recognized!</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class KeypadKeyval extends Keyval
+{
+    protected KeypadKeyval(int keyval, String name) {
+        super(keyval, name);
+    }
+
+    public static final Keyval KPSpace = new Keyval(0xff80, "KPSpace");
+
+    public static final Keyval KPTab = new Keyval(0xff89, "KPTab");
+
+    public static final Keyval KPEnter = new Keyval(0xff8d, "KPEnter");
+
+    public static final Keyval KPHome = new Keyval(0xff95, "KPHome");
+
+    public static final Keyval KPLeft = new Keyval(0xff96, "KPLeft");
+
+    public static final Keyval KPUp = new Keyval(0xff97, "KPUp");
+
+    public static final Keyval KPRight = new Keyval(0xff98, "KPRight");
+
+    public static final Keyval KPDown = new Keyval(0xff99, "KPDown");
+
+    public static final Keyval KPPageUp = new Keyval(0xff9a, "KPPageUp");
+
+    public static final Keyval KPPageDown = new Keyval(0xff9b, "KPPageDown");
+
+    public static final Keyval KPEnd = new Keyval(0xff9c, "KPEnd");
+
+    public static final Keyval KPInsert = new Keyval(0xff9e, "KPInsert");
+
+    public static final Keyval KPDelete = new Keyval(0xff9f, "KPDelete");
+
+    public static final Keyval KPEqual = new Keyval(0xffbd, "KPEqual");
+
+    public static final Keyval KPMultiply = new Keyval(0xffaa, "KPMultiply");
+
+    public static final Keyval KPAdd = new Keyval(0xffab, "KPAdd");
+
+    public static final Keyval KPSubtract = new Keyval(0xffad, "KPSubtract");
+
+    public static final Keyval KPDecimal = new Keyval(0xffae, "KPDecimal");
+
+    public static final Keyval KPDivide = new Keyval(0xffaf, "KPDivide");
+
+    /**
+     * The middle key (the one labeled <b>5</b>) on a keyboard with a numeric
+     * keypad. This is distinct from {@link #KP5}, which is what is emitted if
+     * <b>NumLock</b> is on.
+     * 
+     * <p>
+     * <i>Why "Begin"? I would have thought "Center". Weird legacy crap, no
+     * doubt.</i>
+     */
+    public static final Keyval KPBegin = new Keyval(0xff9d, "KPBegin");
+
+    public static final Keyval KP0 = new Keyval(0xffb0, "KP0");
+
+    public static final Keyval KP1 = new Keyval(0xffb1, "KP1");
+
+    public static final Keyval KP2 = new Keyval(0xffb2, "KP2");
+
+    public static final Keyval KP3 = new Keyval(0xffb3, "KP3");
+
+    public static final Keyval KP4 = new Keyval(0xffb4, "KP4");
+
+    public static final Keyval KP5 = new Keyval(0xffb5, "KP5");
+
+    public static final Keyval KP6 = new Keyval(0xffb6, "KP6");
+
+    public static final Keyval KP7 = new Keyval(0xffb7, "KP7");
+
+    public static final Keyval KP8 = new Keyval(0xffb8, "KP8");
+
+    public static final Keyval KP9 = new Keyval(0xffb9, "KP9");
+}
diff --git a/src/bindings/org/gnome/gdk/Keyval.java b/src/bindings/org/gnome/gdk/Keyval.java
new file mode 100644
index 0000000..3d3e3ee
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Keyval.java
@@ -0,0 +1,509 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * A key value as returned by a keyboard Event. Handling keystrokes is not as
+ * much fun as you might think. There is considerable complexity associated
+ * with dealing with language and country specific keyboard variants. Most of
+ * this complexity is, however, dealt with for you by the X server as proxied
+ * by GDK. This class, in turn, provides constants for the basic keyboard set.
+ * Various subclasses give you access to localized keyboards.
+ * 
+ * <p>
+ * It is important to note that lower case and upper case letters are
+ * considered different keys even though most keyboards present but a single
+ * physical button with an <b><code>A</code></b> showing. Think of that
+ * physical key as having both an <b><code>a</code></b> and an <b>
+ * <code>A</code></b> printed on it, with the second being the key reached if
+ * the <b><code>Shift</code></b> modifier is held down. Have a look at the
+ * {@link ModifierType} class for a discussion of how to deal with the
+ * modifying keys and for a better understanding of the sequence in which key
+ * events occur.
+ * 
+ * <p>
+ * Looking for <b><code>1</code></b> through <b><code>9</code></b>? See
+ * {@link #Num0 Num0} to {@link #Num0 Num9}.
+ * 
+ * <p>
+ * The correlation between keys and Unicode characters is a complex one. For
+ * basic western ISO Latin letters the keys we press and the characters we get
+ * are, to all intents and purposes, one and the same. But there are many
+ * thousands of additional characters for which you probably don't have keys
+ * for, even if you have (or have mapped something to be) the <b>
+ * <code>Compose</code></b> key for taking the composite of several keystrokes
+ * to generate special characters. Just remember that Keyvals are <i>key</i>
+ * constants, not constants for every <i>unicode</i> character and you'll keep
+ * things straight.
+ * 
+ * <p>
+ * <i>GDK deals with keyvals exclusively as <code>int</code>s, and there are
+ * over 1700 of them. Most of these "keys" are ridiculous or apply to hardware
+ * that has long since ceased to exist. We've deliberately constrained this
+ * class to a narrow range; experience in 2.x showed that even mighty Eclipse
+ * chokes when asked to complete from a list that big. This leads us to two
+ * consequences. 1) Constants will be registered for keyvals encountered that
+ * haven't been explicitly created here, so you don't have to worry about some
+ * nasty RuntimeException kicking your ass. 2) You can extend this Keyval
+ * class as necessary to create your own constants if you need to. See</i>
+ * {@link KeypadKeyval} <i>for an example.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+/*
+ * WARNING I've done something in this class that ordinarily would be
+ * forbidden, and that is to put raw native values in a bindings class. This
+ * is, by definition, a bug and a maintenance nightmare waiting to happen.
+ * There are so many constants that merely loading this class would result in
+ * hundreds (if not thousands) of JNI calls to populate them.
+ * 
+ * FIXME So change this to a (define-flags) type behaviour if there are any
+ * problems. One idea would be to make it lazy loading, somehow, though
+ * perhaps the complexity in that case wouldn't be worth it.
+ * 
+ * This data for this class was extracted by doing regular expressions on
+ * gtk+'s gdk/gdkkeysyms.h; see the script in src/util/keyval/ for details.
+ */
+public class Keyval extends Constant
+{
+    /**
+     * If you know the name of a GDK keyval, you can instantiate a Constant
+     * for it with this method.
+     */
+    protected Keyval(String name) {
+        super(keyvalFromName(name), name.intern());
+    }
+
+    protected Keyval(int keyval, String nickname) {
+        super(keyval, nickname);
+    }
+
+    private static int keyvalFromName(String name) {
+        final int result;
+
+        result = GdkKeyval.fromName(name);
+
+        if (result == 0xFFFFFF) {
+            throw new IllegalArgumentException("Unknown key name");
+        }
+
+        return result;
+    }
+
+    /**
+     * Translate this Keyval to a unicode representation. This is useful when
+     * you've intercepted a keystroke and, having determined it is a "normal"
+     * character and not something more unusual, need to append it to a
+     * String.
+     * 
+     * <p>
+     * One way this might be used is:
+     * 
+     * <pre>
+     * final Pattern regexAtoZ = Pattern.compile("[a-z]");
+     * final Keyval key;
+     * final String str, result;
+     * 
+     * str = "" + key.toUnicode();
+     * 
+     * if (key == Keyval.Return) {
+     *     // execute
+     * } else if (key == Keyval.Escape) {
+     *     // abort
+     * } else if (regexAtoZ.matcher(str).matches()) {
+     *     entry.setText(str);
+     * } else {
+     *     ...
+     * }
+     * </pre>
+     * 
+     * which is a bit cumbersome, but illustrates one way of identifying
+     * "normal" letters being typed.
+     * 
+     * <p>
+     * Not all keys have translations; in such cases <code>0</code> will be
+     * returned. Testing for this can sometimes be an easier approach to
+     * figuring out if a "normal" key was hit, but your mileage will vary
+     * depending on the user's actual configuration. Note that that's
+     * <code>(char) 0</code>, not <code>'0'</code>!
+     * 
+     * <p>
+     * <b>Be wary of appending this return value to a String!</b><br>
+     * <i>Although Java won't lose the character or subsequent ones,</i>
+     * <code>\0</code> <i>is the "<code>NULL</code> terminator" for
+     * <code>char*</code> strings in C and will prematurely terminate the
+     * printed output if you try to print the String (as, after all, in the
+     * final analysis the Java VM is nothing more than a C program and
+     * eventually a C library routine will be called to output the text)!</i>
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * FUTURE This is important, but I have a nagging concern it is expensive.
+     * If so, what is a better way to determine a "normal" key event?
+     */
+    public char toUnicode() {
+        return (char) GdkKeyval.toUnicode(GdkKeyvalOverride.numOf(this));
+    }
+
+    public static final Keyval BackSpace = new Keyval(0xff08, "BackSpace");
+
+    /**
+     * Normal indentation key.
+     * 
+     * <p>
+     * In normal GNOME user interface usage, this is used to move the keyboard
+     * focus forwards from one Widget to the next. In text documents, however,
+     * <b><code>Tab</code></b> is typically used to insert a <code>'\t'</code>
+     * character.
+     * 
+     * <p>
+     * Be aware that on a standard GNOME desktop, <b><code>Alt+Tab</code></b>
+     * is captured by the window manager used to change between applications,
+     * so you likely won't receive it.
+     */
+    public static final Keyval Tab = new Keyval(0xff09, "Tab");
+
+    /**
+     * Reverse indentation key.
+     * 
+     * <p>
+     * This occurs on when you type <b> <code>Shift+Tab</code></b>. Normal
+     * (forward) indentation keystrokes are the {@link #Tab Tab} Keyval.
+     * 
+     * <p>
+     * Backwards movement by an indent is a legacy from the age of
+     * typewriters, and not used in text entry today. The <b>
+     * <code>Shift+Tab</code></b> sequence is, however, used in GNOME to move
+     * the keyboard focus one Widget back.
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * This is ISO_Left_Tab
+     */
+    public static final Keyval BackTab = new Keyval(0xfe20, "BackTab");
+
+    public static final Keyval Return = new Keyval(0xff0d, "Return");
+
+    public static final Keyval Pause = new Keyval(0xff13, "Pause");
+
+    public static final Keyval ScrollLock = new Keyval(0xff14, "ScrollLock");
+
+    public static final Keyval SysReq = new Keyval(0xff15, "SysReq");
+
+    public static final Keyval Escape = new Keyval(0xff1b, "Escape");
+
+    public static final Keyval Delete = new Keyval(0xffff, "Delete");
+
+    /**
+     * The <b><code>Compose</code></b> used to create high order characters
+     * from pressing tis plus certain following key sequences.
+     * 
+     * @since 4.0.11
+     */
+    /*
+     * This is GDK_Multi_key
+     */
+    public static final Keyval Compose = new Keyval(0xff20, "Compose");
+
+    public static final Keyval Home = new Keyval(0xff50, "Home");
+
+    public static final Keyval Left = new Keyval(0xff51, "Left");
+
+    public static final Keyval Up = new Keyval(0xff52, "Up");
+
+    public static final Keyval Right = new Keyval(0xff53, "Right");
+
+    public static final Keyval Down = new Keyval(0xff54, "Down");
+
+    public static final Keyval PageUp = new Keyval(0xff55, "PageUp");
+
+    public static final Keyval PageDown = new Keyval(0xff56, "PageDown");
+
+    public static final Keyval End = new Keyval(0xff57, "End");
+
+    public static final Keyval Print = new Keyval(0xff61, "Print");
+
+    public static final Keyval Insert = new Keyval(0xff63, "Insert");
+
+    public static final Keyval Menu = new Keyval(0xff67, "Menu");
+
+    public static final Keyval Break = new Keyval(0xff6b, "Break");
+
+    public static final Keyval NumLock = new Keyval(0xff7f, "NumLock");
+
+    public static final Keyval F1 = new Keyval(0xffbe, "F1");
+
+    public static final Keyval F2 = new Keyval(0xffbf, "F2");
+
+    public static final Keyval F3 = new Keyval(0xffc0, "F3");
+
+    public static final Keyval F4 = new Keyval(0xffc1, "F4");
+
+    public static final Keyval F5 = new Keyval(0xffc2, "F5");
+
+    public static final Keyval F6 = new Keyval(0xffc3, "F6");
+
+    public static final Keyval F7 = new Keyval(0xffc4, "F7");
+
+    public static final Keyval F8 = new Keyval(0xffc5, "F8");
+
+    public static final Keyval F9 = new Keyval(0xffc6, "F9");
+
+    public static final Keyval F10 = new Keyval(0xffc7, "F10");
+
+    public static final Keyval F11 = new Keyval(0xffc8, "F11");
+
+    public static final Keyval F12 = new Keyval(0xffc9, "F12");
+
+    public static final Keyval ShiftLeft = new Keyval(0xffe1, "ShiftLeft");
+
+    public static final Keyval ShiftRight = new Keyval(0xffe2, "ShiftRight");
+
+    public static final Keyval ControlLeft = new Keyval(0xffe3, "ControlLeft");
+
+    public static final Keyval ControlRight = new Keyval(0xffe4, "ControlRight");
+
+    public static final Keyval SuperLeft = new Keyval(0xffeb, "SuperLeft");
+
+    public static final Keyval SuperRight = new Keyval(0xffec, "SuperRight");
+
+    public static final Keyval CapsLock = new Keyval(0xffe5, "CapsLock");
+
+    public static final Keyval AltLeft = new Keyval(0xffe9, "AltLeft");
+
+    public static final Keyval AltRight = new Keyval(0xffea, "AltRight");
+
+    public static final Keyval Space = new Keyval(0x020, "Space");
+
+    public static final Keyval Exclaim = new Keyval(0x021, "Exclaim");
+
+    public static final Keyval QuoteDouble = new Keyval(0x022, "QuoteDouble");
+
+    public static final Keyval NumberSign = new Keyval(0x023, "NumberSign");
+
+    public static final Keyval Dollar = new Keyval(0x024, "Dollar");
+
+    public static final Keyval Percent = new Keyval(0x025, "Percent");
+
+    /**
+     * Also known as Carrot or Hat.
+     */
+    public static final Keyval Circumflex = new Keyval(0x05e, "Circumflex");
+
+    public static final Keyval Ampersand = new Keyval(0x026, "Ampersand");
+
+    public static final Keyval Apostrophe = new Keyval(0x027, "Apostrophe");
+
+    public static final Keyval QuoteSingle = new Keyval(0x027, "QuoteSingle");
+
+    public static final Keyval ParenLeft = new Keyval(0x028, "ParenLeft");
+
+    public static final Keyval ParenRight = new Keyval(0x029, "ParenRight");
+
+    public static final Keyval Asterisk = new Keyval(0x02a, "Asterisk");
+
+    public static final Keyval Plus = new Keyval(0x02b, "Plus");
+
+    public static final Keyval Comma = new Keyval(0x02c, "Comma");
+
+    public static final Keyval Minus = new Keyval(0x02d, "Minus");
+
+    public static final Keyval Period = new Keyval(0x02e, "Period");
+
+    public static final Keyval Slash = new Keyval(0x02f, "Slash");
+
+    public static final Keyval Num0 = new Keyval(0x030, "0");
+
+    public static final Keyval Num1 = new Keyval(0x031, "1");
+
+    public static final Keyval Num2 = new Keyval(0x032, "2");
+
+    public static final Keyval Num3 = new Keyval(0x033, "3");
+
+    public static final Keyval Num4 = new Keyval(0x034, "4");
+
+    public static final Keyval Num5 = new Keyval(0x035, "5");
+
+    public static final Keyval Num6 = new Keyval(0x036, "6");
+
+    public static final Keyval Num7 = new Keyval(0x037, "7");
+
+    public static final Keyval Num8 = new Keyval(0x038, "8");
+
+    public static final Keyval Num9 = new Keyval(0x039, "9");
+
+    public static final Keyval Colon = new Keyval(0x03a, "Colon");
+
+    public static final Keyval Semicolon = new Keyval(0x03b, "Semicolon");
+
+    public static final Keyval Less = new Keyval(0x03c, "Less");
+
+    public static final Keyval Equal = new Keyval(0x03d, "Equal");
+
+    public static final Keyval Greater = new Keyval(0x03e, "Greater");
+
+    public static final Keyval Question = new Keyval(0x03f, "Question");
+
+    public static final Keyval AtSign = new Keyval(0x040, "AtSign");
+
+    public static final Keyval A = new Keyval(0x041, "A");
+
+    public static final Keyval B = new Keyval(0x042, "B");
+
+    public static final Keyval C = new Keyval(0x043, "C");
+
+    public static final Keyval D = new Keyval(0x044, "D");
+
+    public static final Keyval E = new Keyval(0x045, "E");
+
+    public static final Keyval F = new Keyval(0x046, "F");
+
+    public static final Keyval G = new Keyval(0x047, "G");
+
+    public static final Keyval H = new Keyval(0x048, "H");
+
+    public static final Keyval I = new Keyval(0x049, "I");
+
+    public static final Keyval J = new Keyval(0x04a, "J");
+
+    public static final Keyval K = new Keyval(0x04b, "K");
+
+    public static final Keyval L = new Keyval(0x04c, "L");
+
+    public static final Keyval M = new Keyval(0x04d, "M");
+
+    public static final Keyval N = new Keyval(0x04e, "N");
+
+    public static final Keyval O = new Keyval(0x04f, "O");
+
+    public static final Keyval P = new Keyval(0x050, "P");
+
+    public static final Keyval Q = new Keyval(0x051, "Q");
+
+    public static final Keyval R = new Keyval(0x052, "R");
+
+    public static final Keyval S = new Keyval(0x053, "S");
+
+    public static final Keyval T = new Keyval(0x054, "T");
+
+    public static final Keyval U = new Keyval(0x055, "U");
+
+    public static final Keyval V = new Keyval(0x056, "V");
+
+    public static final Keyval W = new Keyval(0x057, "W");
+
+    public static final Keyval X = new Keyval(0x058, "X");
+
+    public static final Keyval Y = new Keyval(0x059, "Y");
+
+    public static final Keyval Z = new Keyval(0x05a, "Z");
+
+    public static final Keyval BracketLeft = new Keyval(0x05b, "BracketLeft");
+
+    public static final Keyval Backslash = new Keyval(0x05c, "Backslash");
+
+    public static final Keyval BracketRight = new Keyval(0x05d, "BracketRight");
+
+    public static final Keyval Underscore = new Keyval(0x05f, "Underscore");
+
+    public static final Keyval Grave = new Keyval(0x060, "Grave");
+
+    public static final Keyval a = new Keyval(0x061, "a");
+
+    public static final Keyval b = new Keyval(0x062, "b");
+
+    public static final Keyval c = new Keyval(0x063, "c");
+
+    public static final Keyval d = new Keyval(0x064, "d");
+
+    public static final Keyval e = new Keyval(0x065, "e");
+
+    public static final Keyval f = new Keyval(0x066, "f");
+
+    public static final Keyval g = new Keyval(0x067, "g");
+
+    public static final Keyval h = new Keyval(0x068, "h");
+
+    public static final Keyval i = new Keyval(0x069, "i");
+
+    public static final Keyval j = new Keyval(0x06a, "j");
+
+    public static final Keyval k = new Keyval(0x06b, "k");
+
+    public static final Keyval l = new Keyval(0x06c, "l");
+
+    public static final Keyval m = new Keyval(0x06d, "m");
+
+    public static final Keyval n = new Keyval(0x06e, "n");
+
+    public static final Keyval o = new Keyval(0x06f, "o");
+
+    public static final Keyval p = new Keyval(0x070, "p");
+
+    public static final Keyval q = new Keyval(0x071, "q");
+
+    public static final Keyval r = new Keyval(0x072, "r");
+
+    public static final Keyval s = new Keyval(0x073, "s");
+
+    public static final Keyval t = new Keyval(0x074, "t");
+
+    public static final Keyval u = new Keyval(0x075, "u");
+
+    public static final Keyval v = new Keyval(0x076, "v");
+
+    public static final Keyval w = new Keyval(0x077, "w");
+
+    public static final Keyval x = new Keyval(0x078, "x");
+
+    public static final Keyval y = new Keyval(0x079, "y");
+
+    public static final Keyval z = new Keyval(0x07a, "z");
+
+    public static final Keyval BraceLeft = new Keyval(0x07b, "BraceLeft");
+
+    /**
+     * Also known as Pipe (from the fact that this is used in a Unix shell to
+     * "pipe" output from one command to another).
+     */
+    public static final Keyval Bar = new Keyval(0x07c, "Bar");
+
+    public static final Keyval BraceRight = new Keyval(0x07d, "BraceRight");
+
+    public static final Keyval Tilde = new Keyval(0x07e, "Tilde");
+}
diff --git a/src/bindings/org/gnome/gdk/LineStyle.java b/src/bindings/org/gnome/gdk/LineStyle.java
new file mode 100644
index 0000000..88a0ced
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/LineStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class LineStyle extends Constant
+{
+    private LineStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/ModifierType.java b/src/bindings/org/gnome/gdk/ModifierType.java
new file mode 100644
index 0000000..cef7def
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/ModifierType.java
@@ -0,0 +1,296 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants representing what modifier keys are being held down on a
+ * keystroke, if any. You get an object containing flags that are set via the
+ * {@link EventKey#getState() getState()} method on the EventKey you receive
+ * when hooking up a <code>Widget.KeyPressEvent</code> or
+ * <code>Widget.KeyReleaseEvent</code>.
+ * 
+ * <p>
+ * Try running this fragment if you're confused about the relationship between
+ * Keyvals, ModifierTypes, and the keyboard events:
+ * 
+ * <pre>
+ * foo.connect(new Widget.KeyPressEvent() {
+ *     public boolean onKeyPressEvent(Widget source, EventKey event) {
+ *         final Keyval key;
+ *         final ModifierType mod;
+ * 
+ *         key = event.getKeyval();
+ *         mod = event.getState();
+ * 
+ *         System.out.print("Pressed: " + key.toString() + ", ");
+ *         System.out.print("Modifier: " + mod.toString() + " ");
+ * 
+ *         if (mod == ModifierType.SHIFT_MASK) {
+ *             System.out.print("That's Shifty!");
+ *         }
+ *         if (mod.contains(ModifierType.ALT_MASK)) {
+ *             System.out.print("Hooray for Alt!");
+ *         }
+ * 
+ *         System.out.println();
+ *         return false;
+ *     }
+ * });
+ * </pre>
+ * 
+ * For each of the following keystrokes, you'll get a sequence of output
+ * something like the following:
+ * 
+ * <dl>
+ * <dt><b><code>A</code></b>
+ * <dd>
+ * 
+ * <pre>
+ * Pressed: Keyval.a, Modifier: ModifierType.NONE
+ * </pre>
+ * 
+ * <dt><b><code>Shift+A</code></b>
+ * <dd>
+ * 
+ * <pre>
+ * Pressed: Keyval.ShiftRight, Modifier: ModifierType.NONE 
+ * Pressed: Keyval.A, Modifier: ModifierType.SHIFT_MASK That's Shifty!
+ * </pre>
+ * 
+ * <dt><b><code>Ctrl+A</code></b>
+ * <dd>
+ * 
+ * <pre>
+ * Pressed: Keyval.ControlRight, Modifier: ModifierType.NONE 
+ * Pressed: Keyval.a, Modifier: ModifierType.CONTROL_MASK
+ * </pre>
+ * 
+ * <dt><b><code>Ctrl+Shift+A</code></b>
+ * <dd>
+ * 
+ * <pre>
+ * Pressed: Keyval.ControlRight, Modifier: ModifierType.NONE  
+ * Pressed: Keyval.ShiftRight, Modifier: ModifierType.CONTROL_MASK 
+ * Pressed: Keyval.A, Modifier: ModifierType.SHIFT_MASK|CONTROL_MASK
+ * </pre>
+ * 
+ * <dt><b><code>Alt+A</code></b>
+ * <dd>
+ * 
+ * <pre>
+ * Pressed: Keyval.AltRight, Modifier: ModifierType.NONE 
+ * Pressed: Keyval.a, Modifier: ModifierType.ALT_MASK Hooray for Alt!
+ * </pre>
+ * 
+ * <dt><b><code>Ctrl+Alt+A</code></b>
+ * <dd>
+ * 
+ * <pre>
+ * Pressed: Keyval.ControlLeft, Modifier: ModifierType.NONE 
+ * Pressed: Keyval.AltLeft, Modifier: ModifierType.CONTROL_MASK 
+ * Pressed: Keyval.a, Modifier: ModifierType.CONTROL_MASK|ALT_MASK Hooray for Alt!
+ * </pre>
+ * 
+ * </dl>
+ * 
+ * <p>
+ * The sequence of keystrokes for the modifying keys will depend on the order
+ * the user strikes them, but you won't get them showing up as ModifierType
+ * constants until a "normal" key is hit. Incidentally, this is where the
+ * usefulness of Keyval's {@link Keyval#toUnicode() toUnicode()} come in: you
+ * can filter key events until you get one with a non-<code>0</code>
+ * translation.
+ * 
+ * <p>
+ * <i>As with Keyval there are many other modifier constants that we haven't
+ * bothered to expose. If you need one, feel free to subclass this and add
+ * it.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class ModifierType extends Flag
+{
+    protected ModifierType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No modifiers were pressed.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * For some reason this isn't explicitly specified in GDK. Well, it's just
+     * 0 so you don't need much of a constant for that.
+     */
+    public static final ModifierType NONE = new ModifierType(0, "NONE");
+
+    /**
+     * The ModifierType associated with the <b><code>CapsLock</code></b> key.
+     * A bit strange that this is also treated as a modifier.
+     * 
+     * @since 4.0.13
+     */
+    public static final ModifierType LOCK_MASK = new ModifierType(GdkModifierType.LOCK_MASK, "LOCK_MASK");
+
+    /**
+     * The ModifierType associated with the <b><code>NumLock</code></b> key. A
+     * bit strange that this is also treated as a modifier.
+     * 
+     * <p>
+     * <i>Even worse is that this appears to actually be state
+     * <code>0x10</code>, which is <code>GDK_MOD2_MASK</code>!</i>
+     * 
+     * @since 4.0.18
+     */
+    public static final ModifierType NUM_MASK = new ModifierType(GdkModifierType.MOD2_MASK, "NUM_MASK");
+
+    /**
+     * The <b><code>Shift</code></b> key modifier.
+     * 
+     * @since 4.0.6
+     */
+    public static final ModifierType SHIFT_MASK = new ModifierType(GdkModifierType.SHIFT_MASK,
+            "SHIFT_MASK");
+
+    /**
+     * The <b><code>Control</code></b> key modifier.
+     * 
+     * @since 4.0.6
+     */
+    public static final ModifierType CONTROL_MASK = new ModifierType(GdkModifierType.CONTROL_MASK,
+            "CONTROL_MASK");
+
+    /**
+     * The <b><code>Alt</code></b> key modifier.
+     * 
+     * <p>
+     * <i>The legacy code in the X server as wrapped by GDK has this as
+     * <code>MOD1_MASK</code>; you should probably be aware that it is
+     * possible that</i> <b><code>Alt</code></b> <i>could be mapped to a
+     * different modifier, There are, however, a number of hard coded
+     * references tying Mod1 to the Alt key in various places, notably
+     * gnome-control-center's <code>gnome-keybinding-properties</code>, so
+     * calling this <code>ALT_MASK</code> seems safe enough.</i>
+     * 
+     * @since 4.0.6
+     */
+    public static final ModifierType ALT_MASK = new ModifierType(GdkModifierType.MOD1_MASK, "ALT_MASK");
+
+    public static final ModifierType SUPER_MASK = new ModifierType(GdkModifierType.SUPER_MASK,
+            "SUPER_MASK");
+
+    public static final ModifierType HYPER_MASK = new ModifierType(GdkModifierType.HYPER_MASK,
+            "HYPER_MASK");
+
+    /**
+     * The <b><code>Window</code></b> modifier key. You will probably also get
+     * <code>SUPER_MASK</code> with this one.
+     * 
+     * <p>
+     * <i>Unless your user has changed things of their X server is doing
+     * something weird, it is likely that <code>MOD4_MASK</code> is mapped to
+     * the "key with the Microsoft Windows logo" that is present on modern
+     * PC104 keyboards. Damn monopolists. Anyway, that's what people call it,
+     * so that's that's what we've named our constant.</i>
+     * 
+     * @since 4.0.6
+     */
+    public static final ModifierType WINDOW_MASK = new ModifierType(GdkModifierType.MOD4_MASK,
+            "WINDOW_MASK");
+
+    /*
+     * These names correspond to the ones we exposed in MouseButton.
+     */
+
+    /**
+     * The left mouse button was held while the key was pressed. GNOME user
+     * interface conventions don't have us using mouse buttons as modifiers,
+     * so you won't need this in normal usage.
+     * 
+     * <p>
+     * If hooking up a handler for <code>Widget.ButtonPressEvent</code> you
+     * will instead be using the {@link MouseButton#LEFT LEFT} MouseButton
+     * constant.
+     * 
+     * 
+     * @since 4.0.14
+     */
+    public static final ModifierType BUTTON_LEFT_MASK = new ModifierType(GdkModifierType.BUTTON1_MASK,
+            "BUTTON_LEFT_MASK");
+
+    /**
+     * The middle mouse button was held while the key was pressed.
+     * 
+     * @since 4.0.14
+     */
+    public static final ModifierType BUTTON_MIDDLE_MASK = new ModifierType(GdkModifierType.BUTTON2_MASK,
+            "BUTTON_MIDDLE_MASK");
+
+    /**
+     * The right mouse button was held while the key was pressed.
+     * 
+     * @since 4.0.14
+     */
+    public static final ModifierType BUTTON_RIGHT_MASK = new ModifierType(GdkModifierType.BUTTON3_MASK,
+            "BUTTON_RIGHT_MASK");
+
+    /**
+     * Combine two ModifierType instances.
+     */
+    public static ModifierType or(ModifierType one, ModifierType two) {
+        return (ModifierType) Flag.orTwoFlags(one, two);
+    }
+
+    /**
+     * Find the union of two ModifierType instances.
+     * 
+     * @since 4.0.18
+     */
+    public static ModifierType and(ModifierType one, ModifierType two) {
+        return (ModifierType) Flag.andTwoFlags(one, two);
+    }
+
+    /**
+     * Remove the second Flag's fields from the first. This is especially
+     * useful for screening out <b><code>NumLock</code></b>
+     * 
+     * @since 4.0.18
+     */
+    public static ModifierType mask(ModifierType one, ModifierType two) {
+        return (ModifierType) Flag.maskTwoFlags(one, two);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/MouseButton.java b/src/bindings/org/gnome/gdk/MouseButton.java
new file mode 100644
index 0000000..602ac50
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/MouseButton.java
@@ -0,0 +1,109 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants representing which mouse button was pressed.
+ * 
+ * <p>
+ * Note that mouse buttons 4 to 7 have not a corresponding constant. These
+ * buttons refer to mouse wheel actions, directions up, down, left and right,
+ * respectively. GDK will present such events as a
+ * <code>Widget.ScrollEvent</code>, so if you are interested on them you will
+ * need to
+ * {@link org.gnome.gtk.Widget#connect(org.gnome.gtk.Widget.ScrollEvent)
+ * connect()} to such event.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.6
+ */
+/*
+ * This is something we just cooked up locally. It's not in GDK.
+ */
+public class MouseButton extends Constant
+{
+    protected MouseButton(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * A "left click", mouse button <code>1</code>.
+     * 
+     * @since 4.0.6
+     */
+    public static final MouseButton LEFT = new MouseButton(1, "LEFT");
+
+    /**
+     * A "centre click", mouse button <code>2</code>. Some mice don't have a
+     * middle button; in such cases your X server may be configured to
+     * generate the middle button press if you press both right and left
+     * simultaneously. Mice with scroll wheels will often generated this
+     * button if the wheel is clicked (not scrolled, but pressed).
+     * 
+     * @since 4.0.6
+     */
+    public static final MouseButton MIDDLE = new MouseButton(2, "MIDDLE");
+
+    /**
+     * A "right click", mouse button <code>3</code>.
+     * 
+     * @since 4.0.6
+     */
+    public static final MouseButton RIGHT = new MouseButton(3, "RIGHT");
+
+    /**
+     * Mouse button <code>8</code>. It corresponds to the button typically
+     * mapped to the "back" action, for example on web browsers. Note that
+     * many mice do not have a BACK button, so if you plan to add an
+     * application action to this button, do not forget to ensure it can be
+     * also executed by other means, such a key press, ToolButton, etc
+     * 
+     * @since 4.0.12
+     */
+    public static final MouseButton BACK = new MouseButton(8, "BACK");
+
+    /**
+     * Mouse button <code>9</code>. It corresponds to the button typically
+     * mapped to the "forward" action, for example on web browsers. Note that
+     * many mice do not have a FORWARD button, so if you plan to add an
+     * application action to this button, do not forget to ensure it can be
+     * also executed by other means, such a key press, ToolButton, etc
+     * 
+     * @since 4.0.12
+     */
+    public static final MouseButton FORWARD = new MouseButton(9, "FORWARD");
+}
diff --git a/src/bindings/org/gnome/gdk/NotifyType.java b/src/bindings/org/gnome/gdk/NotifyType.java
new file mode 100644
index 0000000..d5b0b74
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/NotifyType.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The kind of motion in an EventCrossing. These Constants describe the
+ * relationship between the GDK Window that the mouse pointer left, and the
+ * GDK Window that the mouse pointer entered.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ * @see <a
+ *      href="http://xorg.freedesktop.org/releases/X11R7.0/doc/PDF/xlib.pdf">The
+ *      XLib programming manual, section 10.6</a>
+ */
+public final class NotifyType extends Constant
+{
+    private NotifyType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The mouse has moved from an inferior Window to a superior or enclosing
+     * one.
+     */
+    public static final NotifyType ANCESTOR = new NotifyType(GdkNotifyType.ANCESTOR, "ANCESTOR");
+
+    /**
+     * This event is generated for Windows that lay between the receiving
+     * Window and the departing Window.
+     */
+    public static final NotifyType VIRTUAL = new NotifyType(GdkNotifyType.VIRTUAL, "VIRTUAL");
+
+    /**
+     * The mouse has moved from a superior (parent, enclosing) Window to an
+     * inferior (child) one.
+     */
+    public static final NotifyType INFERIOR = new NotifyType(GdkNotifyType.INFERIOR, "INFERIOR");
+
+    /**
+     * The mouse moved between unrelated Windows. This is what seems to occur
+     * most of the time when you exit the app and cross to the root X Window
+     * or some other application's Window. Not terribly helpful otherwise.
+     */
+    public static final NotifyType NONLINEAR = new NotifyType(GdkNotifyType.NONLINEAR, "NONLINEAR");
+
+    public static final NotifyType NONLINEAR_VIRTUAL = new NotifyType(GdkNotifyType.NONLINEAR_VIRTUAL,
+            "NONLINEAR_VIRTUAL");
+
+    public static final NotifyType UNKNOWN = new NotifyType(GdkNotifyType.UNKNOWN, "UNKNOWN");
+}
diff --git a/src/bindings/org/gnome/gdk/OverlapType.java b/src/bindings/org/gnome/gdk/OverlapType.java
new file mode 100644
index 0000000..d810f81
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/OverlapType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class OverlapType extends Constant
+{
+    private OverlapType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/OwnerChange.java b/src/bindings/org/gnome/gdk/OwnerChange.java
new file mode 100644
index 0000000..21802a0
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/OwnerChange.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants describing the reason a selection has changed ownership.
+ * 
+ * <p>
+ * This is, essentially, internal to GTK; using our binding of Clipboard
+ * you'll get a {@link #NEW_OWNER NEW_OWNER} event every time Clipboard's
+ * {@link org.gnome.gtk.Clipboard#setText(String) setText()} is called.
+ * 
+ * <p>
+ * <i>That may be a bug.</i>
+ */
+public final class OwnerChange extends Constant
+{
+    private OwnerChange(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    public static final OwnerChange NEW_OWNER = new OwnerChange(GdkOwnerChange.NEW_OWNER, "NEW_OWNER");
+
+    public static final OwnerChange DESTROY = new OwnerChange(GdkOwnerChange.DESTROY, "DESTROY");
+
+    public static final OwnerChange CLOSE = new OwnerChange(GdkOwnerChange.CLOSE, "CLOSE");
+}
diff --git a/src/bindings/org/gnome/gdk/PangoRenderer.java b/src/bindings/org/gnome/gdk/PangoRenderer.java
new file mode 100644
index 0000000..f98a1fa
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PangoRenderer.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.pango.Renderer;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PangoRenderer extends Renderer
+{
+    protected PangoRenderer(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Pixbuf.java b/src/bindings/org/gnome/gdk/Pixbuf.java
new file mode 100644
index 0000000..6fe8bb8
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Pixbuf.java
@@ -0,0 +1,401 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.gnome.glib.GlibException;
+
+/**
+ * An image in memory.
+ * 
+ * <p>
+ * <i> Pixbuf is just here to be efficient at handling images that are going
+ * to placed in your GTK user interfaces. If you want to draw on an image, use
+ * Cairo's ImageSurface. If you want to otherwise manipulate the image, use a
+ * dedicated image processing library to load the data as it will doubtless
+ * provide for more efficient storage anticipating the processing tasks it
+ * will facilitate.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ * @since 4.0.0
+ */
+public class Pixbuf extends org.gnome.glib.Object
+{
+    protected Pixbuf(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Pixbuf object from the image found in
+     * <code>filename</code>.
+     * 
+     * @since 4.0.5
+     */
+    /*
+     * Trapping an exception in a constructor is tricky; you have to use an
+     * auxiliary helper method.
+     */
+    public Pixbuf(String filename) throws FileNotFoundException {
+        super(checkPixbufFromFile(filename));
+    }
+
+    /*
+     * First check the file exists first, allowing us to isolate the GError
+     * representing image format problems. We'll need a more efficient GError
+     */
+    private static long checkPixbufFromFile(String filename) throws FileNotFoundException {
+        final File target;
+
+        target = new File(filename);
+        if (!target.exists()) {
+            throw new FileNotFoundException(target + " not found");
+        }
+        try {
+            return GdkPixbuf.createPixbufFromFile(filename);
+        } catch (GlibException ge) {
+            // FIXME change to something more image related.
+            throw new RuntimeException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Construct a new Pixbuf object by loading an image from a given
+     * filename, but scaling it. The image will be scaled to fit the supplied
+     * width and height, preserving the aspect ratio or not based on the value
+     * of the fourth parameter.
+     * 
+     * <p>
+     * If preserving the aspect ratio,
+     * <ul>
+     * <li>width of <code>-1</code> will cause the image to be scaled to the
+     * exact given height
+     * <li>height of <code>-1</code> will cause the image to be scaled to the
+     * exact given width.
+     * </ul>
+     * When not preserving aspect ratio,
+     * <ul>
+     * <li>a width or height of <code>-1</code> means to not scale the image
+     * at all in that dimension.
+     * </ul>
+     * 
+     * @since 4.0.5
+     */
+    public Pixbuf(String filename, int width, int height, boolean preserveAspectRatio)
+            throws FileNotFoundException {
+        super(checkPixbufFromFileAtScale(filename, width, height, preserveAspectRatio));
+    }
+
+    public Pixbuf(int width, int height) {
+        super(GdkPixbuf.createPixbuf(null, true, 8, width, height));
+        GdkPixbuf.fill(this, 0);
+    }
+
+    /**
+     * Construct a new Pixbuf object from image data already in memory. The
+     * data needs to be a complete image in a format that will be recognized
+     * by one of the gdk-pixbuf library's loaders (PNG, JPEG, etc).
+     * 
+     * @since 4.0.10
+     */
+    public Pixbuf(byte[] data) throws IOException {
+        super(checkPixbufFromArray(data));
+    }
+
+    private static long checkPixbufFromArray(byte[] data) throws IOException {
+        try {
+            // Parameters 2-4 have no meaning when we're not scaling
+            return GdkPixbufOverride.createPixbufFromArray(data, 0, 0, true, false);
+        } catch (GlibException ge) {
+            /*
+             * FIXME this will need to be more specific when our GError
+             * handling is better! IOException is the usual in stream-ish
+             * cases, but is it really appropriate here?
+             */
+            throw new IOException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Construct a new Pixbuf from in-memory data and scale it.
+     * <p>
+     * See {@link #Pixbuf(byte[])} for info on in-memory data.<br>
+     * See {@link #Pixbuf(String, int, int, boolean)} for info on scaling.
+     * 
+     * @since 4.0.12
+     */
+    public Pixbuf(byte[] data, int width, int height, boolean preserveAspectRatio) throws IOException {
+        super(checkPixbufFromArrayAtScale(data, width, height, preserveAspectRatio));
+    }
+
+    private static long checkPixbufFromArrayAtScale(byte[] data, int width, int height,
+            boolean preserveAspectRatio) throws IOException {
+        try {
+            return GdkPixbufOverride.createPixbufFromArray(data, width, height, preserveAspectRatio,
+                    true);
+        } catch (GlibException ge) {
+            /*
+             * FIXME this will need to be more specific when our GError
+             * handling is better! IOException is the usual in stream-ish
+             * cases, but is it really appropriate here?
+             */
+            throw new IOException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Create an identical copy of this Pixbuf.
+     * 
+     * <p>
+     * Since you can happily reuse a Pixbuf instance in multiple places, you
+     * generally won't need this unless doing mutating operations like
+     * rescaling.
+     * 
+     * @since 4.0.10
+     */
+    public Pixbuf copy() {
+        return GdkPixbuf.copy(this);
+    }
+
+    private static long checkPixbufFromFileAtScale(String filename, int width, int height,
+            boolean preserveAspectRatio) throws FileNotFoundException {
+        final File target;
+
+        target = new File(filename);
+        if (!target.exists()) {
+            throw new FileNotFoundException(target + " not found");
+        }
+        try {
+            return GdkPixbuf.createPixbufFromFileAtScale(filename, width, height, preserveAspectRatio);
+        } catch (GlibException ge) {
+            // FIXME change to something more image related.
+            throw new RuntimeException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Write this Pixbuf to a file.
+     * 
+     * <p>
+     * The various file formats that GDK is actually capable of writing to are
+     * specified by the constants on PixbufFormat. For example, you can save a
+     * screenshot as a PNG using:
+     * 
+     * <pre>
+     * Pixbuf p;
+     * ...
+     * 
+     * p.save("Screenshot.png", PixbufFormat.PNG);
+     * </pre>
+     * 
+     * @since 4.0.5
+     */
+    /*
+     * TODO there are a wide range of GError states that emanate from this
+     * call; we need some appropriate code to interpret the more "common" ones
+     * and turn them into more strongly typed Exceptions.
+     */
+    public void save(String filename, PixbufFormat type) {
+        try {
+            GdkPixbuf.savev(this, filename, type.getName(), null, null);
+        } catch (GlibException e) {
+            // FIXME
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Get the width of this Pixbuf, in pixels
+     * 
+     * @since 4.0.8
+     */
+    public int getWidth() {
+        return GdkPixbuf.getWidth(this);
+    }
+
+    /**
+     * Get the height of this Pixbuf, in pixels
+     * 
+     * @since 4.0.8
+     */
+    public int getHeight() {
+        return GdkPixbuf.getHeight(this);
+    }
+
+    /**
+     * Get a the individual pixel values comprising this Pixbuf.
+     * 
+     * <p>
+     * Image data in a Pixbuf is stored in memory in an uncompressed but
+     * packed format. Rows in the image are stored top to bottom, and in each
+     * row pixels are stored from left to right. The returned array is, as you
+     * would expect, the bytes comprising each single pixel in a sequential
+     * series. There will be either three (RGB) or four (RGBA) bytes per
+     * pixel, see {@link #getNumChannels() getNumChannels()}.
+     * 
+     * <p>
+     * The return array is of type of is <code>byte</code> but you can expect
+     * unsigned values in the range <code>0</code> to <code>255</code>. If you
+     * need the actual values you'll have to <code>&</code> with
+     * <code>0xFF</code> to get yourself to the correct unsigned integer.
+     * 
+     * <p>
+     * You should not need to call this. See the caveats at the top of this
+     * class; changing the values of this array will <b>not</b> change the
+     * underlying image.
+     * 
+     * <p>
+     * <i>The underlying library stores Pixbufs in a format which is efficient
+     * for internal representation and memory operations, though not
+     * necessarily efficient for size and frequently extra bits are added as
+     * alignment padding. We do some minor copying so that the array returned
+     * is one byte per channel and Cartesian. </i>
+     * 
+     * <p>
+     * <i>In the current GDK Pixbuf library implementation, the red, green,
+     * blue and optional alpha are fixed at 8 bits per channel.</i>
+     * 
+     * @since 4.0.8
+     */
+    public byte[] getPixels() {
+        return GdkPixbufOverride.getPixels(this);
+    }
+
+    /**
+     * Get the number of colour channels in this Pixbuf. This will be either
+     * <code>3</code> for RGB or <code>4</code> for an RGBA image.
+     * 
+     * <p>
+     * You don't actually need this; if you're working with the pixel data
+     * from {@link #getPixels() getPixels()} just divide the length of the
+     * returned array by (<var>width</var> <code>*</code> <var>height</var>).
+     * 
+     * @since 4.0.8
+     */
+    public int getNumChannels() {
+        return GdkPixbuf.getNChannels(this);
+    }
+
+    /**
+     * Create a new Pixbuf, applying the scaling factors inherent in the
+     * ratios between the size of this Pixbuf and the new image size specified
+     * by <code>width</code> and <code>height</code>.
+     * 
+     * <p>
+     * In general you probably want to use the {@link InterpType#BILINEAR
+     * BILINEAR} interpolation algorithm.
+     * 
+     * @since 4.0.10
+     */
+    public Pixbuf scale(int width, int height, InterpType algorithm) {
+        return GdkPixbuf.scaleSimple(this, width, height, algorithm);
+    }
+
+    /*
+     * TODO we'll want to expose the full gdk_pixbuf_scale() method too. That
+     * will require a (probably package private) no-arg Pixbuf constructor to
+     * pass as the second argument out-parameter of GdkPixbuf.scale(), which
+     * we can then return. The signature and stub here should otherwise be
+     * correct. Good luck explaining all this stuff.
+     */
+    Pixbuf scale(int x, int y, int width, int height, double offsetX, double offsetY, double scaleX,
+            double scaleY, InterpType algorithm) {
+        final Pixbuf result;
+
+        result = null; // FIXME
+
+        GdkPixbuf.scale(this, result, x, y, width, height, offsetX, offsetY, scaleX, scaleY, algorithm);
+
+        return result;
+    }
+
+    /**
+     * @param filename
+     */
+    /*
+     * TODO to expose the gdk_pixbuf_get_file_info() function properly, we'll
+     * have to fix the engineering of PixbufFormat which is presently a dogs
+     * breakfast. Luckily, given the two out parameter accessors below, we
+     * don't seem to need this.
+     */
+    PixbufFormat getFileInfo(String filename) throws IOException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    /**
+     * Query an image on disk for its width.
+     * 
+     * <p>
+     * This is a utility function where the minimum amount is read in order to
+     * determine metadata about the file in question. You'll get an
+     * IOException if the gdk-pixbuf library's image loaders can't figure out
+     * the format of the file.
+     * 
+     * @since 4.0.14
+     */
+    public static int getFileInfoWidth(String filename) throws IOException {
+        int result;
+
+        result = GdkPixbufOverride.getFileInfoX(filename);
+
+        if (result == -1) {
+            throw new IOException("Image format not recognized");
+        }
+
+        return result;
+    }
+
+    /**
+     * Query an image on disk for its height.
+     * 
+     * <p>
+     * This function is the compliment of {@link #getFileInfoWidth(String)
+     * getFileInfoWidth()}; see there.
+     * 
+     * @since 4.0.14
+     */
+    public static int getFileInfoHeight(String filename) throws IOException {
+        int result;
+
+        result = GdkPixbufOverride.getFileInfoY(filename);
+
+        if (result == -1) {
+            throw new IOException("Image format not recognized");
+        }
+
+        return result;
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufAlphaMode.java b/src/bindings/org/gnome/gdk/PixbufAlphaMode.java
new file mode 100644
index 0000000..3a71943
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufAlphaMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PixbufAlphaMode extends Constant
+{
+    private PixbufAlphaMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufAnimation.java b/src/bindings/org/gnome/gdk/PixbufAnimation.java
new file mode 100644
index 0000000..62dccf8
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufAnimation.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PixbufAnimation extends Object
+{
+    protected PixbufAnimation(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufAnimationIter.java b/src/bindings/org/gnome/gdk/PixbufAnimationIter.java
new file mode 100644
index 0000000..123ce7f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufAnimationIter.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PixbufAnimationIter extends Object
+{
+    protected PixbufAnimationIter(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufError.java b/src/bindings/org/gnome/gdk/PixbufError.java
new file mode 100644
index 0000000..20b261f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PixbufError extends Constant
+{
+    private PixbufError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufFormat.java b/src/bindings/org/gnome/gdk/PixbufFormat.java
new file mode 100644
index 0000000..15dd601
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufFormat.java
@@ -0,0 +1,98 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/**
+ * Constants representing the image file formats that GDK is capable of
+ * writing to. This is used by Pixbuf's
+ * {@link Pixbuf#save(String, PixbufFormat) save()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+/*
+ * This is a total hack at the moment. There is a GdkPixbufFormat, but we'll
+ * need to clean things up so that these constants are actually properly
+ * instantiated from the underlying structs. The only thing that will stay the
+ * same is that the constants here will be for the writable formats only.
+ */
+public class PixbufFormat // FIXME is actually a Boxed
+{
+    // TODO drop this and fetch authentic data
+    private String name;
+
+    private PixbufFormat(String type) {
+        this.name = type;
+    }
+
+    // TODO ok to make public
+    String getName() {
+        return name;
+    }
+
+    /*
+     * This will all have to be redone when we get the real GdkPixbufFormat
+     * hooked up.
+     */
+
+    /**
+     * The Portable Network Graphic image format. The filename extension for
+     * PNGs is <code>.png</code> and should be used when saving images of this
+     * type.
+     */
+    public static PixbufFormat PNG = new PixbufFormat("png");
+
+    /**
+     * The Joint Photographic Group image format. Often used for digital
+     * photographs, JPEG uses frequency compression to store enough of the
+     * image as to be able to capture its essence, but does so using a
+     * transform that is lossy. The common filename extension is
+     * <code>.jpg</code>.
+     */
+    public static PixbufFormat JPEG = new PixbufFormat("jpeg");
+
+    /**
+     * The Tagged Image File Format, used as a container format for storing
+     * images including photographs and line art. It is a lossless format, but
+     * is incredibly space-inefficient. Images saved in this format should be
+     * given the filename extension <code>.tiff</code>.
+     * 
+     * @see <a href="http://en.wikipedia.org/wiki/TIFF">TIFF entry at
+     *      Wikipedia</a>
+     */
+    public static PixbufFormat TIFF = new PixbufFormat("tiff");
+
+    public static PixbufFormat ICO = new PixbufFormat("ico");
+
+    public static PixbufFormat BMP = new PixbufFormat("bmp");
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufLoader.java b/src/bindings/org/gnome/gdk/PixbufLoader.java
new file mode 100644
index 0000000..14c086a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufLoader.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PixbufLoader extends Object
+{
+    protected PixbufLoader(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufRotation.java b/src/bindings/org/gnome/gdk/PixbufRotation.java
new file mode 100644
index 0000000..aa8de02
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufRotation.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PixbufRotation extends Constant
+{
+    private PixbufRotation(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufSimpleAnim.java b/src/bindings/org/gnome/gdk/PixbufSimpleAnim.java
new file mode 100644
index 0000000..399860e
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufSimpleAnim.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PixbufSimpleAnim extends PixbufAnimation
+{
+    protected PixbufSimpleAnim(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PixbufSimpleAnimIter.java b/src/bindings/org/gnome/gdk/PixbufSimpleAnimIter.java
new file mode 100644
index 0000000..41c3822
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PixbufSimpleAnimIter.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PixbufSimpleAnimIter extends PixbufAnimationIter
+{
+    protected PixbufSimpleAnimIter(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Plumbing.c b/src/bindings/org/gnome/gdk/Plumbing.c
new file mode 100644
index 0000000..64b2fad
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Plumbing.c
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include "bindings_java.h"
+#include "org_gnome_gdk_Plumbing.h"
+
+/*
+ * Implements
+ *   org.gnome.gdk.Plumbing.getEventTypeOrdinal(long pointer)
+ *
+ * Assuming that the supplied pointer is a GdkEvent, then regardless of which
+ * element of the union the actual structure is, the first field is always of
+ * GdkEventType.
+ *
+ * See http://developer.gnome.org/doc/API/2.0/gdk/gdk-Event-Structures.html#GdkEvent
+ */
+JNIEXPORT jint JNICALL
+Java_org_gnome_gdk_Plumbing_getEventTypeOrdinal
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _pointer
+)
+{
+	GdkEvent* event;
+	GdkEventType type;
+	
+	event = (GdkEvent*) _pointer;
+	
+	type = event->type;
+	
+	return (jint) type;
+}
diff --git a/src/bindings/org/gnome/gdk/Plumbing.java b/src/bindings/org/gnome/gdk/Plumbing.java
new file mode 100644
index 0000000..657248f
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Plumbing.java
@@ -0,0 +1,180 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * Provide handling for the special cases of the GdkEvent union.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public abstract class Plumbing extends org.gnome.glib.Plumbing
+{
+    protected Plumbing() {}
+
+    static {
+        isLibraryReady();
+
+        /*
+         * When you call getScreen(), the object returned appears to be a
+         * sublcass of GdkScreen, in this case GdkX11Screen. It doesn't seem
+         * to be public, thus making GdkScreen the "concrete interface" to it
+         * anyway. This actually reflects the fact that we don't have an
+         * architectural treatment for dealing with getting GObject instances
+         * back that are subtypes we don't know about.
+         */
+        registerType("GdkX11Screen", org.gnome.gdk.Screen.class);
+        registerType("GdkX11Display", org.gnome.gdk.Display.class);
+        registerType("GdkX11Window", org.gnome.gdk.Window.class);
+    }
+
+    /**
+     * GdkEvent is a union, which would ordinarily present an insurmountable
+     * problem, but since the GdkEvent structures all begin with a
+     * GdkEventType we write a very hacky override which uses that as a
+     * discriminator.
+     */
+    protected static Boxed boxedFor(Class<? extends Boxed> type, long pointer) {
+        Boxed proxy;
+
+        if (pointer == 0L) {
+            return null;
+        }
+
+        /*
+         * Handle the special case of the GdkEvent union.
+         */
+        if (type == Event.class) {
+            int ordinal = getEventTypeOrdinal(pointer);
+            switch (ordinal) {
+
+            // FIXME this must be wrong, but what else should we do with it?
+            case GdkEventType.DELETE:
+            case GdkEventType.MAP:
+            case GdkEventType.UNMAP:
+                type = EventAny.class;
+                break;
+
+            case GdkEventType.KEY_PRESS:
+            case GdkEventType.KEY_RELEASE:
+                type = EventKey.class;
+                break;
+
+            case GdkEventType.BUTTON_PRESS:
+            case GdkEventType.BUTTON_PRESS_DOUBLE:
+            case GdkEventType.BUTTON_PRESS_TRIPLE:
+            case GdkEventType.BUTTON_RELEASE:
+                type = EventButton.class;
+                break;
+
+            case GdkEventType.SCROLL:
+                type = EventScroll.class;
+                break;
+
+            // others?
+            case GdkEventType.MOTION_NOTIFY:
+                type = EventMotion.class;
+                break;
+
+            case GdkEventType.VISIBILITY_NOTIFY:
+                type = EventVisibility.class;
+                break;
+
+            case GdkEventType.ENTER_NOTIFY:
+            case GdkEventType.LEAVE_NOTIFY:
+                type = EventCrossing.class;
+                break;
+
+            case GdkEventType.FOCUS_CHANGE:
+                type = EventFocus.class;
+                break;
+
+            case GdkEventType.CONFIGURE:
+                type = EventConfigure.class;
+                break;
+
+            case GdkEventType.PROPERTY_NOTIFY:
+                type = EventProperty.class;
+                break;
+
+            case GdkEventType.SELECTION_CLEAR:
+            case GdkEventType.SELECTION_NOTIFY:
+            case GdkEventType.SELECTION_REQUEST:
+                type = EventSelection.class;
+                break;
+
+            case GdkEventType.DRAG_ENTER:
+            case GdkEventType.DRAG_LEAVE:
+            case GdkEventType.DRAG_MOTION:
+            case GdkEventType.DRAG_STATUS:
+            case GdkEventType.DROP_START:
+            case GdkEventType.DROP_FINISHED:
+                type = EventDragAndDrop.class;
+                break;
+
+            case GdkEventType.PROXIMITY_IN:
+            case GdkEventType.PROXIMITY_OUT:
+                type = EventProximity.class;
+                break;
+
+            case GdkEventType.OWNER_CHANGE:
+                type = EventOwnerChange.class;
+                break;
+
+            case GdkEventType.WINDOW_STATE:
+                type = EventWindowState.class;
+                break;
+
+            /*
+             * And here we list values what we don't feel like mapping or
+             * don't know what to do with. The .defs data for GdkEventType may
+             * not be 100% complete, hence the default block. If you get here
+             * and you think the event should be legitimately exposed, add a
+             * public API class for it.
+             */
+            case GdkEventType.SETTING:
+            case GdkEventType.CLIENT_EVENT:
+            case GdkEventType.NO_EXPOSE:
+            default:
+                throw new UnsupportedOperationException("What GdkEventType is this?");
+            }
+        }
+
+        proxy = org.gnome.glib.Plumbing.boxedFor(type, pointer);
+        return proxy;
+    }
+
+    private static native final int getEventTypeOrdinal(long pointer);
+}
diff --git a/src/bindings/org/gnome/gdk/Point.java b/src/bindings/org/gnome/gdk/Point.java
new file mode 100644
index 0000000..fce5465
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Point.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Point extends Boxed
+{
+    protected Point(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PropMode.java b/src/bindings/org/gnome/gdk/PropMode.java
new file mode 100644
index 0000000..7c70b70
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PropMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PropMode extends Constant
+{
+    private PropMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/PropertyState.java b/src/bindings/org/gnome/gdk/PropertyState.java
new file mode 100644
index 0000000..ddbe53a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/PropertyState.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PropertyState extends Constant
+{
+    private PropertyState(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/RGBA.java b/src/bindings/org/gnome/gdk/RGBA.java
new file mode 100644
index 0000000..9af8c99
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/RGBA.java
@@ -0,0 +1,145 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * Representation of an RGB colour. Used by GDK in drawing Widgets and related
+ * elements.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.20
+ */
+// cloned from Color
+public final class RGBA extends Boxed
+{
+    protected RGBA(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new RGBA object. The <code>red</code>, <code>green</code>,
+     * <code>blue</code> and <code>alpha</code> parameters take values
+     * <code>0.0</code> to <code>1.0</code>.
+     * 
+     * @since 4.0.20
+     */
+    public RGBA(double red, double green, double blue, double alpha) {
+        super(GdkRGBAOverride.createRGBA(red, green, blue, alpha));
+    }
+
+    protected void release() {
+        GdkRGBA.free(this);
+    }
+
+    /**
+     * Get the red component of this Color.
+     * 
+     * @since 4.0.20
+     */
+    public double getRed() {
+        return GdkRGBA.getRed(this);
+    }
+
+    /**
+     * Get the green component of this Color.
+     * 
+     * @since 4.0.20
+     */
+    public double getGreen() {
+        return GdkRGBA.getGreen(this);
+    }
+
+    /**
+     * Get the blue component of this Color.
+     * 
+     * @since 4.0.20
+     */
+    public double getBlue() {
+        return GdkRGBA.getBlue(this);
+    }
+
+    /**
+     * Get the blue component of this Color.
+     * 
+     * @since 4.1.1
+     */
+    public double getAlpha() {
+        return GdkRGBA.getBlue(this);
+    }
+
+    /**
+     * @since 4.0.20
+     */
+    public static final RGBA BLACK = new RGBA(0.0, 0.0, 0.0, 1.0);
+
+    /**
+     * @since 4.0.20
+     */
+    public static final RGBA WHITE = new RGBA(1.0, 1.0, 1.0, 1.0);
+
+    /**
+     * @since 4.0.20
+     */
+    public static final RGBA RED = new RGBA(1.0, 0.0, 0.0, 1.0);
+
+    /**
+     * @since 4.0.20
+     */
+    public static final RGBA GREEN = new RGBA(0.0, 1.0, 0.0, 1.0);
+
+    /**
+     * @since 4.0.20
+     */
+    public static final RGBA BLUE = new RGBA(0.0, 0.0, 1.0, 1.0);
+
+    public boolean equals(Object obj) {
+        final RGBA other;
+
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof RGBA)) {
+            return false;
+        }
+
+        other = (RGBA) obj;
+
+        return GdkRGBA.equal(this, other);
+    }
+
+    public int hashCode() {
+        return GdkRGBA.hash(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Rectangle.java b/src/bindings/org/gnome/gdk/Rectangle.java
new file mode 100644
index 0000000..6b96a4a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Rectangle.java
@@ -0,0 +1,115 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * An object describing a rectangular area. While superficially similar to
+ * {@link org.gnome.gtk.Allocation Allocation}, this class is in fact
+ * different. It's primary use is in describing an area that has been exposed
+ * and needs to be [re]drawn. You normally get one of these from the
+ * {@link EventExpose#getArea() getArea()} method on EventExpose, though in
+ * rare situations you need to describe an area based on your own calculations
+ * and there is a constructor for that case.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public final class Rectangle extends Boxed
+{
+    protected Rectangle(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a Rectanlge. This is principally used so that you can describe
+     * an area that needs to be redrawn, passing it to the
+     * {@link Window#invalidate(Rectangle, boolean) invalidate()} method of an
+     * [org.gnome.gdk] Window.
+     * 
+     * <p>
+     * As usual, measurements are in pixels.
+     * 
+     * @since 4.0.8
+     */
+    public Rectangle(int x, int y, int width, int height) {
+        super(GdkRectangleOverride.createRectangle(x, y, width, height));
+    }
+
+    protected void release() {
+        GdkRectangleOverride.free(this);
+    }
+
+    /**
+     * The width of the box described by this Rectangle.
+     * 
+     * @since 4.0.7
+     */
+    public int getWidth() {
+        return GdkRectangle.getWidth(this);
+    }
+
+    /**
+     * The height of the box described by this Rectangle.
+     * 
+     * @since 4.0.7
+     */
+    public int getHeight() {
+        return GdkRectangle.getHeight(this);
+    }
+
+    /**
+     * The horizontal co-ordinate of the top left corner of the box described
+     * by this Rectangle.
+     * 
+     * @since 4.0.7
+     */
+    public int getX() {
+        return GdkRectangle.getX(this);
+    }
+
+    /**
+     * The vertical co-ordinate of the box described by this Rectangle.
+     * 
+     * @since 4.0.7
+     */
+    public int getY() {
+        return GdkRectangle.getY(this);
+    }
+
+    public String toString() {
+        return this.getClass().getSimpleName() + ": " + getWidth() + "x" + getHeight() + " at " + getX()
+                + "," + getY();
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/RgbCmap.java b/src/bindings/org/gnome/gdk/RgbCmap.java
new file mode 100644
index 0000000..84dab7e
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/RgbCmap.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class RgbCmap extends Boxed
+{
+    protected RgbCmap(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/RgbDither.java b/src/bindings/org/gnome/gdk/RgbDither.java
new file mode 100644
index 0000000..0e3d0b0
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/RgbDither.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class RgbDither extends Constant
+{
+    private RgbDither(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Screen.java b/src/bindings/org/gnome/gdk/Screen.java
new file mode 100644
index 0000000..a332942
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Screen.java
@@ -0,0 +1,106 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/**
+ * Representation of a physical monitor screen. You can get the Screen object
+ * for one of your application's Windows by calling Window's
+ * {@link org.gnome.gtk.Window#getScreen() getScreen()} method; it you want
+ * the width and height of the screen your Window is on, you're in the right
+ * place.
+ * 
+ * <p>
+ * A Screen is typically one monitor, but could actually be more; it depends
+ * on how your X server is configured. A Display, in turn, is made up of one
+ * or more Screens; again it depends.
+ * 
+ * <p>
+ * <i>With the advent of the</i> <code>XINERAMA</code> <i>extension in the</i>
+ * XFree <i>and later</i> X.org <i>X Windows servers, you tend to find that
+ * what would have been multiple Screens have been (transparently) merged and
+ * stretched to run over an entire multi-headed Display. This works out better
+ * (single mouse and keyboard works over the entire desktop, as does cut and
+ * paste, dragging, etc) and since the window manager is aware of the
+ * situation, it can maximize Windows properly to be only on one physical
+ * screen as you'd expect and desire.</i>
+ * 
+ * <p>
+ * <i>As a result, the distinction between Screen and Display is nowadays
+ * somewhat blurred. In practise you can treat them synonymously especially
+ * since their methods don't overlap. Frankly, this is all another classic
+ * case of "don't second guess the window manager"; just let it do it's job
+ * and leave the Window placement alone.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.4
+ * @see Display
+ * @see <span>The <code>X</code>(7) man page on your system</span>
+ */
+public class Screen extends Object
+{
+    protected Screen(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the horizontal width of this Screen, in pixels.
+     * 
+     * @since 4.0.4
+     */
+    public int getWidth() {
+        return GdkScreen.getWidth(this);
+    }
+
+    /**
+     * Get the vertical height of this Screen, in pixels.
+     * 
+     * @since 4.0.4
+     */
+    public int getHeight() {
+        return GdkScreen.getHeight(this);
+    }
+
+    /*
+     * Functions being used in debugging Pixmaps. Not clear if they need to be
+     * public; doesn't seem so.
+     */
+
+    /**
+     * Get the default Screen on the default Display.
+     */
+    static Screen getDefault() {
+        return GdkScreen.getDefault();
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/ScrollDirection.java b/src/bindings/org/gnome/gdk/ScrollDirection.java
new file mode 100644
index 0000000..d21538a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/ScrollDirection.java
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The direction of an {@link EventScroll}. With traditional wheel mice you
+ * will only receive UP and DOWN directions. Most recent mice also allow to
+ * move the wheel right and left, so RIGHT and LEFT directions refer to that.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.12
+ */
+public final class ScrollDirection extends Constant
+{
+    private ScrollDirection(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The Window is scrolled up.
+     */
+    public static final ScrollDirection UP = new ScrollDirection(GdkScrollDirection.UP, "UP");
+
+    /**
+     * The Window is scrolled down.
+     */
+    public static final ScrollDirection DOWN = new ScrollDirection(GdkScrollDirection.DOWN, "DOWN");
+
+    /**
+     * The Window is scrolled to the left
+     */
+    public static final ScrollDirection RIGHT = new ScrollDirection(GdkScrollDirection.RIGHT, "RIGHT");
+
+    /**
+     * The Window is scrolled to the right.
+     */
+    public static final ScrollDirection LEFT = new ScrollDirection(GdkScrollDirection.LEFT, "LEFT");
+}
diff --git a/src/bindings/org/gnome/gdk/Segment.java b/src/bindings/org/gnome/gdk/Segment.java
new file mode 100644
index 0000000..6df2f01
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Segment.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class Segment extends Boxed
+{
+    protected Segment(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/SettingAction.java b/src/bindings/org/gnome/gdk/SettingAction.java
new file mode 100644
index 0000000..ddc6bf7
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/SettingAction.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SettingAction extends Constant
+{
+    private SettingAction(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/SubwindowMode.java b/src/bindings/org/gnome/gdk/SubwindowMode.java
new file mode 100644
index 0000000..61a4c27
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/SubwindowMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SubwindowMode extends Constant
+{
+    private SubwindowMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Trapezoid.java b/src/bindings/org/gnome/gdk/Trapezoid.java
new file mode 100644
index 0000000..fde8e2a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Trapezoid.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class Trapezoid extends Boxed
+{
+    protected Trapezoid(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/VisibilityState.java b/src/bindings/org/gnome/gdk/VisibilityState.java
new file mode 100644
index 0000000..957130d
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/VisibilityState.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants indicating the current visibility of a Widget. See the
+ * {@link org.gnome.gtk.Widget.VisibilityNotifyEvent
+ * Widget.VisibilityNotifyEvent} signal for further details; these constants
+ * come from the {@link EventVisibility#getState() getState()} method on an
+ * EventVisibility.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+/*
+ * TODO should we normalize these names?
+ */
+public final class VisibilityState extends Constant
+{
+    private VisibilityState(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The Widget is no longer obscured. Will also be fired on initial
+     * presentation of a Window.
+     */
+    public static final VisibilityState UNOBSCURED = new VisibilityState(GdkVisibilityState.UNOBSCURED,
+            "UNOBSCURED");
+
+    /**
+     * The Widget is partially obscured by another Window (be it this
+     * application's or anther's).
+     */
+    public static final VisibilityState PARTIAL = new VisibilityState(GdkVisibilityState.PARTIAL,
+            "PARTIAL");
+
+    /**
+     * The Widget is fully blocked from view.
+     */
+    public static final VisibilityState FULLY_OBSCURED = new VisibilityState(
+            GdkVisibilityState.FULLY_OBSCURED, "FULLY_OBSCURED");
+}
diff --git a/src/bindings/org/gnome/gdk/Visual.java b/src/bindings/org/gnome/gdk/Visual.java
new file mode 100644
index 0000000..bbea48e
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Visual.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Visual extends Object
+{
+    protected Visual(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the best depth supported by this Visual. The return value is depth,
+     * in bits.
+     */
+    static int getBestDepth() {
+        return GdkVisual.getBestDepth();
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/VisualType.java b/src/bindings/org/gnome/gdk/VisualType.java
new file mode 100644
index 0000000..f2e8ad3
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/VisualType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class VisualType extends Constant
+{
+    private VisualType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/Window.java b/src/bindings/org/gnome/gdk/Window.java
new file mode 100644
index 0000000..9c07ee7
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/Window.java
@@ -0,0 +1,256 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Object;
+
+/**
+ * The underlying native resource driving a rectangular region on a screen.
+ * These are notable as being what powers the display of Widgets, being both
+ * that upon which drawing is done, and that to which user actions are
+ * delivered.
+ * 
+ * <p>
+ * In theory, some, but not all, Widgets have their own native windows to draw
+ * upon and from whence events originate. Thus Widgets such as Buttons have
+ * their own underlying native resource, whereas Labels and various Containers
+ * do not. In practise, this distinction is blurred and newer versions of GTK
+ * do all sorts of strange things under the hood for greater efficiency. You
+ * don't need to worry about any of this.
+ * 
+ * <p>
+ * These are wrappers around Xlib's <code>Window</code> object. They can be
+ * arranged in tree structures, wrapping and overlapping one another, with
+ * parents cropping children, etc. You don't need to worry about any of this
+ * either.
+ * 
+ * <p>
+ * What this <i>is</i> useful for is as a way to get to the state of top level
+ * windows and various low level drawing functions.
+ * 
+ * <p>
+ * <i>Since the C name of this class is <code>GdkWindow</code>, the
+ * unavoidable consequence of the java-gnome mapping algorithm is that the
+ * name of this class Java is Window. This can be a bit of a pain if you're
+ * working in a piece of code where</i> <code>org.gnome.gtk.Window</code>
+ * <i>is already imported, but c'est la vie.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class Window extends Object
+{
+    protected Window(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Return a flags object representing the current state of the Window
+     * (maximized, iconified, etc). See {@link WindowState WindowState} for
+     * the individual constants, obviously, but be aware that an unmapped
+     * Window will have no WindowState bits set.
+     * 
+     * @since 4.0.4
+     */
+    public WindowState getState() {
+        return GdkWindow.getState(this);
+    }
+
+    /**
+     * Set the Cursor that will be shown when the pointer hovers over this
+     * Window.
+     * 
+     * @param cursor
+     *            Passing <code>null</code> will cause this Window to [revert
+     *            to] using the Cursor default inherited from its parent.
+     * @since 4.0.6
+     */
+    public void setCursor(Cursor cursor) {
+        GdkWindow.setCursor(this, cursor);
+    }
+
+    /**
+     * Get the horizontal position of this Window in terms of the root
+     * Window's co-ordinates. The root window is what you might think of as
+     * the desktop background, although in X terms it really is the parent of
+     * all windows.
+     * 
+     * @since 4.0.6
+     */
+    public int getOriginX() {
+        final int x[], y[];
+
+        x = new int[1];
+        y = new int[1];
+
+        GdkWindow.getOrigin(this, x, y);
+
+        return x[0];
+    }
+
+    /**
+     * Get the vertical position of this Window in terms of the root Window's
+     * co-ordinates.
+     * 
+     * @since 4.0.6
+     */
+    public int getOriginY() {
+        final int x[], y[];
+
+        x = new int[1];
+        y = new int[1];
+
+        GdkWindow.getOrigin(this, x, y);
+
+        return y[0];
+    }
+
+    /**
+     * Get the horizontal position of this Window relative to its parent
+     * Window. Given that many Widgets draw directly on their parent's
+     * <code>org.gnome.gdk</code> Window, you may at times be surprised at
+     * what this reports.
+     * 
+     * @since 4.0.6
+     */
+    public int getPositionX() {
+        final int x[], y[];
+
+        x = new int[1];
+        y = new int[1];
+
+        GdkWindow.getPosition(this, x, y);
+
+        return x[0];
+    }
+
+    /**
+     * Get the vertical position of this Window relative to its parent Window.
+     * 
+     * @since 4.0.6
+     */
+    public int getPositionY() {
+        final int x[], y[];
+
+        x = new int[1];
+        y = new int[1];
+
+        GdkWindow.getPosition(this, x, y);
+
+        return y[0];
+    }
+
+    /**
+     * Mark the given area as damaged and needing redrawing. Calling this
+     * method will ultimately result in <code>Widget.Draw</code> being emitted
+     * on Widgets that are present in the area being invalidated.
+     * 
+     * @param recursive
+     *            If <code>true</code>, calling this method will invalidate
+     *            not only the described area in this [org.gnome.gdk] Window,
+     *            but also the corresponding areas of any child
+     *            [org.gnome.gdk] Windows that overlap it. This is mostly an
+     *            implementation detail, but occasionally you need to find
+     *            tune the control. We tend to use <code>true</code>.
+     * @since 4.0.8
+     */
+    /*
+     * TODO this needs a much stronger description, linked to wherever else we
+     * end up discussing drawing, regions, and invalidation.
+     */
+    /*
+     * If we expose Region then there will be an invalidate(Region, boolean)
+     * in due course corresponding to this method, hence the name change to
+     * invalidate().
+     */
+    public void invalidate(Rectangle area, boolean recursive) {
+        GdkWindow.invalidateRect(this, area, recursive);
+    }
+
+    /**
+     * Has this underlying resouce been mapped? This will return
+     * <code>true</code> if <code>show()</code> has been called on the Widget
+     * that draws on this [org.gnome.gdk] Window <i>and on all its parents, if
+     * this Window happens to be a sub-Window.</i>
+     * 
+     * @since 4.0.10
+     */
+    public boolean isViewable() {
+        return GdkWindow.isViewable(this);
+    }
+
+    /**
+     * Force GDK to use the old X Window allocation behaviour for this Window.
+     * This reverts the GDK Window backing a GTK Widget to the pre-2.18
+     * behaviour, analogous to setting the <code>GDK_NATIVE_WINDOW</code>
+     * environment variable but not nearly as invasive.
+     * 
+     * <p>
+     * Theoretically you should not need to use this; the whole idea of the
+     * "client-side windows" patch to GTK was to avoid having to use
+     * unnecesssary intermediate X Windows, and calling this method
+     * circumvents this optimization. Most GTK Widgets should perform just
+     * fine without reverting to the old behaviour, but in isolated corner
+     * cases it may be necessary to workaround obscure bugs.
+     * 
+     * @return This will return <code>false</code> should GDK be unable to
+     *         allocate native resources as requested. The consequences of
+     *         that are unclear.
+     * @since 4.0.16
+     */
+    public boolean ensureNative() {
+        return GdkWindow.ensureNative(this);
+    }
+
+    /**
+     * Get the width of this Window.
+     * 
+     * @since 4.1.1
+     */
+    /*
+     * TODO document the impact of this reporting the most recent
+     * CONFIGURE_EVENT, not necesarily live X server information.
+     */
+    public int getWidth() {
+        return GdkWindow.getWidth(this);
+    }
+
+    /**
+     * Get the height of this Window.
+     * 
+     * @since 4.1.1
+     */
+    public int getHeight() {
+        return GdkWindow.getHeight(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowAttr.java b/src/bindings/org/gnome/gdk/WindowAttr.java
new file mode 100644
index 0000000..e701773
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowAttr.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class WindowAttr extends Boxed
+{
+    protected WindowAttr(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowAttributesType.java b/src/bindings/org/gnome/gdk/WindowAttributesType.java
new file mode 100644
index 0000000..9529a3a
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowAttributesType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class WindowAttributesType extends Constant
+{
+    private WindowAttributesType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowClass.java b/src/bindings/org/gnome/gdk/WindowClass.java
new file mode 100644
index 0000000..9f58ea8
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowClass.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class WindowClass extends Constant
+{
+    private WindowClass(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowEdge.java b/src/bindings/org/gnome/gdk/WindowEdge.java
new file mode 100644
index 0000000..fa40836
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowEdge.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class WindowEdge extends Constant
+{
+    private WindowEdge(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowHints.java b/src/bindings/org/gnome/gdk/WindowHints.java
new file mode 100644
index 0000000..9c4029d
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowHints.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class WindowHints extends Constant
+{
+    private WindowHints(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowState.java b/src/bindings/org/gnome/gdk/WindowState.java
new file mode 100644
index 0000000..adba242
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowState.java
@@ -0,0 +1,76 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants describing the state of an underlying resource. You can access
+ * most of these by calling methods available on [org.gnome.gtk] Window.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.3
+ */
+/*
+ * How on earth did these get in without documentation? FIXME!
+ */
+public final class WindowState extends Flag
+{
+    private WindowState(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    public static final WindowState WITHDRAWN = new WindowState(GdkWindowState.WITHDRAWN, "WITHDRAWN");
+
+    public static final WindowState ICONIFIED = new WindowState(GdkWindowState.ICONIFIED, "ICONIFIED");
+
+    public static final WindowState MAXIMIZED = new WindowState(GdkWindowState.MAXIMIZED, "MAXIMIZED");
+
+    public static final WindowState STICKY = new WindowState(GdkWindowState.STICKY, "STICKY");
+
+    public static final WindowState FULLSCREEN = new WindowState(GdkWindowState.FULLSCREEN, "FULLSCREEN");
+
+    public static final WindowState ABOVE = new WindowState(GdkWindowState.ABOVE, "ABOVE");
+
+    public static final WindowState BELOW = new WindowState(GdkWindowState.BELOW, "BELOW");
+
+    public static final WindowState FOCUSED = new WindowState(GdkWindowState.FOCUSED, "FOCUSED");
+
+    /**
+     * Creates a new WindowState flag as the OR'ing or combination of two
+     * WindowState flags.
+     */
+    public static WindowState or(WindowState one, WindowState two) {
+        return (WindowState) Flag.orTwoFlags(one, two);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowType.java b/src/bindings/org/gnome/gdk/WindowType.java
new file mode 100644
index 0000000..87a40e0
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class WindowType extends Constant
+{
+    private WindowType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gdk/WindowTypeHint.java b/src/bindings/org/gnome/gdk/WindowTypeHint.java
new file mode 100644
index 0000000..4aab7d8
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/WindowTypeHint.java
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gdk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants indicating hints you can provide to the window manager about what
+ * the nature and purpose of a given Window is. While this is in the GDK
+ * package, its primary use is for designating the purpose of top level
+ * <code>[org.gnome.gtk]</code> Windows via
+ * {@link org.gnome.gtk.Window#setTypeHint(WindowTypeHint) setTypeHint()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.8
+ */
+public final class WindowTypeHint extends Constant
+{
+    private WindowTypeHint(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * This is the default when constructing a new Window and you don't need
+     * to set it.
+     * 
+     * @since 4.0.8
+     */
+    public static final WindowTypeHint NORMAL = new WindowTypeHint(GdkWindowTypeHint.NORMAL, "NORMAL");
+
+    /**
+     * Mark this Window as a utility window. Under Metacity you should expect
+     * a Window so marked to not appear in the pager or taskbar. A utility
+     * window will be raised when a normal Window from the same application
+     * gains the focus.
+     * 
+     * <p>
+     * This setting is excellent for secondary windows. The key question is
+     * "should I be able to <b><code>Alt+Tab</code></b> to this Window?" If
+     * it's not the real application, per se, then the answer is "probably
+     * not" and the Window should be marked <code>UTILITY</code>.
+     * 
+     * @since 4.0.8
+     */
+    public static final WindowTypeHint UTILITY = new WindowTypeHint(GdkWindowTypeHint.UTILITY, "UTILITY");
+
+    /**
+     * This Window will be used to present something that is docked,
+     * presumably to the panel. An example in GNOME is the calendar that the
+     * clock applet displays as a popup. Once raised, it stays on top of all
+     * other windows regardless of which workspace you are on or what other
+     * applications you focus.
+     * 
+     * <p>
+     * If you're thinking to use this you probably want Window's
+     * {@link org.gnome.gtk.Window#setKeepAbove(boolean) setKeepAbove()}
+     * instead.
+     * 
+     * @since 4.0.8
+     */
+    public static final WindowTypeHint DOCK = new WindowTypeHint(GdkWindowTypeHint.DOCK, "DOCK");
+
+    /**
+     * This Window is a dialog. Obviously if you've used Dialog or one of its
+     * subclasses, the window manager will be informed properly for you. This
+     * is for when you've created a Window that is acting as a dialog but
+     * isn't a Dialog.
+     * 
+     * @since 4.0.8
+     */
+    public static final WindowTypeHint DIALOG = new WindowTypeHint(GdkWindowTypeHint.DIALOG, "DIALOG");
+}
diff --git a/src/bindings/org/gnome/gdk/package.html b/src/bindings/org/gnome/gdk/package.html
new file mode 100644
index 0000000..ce2ed80
--- /dev/null
+++ b/src/bindings/org/gnome/gdk/package.html
@@ -0,0 +1,38 @@
+<html>
+<head>
+</head>
+<body>
+
+GDK is the low level drawing and events library used by GTK to wrap the
+underlying diplsay hardware and to react to actions by the user. You rarely
+need to use GDK; by design GTK should contain most of what you need to create
+a graphical application. 
+
+<p>
+<i>For some years now, GTK and GDK have used Cairo internally to do the bulk of
+their drawing work.</i>
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/org/gnome/glib/Application.java b/src/bindings/org/gnome/glib/Application.java
new file mode 100644
index 0000000..fb596bf
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Application.java
@@ -0,0 +1,350 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Claspath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * The foundation of an application. This class is the basis for higher-level
+ * functionality appropriate to a GUI framework; it is accessed through the [
+ * <code>org.gnome.gtk</code>] {@link org.gnome.gtk.Application Application}
+ * class; see there for a full discussion.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public class Application extends Object
+{
+    /*
+     * Force a type registration in a static block that's able to see
+     * Plumbing.
+     */
+    static {
+        GApplicationOverride.init();
+    }
+
+    protected Application(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Check if the given string is valid to be used as an Application
+     * identifier.
+     * 
+     * @since 4.1.2
+     */
+    /*
+     * This re-implements the native call, but at the benefit of good error
+     * messages. We call g_application_is_valid_id() at the end to be sure.
+     */
+    protected static String isValidId(final String id) {
+        if (id.isEmpty()) {
+            throw new IllegalArgumentException("identifier cannot be emtpy.");
+        }
+        if (!(Character.isLetter(id.charAt(0)) || id.matches("^[A-Z][a-z][0-9][_\\-.]*$"))) {
+            throw new IllegalArgumentException(
+                    "identifier must contain only the ASCII characters \"[A-Z][a-z][0-9]_-.\" and must not begin with a digit.");
+        }
+        if (id.indexOf('.') == -1) {
+            throw new IllegalArgumentException(
+                    "identifier must contain at least one '.' (period) character (and thus at least three elements).");
+        }
+        if (id.indexOf('$') != -1) {
+            throw new IllegalArgumentException("identifier cannot contain '$'.");
+        }
+        if (id.startsWith(".") || id.endsWith(".")) {
+            throw new IllegalArgumentException(
+                    "identifier must not begin or end with a '.' (period) character.");
+        }
+        if (id.length() > 255) {
+            throw new IllegalArgumentException("identifier must not exceed 255 characters.");
+        }
+
+        if (!GApplication.isValidId(id)) {
+            /*
+             * Note: if you've found yourself here, they've changed the rules
+             * for valid application IDs.
+             */
+            throw new IllegalArgumentException("Invalid Application ID");
+        }
+
+        return id;
+    }
+
+    /**
+     * Creates a new Application instance. The application ID must be valid.
+     * See {@link #isValidId(String) isValidId()}.
+     * 
+     * <p>
+     * <i> You should probably not have to call this constructor by yourself;
+     * <code>GApplication</code> is infrastructure over which a framework like
+     * GTK can build integrated application management appropriate to their
+     * environment.</i>
+     * 
+     * @since 4.1.2
+     */
+    protected Application(String id, ApplicationFlags flags) {
+        super(GApplication.createApplication(isValidId(id), flags));
+    }
+
+    /**
+     * Gets the unique identifier of the Application.
+     * 
+     * @since 4.1.2
+     */
+    public String getApplicationId() {
+        return GApplication.getApplicationId(this);
+    }
+
+    /**
+     * Sets the unique identifier of the Application. The application ID must
+     * be valid. See {@link #isValidId(String) isValidId()}.
+     * 
+     * @since 4.1.2
+     */
+    public void setApplicationId(String id) {
+        isValidId(id);
+        GApplication.setApplicationId(this, id);
+    }
+
+    /**
+     * Returns the current inactivity timeout for the Application. This is the
+     * amount of time (in milliseconds) after the last call to
+     * {@link #unhold()} before the Application stops running.
+     * 
+     * @since 4.1.2
+     */
+    public int getInactivityTimeout() {
+        return GApplication.getInactivityTimeout(this);
+    }
+
+    /**
+     * Sets the current inactivity timeout (in milliseconds) for the
+     * Application.
+     * 
+     * @since 4.1.2
+     */
+    public void setInactivityTimeout(int timeout) {
+        GApplication.setInactivityTimeout(this, timeout);
+    }
+
+    /**
+     * Returns the {@link GlibApplicationFlags flags} of the Application.
+     * 
+     * @since 4.1.2
+     */
+    public ApplicationFlags getFlags() {
+        return GApplication.getFlags(this);
+    }
+
+    /**
+     * Sets the flags of the Application.
+     * 
+     * @since 4.1.2
+     */
+    public void setFlags(ApplicationFlags flags) {
+        GApplication.setFlags(this, flags);
+    }
+
+    /**
+     * Checks if the Application is <var>remote</var>. If it is then it means
+     * that another instance of the Application exists and is running, the
+     * <var>primary</var>; instance.
+     * 
+     * <p>
+     * <i>Not sure what the point of this is; this method is not available
+     * until after <code>run()</code> has been called, and the signals raised
+     * on this class all happen in the <var>primary</var> instance.</i>
+     * 
+     * @since 4.1.2
+     */
+    public boolean isRemote() {
+        return GApplication.isRemote(this);
+    }
+
+    /**
+     * Increases the use count of the Application.
+     * 
+     * <p>
+     * Use this function to indicate that the Application has a reason to
+     * continue to run. This method is called by GTK+ when a top-level
+     * {@link org.gnome.gtk.Window} is on the screen.
+     * 
+     * <p>
+     * To cancel the hold, call {@link #unhold()}.
+     * 
+     * @since 4.1.2
+     */
+    public void hold() {
+        GApplication.hold(this);
+    }
+
+    /**
+     * Decrease the use count of the Application.
+     * 
+     * <p>
+     * When the use count reaches zero, the Application will stop running.
+     * 
+     * <p>
+     * You should never call this function except to cancel the effect of a
+     * previous call to {@link #hold()}.
+     * 
+     * @since 4.1.2
+     */
+    public void unhold() {
+        GApplication.release(this);
+    }
+
+    /**
+     * Immediately quits the Application.
+     * 
+     * @since 4.1.2
+     */
+    public void quit() {
+        GApplication.quit(this);
+    }
+
+    /**
+     * Emits the {@link Application.Activate} signal.
+     * 
+     * @since 4.1.2
+     */
+    public void activate() {
+        GApplication.activate(this);
+    }
+
+    /**
+     * Runs the Application.
+     * 
+     * <p>
+     * This is intended to be called from <code>main()</code>. Its return
+     * value is should be used as the exit value of the program.
+     * 
+     * <p>
+     * You can pass <code>null</code> if you don't have any command line
+     * arguments.
+     * 
+     * @since 4.1.2
+     */
+    public int run(final String[] args) {
+        final int result;
+        final int argc;
+        final String[] argv;
+
+        if (args == null) {
+            argc = 0;
+            argv = null;
+        } else {
+            /*
+             * In C, the first element in the argv is the program name from
+             * the command line. Java skips this, so we need to re-introduce a
+             * dummy value here.
+             */
+
+            argc = args.length + 1;
+            argv = new String[argc];
+            argv[0] = Glib.getProgramName();
+            System.arraycopy(args, 0, argv, 1, args.length);
+        }
+
+        result = GApplication.run(this, argc, argv);
+
+        return result;
+    }
+
+    /**
+     * This signal is emitted on the <var>primary</var> instance when an
+     * activation occurs (at startup or by calling the Application
+     * {@link Application#activate() activate()} method.
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.1.2
+     */
+    public interface Activate extends GApplication.ActivateSignal
+    {
+        public void onActivate(Application source);
+    }
+
+    /**
+     * Hook up the <code>Application.Activate</code> handler.
+     * 
+     * @since 4.1.2
+     */
+    protected void connect(Application.Activate handler) {
+        GApplication.connect(this, handler, false);
+    }
+
+    /**
+     * This signal is emitted on the <var>primary</var> instance immediately
+     * after registration. This is the place to put (or call) your user
+     * interface initialization code.
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.1.2
+     */
+    public interface Startup extends GApplication.StartupSignal
+    {
+        public void onStartup(Application source);
+    }
+
+    /**
+     * Hook up the <code>Application.Startup</code> handler.
+     * 
+     * @since 4.1.2
+     */
+    protected void connect(Application.Startup handler) {
+        GApplication.connect(this, handler, false);
+    }
+
+    /**
+     * Connect to this signal to receive command line arguments from a
+     * <var>remote</var> instance. Note that you must call
+     * ApplciationCommandLine's {@link ApplicationCommandLine#exit() exit()}
+     * to release the <var>remote</var> from its call to Application's
+     * <code>run()</code>.
+     * 
+     * 
+     * @author Andrew Cowie
+     */
+    public interface CommandLine extends GApplication.CommandLineSignal
+    {
+        public int onCommandLine(Application source, ApplicationCommandLine remote);
+    }
+
+    /**
+     * Hook up the <code>Application.CommandLine</code> handler.
+     * 
+     * @since 4.1.2
+     */
+    protected void connect(Application.CommandLine handler) {
+        GApplication.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/ApplicationCommandLine.java b/src/bindings/org/gnome/glib/ApplicationCommandLine.java
new file mode 100644
index 0000000..e78173d
--- /dev/null
+++ b/src/bindings/org/gnome/glib/ApplicationCommandLine.java
@@ -0,0 +1,109 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Claspath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * Basic coverage to handle command line arguments that can be given by using
+ * the {@link org.gnome.glib.Application.CommandLine Application.CommandLine}
+ * signal of the {@link Application} class.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.1.2
+ */
+public class ApplicationCommandLine extends Object
+{
+    protected ApplicationCommandLine(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Returns the arguments of the invoking process's command line.
+     * 
+     * @since 4.1.2
+     */
+    public String[] getArguments() {
+        int[] argc;
+        String[] result;
+
+        argc = new int[1];
+
+        result = GApplicationCommandLine.getArguments(this, argc);
+
+        return result;
+    }
+
+    /**
+     * Call this when you are finished with the ApplicationCommandLine and
+     * wish the remote instance to exit.
+     * 
+     * <p>
+     * If subsequent invocations of your process are to act merely as
+     * launchers, activating the primary instance and passing information,
+     * then you will want the remote to exit as soon as possible. This method
+     * will accomplish that; presumably you will call this from within your
+     * <code>Application.CommandLine</code> handler once you have finished
+     * dealing with the passed command line arguments.
+     * 
+     * <p>
+     * <b>Do not call more than once.</b>
+     * 
+     * <p>
+     * Do not use this ApplicationCommandLine object further after
+     * <code>exit()</code> has been called.
+     * 
+     * <p>
+     * <b style="color: red;">WARNING</b><br>
+     * <i>This is as yet un-implemented in GApplication. We have modelled the
+     * necessary functionality by artificially dropping a reference count on
+     * the GApplicationCommandLine object, but ultimately, causing the remote
+     * to exit relies on the backing GObject being finalized. Your mileage may
+     * vary.</i>
+     * 
+     * @since 4.1.2
+     */
+    public void exit() {
+        GApplicationCommandLine.broken(this);
+    }
+}
+
+/*
+ * We get a GDBusCommandLine returned when this fires. This is a placeholder,
+ * c.f. GdkX11Display
+ */
+class DBusCommandLine extends ApplicationCommandLine
+{
+    protected DBusCommandLine(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/ApplicationFlags.java b/src/bindings/org/gnome/glib/ApplicationFlags.java
new file mode 100644
index 0000000..d84ea36
--- /dev/null
+++ b/src/bindings/org/gnome/glib/ApplicationFlags.java
@@ -0,0 +1,119 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants used to define the behavior of an {@link Application}.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.1.2
+ */
+public class ApplicationFlags extends Flag
+{
+    protected ApplicationFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Default operation mode. You don't need to specify this; you can call
+     * Application's {@link org.gnome.gtk.Application#Application(String)
+     * singe arg} constructor.
+     * 
+     * @since 4.1.2
+     */
+    public static final ApplicationFlags NONE = new ApplicationFlags(GlibApplicationFlags.NONE, "NONE");
+
+    /**
+     * The application run as a service. If the service is already running the
+     * registration fails. You use this, along with {@link #IS_LAUNCHER
+     * IS_LAUNCHER}, in a pair of binaries, one being server only and the
+     * other being launcher only. When a single code base is performing the
+     * role of becoming <var>primary</var> when necessary and otherwise being
+     * <var>remote</var> then you want the [default] {@link #NONE NONE}
+     * setting.
+     * 
+     * @since 4.1.2
+     */
+    public static final ApplicationFlags IS_SERVICE = new ApplicationFlags(
+            GlibApplicationFlags.IS_SERVICE, "IS_SERVICE");
+
+    /**
+     * The application will not try to become the primary instance.
+     * 
+     * @since 4.1.2
+     */
+    public static final ApplicationFlags IS_LAUNCHER = new ApplicationFlags(
+            GlibApplicationFlags.IS_LAUNCHER, "IS_LAUNCHER");
+
+    /**
+     * Indicate that this application handles command line arguments from
+     * <var>remote</var> instances. These wil be sent from the invoking
+     * process to the <var>primary</var>.
+     * 
+     * <p>
+     * Note that if you choose this mode, the
+     * <code>Application.CommandLine</code> signal will be raised on the
+     * <var>primary</var> rather than <code>Application.Activate</code> so
+     * it's a good idea to call <code>activate()</code> manually from your
+     * <code>Application.CommandLine</code> handler.
+     * 
+     * @since 4.1.2
+     */
+    public static final ApplicationFlags HANDLES_COMMAND_LINE = new ApplicationFlags(
+            GlibApplicationFlags.HANDLES_COMMAND_LINE, "HANDLES_COMMAND_LINE");
+
+    public static final ApplicationFlags HANDLES_OPEN = new ApplicationFlags(
+            GlibApplicationFlags.HANDLES_OPEN, "HANDLES_OPEN");
+
+    /**
+     * The primary instance will receive the environment of the launching
+     * process. This constant is useful if the application should behave
+     * differently depending on certain environment variables.
+     */
+    public static final ApplicationFlags SEND_ENVIRONMENT = new ApplicationFlags(
+            GlibApplicationFlags.SEND_ENVIRONMENT, "SEND_ENVIRONMENT");
+
+    /**
+     * The application does not wish to model unique behaviour and does not
+     * check for an already existing single instance.
+     */
+    public static final ApplicationFlags NON_UNIQUE = new ApplicationFlags(
+            GlibApplicationFlags.NON_UNIQUE, "NON_UNIQUE");
+
+    public static ApplicationFlags or(ApplicationFlags one, ApplicationFlags two) {
+        return (ApplicationFlags) Flag.orTwoFlags(one, two);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/Boxed.java b/src/bindings/org/gnome/glib/Boxed.java
new file mode 100644
index 0000000..4d95543
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Boxed.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Pointer;
+
+/**
+ * Parent class of proxied structures. Java side, these behave like normal
+ * {@link org.gnome.glib.Object Object}s, but they are not as rich - they may
+ * be missing getters or setters (or both!), for example.
+ * 
+ * <p>
+ * In general, Boxed are short lived. They are commonly used to convey
+ * parameters or represent state such as in an Iterator. As such, good
+ * programming practise is to <b>not</b> hold on to these long term. Use them
+ * and let them go out of scope so they can be reclaimed.
+ * 
+ * <p>
+ * <i>In the underlying GLib library, a <code>GBoxed</code> is an opaque
+ * wrapper around a C structure allowing it to be used within GLib's Type
+ * system. <code>GBoxed</code> generally have custom <code>copy()</code> and
+ * <code>free()</code> functions. Unlike <code>GObjects</code> they are not
+ * memory managed via the reference counting mechanism, and so the owner of a
+ * <code>GBoxed</code> is responsible to free it. The trick is to figure out
+ * whether we are owner of the <code>GBoxed</code> or not...</i>
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.0
+ */
+/*
+ * WARNING This is not fully implemented.
+ */
+public abstract class Boxed extends Pointer
+{
+    protected Boxed(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/FatalError.java b/src/bindings/org/gnome/glib/FatalError.java
new file mode 100644
index 0000000..83bd483
--- /dev/null
+++ b/src/bindings/org/gnome/glib/FatalError.java
@@ -0,0 +1,82 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * Misuse of the underlying library. This is thrown as a result of a
+ * programmer carrying out an operation which the native library considers
+ * illegal. In an ideal world we would inhibit this before we even get to the
+ * native side, but in this case we didn't, and their defence mechanisms have
+ * caught the problem.
+ * 
+ * <p>
+ * By definition, a <code>CRITICAL</code> has to be fatal; the application is
+ * known to be in an undefined state after one has been emitted. While some
+ * programs allow the user to carry on in blissful ignorance, these warnings
+ * indicate a programmer doing something wrong, and that needs fixing.
+ * 
+ * <p>
+ * The message has, therefore, been thrown as a Java Error. This gets you a
+ * stack trace at the place where the problem occurred, and that's how we
+ * identify problems in the Java world.
+ * 
+ * <p>
+ * <i><b>This is not the wrapper around <code>GError</code>!</b></i>
+ * 
+ * <p>
+ * <i>This class is our way of exposing fatal error conditions in a
+ * Java-appropriate fashion. <code>GError</code>, on the other hand, is GLib's
+ * mechanism for returning conditions that the developer can ask the user for
+ * a decision about. Incidentally, we do not expose those directly in the
+ * java-gnome public API; where they occur we propagate an appropriate Java
+ * checked exception instead. See {@link GlibException}</i>.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+/*
+ * It was very tempting to have this class extend CoderMalfunctionError. What
+ * a great name. "Problem exists between Keyboard and Chair". I love it! :)
+ */
+public class FatalError extends org.freedesktop.bindings.FatalError
+{
+    private static final long serialVersionUID = 1;
+
+    protected FatalError() {
+        super();
+    }
+
+    protected FatalError(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/File.java b/src/bindings/org/gnome/glib/File.java
new file mode 100644
index 0000000..5ec1ec3
--- /dev/null
+++ b/src/bindings/org/gnome/glib/File.java
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Claspath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * A simple coverage of GFile for our internal bindings needs.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+final class File extends Object
+{
+    private File(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a File object using a path on the file system.
+     * 
+     * @since 4.1.2
+     */
+    File(String path) {
+        this(GFile.createFileForPath(path));
+    }
+
+    /**
+     * Returns the path of the File.
+     * 
+     * @since 4.1.2
+     */
+    final String getPath() {
+        return GFile.getPath(this);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/FormatSizeFlags.java b/src/bindings/org/gnome/glib/FormatSizeFlags.java
new file mode 100644
index 0000000..f19f8cd
--- /dev/null
+++ b/src/bindings/org/gnome/glib/FormatSizeFlags.java
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Flags to modify the format of the string returned by
+ * {@link Glib#formatSize(long, FormatSizeFlags) formatSize()} method.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.3
+ */
+public class FormatSizeFlags extends Constant
+{
+    protected FormatSizeFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Behave the same as {@link Glib#formatSize(long) formatSize()}.
+     */
+    public static final FormatSizeFlags DEFAULT = new FormatSizeFlags(GlibFormatSizeFlags.DEFAULT,
+            "DEFAULT");
+
+    /**
+     * Include the exact number of bytes as part of the returned string. For
+     * example, "45.6 kB (45,612 bytes)".
+     */
+    public static final FormatSizeFlags LONG_FORMAT = new FormatSizeFlags(
+            GlibFormatSizeFlags.LONG_FORMAT, "LONG_FORMAT");
+
+    /**
+     * Use IEC (base 1024) units with "KiB"-style suffixes. IEC units should
+     * only be used for reporting things with a strong "power of 2" basis,
+     * like RAM sizes. Network and storage sizes should be reported in the
+     * normal SI units.
+     */
+    public static final FormatSizeFlags IEC_UNITS = new FormatSizeFlags(GlibFormatSizeFlags.IEC_UNITS,
+            "IEC_UNITS");
+}
diff --git a/src/bindings/org/gnome/glib/GApplicationOverride.java b/src/bindings/org/gnome/glib/GApplicationOverride.java
new file mode 100644
index 0000000..2907587
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GApplicationOverride.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * Custom class to handle methods of GApplication in our way.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.1.2
+ */
+final class GApplicationOverride extends Plumbing
+{
+    /*
+     * It turns out that what we would expect to be GApplicationCommandLine
+     * turns out to be a subclass, GDBusCommandLine. So we need to register
+     * our mock subclass somewhere.
+     */
+    static void init() {
+        registerType("GDBusCommandLine", DBusCommandLine.class);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/GBoxed.c b/src/bindings/org/gnome/glib/GBoxed.c
new file mode 100644
index 0000000..50f2421
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GBoxed.c
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <jni.h>
+#include "org_gnome_glib_GBoxed.h"
+
+/*
+ * Implements
+ *   org.gnome.glib.GBoxed.g_boxed_free(long boxed)
+ * called from
+ *   org.gnome.glib.GBoxed.free(Boxed reference)
+ * called from
+ *   org.gnome.glib.Boxed.release()
+ *
+ * This is where we free a GBoxed if we're the owner of it.
+ */
+// nothing here
diff --git a/src/bindings/org/gnome/glib/GBoxed.java b/src/bindings/org/gnome/glib/GBoxed.java
new file mode 100644
index 0000000..b6c4000
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GBoxed.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+final class GBoxed extends Plumbing
+{
+
+    // no instantiation
+    private GBoxed() {}
+
+    // nothing here
+}
diff --git a/src/bindings/org/gnome/glib/GMain.c b/src/bindings/org/gnome/glib/GMain.c
new file mode 100644
index 0000000..c12e866
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GMain.c
@@ -0,0 +1,125 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <jni.h>
+#include "bindings_java.h"
+#include "org_gnome_glib_GMain.h"
+
+/*
+ * Conforms to the signature requirement of (*GSourceFunc) as required by
+ * the first parameter of g_idle_add().
+ */
+static gboolean
+dispatch_callback
+(
+	gpointer user_data
+)
+{
+	JNIEnv* env;
+	jclass found;
+	static jclass Handler = NULL;	
+	static jmethodID method = NULL;
+	jobject obj;
+	jboolean result;
+
+	env = bindings_java_getEnv();
+
+	obj = (jobject) user_data;
+
+	/*
+	 * Lookup the class, cache it, and then add the closure function.
+	 */
+	
+	if (Handler == NULL) {
+		found = (*env)->FindClass(env, "org/gnome/glib/Handler");
+		if (found == NULL) {
+			return FALSE;
+		}
+		Handler = (*env)->NewGlobalRef(env, found);
+	}
+
+	if (method == NULL) {
+		method = (*env)->GetMethodID(env, Handler, "run", "()Z");
+		if (method == NULL) {
+			return FALSE;
+		}
+	}
+
+	result = (*env)->CallBooleanMethod(env, obj, method);
+
+	return (gboolean) result;
+}
+
+/*
+ * Meets signature requirement of a (*GDestroyNotify) function as passed 
+ * to g_idle_add_full()'s last argument.
+ */
+static void
+dispatch_release
+(
+	gpointer data
+)
+{
+	JNIEnv* env;
+	jobject obj;
+
+	env = bindings_java_getEnv();
+
+	obj = (jobject) data;
+
+	(*env)->DeleteGlobalRef(env, obj);
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GMain.g_idle_add()
+ * called from
+ *   org.gnome.glib.GMain.idleAdd()
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_GMain_g_1idle_1add
+(
+	JNIEnv* env,
+	jclass cls,
+	jobject _handler
+)
+{
+	jobject handler;
+
+	handler = (*env)->NewGlobalRef(env, _handler);
+
+	g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, dispatch_callback, (gpointer) handler, dispatch_release);
+}
+
diff --git a/src/bindings/org/gnome/glib/GMain.java b/src/bindings/org/gnome/glib/GMain.java
new file mode 100644
index 0000000..337b757
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GMain.java
@@ -0,0 +1,47 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/*
+ * crafted to engineer manual callback for idle functions
+ */
+final class GMain extends Plumbing
+{
+    private GMain() {}
+
+    static final void idleAdd(Handler handler) {
+        g_idle_add(handler);
+    }
+
+    private static native final void g_idle_add(Handler handler);
+}
diff --git a/src/bindings/org/gnome/glib/GObject.c b/src/bindings/org/gnome/glib/GObject.c
new file mode 100644
index 0000000..13b5d9a
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GObject.c
@@ -0,0 +1,308 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * The code for signal marshaling was completely rewritten by Andrew Cowie
+ * during the 4.0 re-engineering effort. Working with JNI and with GLib is
+ * very idiomatic, however, and the sequence of calls employed here was drawn
+ * directly from the example set by the java-gnome 2.x project in their
+ * glib-java/src/jni/org_gnu_glib_GObject.c. We are certainly indebted to the
+ * previous hackers for having worked out these techniques, an echo of which
+ * appears here in our implementation of g_signal_connect()
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <jni.h>
+#include "bindings_java.h"
+#include "org_gnome_glib_GObject.h"
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GObject.g_type_name(long object)
+ * called from
+ *   org.gnome.glib.Plumbing.instanceForObject(long pointer)
+ * also made available via
+ *   org.gnome.glib.GObject.typeName(Object object);
+ */
+JNIEXPORT jstring JNICALL
+Java_org_gnome_glib_GObject_g_1type_1name
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _object
+)
+{
+	GObject* object;
+	const gchar* name;
+
+	// translate value
+	object = (GObject*) _object;
+	
+	// call function & macro	
+	name = g_type_name(G_TYPE_FROM_INSTANCE(object));
+	//g_print("GObject (%ld): %s\n", (long) G_OBJECT_TYPE(object), name);
+	
+	// return name. Guard against NullPointerException by returning an
+	// empty string instead of null
+	return bindings_java_newString(env, (name != NULL ? name : "\0"));
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GObject.g_object_set_property(long instance, String name, long value)
+ * called from
+ *   org.gnome.glib.GObject.setProperty(Object instance, String name, Value value)
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_GObject_g_1object_1set_1property
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _instance,
+	jstring _name,
+	jlong _value
+)
+{
+	GObject* instance;
+	const gchar* name;
+	const GValue* value;
+	
+	// translate instance
+	instance = (GObject*) _instance;
+	
+	// translate name
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return; /* OutOfMemoryError already thrown */
+	}
+	
+	// translate value
+	value = (GValue*) _value;
+	
+	// call	method
+	g_object_set_property(instance, name, value);
+
+	// clean up name
+	bindings_java_releaseString(name);
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GObject.g_object_get_property(long instance, String name)
+ * called from
+ *   org.gnome.glib.GObject.getProperty(Object instance, String name)
+ *
+ * The idea of using g_object_class_find_property() to get at an appropriate
+ * GType for the empty GValue we need to pass as an out parameter to
+ * g_object_get_property() is borrowed from java-gnome 2.x's implementation.
+ */
+JNIEXPORT jlong JNICALL Java_org_gnome_glib_GObject_g_1object_1get_1property
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _instance,
+	jstring _name
+)
+{
+	GObject* instance;
+	const gchar* name;
+	GValue* value;
+	GParamSpec* spec;
+	
+	// translate instance
+	instance = (GObject*) _instance;
+	
+	// translate name
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return 0L; /* OutOfMemoryError already thrown */
+	}
+
+	// initialize value
+	spec = g_object_class_find_property(G_OBJECT_GET_CLASS(instance), name);
+	if (spec == NULL) {
+		bindings_java_throw(env, "GParamSpec for %s was NULL", name);
+		return 0L;
+	}
+
+	value =	g_slice_new0(GValue);
+	g_value_init(value, spec->value_type);
+
+	// call	method
+	g_object_get_property(instance, name, value);
+
+	// clean up name
+	bindings_java_releaseString(name);
+	
+	/*
+	 * we do not need to clean up value; it will eventually be underneath a
+	 * Fundamental extends Value extends Proxy which will ultimately call
+	 * g_value_free() when it is ready to be disposed.
+	 */
+	 	
+	return (jlong) value;
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GObject.g_signal_connect(long instance, Object handler, String name, boolean after)
+ * called from
+ *   org.gnome.glib.Plumbing.connectSignal(Object instance, Signal handler, String name, boolean after)
+ * called from
+ *   <generated package scope classes>.connect(Object instance, Signal handler, boolean after)
+ *
+ * This is where the magic to create a GClosure and hook it up to the GSignal
+ * handling mechanisms is taken care of. A reference is created to the passed
+ * Java object which is used as the callback when the signal is fired.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_GObject_g_1signal_1connect
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _instance,
+	jobject _handler,
+	jobject _receiver,
+	jstring _name,
+	jboolean _after
+)
+{
+	GObject* instance;
+  	const gchar* name;
+  	gboolean after;
+
+  	guint id;
+  	GQuark detail = 0;
+  	GClosure* closure;
+  	gboolean ok;
+
+	// translate instance  	
+  	instance = (GObject*) _instance;
+
+	// translate the signal name
+	name = bindings_java_getString(env, _name);
+
+	// translate after  	
+  	after = (gboolean) _after;
+
+	/*
+	 * Lookup the signal information. We use this rather than g_signal_lookup() because
+	 * it allows us to sidestep the issue of detailed signal names.
+	 */
+
+	ok = g_signal_parse_name(name, G_OBJECT_TYPE(instance), &id, &detail, TRUE);
+	
+	if (!ok) {
+		bindings_java_throw(env, "Unknown signal name %s for object %s", name, G_OBJECT_TYPE_NAME(instance));
+    		return;
+  	}
+  	
+  	closure = bindings_java_closure_new(env, _handler, (jclass) _receiver, name, id);
+  	if (closure == NULL) {
+  		// and an exception has already been thrown
+	    	return;
+  	}
+
+	// returns the handler id, but we don't need it.
+	g_signal_connect_closure_by_id(instance, id, detail, closure, after);
+	
+	// cleanup. Not really necessary as will happen automatically in a moment.
+	bindings_java_releaseString(name);
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GObject.g_object_add_toggle_ref(long reference, Object target)
+ * called from
+ *   org.gnome.glib.GObject.addToggleRef(Object reference)
+ * called from
+ *   org.gnome.glib.Object.<init>(long pointer)
+ *
+ * When we make a Proxy to a GObject, we need to tell the
+ * reference system about it.
+ */
+
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_GObject_g_1object_1add_1toggle_1ref
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _reference,
+	jobject _target
+)
+{
+	GObject* reference;
+	
+	// translate reference
+	reference = (GObject*) _reference;
+	
+	// call function
+	bindings_java_memory_ref(env, reference, _target);
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GObject.g_object_remove_toggle_ref(long reference)
+ * called from
+ *   org.gnome.glib.GObject.removeToggleRef(Object reference)
+ * called when
+ *   org.gnome.glib.Object.release()
+ * is invoked by a finalizer.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_GObject_g_1object_1remove_1toggle_1ref
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _reference
+)
+{
+	GObject* reference;
+	
+	// translate reference
+	reference = (GObject*) _reference;
+	
+	// call function
+	bindings_java_memory_unref(reference);
+	
+	/*
+	 * Which should, incidentally, dispose of this GObject if we're the
+	 * only one still holding a reference count to it. See discussion at
+	 * the JavaDoc for org.gnome.glib.Object's release() method.
+	 */
+}
diff --git a/src/bindings/org/gnome/glib/GObject.java b/src/bindings/org/gnome/glib/GObject.java
new file mode 100644
index 0000000..12d7214
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GObject.java
@@ -0,0 +1,140 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/*
+ * crafted since the setProperty() and connectSignal() functionality is
+ * somewhat custom transform not especially connected to either the public API
+ * or the underlying G code.
+ */
+final class GObject extends Plumbing
+{
+    private GObject() {}
+
+    static final void setProperty(org.gnome.glib.Object self, String name, Value value) {
+        g_object_set_property(pointerOf(self), name, pointerOf(value));
+    }
+
+    private static final native void g_object_set_property(long self, String name, long value);
+
+    static final Value getProperty(org.gnome.glib.Object self, String name) {
+        return valueFor(g_object_get_property(pointerOf(self), name));
+    }
+
+    private static final native long g_object_get_property(long self, String name);
+
+    /*
+     * Atypically, this is package visible so that org.gnome.glib.Plumbing can
+     * see it. That class exposes a method with the name connectSignal() which
+     * is then visible to all the generated classes (ie Gdk, Gtk, etc) that
+     * offer signal events that can be hooked up. Plumbing.connectSignal() is
+     * the only method which calls this one.
+     */
+    final static native void g_signal_connect(long instance, java.lang.Object handler,
+            Class<?> receiver, String name, boolean after);
+
+    /**
+     * Call g_object_add_toggle_ref() on the argument passed. This should only
+     * called when we're creating a Proxy for a GObject.
+     */
+    static void addToggleRef(org.gnome.glib.Object reference) {
+        long pointer = pointerOf(reference);
+        /*
+         * if are transmitting NULL from the G side to null on the Java sde,
+         * we don't need to do anything.
+         */
+        if (pointer == 0) {
+            return;
+        }
+        synchronized (lock) {
+            g_object_add_toggle_ref(pointer, reference);
+        }
+    }
+
+    /**
+     * Call g_object_remove_toggle_ref() on the argument passed. You'd really
+     * best only do this once, since removing this ref will undoubtedly cause
+     * the destruction of the underlying GObject.
+     */
+    static void removeToggleRef(org.gnome.glib.Object reference) {
+        long pointer = pointerOf(reference);
+        // guard against absurdity.
+        if (pointer == 0) {
+            return;
+        }
+        synchronized (lock) {
+            g_object_remove_toggle_ref(pointer);
+        }
+    }
+
+    /**
+     * Lookup the type name for a given Object. <i>When a GType such as a
+     * primitive (fundamental) type or a class is registered in GObject, it is
+     * given a name.
+     * 
+     * <p>
+     * <i>We do not use or even provide a mechanism to retrieve the GType
+     * itself. This value would be opaque and in any case changes from run to
+     * run.</i>
+     * 
+     * @param value
+     *            the pointer address of the <code>GObject</code> you are
+     *            looking at
+     * 
+     * @return the name which is used to identify the <code>GType</code> in
+     *         the underlying libraries.
+     */
+    /*
+     * We don't really need this, but we'll leave it here for bindings hackers
+     * to use if debugging.
+     */
+    static final String typeName(Object object) {
+        return g_type_name(pointerOf(object));
+    }
+
+    /*
+     * Atypically, this native method is package visible so that the crucial
+     * instanceForObject() method in org.gnome.glib.Plumbing can see it. That
+     * method needs to call this _before_ it can (and in order to) construct a
+     * Proxy.
+     */
+    static final String typeName(long object) {
+        return g_type_name(object).intern();
+    }
+
+    private static native final String g_type_name(long object);
+
+    private static native final void g_object_add_toggle_ref(long reference, Object target);
+
+    private static native final void g_object_remove_toggle_ref(long reference);
+}
diff --git a/src/bindings/org/gnome/glib/GValue.c b/src/bindings/org/gnome/glib/GValue.c
new file mode 100644
index 0000000..54ee6a8
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GValue.c
@@ -0,0 +1,806 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <pango/pango.h>
+#include <jni.h>
+#include "org_gnome_glib_GValue.h"
+#include "bindings_java.h"
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_type_name(long value)
+ * called from
+ *   org.gnome.glib.GValue.typeName(long value)
+ * called from
+ *   org.gnome.glib.Plumbing.instanceFor(long pointer)
+ * and also made available via
+ *   org.gnome.glib.GValue.typeName(Value value)
+ */
+JNIEXPORT jstring JNICALL
+Java_org_gnome_glib_GValue_g_1type_1name
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	const gchar* name;
+
+	// translate value
+	value = (GValue*) _value;
+
+	// call function & macro
+	name = g_type_name(G_VALUE_TYPE(value));
+	//g_print("GValue  g_type_name(%ld): %s\n", (long) G_VALUE_TYPE(value), name);
+
+	// return name. Guard against NullPointerException by returning an
+	// empty string instead of null
+	return bindings_java_newString(env, (name != NULL ? name : "\0"));
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_free(long value)
+ * called from
+ *   org.gnome.glib.GValue.free(Fundamental reference)
+ * called from
+ *   org.gnome.glib.Fundamental.release()
+ *
+ * This is where we free the chunk of memory containing the GValue pointer
+ * (that we know we allocated with GSlice).
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_GValue_g_1value_1free
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+		
+	value =	(GValue*) _value;
+	
+	/*
+	 * Although this function is mostly about resetting the GValue to
+	 * the blank state, it also has the effect of unref()'ing GObjects,
+	 * free()'ing NULL terminated strings, etc.
+	 */
+	g_value_unset(value);
+
+	g_slice_free(GValue, value);
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_new()
+ * called from
+ *   org.gnome.glib.GValue.createValue()
+ * called from
+ *   org.gnome.glib.Value.<init>()
+ *
+ * Allocate a blank GValue, for use in methods which populate a blank GValue
+ * in order to return information in an out-parameter-esque fashion.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1new
+(
+	JNIEnv *env,
+	jclass cls
+)
+{
+	GValue* value;
+		
+	// allocate it and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+
+	// return address
+	return (jlong) value;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init(int i)
+ * called from
+ *   org.gnome.glib.GValue.createValue(int i)
+ *
+ * Allocate a GValue for a gint32 with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init__I
+(
+	JNIEnv *env,
+	jclass cls,
+	jint _i
+)
+{
+	gint32 i;
+	GValue* value;
+
+	// translate arg
+	i = (gint32) _i;
+
+	// allocate it and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_INT);
+
+	// set the value
+	g_value_set_int(value, i);
+
+	// return address
+	return (jlong) value;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init(long j)
+ * called from
+ *   org.gnome.glib.GValue.createValue(long j)
+ *
+ * Allocate a GValue for a gint64 with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init__J
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _j
+)
+{
+	gint64 j;
+	GValue* value;
+
+	// translate arg
+	j = (gint64) _j;
+
+	// allocate it and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_INT64);
+
+	// set the value
+	g_value_set_int64(value, j);
+
+	// return address
+	return (jlong) value;
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init(boolean b)
+ * called from
+ *   org.gnome.glib.GValue.createValue(boolean b)
+ *
+ * Allocate a GValue for a gboolean with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init__Z
+(
+	JNIEnv *env,
+	jclass cls,
+	jboolean _b
+)
+{
+	gboolean b;
+	GValue* value;
+	
+	b = (gboolean) _b;
+
+	// allocate it and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_BOOLEAN);
+
+	// set the value
+	g_value_set_boolean(value, b);
+
+	// return address
+	return (jlong) value;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init(float f)
+ * called from
+ *   org.gnome.glib.GValue.createValue(float f)
+ *
+ * Allocate a GValue for a gfloat with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init__F
+(
+	JNIEnv *env,
+	jclass cls,
+	jfloat _f
+)
+{
+	gfloat f;
+	GValue* value;
+	
+	f = (gfloat) _f;
+		
+	// allocate it and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_FLOAT);
+
+	// set the value
+	g_value_set_float(value, f);
+
+	// return address
+	return (jlong) value;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init(double d)
+ * called from
+ *   org.gnome.glib.GValue.createValue(double d)
+ *
+ * Allocate a GValue for a gdouble with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init__D
+(
+	JNIEnv *env,
+	jclass cls,
+	jdouble _d
+)
+{
+	gdouble d;
+	GValue* value;
+	
+	d = (gdouble) _d;
+
+	// allocate it and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_DOUBLE);
+
+	// set the value
+	g_value_set_double(value, d);
+
+	// return address
+	return (jlong) value;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init(String str)
+ * called from
+ *   org.gnome.glib.GValue.createValue(String str)
+ *
+ * Allocate a GValue for a char* with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init__Ljava_lang_String_2
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _str
+)
+{
+	const gchar* str;
+	GValue* value;
+
+	// translate
+	str = bindings_java_getString(env, _str);
+	if (str == NULL) {
+		return 0; /* OutOfMemoryError already thrown */
+	}
+
+	// allocate and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_STRING);
+
+	// set the value
+	g_value_set_string(value, str);
+
+	// clean up
+	bindings_java_releaseString(str);
+
+	// return address
+	return (jlong) value;
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init_object(long obj)
+ * called from
+ *   org.gnome.glib.GValue.createValue(Object obj)
+ *
+ * Allocate a GValue for a GObject with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init_1object
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _obj
+)
+{
+	GObject* obj;
+	GValue* value;
+	
+	// translate obj
+	obj = (GObject*) _obj;
+
+	// allocate and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, G_TYPE_OBJECT);
+
+	// set the value
+	g_value_set_object(value, obj);
+
+	// clean up obj
+
+	// return address
+	return (jlong) value;
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init_font_description(long desc)
+ * called from
+ *   org.gnome.glib.GValue.createValue(FontDescription obj)
+ *
+ * Allocate a GValue for a PangoFontDescription with GSlice, then initialize
+ * it and return the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init_1font_1description
+(
+    JNIEnv *env,
+    jclass cls,
+    jlong _desc
+)
+{
+    PangoFontDescription* desc;
+    GValue* value;
+
+    // translate desc
+    desc = (PangoFontDescription*) _desc;
+
+    // allocate and set to zeros, per what g_value_init requires
+    value = g_slice_new0(GValue);
+    g_value_init(value, PANGO_TYPE_FONT_DESCRIPTION);
+
+    // set the value
+    g_value_set_boxed(value, desc);
+
+    // clean up desc
+
+    // return address
+    return (jlong) value;
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init_pixbuf(long pixbuf)
+ * called from
+ *   org.gnome.glib.GValue.createValue(Pixbuf obj)
+ *
+ * Allocate a GValue for a GdkPixbuf with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init_1pixbuf
+(
+    JNIEnv *env,
+    jclass cls,
+    jlong _pixbuf
+)
+{
+    GdkPixbuf* pixbuf;
+    GValue* value;
+
+    // translate obj
+    pixbuf = (GdkPixbuf*) _pixbuf;
+
+    // allocate and set to zeros, per what g_value_init requires
+    value = g_slice_new0(GValue);
+    g_value_init(value, GDK_TYPE_PIXBUF);
+
+    // set the value
+    g_value_set_object(value, pixbuf);
+
+    // clean up obj
+
+    // return address
+    return (jlong) value;
+}
+
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_init_enum(int num)
+ * called from
+ *   org.gnome.glib.GValue.createValue(Constant reference)
+ *
+ * Allocate a GValue for a GObject with GSlice, then initialize it and return
+ * the pointer.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1init_1enum
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _name,
+	jint _num
+)
+{
+	const gchar* name;
+	GType type;
+	gint num;
+	GValue* value;
+	
+	// translate type;
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		return 0; /* OutOfMemoryError already thrown */
+	}
+
+	type = g_type_from_name(name);
+
+	bindings_java_releaseString(name);
+	
+	// translate obj
+	num = (gint) _num;
+	
+	// allocate and set to zeros, per what g_value_init requires
+	value =	g_slice_new0(GValue);
+	g_value_init(value, type);
+
+	// set the value
+	g_value_set_enum(value, num);
+
+	// clean up obj
+
+	// return address
+	return (jlong) value;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_get_float(long value)
+ * called from
+ *   org.gnome.glib.GValue.getFloat(Value value)
+ * called from
+ *   org.gnome.glib.Object.getPropertyFloat(String name)
+ *
+ * Extract the gfloat value from a GValue of G_TYPE_FLOAT, returning the
+ * primitive.
+ */
+JNIEXPORT jfloat JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1float
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	gfloat result;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_FLOAT(value)) {
+		bindings_java_throw(env, "You've asked for the float value of a GValue, but it's not a G_TYPE_FLOAT!");
+		return 0.0f;
+	}
+
+	// call function
+	result = g_value_get_float(value);
+
+	// and return
+	return (jfloat) result;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_get_double(long value)
+ * called from
+ *   org.gnome.glib.GValue.getDouble(Value value)
+ * called from
+ *   org.gnome.glib.Object.getPropertyDouble(String name)
+ *
+ * Extract the gdoulbe value from a GValue of G_TYPE_DOUBLE, returning the
+ * primitive.
+ */
+JNIEXPORT jdouble JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1double
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	gdouble result;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_DOUBLE(value)) {
+		bindings_java_throw(env, "You've asked for the double value of a GValue, but it's not a G_TYPE_DOUBLE!");
+		return 0.0;
+	}
+
+	// call function
+	result = g_value_get_double(value);
+	
+	// and return
+	return (jdouble) result;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1int
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	gint result;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_INT(value)) {
+		bindings_java_throw(env, "You've asked for the int value of a GValue, but it's not a G_TYPE_INT!");
+		return 0;
+	}
+
+	// call function
+	result = g_value_get_int(value);
+	
+	// and return
+	return (jint) result;
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1long
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	gint64 result;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_INT64(value)) {
+		bindings_java_throw(env, "You've asked for the long value of a GValue, but it's not a G_TYPE_INT64!");
+		return 0;
+	}
+
+	// call function
+	result = g_value_get_int64(value);
+
+	// and return
+	return (jlong) result;
+}
+
+
+JNIEXPORT jboolean JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1boolean
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	gboolean result;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_BOOLEAN(value)) {
+		bindings_java_throw(env, "You've asked for the boolean value of a GValue, but it's not a G_TYPE_BOOLEAN!");
+		return 0;
+	}
+
+	// call function
+	result = g_value_get_boolean(value);
+
+	// and return
+	return (jboolean) result;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_get_string(long value)
+ * called from
+ *   org.gnome.glib.GValue.getString(Value value)
+ * called from
+ *   org.gnome.glib.Object.getPropertyString(String name)
+ *
+ * Extract the string value from a GValue of G_TYPE_STRING, returning the
+ * primitive (well, String) to be used as such.
+ */
+JNIEXPORT jstring JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1string
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	const gchar* str;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_STRING(value)) {
+		bindings_java_throw(env, "You've asked for the string value of a GValue, but it's not a G_TYPE_STRING!");
+		return NULL;
+	}
+
+	// call function
+	str = g_value_get_string(value);
+
+	// and return	
+	return bindings_java_newString(env, str);
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_get_enum(long value)
+ * called from
+ *   org.gnome.glib.GValue.getEnum(Value value)
+ * called from
+ *   org.gnome.glib.Object.getPropertyEnum(String name)
+ *
+ * Extract the ordinal of an enum stored in a GValue of type G_TYPE_ENUM.
+ */
+JNIEXPORT jint JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1enum
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	gint num;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_ENUM(value)) {
+		bindings_java_throw(env, "You've asked for the ordinal value of a GValue, but it's not a G_TYPE_ENUM!");
+		return 0;
+	}
+
+	// call function
+	num = g_value_get_enum(value);
+
+	// and return	
+	return (jint) num;
+}
+
+/**
+ * Implements
+ *   org.gnome.glib.GValue.g_value_get_flags(long value)
+ * called from
+ *   org.gnome.glib.GValue.getFlags(Value value)
+ * called from
+ *   org.gnome.glib.Object.getPropertyFlags(String name)
+ *
+ * Extract the ordinal of an flag stored in a GValue of type G_TYPE_FLAGS.
+ */
+JNIEXPORT jint JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1flags
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	guint num;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_FLAGS(value)) {
+		bindings_java_throw(env, "You've asked for the flags ordinal value of a GValue, but it's not a G_TYPE_FLAGS!");
+		return 0;
+	}
+
+	// call function
+	num = g_value_get_flags(value);
+
+	// and return	
+	return (jint) num;
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1object
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _value
+)
+{
+	GValue* value;
+	GObject* object;
+
+	// translate value
+	value =	(GValue*) _value;
+	if (!G_VALUE_HOLDS_OBJECT(value)) {
+		bindings_java_throw(env, "You've asked for the GObject within a GValue, but it's not a G_TYPE_OBJECT!");
+		return 0L;
+	}
+
+	// call function
+	object = g_value_get_object(value);
+
+	// and return	
+	return (jlong) object;
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_glib_GValue_g_1value_1get_1pixbuf
+(
+    JNIEnv* env,
+    jclass cls,
+    jlong _value
+)
+{
+    GValue* value;
+    GdkPixbuf* pixbuf;
+
+    // translate value
+    value = (GValue*) _value;
+    if (G_VALUE_TYPE(value) != GDK_TYPE_PIXBUF) {
+        bindings_java_throw(env, "You've asked for the GdkPixbuf within a GValue, but it's not a GDK_TYPE_PIXBUF!");
+        return 0L;
+    }
+
+    // call function
+    pixbuf = g_value_get_object(value);
+
+    // and return
+    return (jlong) pixbuf;
+}
diff --git a/src/bindings/org/gnome/glib/GValue.java b/src/bindings/org/gnome/glib/GValue.java
new file mode 100644
index 0000000..09ff6c8
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GValue.java
@@ -0,0 +1,259 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Constant;
+import org.freedesktop.bindings.Flag;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.pango.FontDescription;
+
+/*
+ * Crafted: the creation of fundamentals is quite custom.
+ */
+final class GValue extends Plumbing
+{
+    // no instantiation
+    private GValue() {}
+
+    static final long createValue() {
+        return g_value_new();
+    }
+
+    private static native final long g_value_new();
+
+    static final long createValue(int i) {
+        return g_value_init(i);
+    }
+
+    static final long createValue(boolean b) {
+        return g_value_init(b);
+    }
+
+    static final long createValue(String str) {
+        return g_value_init(str);
+    }
+
+    static final long createValue(Object obj) {
+        return g_value_init_object(pointerOf(obj));
+    }
+
+    static final long createValue(Pixbuf pixbuf) {
+        return g_value_init_pixbuf(pointerOf(pixbuf));
+    }
+
+    static final long createValue(FontDescription desc) {
+        return g_value_init_font_description(pointerOf(desc));
+    }
+
+    static final long createValue(float f) {
+        return g_value_init(f);
+    }
+
+    static final long createValue(double d) {
+        return g_value_init(d);
+    }
+
+    static final long createValue(long j) {
+        return g_value_init(j);
+    }
+
+    public static long createValue(Constant value) {
+        final String typeName;
+
+        typeName = typeOf(value.getClass());
+
+        return g_value_init_enum(typeName, numOf(value));
+    }
+
+    /*
+     * These ones does not match the exact prototype of g_value_init(); we do
+     * the type system magic on the other side (where its all mostly macros in
+     * any case) and carry out allocation using GSlice. A rare occasion when
+     * we overload the native call.
+     */
+
+    private static native final long g_value_init(int i);
+
+    private static native final long g_value_init(boolean b);
+
+    private static native final long g_value_init(float f);
+
+    private static native final long g_value_init(double d);
+
+    private static native final long g_value_init(String str);
+
+    /*
+     * ... and boom, our naming conventon goes splat when we added
+     * DataColumnLong.
+     */
+    private static native final long g_value_init(long j);
+
+    /*
+     * Meaning the original g_value_init(long) got in the way. Grr. What a
+     * mess. Oh well. Rename it as follows to create a distinct function name,
+     * and corresponding to the Value.<init>(long, boolean) bullshit
+     * constructor. TODO If someone wants to clean up these overloads, go
+     * ahead, but beware of the function prototypes on the JNI side.
+     */
+    private static native final long g_value_init_object(long obj);
+
+    private static native final long g_value_init_pixbuf(long pixbuf);
+
+    private static native final long g_value_init_font_description(long desc);
+
+    private static native final long g_value_init_enum(String type, int num);
+
+    static final int getInteger(Value value) {
+        return g_value_get_int(pointerOf(value));
+    }
+
+    private static native final int g_value_get_int(long value);
+
+    static final long getLong(Value value) {
+        return g_value_get_long(pointerOf(value));
+    }
+
+    private static native final long g_value_get_long(long value);
+
+    static final boolean getBoolean(Value value) {
+        return g_value_get_boolean(pointerOf(value));
+    }
+
+    private static native final boolean g_value_get_boolean(long value);
+
+    static final float getFloat(Value value) {
+        return g_value_get_float(pointerOf(value));
+    }
+
+    private static native final float g_value_get_float(long value);
+
+    static final double getDouble(Value value) {
+        return g_value_get_double(pointerOf(value));
+    }
+
+    private static native final double g_value_get_double(long value);
+
+    static final String getString(Value value) {
+        return g_value_get_string(pointerOf(value));
+    }
+
+    private static native final String g_value_get_string(long value);
+
+    static final Constant getEnum(Value value) {
+        final long pointer;
+        final int ordinal;
+        final String name;
+        final Class<?> k;
+
+        pointer = pointerOf(value);
+
+        ordinal = g_value_get_enum(pointer);
+
+        name = typeName(pointer);
+        k = lookupType(name);
+        return enumFor(k, ordinal);
+    }
+
+    private static native final int g_value_get_enum(long value);
+
+    static final Flag getFlags(Value value) {
+        final long pointer;
+        final int ordinal;
+        final String name;
+        final Class<?> k;
+
+        pointer = pointerOf(value);
+
+        ordinal = g_value_get_flags(pointer);
+
+        name = typeName(pointer);
+        k = lookupType(name);
+        return flagFor(k, ordinal);
+    }
+
+    private static native final int g_value_get_flags(long value);
+
+    static final Object getObject(Value value) {
+        return objectFor(g_value_get_object(pointerOf(value)));
+    }
+
+    private static native final long g_value_get_object(long value);
+
+    static final Pixbuf getPixbuf(Value value) {
+        return (Pixbuf) objectFor(g_value_get_pixbuf(pointerOf(value)));
+    }
+
+    private static native final long g_value_get_pixbuf(long value);
+
+    /**
+     * Lookup the type name for a given Value. <i>When a GType such as a
+     * primitive (fundamental) type or a class is registered in GObject, it is
+     * given a name.
+     * 
+     * <p>
+     * <i>We do not use or even provide a mechanism to retrieve the GType
+     * itself. This value would be opaque and in any case changes from run to
+     * run.</i>
+     * 
+     * @param value
+     *            the pointer address of the <code>GValue</code> you are
+     *            looking at
+     * 
+     * @return the name which is used to identify the <code>GType</code> in
+     *         the underlying libraries.
+     */
+    /*
+     * We don't really need this, but we'll leave it here for bindings hackers
+     * to use if debugging.
+     */
+    static final String typeName(Value value) {
+        return g_type_name(pointerOf(value)).intern();
+    }
+
+    private static final String typeName(long value) {
+        return g_type_name(value).intern();
+    }
+
+    private static native final String g_type_name(long value);
+
+    static final void free(Value reference) {
+        g_value_free(pointerOf(reference));
+    }
+
+    /*
+     * This was originally called g_slice_free, but since it's specifically to
+     * release the GValue copies we make for Standard Types, give it a more
+     * appropriate name instead.
+     */
+    private static native final void g_value_free(long value);
+}
diff --git a/src/bindings/org/gnome/glib/Glib.java b/src/bindings/org/gnome/glib/Glib.java
new file mode 100644
index 0000000..7e511e4
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Glib.java
@@ -0,0 +1,325 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * Static methods to initialize the Java bindings around GLib.
+ * 
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ * @author Guillaume Mazoyer
+ * @since 4.0.0
+ * 
+ * @see <a
+ *      href="http://www.freedesktop.org/wiki/Specifications/basedir-spec?action=show&redirect=Standards%2Fbasedir-spec">
+ *      XDG Base Directory Specification</a>
+ */
+public class Glib
+{
+    /**
+     * No instantiation. Static methods only!
+     */
+    protected Glib() {}
+
+    /**
+     * Change the internal program name used by GLib and GTK for internal
+     * error messages. Occasionally (especially as we develop new
+     * functionality) you or we will do something wrong, and GLib will
+     * complain loudly about it to the console, for example:
+     * 
+     * <pre>
+     * (gnome-panel:5581): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to...
+     * </pre>
+     * 
+     * where "<code>gnome-panel</code>" was the name set by that program with
+     * this method call, and <code>5581</code> was the process id originating
+     * the message. As you can see, the whole thing is pretty ugly (not to
+     * mention having no context), which is why one of the design goals of
+     * java-gnome is to fully proxy the entire underlying library and have
+     * none of the internals from GLib or GTK be exposed to the Java
+     * developer. If we do our job right, your users should never see a
+     * message like that; at <i>worst</i> it would be reported as a Java stack
+     * trace.
+     * 
+     * <p>
+     * You don't really need to call this, but it's here if you want to make
+     * it clearer in the <code>.xsession-errors</code> log what the culprit
+     * application is.
+     * 
+     * <p>
+     * <b>Warning</b><br>
+     * If you wish to use this, it <b>must</b> be called before anything else.
+     * This is the <i>only</i> method in java-gnome that can be called before
+     * {@link org.gnome.gtk.Gtk#init(String[]) Gtk.init()}.
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * Another one to potentially move to a GtkApplication class.
+     */
+    public static void setProgramName(String name) {
+        GlibMisc.setPrgname(name);
+    }
+
+    /**
+     * Get the internal program name set with {@link #setProgramName(String)
+     * setProgramName()}, if any.
+     * 
+     * @since 4.1.2
+     */
+    public static String getProgramName() {
+        return GlibMisc.getPrgname();
+    }
+
+    /**
+     * Get the XDG user specific configuration directory. In all likelihood
+     * this will be <code>~/.config</code>.
+     * 
+     * @since 4.0.15
+     */
+    public static String getUserConfigDir() {
+        return GlibMisc.getUserConfigDir();
+    }
+
+    /**
+     * Returns the username (i.e Linux login name) running the application.<br>
+     * 
+     * <p>
+     * <b>WARNING:</b><br>
+     * This method assumes that your system uses UTF-8 as encoding. Please
+     * file a bug if this assumption is not valid for your system.</b>
+     * 
+     * @since 4.0.15
+     */
+    public static String getUserName() {
+        return GlibMisc.getUserName();
+    }
+
+    /**
+     * Returns the real name of the user running the application from
+     * <code>/etc/passwd</code> file. If it can't be determined
+     * <code>"Unknown"</code> is returned.
+     * 
+     * <p>
+     * The warning about encoding in {@link #getUserName() getUserName()} also
+     * applies.
+     * 
+     * @since 4.0.15
+     */
+    public static String getRealName() {
+        return GlibMisc.getRealName();
+    }
+
+    /**
+     * Get the XDG user specific cache directory. In all likelihood this will
+     * be <code>~/.cache</code>.
+     * 
+     * @since 4.0.15
+     */
+    public static String getUserCacheDir() {
+        return GlibMisc.getUserCacheDir();
+    }
+
+    /**
+     * Get the XDG user specific data directory. In all likelihood this will
+     * be <code>~/.local/share</code>.
+     * 
+     * @since 4.0.15
+     */
+    public static String getUserDataDir() {
+        return GlibMisc.getUserDataDir();
+    }
+
+    /**
+     * Get the XDG user specific special directory. Directory constants are
+     * defined in {@link UserDirectory}. System wide defaults are defined in
+     * <code>/etc/xdg/user-dirs.defaults</code> and can be overridden in
+     * <code>~/.config/user-dir.dirs</code>.
+     * 
+     * <p>
+     * If you've already queried the "special" directories then those values
+     * are cached; they certainly don't change often. If you're writing a
+     * program that absolutely needs to be aware if those settings have
+     * changed after you're already used this, then you can force up to date
+     * information by calling {@link #reloadUserSpecialDirsCache()
+     * Glib.reloadUserSpecialDirsCache()}.
+     * 
+     * @since 4.0.15
+     */
+    public static String getUserSpecialDir(UserDirectory directory) {
+        return GlibMisc.getUserSpecialDir(directory);
+    }
+
+    /**
+     * Reset the cache used for {@link #getUserSpecialDir(UserDirectory)
+     * getUserSpecialDir()}.
+     * 
+     * <p>
+     * <b>WARNING:</b><br>
+     * This may cause memory leaks if the return values change between calls.
+     * 
+     * @since 4.0.15
+     */
+    public static void reloadUserSpecialDirsCache() {
+        GlibMisc.reloadUserSpecialDirsCache();
+    }
+
+    /**
+     * Get a list of system-wide XDG data directories.
+     * 
+     * @since 4.0.15
+     */
+    public static String[] getSystemDataDirs() {
+        return GlibMisc.getSystemDataDirs();
+    }
+
+    /**
+     * Get a list of system-wide XDG configuration directories.
+     * 
+     * @since 4.0.15
+     */
+    public static String[] getSystemConfigDirs() {
+        return GlibMisc.getSystemConfigDirs();
+    }
+
+    /**
+     * Format a size into a human readable String. This is useful when
+     * representing file sizes and data transfer rates.
+     * 
+     * <p>
+     * Sizes use the nearest prefix (KB, MB, GB). The prefix units are base 2
+     * so 1 MB is 1024 * 1024 bytes.
+     * 
+     * <p>
+     * Note that the returned String depends on the localization. E.g. if the
+     * system is configured to use French, the formatted size will use French
+     * size prefix.
+     * 
+     * @since 4.0.16
+     * @deprecated Use {@link #formatSize(long) formatSize()} instead.
+     */
+    public static String formatSizeForDisplay(long size) {
+        return GlibMisc.formatSizeForDisplay(size);
+    }
+
+    /**
+     * Format a size into a human readable String. This is useful when
+     * representing file sizes and data transfer rates.
+     * 
+     * <p>
+     * Sizes use the nearest prefix (kB, MB, GB). The prefix units base is
+     * 1000 (i.e. 1 kB is 1000 bytes).
+     * 
+     * <p>
+     * Note that the returned String depends on the localization. E.g. if the
+     * system is configured to use French, the formatted size will use French
+     * size prefix.
+     * 
+     * @since 4.1.3
+     */
+    public static String formatSize(long size) {
+        return GlibMisc.formatSize(size);
+    }
+
+    /**
+     * This function is similar to {@link #formatSize(long) formatSize()} but
+     * allows for flags that modify the output. See {@link FormatSizeFlags}.
+     * 
+     * @since 4.1.3
+     */
+    public static String formatSize(long size, FormatSizeFlags format) {
+        return GlibMisc.formatSize(size, format);
+    }
+
+    /**
+     * Perform basic escaping on a String so that it can be safely passed to
+     * XML.
+     * 
+     * <p>
+     * This will escape <code>&</code>, <code>></code>,
+     * <code><</code>, etc which is necessary when passing arbitrary input
+     * to methods which use Pango Markup such as Labels with markup enabled
+     * via {@link org.gnome.gtk.Label#setUseMarkup(boolean) setUseMarkup()}
+     * and directly with CellRendererText's
+     * {@link org.gnome.gtk.CellRendererText#setMarkup(org.gnome.gtk.DataColumnString)
+     * setMarkup()} or Layout's
+     * {@link org.gnome.pango.Layout#setMarkup(String) setMarkup()}
+     * 
+     * @since 4.0.17
+     */
+    public static String markupEscapeText(String str) {
+        return GlibMisc.markupEscapeText(str, -1);
+    }
+
+    /**
+     * Queue an idle handler to be run during the next iteration of the main
+     * loop.
+     * 
+     * <p>
+     * Like all graphical user interfaces, GTK is not thread safe; GUI code
+     * <b>must</b> be run from the main thread, that is, the thread that
+     * Application's {@link org.gnome.gtk.Application#run(String[]) run()}
+     * [which calls {@link org.gnome.gtk.Gtk#main() Gtk.main()}] was invoked
+     * from.
+     * 
+     * <p>
+     * In order to make a change to a widget from a worker thread, you must
+     * embed the call(s) in an idle handler, as follows:
+     * 
+     * <pre>
+     * Glib.idleAdd(new Handler() {
+     *     public boolean run() {
+     *         b.setLabel("Press Me");
+     *         return false;
+     *     }
+     * });
+     * </pre>
+     * 
+     * where <code>b</code> is a Button you'd previously initialzed and added
+     * to your UI. More generally, you'd just call some <code>doStuff()</code>
+     * method and do your updates there.
+     * 
+     * <p>
+     * The return value in the handler indicates whether or not the idle
+     * function has done it's work; return <code>true</code> to indicate you
+     * want the handler to be re-invoked. Note that you are blocking the main
+     * loop when your idle handler is running, so if you're doing serious
+     * computation you're best doing that in a worker thread and not in the
+     * idle handler callback.
+     * 
+     * @since 4.1.2
+     */
+    public static void idleAdd(Handler handler) {
+        GMain.idleAdd(handler);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/GlibException.java b/src/bindings/org/gnome/glib/GlibException.java
new file mode 100644
index 0000000..b170b5f
--- /dev/null
+++ b/src/bindings/org/gnome/glib/GlibException.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * An exception thrown by the underlying library.
+ * 
+ * <p>
+ * <b>It is inappropriate for a public API wrapper method to throw this
+ * Exception. It is to be caught and re-thrown as a new Exception of an
+ * appropriate Java type.</b> For example, if a function uses this mechanism
+ * to report being unable to locate a file on disk, then the wrapper method
+ * should do the following:
+ * 
+ * <pre>
+ * public String getModificationDate(String filename) {
+ *     try {
+ *         NativeLibrary.getModificationDate(this, filename);
+ *     } catch (GlibException ge) {
+ *         throw new FileNotFoundException(ge.getMessage());
+ *     }
+ * }
+ * </pre>
+ * 
+ * <p>
+ * <i> We map native functions that take a <code>GError**</code> argument to
+ * throwing this Exception if the function actually returns an error via that
+ * parameter; the error parameter is masked from the binding hacker's view by
+ * being handled in the C side JNI code.</i>
+ * 
+ * <p>
+ * <i>Note that <code>GError</code>s are meant as Exceptions in the Java sense
+ * of the term; they do not represent crashes nor RuntimeExceptions; they are
+ * conditions that the programmer will need to create appropriate user
+ * interface code for to allow the <i>user</i> to deal with.</i>
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class GlibException extends Exception
+{
+    private static final long serialVersionUID = 1;
+
+    protected GlibException() {
+        super();
+    }
+
+    protected GlibException(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/Handler.java b/src/bindings/org/gnome/glib/Handler.java
new file mode 100644
index 0000000..82491fe
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Handler.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * Code to be run when the main loop is idle.
+ * 
+ * @author Andrew Cowie
+ * @since 4.1.2
+ */
+public abstract interface Handler
+{
+    /**
+     * Return <code>false</code> to indicate this handler is done. Return
+     * <code>true</code> if you want the handler to be re-invoked. Be aware
+     * that as with normal signal handlers, your code is running in the main
+     * thread, and is blocking the main loop from cycling.
+     */
+    public boolean run();
+}
diff --git a/src/bindings/org/gnome/glib/Object.java b/src/bindings/org/gnome/glib/Object.java
new file mode 100644
index 0000000..49665ad
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Object.java
@@ -0,0 +1,266 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import java.util.ArrayList;
+
+import org.freedesktop.bindings.Constant;
+import org.freedesktop.bindings.Debug;
+import org.freedesktop.bindings.Flag;
+import org.freedesktop.bindings.Proxy;
+import org.gnome.pango.FontDescription;
+
+/**
+ * Base class of the object system used by GLib and libraries based on it,
+ * such as GTK.
+ * 
+ * <p>
+ * <i><b>This is the wrapper around <code>GObject</code>!</b></i>
+ * 
+ * <p>
+ * <i>Methods here provide the mechanism to get and set "properties" on the
+ * underlying <code>GObject</code>s. As a deliberate design decision to ensure
+ * type safety, however, these are not exposed for public use. To offer a
+ * getter or setter for a property, a java-gnome subclass must expose an
+ * explicitly named method. For example, to set the</i> <var>righteous</var>
+ * <i>property, (assuming that the <code>GObject</code> in question has such a
+ * property, that it is writable, and that it takes a string), create a method
+ * like this:</i>
+ * 
+ * <pre>
+ * public void setRighteous(String value) {
+ *     setPropertyString("righteous", value);
+ * }
+ * </pre>
+ * 
+ * <i>The use of a String property name is, of course, insanely type-unsafe,
+ * which is why we don't expose it in our public API. Luckily, though, in
+ * general it is not necessary to use this at all, as most
+ * <code>GObject</code>s provide convenience methods for such things, and
+ * should be used in preference wherever available.</i>
+ * 
+ * <p>
+ * <i>It is probably also worth noting that these code paths are less
+ * efficient by about 8:1 as a <code>GValue</code> must be constructed as a
+ * wrapper around the data for the property being set. While that's not too
+ * expensive in C, from Java (and from all other language bindings of GTK) it
+ * requires allocation and initialization of the wrapper structure which
+ * really is just throw away.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public abstract class Object extends Proxy
+{
+    /**
+     * When signals are collected, we maintain the strong Java reference here,
+     * in the GObject Proxy so that circular (well, dangling) references to
+     * the Signal instance can be detected by the garbage collector. There is
+     * a weak Java reference from the BindingsJavaClosure on the JNI side. See
+     * bindings_java_signal.c in src/jni.
+     */
+    private ArrayList<Signal> handlers;
+
+    protected Object(long pointer) {
+        super(pointer);
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.err.println("Object.<init>(long)\t\t" + this.toString());
+            System.err.flush();
+        }
+        GObject.addToggleRef(this);
+    }
+
+    /**
+     * Drop our reference count to the underlying GObject.
+     * 
+     * <p>
+     * <i>This should, incidentally, cause this GObject to be disposed by GLib
+     * of if we're the only one still holding a reference count to it. On the
+     * other hand, if our Proxy just happens to be going out of scope, and the
+     * GtkWidget (say) is [still] packed into some GtkContainer, then it will
+     * continue to exist quite happily.</i>
+     */
+    protected final void release() {
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.err.println("Object.release()\t\t" + this.toString());
+            System.err.flush();
+        }
+        GObject.removeToggleRef(this);
+    }
+
+    /**
+     * Set a property that takes a <code>String</code> for its value.
+     * 
+     * @since 4.0.0
+     */
+    /*
+     * Obviously a convenience method, but the developer doesn't need to know
+     * that.
+     */
+    protected void setPropertyString(String name, String value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    /**
+     * Set a property that takes an <code>int</code> for its value.
+     * 
+     * @since 4.0.0
+     */
+    /*
+     * Obviously a convenience method, but the developer doesn't need to know
+     * that.
+     */
+    protected void setPropertyInteger(String name, int value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    protected int getPropertyInteger(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getInteger(value);
+    }
+
+    /**
+     * Set a property that takes a <code>boolean</code> for its value.
+     * 
+     * @since 4.0.0
+     */
+    protected void setPropertyBoolean(String name, boolean value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    protected boolean getPropertyBoolean(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getBoolean(value);
+    }
+
+    /**
+     * Set a property that takes a <code>float</code> for its value.
+     * 
+     * @since 4.0.4
+     */
+    protected void setPropertyFloat(String name, float value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    protected float getPropertyFloat(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getFloat(value);
+    }
+
+    protected void setPropertyDouble(String name, double value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    protected double getPropertyDouble(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getDouble(value);
+    }
+
+    /**
+     * Set a property that takes an Object subclass for its value.
+     * 
+     * @since 4.0.2
+     */
+    protected void setPropertyObject(String name, Object value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    protected String getPropertyString(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getString(value);
+    }
+
+    protected void setPropertyEnum(String name, Constant value) {
+        GObject.setProperty(this, name, new Value(value));
+    }
+
+    protected Constant getPropertyEnum(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getEnum(value);
+    }
+
+    protected Flag getPropertyFlags(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getFlags(value);
+    }
+
+    /**
+     * Get a property that takes a Value [subclass] such as an Object or Boxed
+     * as its value. This isn't type safe at all, so if you call it and want
+     * to downcast the result, you'd probably be careful about it.
+     * 
+     * @param name
+     *            the property whose value you want to get.
+     * @return the {@link org.gnome.glib.Value Value} of the property, or null
+     *         if not set (?). FIXME what about no such property?
+     * @since 4.0.1
+     */
+    protected Object getPropertyObject(String name) {
+        final Value value;
+
+        value = GObject.getProperty(this, name);
+        return GValue.getObject(value);
+    }
+
+    protected void setPropertyBoxed(String name, FontDescription desc) {
+        GObject.setProperty(this, name, new Value(desc));
+    }
+
+    /**
+     * When a Signal handler is connected, we maintain a strong reference from
+     * here. We don't use it for anything, just memory management. Only called
+     * from Plumbing.connectSignal().
+     */
+    void addHandler(Signal handler) {
+        synchronized (this) {
+            if (handlers == null) {
+                handlers = new ArrayList<Signal>(1);
+            }
+            handlers.add(handler);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/glib/Plumbing.c b/src/bindings/org/gnome/glib/Plumbing.c
new file mode 100644
index 0000000..d6733d7
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Plumbing.c
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+
+#include "bindings_java.h"
+#include "org_gnome_glib_Plumbing.h"
+
+/*
+ * Implements
+ *   org.gnome.glib.Plumbing.initializeNative(Object lock)
+ * called from
+ *   org.gnome.glib.Plumbing.static()
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_glib_Plumbing_initializeNative
+(
+	JNIEnv *env,
+	jclass cls,
+	jobject _lock
+)
+{
+
+	/*
+	 * The call to g_threads_init() needs to be be the very first thing
+	 * that happens in our use of GLib. We do that in the following call
+	 */
+
+	bindings_java_threads_init(env, _lock);
+	bindings_java_logging_init();
+}
diff --git a/src/bindings/org/gnome/glib/Plumbing.java b/src/bindings/org/gnome/glib/Plumbing.java
new file mode 100644
index 0000000..2f930b6
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Plumbing.java
@@ -0,0 +1,400 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.Properties;
+
+import org.freedesktop.bindings.Constant;
+import org.freedesktop.bindings.Proxy;
+import org.gnome.gdk.Gdk;
+
+/**
+ * Translation layer class which adds the ability to connect signals to
+ * GObjects. See {@link org.freedesktop.bindings.Plumbing Plumbing} for
+ * utility methods which work with Proxy and Constant. <b>No one using
+ * developing applications which happen to use bindings based on this package
+ * should ever need to see, or subclass, this.</b>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public abstract class Plumbing extends org.freedesktop.bindings.Plumbing
+{
+    protected static final java.lang.Object lock;
+
+    protected Plumbing() {}
+
+    private static final IdentityHashMap<String, String> typeMapping;
+
+    private static final String TYPE_MAPPING = "typeMapping.properties";
+
+    static {
+        final InputStream is;
+        final Properties p;
+
+        /*
+         * A call to g_threads_init() has to be the first thing done with
+         * GLib. This call makes it so, along with the lock object that will
+         * be used for GDK.
+         */
+
+        lock = Gdk.lock;
+        initializeNative(lock);
+
+        /*
+         * Not that this code does NOT call isLibraryReady(). That is because
+         * g_set_prgname() is allowed to (and must) be called before other
+         * code if it is being used.
+         */
+
+        typeMapping = new IdentityHashMap<String, String>(470);
+
+        p = new Properties();
+
+        try {
+            is = loader.getResourceAsStream(TYPE_MAPPING);
+            if (is == null) {
+                throw new NullPointerException("InputStream for " + TYPE_MAPPING + " is null");
+            }
+            p.load(is);
+            is.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("\nUnable to load GType to Java class mapping file " + TYPE_MAPPING);
+
+            System.exit(2);
+        }
+
+        for (Iterator<java.lang.Object> iter = p.keySet().iterator(); iter.hasNext();) {
+            String gType = (String) iter.next();
+            String javaClass = (String) p.get(gType);
+            registerType(gType, javaClass);
+        }
+    }
+
+    private static native final void initializeNative(java.lang.Object lock);
+
+    /**
+     * Register a GType name as corresponding to the given Proxy subclass.
+     * This form, where a class name is specified by a string, is used by the
+     * generated translation layer classes to get around the case where a hand
+     * written wrapper class presenting a public API has not been (or will not
+     * be) written.
+     */
+    protected static void registerType(String nativeName, String javaClassName) {
+
+        assert ((nativeName != null) && (!nativeName.equals(""))) : "GType name being registered cannot be null or empty";
+        assert (javaClassName != null) : "Java class name being registered cannot be null";
+
+        typeMapping.put(nativeName.intern(), javaClassName.intern());
+    }
+
+    /**
+     * Register a GType name as corresponding to the given Proxy subclass. Use
+     * this form when you're hand writing a translation layer class - after
+     * all, you should also have implemented the public class that goes along
+     * with it!
+     */
+    protected static void registerType(String nativeName, Class<?> javaClass) {
+        assert (javaClass != null) : "Java class being registered cannot be null";
+        registerType(nativeName, javaClass.getName());
+    }
+
+    /**
+     * Retrieve an array of appropriate Java Object for the given array of
+     * pointers.
+     */
+    protected static Object[] objectArrayFor(long[] pointers, Object[] objects) {
+        if (pointers == null) {
+            return null;
+        }
+
+        for (int i = 0; i < pointers.length; ++i) {
+            objects[i] = objectFor(pointers[i]);
+        }
+        return objects;
+    }
+
+    /**
+     * Retrieve an array of appropriate Java Boxeds for the given array of
+     * pointers.
+     */
+    protected static Boxed[] boxedArrayFor(final Class<? extends Boxed> type, final long[] pointers,
+            Boxed[] boxeds) {
+        if (pointers == null) {
+            return null;
+        }
+
+        for (int i = 0; i < pointers.length; ++i) {
+            boxeds[i] = boxedFor(type, pointers[i]);
+        }
+        return boxeds;
+    }
+
+    /**
+     * Retrieve an appropriate Java Boxed for this pointer.
+     * 
+     * @throw ClassCastException if the GType pointed by given pointer is not
+     *        a GBoxed.
+     */
+    protected static Boxed boxedFor(Class<? extends Boxed> type, final long pointer) {
+        Boxed proxy;
+
+        if (pointer == 0L) {
+            return null;
+        }
+
+        proxy = (Boxed) createPointer(type, pointer);
+        return proxy;
+    }
+
+    /**
+     * Retrieve the Proxies corresponding to several pointers to GObject, and
+     * fill an Object array with them.
+     * 
+     * @see #objectFor(long)
+     */
+    protected static void fillObjectArray(Object[] objects, long[] pointers) {
+        if (pointers == null) {
+            return;
+        }
+        for (int i = 0; i < pointers.length; ++i) {
+            objects[i] = objectFor(pointers[i]);
+        }
+    }
+
+    /**
+     * Retrieve the Proxies corresponding to several pointers to GBoxed, and
+     * fill an Boxed array with them.
+     * 
+     * @see #boxedFor(Class, long)
+     */
+    protected static void fillBoxedArray(Class<? extends Boxed> type, Boxed[] boxeds, long[] pointers) {
+        if (pointers == null) {
+            return;
+        }
+        for (int i = 0; i < pointers.length; ++i) {
+            boxeds[i] = boxedFor(type, pointers[i]);
+        }
+    }
+
+    /**
+     * Retrieve an appropriate Java Proxy for a pointer to a GObject. This
+     * will return the Proxy instance already created using a real constructor
+     * if one was created Java side; where no Proxy exists it looks up the
+     * underlying <code>GType</code> and does its best to create it.
+     * 
+     * @return null if the <code>pointer</code> argument is <code>0x0</code>,
+     *         <i>which can happen after looking up a valid GValue which turns
+     *         out to contains a <code>NULL</code> pointer value for a GObject
+     *         it is carrying.</i>
+     * @throw UnsupportedOperationException if no Java class has been
+     *        registered for this <code>GType</code>.
+     * 
+     * @see org.freedesktop.bindings.Plumbing#instanceFor(long)
+     */
+    protected static Object objectFor(long pointer) {
+        Proxy proxy;
+
+        if (pointer == 0L) {
+            return null;
+        }
+
+        proxy = instanceFor(pointer);
+
+        if (proxy != null) {
+            /*
+             * A Proxy exists for this. Great! Simply return it.
+             */
+            return (Object) proxy;
+        } else {
+            /*
+             * Oh. A proxy doesn't exist (yet). Okay. Lookup the GType name,
+             * and see if we've got it registered. If we do, then we can go
+             * ahead and try to instantiate a Proxy. If not, blow an
+             * exception.
+             */
+            final String name;
+            final Class<?> type;
+
+            /*
+             * We intern the returned GType name string to reduce memory
+             * pressure and to permit lookup by identity.
+             */
+
+            name = GObject.typeName(pointer);
+
+            if (name.equals("")) {
+                throw new IllegalStateException("\n" + "GType name lookup failed");
+            }
+
+            /*
+             * Now we handle the expected case of being able to get the
+             * instance for the Proxy subclass.
+             */
+
+            type = lookupType(name);
+
+            proxy = (Proxy) createPointer(type, pointer);
+            return (Object) proxy;
+        }
+    }
+
+    /**
+     * Retrieve a Pointer object corresponding to a <code>GValue</code>. This
+     * should only be needed by the property getter functions.
+     * 
+     * <p>
+     * <i><code>GValues</code> are special... and a pain in the ass.
+     * Superficially the structure seems like <code>GObject</code> and
+     * friends, starting with a <code>GType</code>, but this is misleading
+     * because <code>GObject</code> has a <b>pointer</b> to a
+     * <code>GTypeInstance</code> which contains the <code>GType</code> first.
+     * This means that we cannot use the same code path to figure out what the
+     * type name of a pointer is that we do in objectFor() above.</i>
+     */
+    protected static Value valueFor(long pointer) {
+        Value obj;
+
+        if (pointer == 0L) {
+            return null;
+        }
+
+        obj = new Value(pointer, true);
+        return obj;
+    }
+
+    /**
+     * Get the Class object that this supplied name maps to.
+     */
+    protected final static Class<?> lookupType(String name) {
+        final String java;
+
+        java = typeMapping.get(name);
+
+        if (java == null) {
+            /*
+             * No class indicates that we don't have any information about
+             * this native type and how to map it to Java. So,
+             */
+            throw new FatalError("\n" + "No mapping for " + name + " (yet!)");
+        }
+        try {
+            return Class.forName(java, true, loader);
+        } catch (ClassNotFoundException cnfe) {
+            throw new FatalError("\n" + "Mapping exists, but class not found! " + cnfe.getMessage());
+        }
+    }
+
+    /**
+     * Connect a signal handler to a GObject.
+     * 
+     * @param instance
+     *            the Object Proxy you want to connect the signal to
+     * @param handler
+     *            the object implementing the Signal subinterface we defined
+     *            in one of our public classes.
+     * @param name
+     *            the name of the signal being connected. <i>By design, the
+     *            literal name of the interface being connected is the name of
+     *            the signal in capitals by our naming convention.
+     *            Nevertheless, you have to explicitly name the signal in
+     *            because self-delegation means we never quite know which is
+     *            being hooked up. Because all the calls to connectSignal()
+     *            will be in generated code, the signal name is sourced from
+     *            .defs data and should always be correct!</i>
+     * @param after
+     *            Whether this handler should be registered before or after
+     *            the default handler. The default is to connect before, so
+     *            <code>false</code>. Any time you use this, you <b>must</b>
+     *            name the public method <code>connectAfter()</code>.
+     */
+    /*
+     * In this case we need to go back to GObject in order to be able to make
+     * the native call to our g_signal_connect() wrapper.
+     */
+    protected static final void connectSignal(Object instance, Signal handler, Class<?> receiver,
+            String name, boolean after) {
+        GObject.g_signal_connect(pointerOf(instance), handler, receiver, name, after);
+        instance.addHandler(handler);
+    }
+
+    /*
+     * FIXME this is a pathetic hack, only here to permit compilation to
+     * succeed while we work out a better means of handling the cross-package
+     * visibility issue. Entities are the various Cairo types.
+     */
+    protected static Proxy entityFor(Class<?> type, long pointer) {
+        return org.freedesktop.cairo.Plumbing.entityFor(type, pointer);
+    }
+
+    /**
+     * This (quite inefficiently) goes the reverse direction as compared to
+     * lookupType() [those based on g_type_name()], from a known class name to
+     * a GType name.
+     */
+    /*
+     * At time of writing, this is only being used to create GValues
+     * containing enums for use in GObject property setting. For whatever
+     * reason GValue requires something more derived than G_TYPE_ENUM.
+     * 
+     * FUTURE If this becomes a hotspot at all, replace with a Map going the
+     * reverse direction as typeMapping does presenty.
+     */
+    protected static String typeOf(Class<? extends Constant> cls) {
+        final String name;
+        final Collection<String> values;
+        String jType;
+
+        name = cls.getName();
+
+        values = typeMapping.values();
+
+        if (!values.contains(name)) {
+            throw new IllegalArgumentException("Class " + name + " not in typeMapping");
+        }
+
+        for (String gType : typeMapping.keySet()) {
+            jType = typeMapping.get(gType);
+            if (jType.equals(name)) {
+                return gType;
+            }
+        }
+
+        throw new IllegalStateException("Reverse type lookup of " + name + " failed");
+    }
+}
diff --git a/src/bindings/org/gnome/glib/Signal.java b/src/bindings/org/gnome/glib/Signal.java
new file mode 100644
index 0000000..91dd734
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Signal.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006,2008 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+/**
+ * Marker interface which is the parent of all signals as expressed in the
+ * bindings. Calling it Signal is actually a slight misnomer; when someone
+ * implements the concrete Signal subclass that is written into the public API
+ * files a "SignalHandler" is more what they've created.
+ * 
+ * <p>
+ * <b>Developers using the bindings will never need to use or subclass this
+ * directly.</b> People wishing to write signal handler callbacks implement
+ * the subclasses of this interface provided by individual Widgets. See the
+ * signal called Button {@link org.gnome.gtk.Button.Clicked Button.Clicked}
+ * for a thorough example of how signals are used in practise.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+/*
+ * This is only here so that the callback design is more straight forward.
+ * Otherwise we'd have to lookup the jclass for each signal on the JNI side,
+ * and that's silly. The downcast in the generated handleName() method will
+ * take care of it.
+ */
+public abstract interface Signal
+{
+}
diff --git a/src/bindings/org/gnome/glib/UserDirectory.java b/src/bindings/org/gnome/glib/UserDirectory.java
new file mode 100644
index 0000000..cdce684
--- /dev/null
+++ b/src/bindings/org/gnome/glib/UserDirectory.java
@@ -0,0 +1,98 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Used to indicate the types of "special" user directory (as defined by the
+ * XDG standard) that you can query with
+ * {@link Glib#getUserSpecialDir(UserDirectory) Glib.getUserSpecialDir()}.
+ * 
+ * @author Serkan Kaba
+ * @since 4.0.15
+ */
+public class UserDirectory extends Constant
+{
+    protected UserDirectory(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Represents Desktop directory of the user.
+     */
+    public static final UserDirectory DESKTOP = new UserDirectory(GlibUserDirectory.DIRECTORY_DESKTOP,
+            "DESKTOP");
+
+    /**
+     * Represents Documents directory of the user.
+     */
+    public static final UserDirectory DOCUMENTS = new UserDirectory(
+            GlibUserDirectory.DIRECTORY_DOCUMENTS, "DOCUMENTS");
+
+    /**
+     * Represents Download directory of the user.
+     */
+    public static final UserDirectory DOWNLOAD = new UserDirectory(GlibUserDirectory.DIRECTORY_DOWNLOAD,
+            "DOWNLOAD");
+
+    /**
+     * Represents Music directory of the user.
+     */
+    public static final UserDirectory MUSIC = new UserDirectory(GlibUserDirectory.DIRECTORY_MUSIC,
+            "MUSIC");
+
+    /**
+     * Represents Pictures directory of the user.
+     */
+    public static final UserDirectory PICTURES = new UserDirectory(GlibUserDirectory.DIRECTORY_PICTURES,
+            "PICTURES");
+
+    /**
+     * Represents Public directory of the user.
+     */
+    public static final UserDirectory PUBLIC_SHARE = new UserDirectory(
+            GlibUserDirectory.DIRECTORY_PUBLIC_SHARE, "PUBLIC_SHARE");
+
+    /**
+     * Represents Templates directory of the user.
+     */
+    public static final UserDirectory TEMPLATES = new UserDirectory(
+            GlibUserDirectory.DIRECTORY_TEMPLATES, "TEMPLATES");
+
+    /**
+     * Represents Videos directory of the user.
+     */
+    public static final UserDirectory VIDEOS = new UserDirectory(GlibUserDirectory.DIRECTORY_VIDEOS,
+            "VIDEOS");
+}
diff --git a/src/bindings/org/gnome/glib/Value.java b/src/bindings/org/gnome/glib/Value.java
new file mode 100644
index 0000000..1b20eef
--- /dev/null
+++ b/src/bindings/org/gnome/glib/Value.java
@@ -0,0 +1,204 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Constant;
+import org.freedesktop.bindings.Debug;
+import org.freedesktop.bindings.Pointer;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.pango.FontDescription;
+
+/**
+ * A generic value that can be passed as a parameter to or returned from a
+ * method or function on an underlying entity in the GLib library and those
+ * built on it. Value is only used in setting or getting Object properties,
+ * and in the TreeModel system.
+ * 
+ * <p>
+ * <b>For use by bindings hackers only.</b><br>
+ * As with other classes in <code>org.gnome.glib</code>, this is
+ * implementation machinery and should not be needed by anyone developing
+ * applications with java-gnome.
+ * 
+ * <p>
+ * Ironically, Values are <i>not</i> actually type safe; if you happen to
+ * create one to hold Strings, and then call the getEnum() method on it, your
+ * program will explode (this is somewhat to the contrary of the spirit of
+ * java-gnome). These are therefore only for use from within strongly typed
+ * methods exposing a safe and sane public API. You've been warned.
+ * 
+ * <p>
+ * <i>Complementing the object oriented system supplied by the GLib library is
+ * a set of foundation elements, <code>GType</code> and <code>GValue</code>,
+ * the latter being defined as "a polymorphic type that can hold values of any
+ * other type", which isn't much help, really.</i>
+ * 
+ * <p>
+ * <i>Since instances of Java classes are their own identity, we do not need
+ * to directly represent <code>GType</code> and <code>GValue</code> as
+ * separate classes. We implement <code>GType</code> as a characteristic that
+ * any</i> <code>Value</code> <i>or</i> <code>Object</code> <i>has.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public class Value extends Pointer
+{
+    /*
+     * The second argument is a hack to create a different overload of
+     * <init>(long). What a pain in the ass, but whatever.
+     */
+    protected Value(long pointer, boolean proxy) {
+        super(pointer);
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.err.println("Value.<init>(long)\t\t" + this.toString());
+            System.err.flush();
+        }
+    }
+
+    /**
+     * By design, we are the owner of all the GValues because we allocate the
+     * memory for them in (for example) the native implementation of
+     * {@link GValue#createValue(int)}. So, call <code>g_slice_free()</code>
+     * on our pointer to free that memory.
+     */
+    protected void release() {
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.err.println("Value.release()\t\t\t" + this.toString());
+        }
+        GValue.free(this);
+    }
+
+    /**
+     * Create an empty Value without initializing it's type. For use in
+     * methods like TreeModel's
+     * {@link org.gnome.gtk.TreeModel#getValue(org.gnome.gtk.TreeIter, org.gnome.gtk.DataColumnString)
+     * getValue()} family, which use a blank Value internally.
+     * 
+     * Not public API!
+     */
+    protected Value() {
+        this(GValue.createValue(), true);
+    }
+
+    /**
+     * Create a Value containing a String. Not public API!
+     */
+    protected Value(String value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected String getString() {
+        return GValue.getString(this);
+    }
+
+    /**
+     * Create a Value containing an <code>int</code>. Not public API!
+     */
+    protected Value(int value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected int getInteger() {
+        return GValue.getInteger(this);
+    }
+
+    /**
+     * Create a Value containing a <code>boolean</code>. Not public API!
+     */
+    protected Value(boolean value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected boolean getBoolean() {
+        return GValue.getBoolean(this);
+    }
+
+    /**
+     * Create a Value containing a <code>float</code>. Not public API!
+     */
+    protected Value(float value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected Value(double value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected Value(Pixbuf pixbuf) {
+        this(GValue.createValue(pixbuf), true);
+    }
+
+    protected Value(Object obj) {
+        this(GValue.createValue(obj), true);
+    }
+
+    protected Value(FontDescription desc) {
+        this(GValue.createValue(desc), true);
+    }
+
+    /*
+     * Another one that's only really here for unit tests.
+     */
+    protected Object getObject() {
+        return GValue.getObject(this);
+    }
+
+    protected Pixbuf getPixbuf() {
+        return GValue.getPixbuf(this);
+    }
+
+    protected float getFloat() {
+        return GValue.getFloat(this);
+    }
+
+    protected double getDouble() {
+        return GValue.getDouble(this);
+    }
+
+    protected Value(long value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected Value(Constant value) {
+        this(GValue.createValue(value), true);
+    }
+
+    protected long getLong() {
+        return GValue.getLong(this);
+    }
+
+    protected Constant getEnum() {
+        return GValue.getEnum(this);
+    }
+}
diff --git a/src/bindings/org/gnome/glib/package.html b/src/bindings/org/gnome/glib/package.html
new file mode 100644
index 0000000..e429b5d
--- /dev/null
+++ b/src/bindings/org/gnome/glib/package.html
@@ -0,0 +1,34 @@
+<html>
+<head>
+</head>
+<body>
+
+<p>GLib is the general-purpose base library in GNOME; most of the its elements
+are just implementation infrastructure. We do not present very much of GLib's
+utility nature as most of the same functionality is already available in the
+Java standard library itself.</p>
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/org/gnome/gtk/AboutDialog.java b/src/bindings/org/gnome/gtk/AboutDialog.java
new file mode 100644
index 0000000..1a2ec65
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AboutDialog.java
@@ -0,0 +1,333 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * A Dialog which presents information about a program. <img
+ * src="AboutDialog.png" class="snapshot"> The AboutDialog presents simple
+ * meta information including program {@link #setProgramName(String) name}, a
+ * short {@link #setComments(String) description},
+ * {@link #setCopyright(String) copyright} info, and then lists of
+ * {@link #setAuthors(String[]) authors}, {@link #setDocumenters(String[])
+ * documenters}, {@link #setArtists(String[]) artists} responsible for the
+ * program. Those who contributed by {@link #setTranslatorCredits(String)
+ * translating} the application can also be listed.
+ * 
+ * <p>
+ * As a convention, every GNOME application has a MenuItem labelled "About" in
+ * the main "Help" menu.
+ * 
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ * @since 4.0.6
+ */
+public class AboutDialog extends Dialog
+{
+    protected AboutDialog(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Instantiate a new AboutDialog. You'll need to call the various setters
+     * in this class to populate it.
+     * 
+     * @since 4.0.6
+     */
+    public AboutDialog() {
+        super(GtkAboutDialog.createAboutDialog());
+    }
+
+    /**
+     * Specify the name of the application. Some people choose to use a human
+     * readable name like "<code>The Epiphany Web Browser</code>", whereas
+     * others will use the project name, for example "<code>epiphany</code>".
+     * This will be shown prominently in a large font as the title of the
+     * Dialog.
+     * 
+     * @since 4.0.6
+     */
+    public void setProgramName(String name) {
+        GtkAboutDialog.setProgramName(this, name);
+    }
+
+    /**
+     * Set the version number of this release. It will be shown beside the
+     * program name.
+     * 
+     * @since 4.0.6
+     */
+    public void setVersion(String version) {
+        GtkAboutDialog.setVersion(this, version);
+    }
+
+    /**
+     * Specify the copyright holder of the application. This should be short
+     * and to the point, for example:
+     * 
+     * <pre>
+     * setCopyright("Copyright (c) 2008 ACME, Inc");
+     * </pre>
+     * 
+     * @since 4.0.6
+     */
+    public void setCopyright(String text) {
+        GtkAboutDialog.setCopyright(this, text);
+    }
+
+    /**
+     * Set a simple description of the program. This will essentially be shown
+     * as a subtitle to your application's name.
+     * 
+     * @since 4.0.6
+     */
+    public void setComments(String text) {
+        GtkAboutDialog.setComments(this, text);
+    }
+
+    /**
+     * Add a "licence" Button to the AboutDialog. The String set by this
+     * method will be displayed if the user clicks on this Button.
+     * 
+     * <p>
+     * If <code>null</code> the licence Button is hidden.
+     * 
+     * @since 4.0.12
+     */
+    public void setLicense(String text) {
+        GtkAboutDialog.setLicense(this, text);
+    }
+
+    /**
+     * Wrap the licence text. If <code>true</code>, the licence text will be
+     * automatically wrapped and the initial dialog size will be preserved.
+     * 
+     * @since 4.0.12
+     */
+    public void setWrapLicense(boolean setting) {
+        GtkAboutDialog.setWrapLicense(this, setting);
+    }
+
+    /**
+     * Set a link to your website. It is recommended to do in the standard
+     * <code>http://www.example.com/</code> format.
+     * 
+     * <p>
+     * <i>At the moment this "link" is just plain text and not live.</i>
+     * 
+     * @since 4.0.11
+     */
+    public void setWebsite(String website) {
+        GtkAboutDialog.setWebsite(this, website);
+    }
+
+    /**
+     * Set the license of the application from the currently known
+     * {@link License licenses}.
+     * 
+     * <p>
+     * This method overrides the license set using {@link #setLicense(String)
+     * setLicense()}.
+     * 
+     * @since 4.1.2
+     */
+    public void setLicenseType(License license) {
+        GtkAboutDialog.setLicenseType(this, license);
+    }
+
+    /**
+     * Return the license that was set using {@link #setLicenseType(License)
+     * setLicenseType()}.
+     * 
+     * @since 4.1.2
+     */
+    public License getLicenseType() {
+        return GtkAboutDialog.getLicenseType(this);
+    }
+
+    /**
+     * Set a label to modify the website link previously set by something more
+     * friendly.
+     * 
+     * @since 4.0.13
+     */
+    public void setWebsiteLabel(String label) {
+        GtkAboutDialog.setWebsiteLabel(this, label);
+    }
+
+    /**
+     * Set the image to be displayed in the AboutDialog. Most apps just want
+     * to use the default icon which was set with
+     * {@link Gtk#setDefaultIcon(Pixbuf) Gtk.setDefaultIcon()}.
+     * 
+     * @since 4.0.6
+     */
+    public void setLogo(Pixbuf icon) {
+        GtkAboutDialog.setLogo(this, icon);
+    }
+
+    /**
+     * Add a list of authors to the AboutDialog. You pass in an array of
+     * Strings, with one author listed per String, for example:
+     * 
+     * <pre>
+     * about.setAuthors(new String[] {
+     *     "Andrew Cowie <andrew at operationaldynamics.com>",
+     *     "Srichand Pendyala <srichand.pendyala at gmail.com>",
+     *     "Vreixo Formoso Lopes <metalpain2002 at yahoo.es>",
+     *     "Sebastian Mancke <s.mancke at tarent.de>"
+     * });
+     * </pre>
+     * 
+     * It is indeed tradition for authors of Open Source Software to include
+     * their email addresses when identifying their work.
+     * 
+     * @since 4.0.6
+     */
+    public void setAuthors(String[] people) {
+        GtkAboutDialog.setAuthors(this, people);
+    }
+
+    /**
+     * Add a list of documenters to the AboutDialog. You pass in an array of
+     * Strings, with one person per String, for example:
+     * 
+     * <pre>
+     * about.setDocumenters(new String[] {
+     *     "Guillaume Mazoyer <respawneral at gmail.com>",
+     *     "Stefan Prelle <stefan at prelle.org>",
+     *     "Serkan Kaba <serkan at gentoo.org>"
+     * });
+     * </pre>
+     * 
+     * @since 4.0.12
+     */
+    public void setDocumenters(String[] people) {
+        GtkAboutDialog.setDocumenters(this, people);
+    }
+
+    /**
+     * Add a list of artists to the AboutDialog. You pass in an array of
+     * Strings, with one artist per String, for example:
+     * 
+     * <pre>
+     * about.setArtists(new String[] {
+     *     "Joao Victor <jvital at gmail.com>"
+     * });
+     * </pre>
+     * 
+     * @since 4.0.12
+     */
+    public void setArtists(String[] people) {
+        GtkAboutDialog.setArtists(this, people);
+    }
+
+    /**
+     * Add a tab to the AboutDialog's Credit popup listing the people who have
+     * contributed to translating the application into the active language.
+     * 
+     * <p>
+     * This one is a bit different than <var>authors</var>,
+     * <var>artists</var>, and <var>documenters</var> in that it is expected
+     * that you'll pass the result of looking up the translation of the string
+     * <code>"translator-credits"</code> as follows:
+     * 
+     * <pre>
+     * about.setTranslatorCredits(_("translator-credits"));
+     * </pre>
+     * 
+     * This way, the user of your program will be shown the list of people who
+     * worked on the translation for that particular locale. The translation
+     * for the <code>"translator-credits"</code> string in the PO file should
+     * still be names and email addresses as shown in
+     * {@link #setAuthors(String[]) setAuthors()}.
+     * 
+     * <p>
+     * See {@link org.freedesktop.bindings.Internationalization
+     * Internationalization} for more details about the use of the
+     * <code>_()</code> function.
+     * 
+     * <p>
+     * <i>You could of course use any string as the index for lookup, but
+     * "translator-credits" is the accepted convention, and people doing
+     * translation work will recognize it.</i>
+     * 
+     * @since 4.0.10
+     */
+    public void setTranslatorCredits(String credits) {
+        GtkAboutDialog.setTranslatorCredits(this, credits);
+    }
+
+    private static class ActivateLinkHandler implements GtkAboutDialog.ActivateLinkSignal
+    {
+        private final ActivateLink handler;
+
+        public ActivateLinkHandler(ActivateLink handler) {
+            this.handler = handler;
+        }
+
+        public boolean onActivateLink(AboutDialog source, String link) {
+            try {
+                return handler.onActivateLink(source, new URI(link));
+            } catch (URISyntaxException e) {
+                throw new RuntimeException("We shouldn't be throwing this exception", e);
+            }
+        }
+    }
+
+    /**
+     * Callback invoked when the website is clicked.
+     * 
+     * @author Guillaume Mazoyer
+     * @author Andrew Cowie
+     * @since 4.1.1
+     */
+    public interface ActivateLink
+    {
+        public boolean onActivateLink(AboutDialog source, URI link);
+    }
+
+    /**
+     * Hookup the <code>AboutDialog.ActivateLink</code> callback that will be
+     * used to handle website button click actions.
+     * 
+     * @since 4.1.1
+     */
+    public void connect(AboutDialog.ActivateLink handler) {
+        GtkAboutDialog.connect(this, new ActivateLinkHandler(handler), false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AccelFlags.java b/src/bindings/org/gnome/gtk/AccelFlags.java
new file mode 100644
index 0000000..87c6bd7
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AccelFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class AccelFlags extends Constant
+{
+    private AccelFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AccelKey.java b/src/bindings/org/gnome/gtk/AccelKey.java
new file mode 100644
index 0000000..fca6705
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AccelKey.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class AccelKey extends Boxed
+{
+    protected AccelKey(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AccelLabel.java b/src/bindings/org/gnome/gtk/AccelLabel.java
new file mode 100644
index 0000000..3d98881
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AccelLabel.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class AccelLabel extends Label
+{
+    protected AccelLabel(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AccelMap.java b/src/bindings/org/gnome/gtk/AccelMap.java
new file mode 100644
index 0000000..3727406
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AccelMap.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class AccelMap extends Object
+{
+    protected AccelMap(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AcceleratorGroup.java b/src/bindings/org/gnome/gtk/AcceleratorGroup.java
new file mode 100644
index 0000000..028bc10
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AcceleratorGroup.java
@@ -0,0 +1,121 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.ModifierType;
+import org.gnome.glib.Object;
+
+/**
+ * Accelerator are for key bindings for windows. For example, <b>
+ * <code>Ctrl+O</code></b> is the typical accelerator for opening a file.
+ * Accelerator in this case refers to pressing these keys together and the
+ * action that results.
+ * 
+ * <p>
+ * When a key binding is pressed the action related to the Widget is being
+ * activated. Therefore each key binding is directly tied to the Widget in
+ * question. You generally only need one AcceleratorGroup object per Window.
+ * Create one, then tell the toplevel about it with Window's
+ * {@link Window#addAcceleratorGroup(AcceleratorGroup) addAcceleratorGroup()}.
+ * 
+ * <p>
+ * Key bindings are only bound to MenuItems or Actions. For example, given a
+ * Window, a Menu, and a MenuItem, we setup an AcceleratorGroup for the
+ * toplevel and then assign a key binding to the MenuItem:
+ * 
+ * <pre>
+ * group = new AcceleratorGroup();
+ * window.addAcceleratorGroup(group);
+ * ..
+ * menu.setAcceleratorGroup(group);
+ * item.setAccelerator(group, Keyval.O, ModifierType.CONTROL_MASK);
+ * </pre>
+ * 
+ * <p>
+ * For ImageMenuItem you can either use the key binding that is associated
+ * with it through the Stock item and only invoke:
+ * 
+ * <pre>
+ * imageitem.setAccelerator(group);
+ * </pre>
+ * 
+ * or you can set a custom key binding through the method from parent class
+ * MenuItem:
+ * 
+ * <pre>
+ * imageitem.setAccelerator(group, Keyval.N, ModifierType.CONTROL_MASK);
+ * </pre>
+ * 
+ * <p>
+ * In order to set multiple Modifier Types you can use the static method
+ * {@link ModifierType#or(ModifierType, ModifierType) or()}
+ * 
+ * @author Sarah Leibbrand
+ * @since 4.0.16
+ */
+public class AcceleratorGroup extends Object
+{
+    private String root;
+
+    protected AcceleratorGroup(long pointer) {
+        super(pointer);
+    }
+
+    public AcceleratorGroup() {
+        super(GtkAccelGroup.createAcceleratorGroup());
+
+        root = generateRandomString();
+    }
+
+    protected String generateRandomPath() {
+        return "<" + root + ">/" + generateRandomString();
+    }
+
+    /**
+     * Internal method to used to create a random 8 character long string.
+     * This string is used for path's of menu items and the root for the
+     * Accelerator.
+     */
+    private static String generateRandomString() {
+        final char[] generated;
+        int i;
+
+        generated = new char[8];
+
+        for (i = 0; i < 8; i++) {
+            generated[i] = (char) ((int) (Math.random() * 26) + 97);
+        }
+
+        return String.valueOf(generated);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Accessible.java b/src/bindings/org/gnome/gtk/Accessible.java
new file mode 100644
index 0000000..7ca10bb
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Accessible.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.atk.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Accessible extends Object
+{
+    protected Accessible(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Action.java b/src/bindings/org/gnome/gtk/Action.java
new file mode 100644
index 0000000..bf79da8
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Action.java
@@ -0,0 +1,507 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.icons.Helper;
+import org.freedesktop.icons.Icon;
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+import org.gnome.glib.Object;
+
+/**
+ * Actions represent an operation that the user can perform from one of
+ * several GUI places.
+ * 
+ * <p>
+ * Usually, an application provides several ways to let users execute an
+ * operation, for example the "Open File..." shows up in Menus, Toolbars, and
+ * elsewhere. If an operation can be executed from several GUI places, it
+ * seems logical that such different places appear similar to the user.
+ * Namely, they should have the same textual label, the same icon, and
+ * certainly the same accelerator key. This way, if the user is accustomed to
+ * executing an operation from the Toolbar and then sees the equivalent
+ * operation in as a MenuItem with the same icon and label, she will know that
+ * both will do the same thing. It thus seems reasonable that both MenuItem
+ * and ToolButton share some Object where the common information is stored,
+ * and this is indeed the role of the Action class.
+ * 
+ * <p>
+ * An Action holds information about an operation that could be executed from
+ * different places. This information includes the label that is shown to the
+ * user, the icon, and the tooltip (popup help message). It also stores state
+ * information, such as whether the action is "visible" or "sensitive". When
+ * this information changes, all the Action <i>proxies</i> (i.e. the Widgets
+ * such as MenuItems or ToolButtons related to it) are also all changed
+ * properly.
+ * 
+ * <p>
+ * Each Action has an {@link Action.Activate} signal emitted when any of its
+ * proxies are triggered. Thus you can just connect one signal to start the
+ * needed operation, instead of having to connect to the
+ * <code>Action.Activate</code> signal of each of various proxies.
+ * 
+ * <p>
+ * Once you have created an Action, you can get proxies for it with the
+ * {@link #createMenuItem() createMenuItem()} and {@link #createToolItem()
+ * createToolItem()} methods.
+ * 
+ * <p>
+ * Incidentally, you can still use Actions even if you only plan to let the
+ * user execute operations from a single place in your application; they're a
+ * useful technique to concentrate the code handling of user activity.
+ * 
+ * @see ActionGroup
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class Action extends Object
+{
+    protected Action(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Action, and connect a handler to its
+     * <code>Action.Activate</code> signal.
+     * 
+     * @param name
+     *            A unique name for the Action.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the Action. Also
+     *            localized.
+     * @param stock
+     *            The stock icon to display in proxy Widgets.
+     * @param handler
+     *            A handler to connect to the <code>Action.Activate</code>
+     *            signal. Typically this will be used to actually start the
+     *            operation related to this Action.
+     * @since 4.0.4
+     */
+    /*
+     * FIXME describe the implications of different choices for name.
+     */
+    public Action(String name, String label, String tooltip, Stock stock, Action.Activate handler) {
+        super(GtkAction.createAction(name, label, tooltip, (stock == null ? null : stock.getStockId())));
+        connect(handler);
+    }
+
+    /**
+     * Create a new Action, and connect a handler to its
+     * <code>Action.Activate</code> signal.
+     * 
+     * @param name
+     *            A unique name for the Action.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the Action. Also
+     *            localized.
+     * @param icon
+     *            The Icon to display in proxy Widgets.
+     * @param handler
+     *            A handler to connect to the <code>Action.Activate</code>
+     *            signal. Typically this will be used to actually start the
+     *            operation related to this Action.
+     * @since 4.0.19
+     */
+    public Action(String name, String label, String tooltip, Icon icon, Action.Activate handler) {
+        super(GtkAction.createAction(name, label, tooltip, null));
+        GtkAction.setIconName(this, Helper.getName(icon));
+        connect(handler);
+    }
+
+    /**
+     * Create a new Action.
+     * 
+     * @param name
+     *            A unique name for the Action.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the Action. Also
+     *            localized.
+     * @param stock
+     *            The Stock icon to display in proxy Widgets.
+     * @since 4.0.4
+     */
+    public Action(String name, String label, String tooltip, Stock stock) {
+        super(GtkAction.createAction(name, label, tooltip, (stock == null ? null : stock.getStockId())));
+    }
+
+    /**
+     * Create a new Action.
+     * 
+     * @param name
+     *            A unique name for the Action.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the Action. Also
+     *            localized.
+     * @param icon
+     *            The Icon to display in proxy Widgets.
+     * @since 4.0.19
+     */
+    public Action(String name, String label, String tooltip, Icon icon) {
+        super(GtkAction.createAction(name, label, tooltip, null));
+        GtkAction.setIconName(this, Helper.getName(icon));
+    }
+
+    /**
+     * Create a new Action from a Stock item. The message and tooltip will be
+     * supplied by GTK automatically.
+     * 
+     * @since 4.0.7
+     */
+    public Action(String name, Stock stock) {
+        super(GtkAction.createAction(name, null, null, (stock == null ? null : stock.getStockId())));
+    }
+
+    /**
+     * Create a new Action based on a Stock item, and connect a handler to its
+     * <code>Action.Activate</code> signal. Complements the
+     * {@link #Action(String, Stock) <init>(String, Stock)} constructor.
+     * 
+     * @since 4.0.9
+     */
+    public Action(String name, Stock stock, Action.Activate handler) {
+        super(GtkAction.createAction(name, null, null, stock.getStockId()));
+        connect(handler);
+    }
+
+    /**
+     * Create a new Action, and connect a handler to its
+     * <code>Action.Activate</code> signal.
+     * 
+     * @param name
+     *            A unique name for the Action.
+     * @param label
+     *            The label that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param handler
+     *            A handler to connect to the <code>Action.Activate</code>
+     *            signal. Usually will will start from here the operation
+     *            related to the Action.
+     * @since 4.0.4
+     */
+    public Action(String name, String label, Action.Activate handler) {
+        super(GtkAction.createAction(name, label, null, null));
+        connect(handler);
+    }
+
+    /**
+     * Create a new Action.
+     * 
+     * @param name
+     *            A unique name for the Action.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @since 4.0.4
+     */
+    public Action(String name, String label) {
+        super(GtkAction.createAction(name, label, null, null));
+    }
+
+    /**
+     * Create a MenuItem from this Action.
+     * 
+     * <p>
+     * You can add the returned MenuItem to a {@link Menu}. The MenuItem will
+     * have the same label, icon or accelerator of this Action, and when the
+     * user activates the MenuItem, this Action will
+     * <code>Action.Activate</code> too.
+     * 
+     * @since 4.0.4
+     */
+    public MenuItem createMenuItem() {
+        return (MenuItem) GtkAction.createMenuItem(this);
+    }
+
+    /**
+     * Creates a ToolItem from this Action.
+     * 
+     * <p>
+     * You can add the returned ToolItem to a {@link Toolbar}. The ToolItem
+     * will have the same Label, icon, tooltips or accelerator of this Action,
+     * and when the user clicks it, this Action will be
+     * <code>Action.Activate</code>d.
+     * 
+     * @since 4.0.4
+     */
+    public ToolItem createToolItem() {
+        return (ToolItem) GtkAction.createToolItem(this);
+    }
+
+    /**
+     * Set if the Action is available to be activated by the user. When an
+     * Action is not sensitive, all its ToolItem or MenuItem proxies are
+     * likewise disabled, meaning the user can't activate any of them.
+     * 
+     * <p>
+     * You usually will want to deactivate an Action when its operation makes
+     * no sense in current application status. For example, in a text editor
+     * you should probably disable the "Save" Action when there is no document
+     * is open or when current document hasn't been changed.
+     * 
+     * <p>
+     * When not sensitive, Action proxies are displayed differently than
+     * enabled proxies (usually in grey color). That way, user knows the
+     * Action has no application in the current program state, and she needs
+     * to do something before the disabled Action becomes applicable.
+     * 
+     * <p>
+     * However, when a full Menu on a MenuBar needs to be disabled, generally
+     * a better idea is to {@link #setVisible(boolean) setVisible(false)} it.
+     * 
+     * <p>
+     * Finally, note that setting an Action sensitive doesn't always mean it
+     * will be actually sensitive, as you also need to make sensitive the
+     * ActionGroup the Action belongs to (see {@link #isSensitive()}).
+     * 
+     * <p>
+     * An Action starts life sensitive (ie, <code>true</code>).
+     * 
+     * @since 4.0.4
+     */
+    public void setSensitive(boolean sensitive) {
+        GtkAction.setSensitive(this, sensitive);
+    }
+
+    /**
+     * Return whether this Action itself is enabled to be activated by the
+     * user. Note that this doesn't necessarily mean effective sensitivity due
+     * to the effect of ActionGroups; see {@link #isSensitive() isSensitive()}
+     * for that.
+     * 
+     * @since 4.0.4
+     */
+    public boolean getSensitive() {
+        return GtkAction.getSensitive(this);
+    }
+
+    /**
+     * Returns whether the action is effectively sensitive, i.e., if both the
+     * Action and the ActionGroup it belongs to are enabled.
+     * 
+     * @since 4.0.4
+     */
+    public boolean isSensitive() {
+        return GtkAction.isSensitive(this);
+    }
+
+    /**
+     * Set whether the Action is visible to users.
+     * 
+     * <p>
+     * When an Action is not visible, any associated proxies, such as
+     * MenuItems or ToolItems are hidden to the used.
+     * 
+     * <p>
+     * In most cases, it's a better idea to {@link #setSensitive(boolean)
+     * setSensitive(false)} an Action instead of make it not visible. That
+     * way, users can see that such operation exists in the application, but
+     * they need to do some operations before it becomes available.
+     * 
+     * <p>
+     * However, when a full Menu is disabled, this could be a good option. For
+     * example, on a text edit application, you could hide the "Edit" menu
+     * when there's no opened document.
+     * 
+     * <p>
+     * Finally, note that setting an Action visible doesn't always mean it
+     * will be actually displayed, as you also need to make visible the
+     * ActionGroup the Action belongs to (see {@link #isVisible() isVisible()}
+     * for details).
+     * 
+     * @since 4.0.4
+     */
+    public void setVisible(boolean visible) {
+        GtkAction.setVisible(this, visible);
+    }
+
+    /**
+     * Return whether the Action itself is visible. Note that this doesn't
+     * necessarily mean effective visibility.
+     * 
+     * @see #isVisible()
+     * @see #setVisible(boolean)
+     * @since 4.0.4
+     */
+    public boolean getVisible() {
+        return GtkAction.getVisible(this);
+    }
+
+    /**
+     * Is the Action visible on the screen?
+     * 
+     * @return <code>true</code> when both the Action and the ActionGroup it
+     *         belongs to are visible, <code>false</code> otherwise.
+     * @see #setVisible(boolean)
+     * @since 4.0.4
+     */
+    public boolean isVisible() {
+        return GtkAction.isVisible(this);
+    }
+
+    /**
+     * Activates the Action.
+     * 
+     * <p>
+     * Programmatically cause this Action to fire its
+     * <code>Action.Activate</code> signal. Note that this has no effect if
+     * the Action is not currently sensitive.
+     * 
+     * <p>
+     * Since the Action is automatically activated when user activates one of
+     * its proxies (selecting the specific MenuItem or clicking the ToolButton
+     * that goes with this Action), normally <b>you don't need this</b>.
+     * However, in some cases you want to activate the Action in your
+     * application code. Use this there.
+     * 
+     * @since 4.0.8
+     */
+    public void emitActivate() {
+        GtkAction.activate(this);
+    }
+
+    /**
+     * Set a tooltip (little help message appearing in a hover) for the
+     * Action.
+     * 
+     * @since 4.0.4
+     */
+    public void setTooltip(String tooltip) {
+        setPropertyString("tooltip", tooltip);
+    }
+
+    /**
+     * Get the tooltip for the Action.
+     * 
+     * @since 4.0.4
+     */
+    public String getTooltip() {
+        return getPropertyString("tooltip");
+    }
+
+    /**
+     * Signal emitted when the Action is activated.
+     * 
+     * <p>
+     * An Action is activated when the user clicks a ToolButton proxy, when
+     * (s)he activates an associated MenuItem or when
+     * {@link Action#activate() activate()} is called.
+     * 
+     * @since 4.0.4
+     */
+    public interface Activate extends GtkAction.ActivateSignal
+    {
+        public void onActivate(Action source);
+    }
+
+    /**
+     * Connect a handler to the <code>Action.Activate</code> signal.
+     * 
+     * @since 4.0.4
+     */
+    public void connect(Action.Activate handler) {
+        GtkAction.connect(this, handler, false);
+    }
+
+    /**
+     * Specify a key binding to trigger this Action, as actually specified by
+     * the Stock item being used. This assumes, of course that you
+     * instantiated this Action using one of the Stock constructors, ie
+     * {@link #Action(String, Stock) <init>(Stock)}.
+     */
+    /*
+     * TODO this appears to be parallel to ImageMenuItem's setAccelerator(),
+     * but testing couldn't show it to actually have any effect. It would be
+     * nice if we could figure it out, but for now the convenience in the
+     * other setAccelerator() takes care of things.
+     */
+    void setAccelerator(AcceleratorGroup group) {
+        GtkAction.setAccelGroup(this, group);
+    }
+
+    /**
+     * Specify a key binding to trigger this Action. You need to use the same
+     * group object as was (or will be) passed to Window's
+     * {@link Window#addAcceleratorGroup(AcceleratorGroup)
+     * addAcceleratorGroup()}.
+     * 
+     * @since 4.0.16
+     */
+    /*
+     * This call also sets the AcceleratorGroup for this Action as a
+     * convenience allowing us to avoid having to make an otherwise
+     * unnecessary additional public API call and makes this parallel with
+     * MenuItem and ImageMenuItem.
+     */
+    public void setAccelerator(AcceleratorGroup group, Keyval keyval, ModifierType modifier) {
+        String path;
+        boolean exists, result;
+
+        GtkAction.setAccelGroup(this, group);
+
+        path = GtkAction.getAccelPath(this);
+
+        if (path == null) {
+            exists = false;
+            path = group.generateRandomPath();
+            GtkAction.setAccelPath(this, path);
+            GtkAction.connectAccelerator(this);
+        } else {
+            exists = GtkAccelMap.lookupEntry(path, null);
+        }
+
+        if (exists) {
+            result = GtkAccelMap.changeEntry(path, keyval, modifier, true);
+
+            if (!result) {
+                throw new IllegalStateException("Can't change exising accelerator");
+            }
+        } else {
+            GtkAccelMap.addEntry(path, keyval, modifier);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ActionGroup.java b/src/bindings/org/gnome/gtk/ActionGroup.java
new file mode 100644
index 0000000..6e81565
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ActionGroup.java
@@ -0,0 +1,129 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * A group of Actions.
+ * 
+ * <p>
+ * Actions are generally organized into groups. All Actions that would make
+ * sense to use in a particular context should be in a single group. Multiple
+ * ActionGroups may be used for a particular user interface. In fact, it is
+ * expected that most nontrivial applications will make use of multiple
+ * ActionGroups. For example, in an application that can edit multiple
+ * documents, you would likely have one ActionGroup holding global Actions
+ * (e.g. quit, about, new), and one ActionGroup per document holding Actions
+ * that act on that document (eg. save, cut/copy/paste, etc). Each Window's
+ * Menus would be constructed from a combination of two ActionGroups.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+public class ActionGroup extends Object
+{
+    protected ActionGroup(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new ActionGroup.
+     * 
+     * @param name
+     *            TODO what the name is for? it seems only useful for
+     *            accelerator questions that we will expose in another way!
+     */
+    public ActionGroup(String name) {
+        super(GtkActionGroup.createActionGroup(name));
+    }
+
+    /**
+     * Sets whether Actions in this ActionGroup can respond to user events.
+     * 
+     * <p>
+     * Notice that both the Action itself and the ActionGroup need to be
+     * sensitive to actually allow the user to activate the Action. See
+     * {@link Action#setSensitive(boolean) Action.setSensitive()} for the
+     * other half of this equation.
+     */
+    public void setSensitive(boolean sensitive) {
+        GtkActionGroup.setSensitive(this, sensitive);
+    }
+
+    /**
+     * Whether this ActionGroup is sensitive, i.e., if its Actions can be
+     * activated by users. Take care that even if the ActionGroup is
+     * sensitive, any or all of its Actions may not be.
+     */
+    public boolean getSensitive() {
+        return GtkActionGroup.getSensitive(this);
+    }
+
+    /**
+     * Sets whether Actions in this ActionGroup are visible to the user.
+     * 
+     * <p>
+     * Notice that both the Action itself and the ActionGroup need to be
+     * visible in order the users can see them displayed on screen. See
+     * {@link Action#setVisible(boolean) Action.setVisible()} for the
+     * corresponding per-Action method.
+     */
+    public void setVisible(boolean visible) {
+        GtkActionGroup.setVisible(this, visible);
+    }
+
+    /**
+     * Get if this ActionGroup is visible for the user. Take care that even if
+     * the ActionGroup is visible, its Actions might not be.
+     */
+    public boolean getVisible() {
+        return GtkActionGroup.getVisible(this);
+    }
+
+    /**
+     * Adds an Action to this ActionGroup.
+     */
+    /*
+     * FIXME Gtk+ docs claim that this function can lead to problems if the
+     * user tries to modify the accelerator of a MenuItem associated with the
+     * Action. Thus, I'm tempted to map it to
+     * GtkActionGroup.addActionWithAccel, with a "" accelerator. Anyway, given
+     * that accelerators are not exposed yet, I will delay this discussion a
+     * bit.
+     */
+    public void addAction(Action action) {
+        GtkActionGroup.addAction(this, action);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Activatable.java b/src/bindings/org/gnome/gtk/Activatable.java
new file mode 100644
index 0000000..92ac775
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Activatable.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Widgets which have a notion of being activated.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.16
+ */
+public interface Activatable
+{
+    /**
+     * Set the Action that is triggered when this Activatable is activated.
+     * 
+     * <p>
+     * <i>This replaced Action's connectProxy().</i>
+     * 
+     * @since 4.0.16
+     */
+    public void setRelatedAction(Action action);
+
+    /**
+     * Get the Action that is triggered when this Activatable is activated, if
+     * any.
+     * 
+     * @since 4.0.16
+     */
+    public Action getRelatedAction();
+}
diff --git a/src/bindings/org/gnome/gtk/Adjustment.java b/src/bindings/org/gnome/gtk/Adjustment.java
new file mode 100644
index 0000000..5666025
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Adjustment.java
@@ -0,0 +1,291 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Srichand Pendyala
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * Data concerning a value with a pair of associated values that determine its
+ * lower and upper limits. Also, step and page increments as well as a page
+ * size are available. Adjustment is not a Widget itself; Adjustments are used
+ * by certain Widgets such as SpinButton, VScale and HScale, etc. More
+ * commonly, though, you encounter Adjustment objects as the mechanism
+ * controlling the position of VScrollbars and HScrollbars as seen in
+ * TreeView, TextView, and other Containers packed into a
+ * {@link ScrolledWindow}.
+ * 
+ * <p>
+ * A single Adjustment object can be shared by more than one Widget. Thus if
+ * you need to have multiple Widgets behave similarly with respect to say
+ * vertical scrolling, a single Adjustment object will do.
+ * 
+ * <p>
+ * An Adjustment does <i>not</i> update its own values. Associated Widgets
+ * that use an Adjustment call the <code>emitValueChanged()</code> method on
+ * the widget, causing a <code>Adjustment.ValueChanged</code> signal which in
+ * turn is what drives GTK's internal scrolling behaviours. You can react to
+ * it too.
+ * 
+ * @author Srichand Pendyala
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class Adjustment extends Object
+{
+    protected Adjustment(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Adjustment, with given values for the initial
+     * <var>value</var> value, the <var>lower</var> and <var>upper</var>
+     * bounds, the single <var>step increment</var>, <var>page increment</var>
+     * and the <var>page size</var> properties.
+     * 
+     * <p>
+     * Be aware that <code>pageSize</code> <b>must</b> be set to zero if this
+     * Adjustment is representing a single scalar value (ie, if it is going to
+     * be the Adjustment backing a SpinButton or Scale).
+     * 
+     * @since 4.0.5
+     */
+    public Adjustment(double value, double lower, double upper, double stepIncrement,
+            double pageIncrement, double pageSize) {
+        super(
+                GtkAdjustment.createAdjustment(value, lower, upper, stepIncrement, pageIncrement,
+                        pageSize));
+    }
+
+    /**
+     * Create an Adjustment with all parameters set to initial values of 0.
+     * 
+     * @since 4.0.10
+     */
+    public Adjustment() {
+        super(GtkAdjustment.createAdjustment(0, 0, 0, 0, 0, 0));
+    }
+
+    /**
+     * Get the current value of the Adjustment. This value is always
+     * guaranteed to lie between upper and lower. To set this value, see
+     * {@link #setValue(double) setValue()}.
+     * 
+     * @since 4.0.5
+     */
+    public double getValue() {
+        return GtkAdjustment.getValue(this);
+    }
+
+    /**
+     * Set the value of the Adjustment. This value is bounded between the
+     * <var>upper</var> and <var>lower</var> properties of the Adjustment. Any
+     * attempt to set the value outside of these bounds is ignored.
+     * 
+     * @since 4.0.5
+     */
+    public void setValue(double value) {
+        GtkAdjustment.setValue(this, value);
+    }
+
+    /**
+     * Change all the configuration values and the data value.
+     * 
+     * <p>
+     * This is available as as a single method rather than a series of
+     * individual setters because each invocation of a setter causes
+     * <code>Adjustment.Changed</code> to be emitted, and generally you'd only
+     * want one per sequence of property changes.
+     * 
+     * @since 4.0.17
+     */
+    public void configure(double value, double lower, double upper, double stepIncrement,
+            double pageIncrement, double pageSize) {
+        GtkAdjustment.configure(this, value, lower, upper, stepIncrement, pageIncrement, pageSize);
+    }
+
+    /**
+     * Update the Adjustment's value, to ensure that the bound, defined by
+     * <code>lower</code> and <code>upper</code>, is in the current page.
+     * Thus, it will lie between <code>value</code> and
+     * <code>value + pageSize</code> that you set in the constructor. If the
+     * bound is larger than the page size, then only the start of it will be
+     * in the current page.
+     * 
+     * <p>
+     * As always, a <code>Adjustment.ValueChanged</code> signal is emitted if
+     * the value is changed.
+     * 
+     * @since 4.0.5
+     */
+    public void clampPage(double lower, double upper) {
+        GtkAdjustment.clampPage(this, lower, upper);
+    }
+
+    /**
+     * Emits a <code>Adjustment.Changed</code> signal from the Adjustment
+     * widget. This method will typically be called by the Widget with which
+     * the Adjustment is associated when it changes any of Adjustment's
+     * properties, other than <var>value</var>.
+     * 
+     * <p>
+     * If you have changed <var>value</var>, then {@link #emitValueChanged()
+     * emitValueChanged()} is the method you want to change instead.
+     * 
+     * @since 4.0.8
+     */
+    public void emitChanged() {
+        GtkAdjustment.changed(this);
+    }
+
+    /**
+     * Emits a <code>Adjustment.ValueChanged</code> signal on the Adjustment.
+     * This method is probably unnecessary, since calling
+     * {@link #setValue(double) setValue()} will result in the signal being
+     * raised.
+     * 
+     * @since 4.0.8
+     */
+    public void emitValueChanged() {
+        GtkAdjustment.valueChanged(this);
+    }
+
+    /**
+     * This signal is emitted when one or more of Adjustment's fields, other
+     * than the <var>value</var> field have been changed. This will be emitted
+     * if you call the {@link #emitChanged() emitChanged()} method, but in
+     * general it is in response to actions taken by the Widget with which
+     * this Adjustment is associated.
+     * 
+     * @author Srichand Pendyala
+     * @since 4.0.5
+     */
+    public interface Changed extends GtkAdjustment.ChangedSignal
+    {
+        public void onChanged(Adjustment source);
+    }
+
+    /**
+     * Hook up an <code>Adjustment.Changed</code> signal handler.
+     */
+    public void connect(Changed handler) {
+        GtkAdjustment.connect(this, handler, false);
+    }
+
+    /**
+     * This signal is emitted when Adjustment's <var>value</var> field has
+     * been changed. This signal will be emitted if you call the
+     * {@link #emitValueChanged() emitValueChanged()} method, although more
+     * typically it is the result of changes by the Widget with which this
+     * Adjustment is associated.
+     * 
+     * @author Srichand Pendyala
+     * @since 4.0.5
+     */
+    public interface ValueChanged extends GtkAdjustment.ValueChangedSignal
+    {
+        public void onValueChanged(Adjustment source);
+    }
+
+    /**
+     * Hook up an <code>Adjustment.ValueChanged</code> signal handler.
+     * 
+     * @since 4.0.5
+     */
+    public void connect(ValueChanged handler) {
+        GtkAdjustment.connect(this, handler, false);
+    }
+
+    /**
+     * Get the <var>lower</var> bound of the Adjustment. This is the minimum
+     * value that the <var>value</var> property can range to. In a VScrollbar,
+     * it is the top end of the scrollbar trough, which you can reasonably
+     * expect to be <code>0</code>.
+     * 
+     * @since 4.0.10
+     */
+    public double getLower() {
+        return GtkAdjustment.getLower(this);
+    }
+
+    /**
+     * Set the <var>lower</var> bound of this Adjustment. Most of the time
+     * people start their ranges at <code>0.0</code> and leave it that way, so
+     * you probably won't need this much.
+     * 
+     * <p>
+     * Use {@link #configure(double, double, double, double, double, double)
+     * configure()} if changing more than one property at a time.
+     * 
+     * @since 4.0.17
+     */
+    public void setLower(double lower) {
+        GtkAdjustment.setLower(this, lower);
+    }
+
+    /**
+     * Get the <var>upper</var> bound of the Adjustment. This is the maximum
+     * value that the <var>value</var> property can range to. In a VScrollbar,
+     * it is the (maximum) height that is represents the value at the bottom
+     * end of the scrollbar trough.
+     * 
+     * @since 4.0.10
+     */
+    public double getUpper() {
+        return GtkAdjustment.getUpper(this);
+    }
+
+    /**
+     * Set the <var>upper</var> bound of this Adjustment.
+     * 
+     * <p>
+     * Use {@link #configure(double, double, double, double, double, double)
+     * configure()} if changing more than one property at a time.
+     * 
+     * @since 4.0.17
+     */
+    public void setUpper(double upper) {
+        GtkAdjustment.setUpper(this, upper);
+    }
+
+    /**
+     * Get the current value of the <var>page-size</var> property of this
+     * Adjustment. For a VScrollbar, this is the (vertical) height of the
+     * slider control.
+     * 
+     * @since 4.0.10
+     */
+    public double getPageSize() {
+        return GtkAdjustment.getPageSize(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Align.java b/src/bindings/org/gnome/gtk/Align.java
new file mode 100644
index 0000000..3d2a582
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Align.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants referring to the positioning of a Widget in its parent Container.
+ * See {@link Widget#setAlignHorizontal(Align) setAlignHorizontal()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.1.1
+ */
+public final class Align extends Constant
+{
+    private Align(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Expand to fill available space. This is the default behaviour.
+     * 
+     * @since 4.1.1
+     */
+    public static final Align FILL = new Align(GtkAlign.FILL, "FILL");
+
+    /**
+     * Top or Left.
+     * 
+     * @since 4.1.1
+     */
+    public static final Align START = new Align(GtkAlign.START, "START");
+
+    /**
+     * Bottom or Right.
+     * 
+     * @since 4.1.1
+     */
+    public static final Align END = new Align(GtkAlign.END, "END");
+
+    /**
+     * Position in the middle of the parent allocation.
+     * 
+     * @since 4.1.1
+     */
+    public static final Align CENTER = new Align(GtkAlign.CENTER, "CENTER");
+
+}
diff --git a/src/bindings/org/gnome/gtk/Alignment.java b/src/bindings/org/gnome/gtk/Alignment.java
new file mode 100644
index 0000000..17f68e9
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Alignment.java
@@ -0,0 +1,262 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Control the alignment and size of a child Widget. It has four settings:
+ * <var>xscale</var>, <var>yscale</var>, <var>xalign</var>, and
+ * <var>yalign</var>. You can also specify padding around the child.
+ * 
+ * <p>
+ * The alignment settings are used to place the child within the available
+ * area. The values range from <code>0.0f</code> (top or left) to
+ * <code>1.0f</code> (bottom or right).
+ * 
+ * <p>
+ * The scale settings are used to specify how much the child should expand to
+ * fill the space allocated to the Alignment. The values can range from
+ * <code>0.0f</code> (meaning the child doesn't expand at all) to
+ * <code>1.0f</code> (meaning the child will expand to fill all of the
+ * allocated space). If both scale settings are set to <code>1.0f</code>, the
+ * two alignment values will have no effect on the child Widget.
+ * 
+ * @author Nat Pryce
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class Alignment extends Bin
+{
+    protected Alignment(long pointer) {
+        super(pointer);
+    }
+
+    /*
+     * These constants are not necessary by any stretch of the imagination,
+     * but really they are the only cases you really use, and with static
+     * imports they can make one's code look a bit more meaningful.
+     */
+
+    /**
+     * Align to the left. A convenience constant for the value
+     * <code>0.0f</code>.
+     */
+    public static final float LEFT = 0.0f;
+
+    /**
+     * Align to the center. A convenience constant for the value
+     * <code>0.5f</code>.
+     */
+    public static final float CENTER = 0.5f;
+
+    /**
+     * Align to the right. A convenience constant for the value
+     * <code>1.0f</code>.
+     */
+    public static final float RIGHT = 1.0f;
+
+    /**
+     * Align to the top. A convenience constant for the value
+     * <code>0.0f</code>.
+     */
+    public static final float TOP = 0.0f;
+
+    /**
+     * Align to the bottom. A convenience constant for the value
+     * <code>1.0f</code>.
+     */
+    public static final float BOTTOM = 1.0f;
+
+    private static final float check(final float param) {
+        if ((param < 0.0) || (param > 1.0)) {
+            throw new IllegalArgumentException("Parameters must be between 0.0 and 1.0");
+        }
+        return param;
+    }
+
+    /**
+     * Creates an empty Alignment. The child Widget can later be added by
+     * calling the {@link Container#add(Widget) add()} method.
+     * 
+     * @since 4.0.4
+     */
+    public Alignment(float xalign, float yalign, float xscale, float yscale) {
+        this(GtkAlignment.createAlignment(check(xalign), check(yalign), check(xscale), check(yscale)));
+    }
+
+    /**
+     * Creates an empty Alignment. This is essentially a no-op; the Widget
+     * will be top/left which may well be what would have happened if you had
+     * not used an Alignment in the first place.
+     * 
+     * <p>
+     * This is here so that calling
+     * {@link #setAlignment(float, float, float, float) setAlignment()} after
+     * constructing looks a little cleaner. It's not more "efficient" to use
+     * this.
+     * 
+     * @since 4.0.17
+     */
+    public Alignment() {
+        this(GtkAlignment.createAlignment(Alignment.LEFT, Alignment.TOP, 0.0f, 0.0f));
+    }
+
+    /**
+     * Creates an Alignment wrapping an existing Widget.
+     * 
+     * @since 4.0.4
+     */
+    public Alignment(float xalign, float yalign, float xscale, float yscale, Widget child) {
+        this(GtkAlignment.createAlignment(check(xalign), check(yalign), check(xscale), check(yscale)));
+        add(child);
+    }
+
+    /**
+     * Set the padding on the different sides of the Widget. The padding adds
+     * blank space to the sides of the Widget. For instance, this can be used
+     * to indent the child towards the right by adding padding on the left.
+     * 
+     * <p>
+     * <b>WARNING</b><br>
+     * Pay close attention to the order of the sides; it might be different
+     * than you are expecting.
+     * 
+     * @since 4.0.4
+     */
+    public void setPadding(int paddingTop, int paddingBottom, int paddingLeft, int paddingRight) {
+        GtkAlignment.setPadding(this, paddingTop, paddingBottom, paddingLeft, paddingRight);
+    }
+
+    /**
+     * Returns the padding being added to the top of the child.
+     * 
+     * @since 4.0.4
+     */
+    public int getPaddingTop() {
+        int[] paddingTop = new int[1];
+        int[] paddingBottom = new int[1];
+        int[] paddingLeft = new int[1];
+        int[] paddingRight = new int[1];
+
+        GtkAlignment.getPadding(this, paddingTop, paddingBottom, paddingLeft, paddingRight);
+        return paddingTop[0];
+    }
+
+    /**
+     * Returns the padding being added below the bottom of the child.
+     */
+    public int getPaddingBottom() {
+        int[] paddingTop = new int[1];
+        int[] paddingBottom = new int[1];
+        int[] paddingLeft = new int[1];
+        int[] paddingRight = new int[1];
+
+        GtkAlignment.getPadding(this, paddingTop, paddingBottom, paddingLeft, paddingRight);
+        return paddingBottom[0];
+    }
+
+    /**
+     * Returns the padding being added to the left of the child.
+     * 
+     * @since 4.0.4
+     */
+    public int getPaddingLeft() {
+        int[] paddingTop = new int[1];
+        int[] paddingBottom = new int[1];
+        int[] paddingLeft = new int[1];
+        int[] paddingRight = new int[1];
+
+        GtkAlignment.getPadding(this, paddingTop, paddingBottom, paddingLeft, paddingRight);
+        return paddingLeft[0];
+    }
+
+    /**
+     * Returns the padding being added to the right of the child.
+     * 
+     * @since 4.0.4
+     */
+    public int getPaddingRight() {
+        int[] paddingTop = new int[1];
+        int[] paddingBottom = new int[1];
+        int[] paddingLeft = new int[1];
+        int[] paddingRight = new int[1];
+
+        GtkAlignment.getPadding(this, paddingTop, paddingBottom, paddingLeft, paddingRight);
+        return paddingRight[0];
+    }
+
+    /**
+     * Set the alignment and scale values. See the discussion at
+     * {@link Alignment top} for the interpretation of the values. All
+     * parameters must be within the range of <code>0.0f</code> to
+     * <code>1.0f</code>.
+     */
+    public void setAlignment(float xalign, float yalign, float xscale, float yscale) {
+        GtkAlignment.set(this, check(xalign), check(yalign), check(xscale), check(yscale));
+    }
+
+    /**
+     * Get the <var>xalign</var> value.
+     * 
+     * @since 4.0.4
+     */
+    public float getAlignmentX() {
+        return getPropertyFloat("xalign");
+    }
+
+    /**
+     * Get the <var>yalign</var> value.
+     * 
+     * @since 4.0.4
+     */
+    public float getAlignmentY() {
+        return getPropertyFloat("yalign");
+    }
+
+    /**
+     * Get the <var>xscale</var> value.
+     * 
+     * @since 4.0.4
+     */
+    public float getScaleX() {
+        return getPropertyFloat("xscale");
+    }
+
+    /**
+     * Get the <var>yscale</var> value.
+     * 
+     * @since 4.0.4
+     */
+    public float getScaleY() {
+        return getPropertyFloat("yscale");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Allocation.java b/src/bindings/org/gnome/gtk/Allocation.java
new file mode 100644
index 0000000..8b64e12
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Allocation.java
@@ -0,0 +1,105 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * An object with information about the size of the rectangle that has been
+ * allocated to a Widget and its position within its parent Container as a
+ * result of consideration of the Widget's size request. See Widget's
+ * {@link Widget#setSizeRequest(int, int) setSizeRequest()} for a more
+ * detailed discussion of the size request-allocation process. You get the
+ * Allocation currently given to a Widget with Widget's
+ * {@link Widget#getAllocation() getAllocation()}.
+ * 
+ * <p>
+ * Before the request-allocation process has occurred, you can expect this
+ * class to report a size of <code>1</code>x<code>1</code> at position
+ * <code>-1</code>,<code>-1</code>. You probably don't want to rely on those
+ * numbers; but that's what the initial values are.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class Allocation extends Boxed
+{
+    protected Allocation(long pointer) {
+        super(pointer);
+    }
+
+    Allocation() {
+        super(GtkAllocationOverride.createAllocation());
+    }
+
+    protected void release() {
+        GtkAllocationOverride.free(this);
+    }
+
+    /**
+     * The width that has been allocated.
+     */
+    public int getWidth() {
+        return GtkAllocation.getWidth(this);
+    }
+
+    /**
+     * The height that has been allocated.
+     */
+    public int getHeight() {
+        return GtkAllocation.getHeight(this);
+    }
+
+    /**
+     * The horizontal co-ordinate of the top left corner of the rectangle.
+     * This is relative to (ie, an offset from the top left corner of) the
+     * parent's Allocation).
+     */
+    public int getX() {
+        return GtkAllocation.getX(this);
+    }
+
+    /**
+     * The vertical co-ordinate of the top left corner of the rectangle. This
+     * is relative to (ie, an offset from the top left corner of) the parent's
+     * Allocation).
+     */
+    public int getY() {
+        return GtkAllocation.getY(this);
+    }
+
+    public String toString() {
+        return this.getClass().getName() + ": " + getWidth() + "x" + getHeight() + " at " + getX() + ","
+                + getY();
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AnchorType.java b/src/bindings/org/gnome/gtk/AnchorType.java
new file mode 100644
index 0000000..2c61680
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AnchorType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class AnchorType extends Constant
+{
+    private AnchorType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Application.java b/src/bindings/org/gnome/gtk/Application.java
new file mode 100644
index 0000000..07f4c3f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Application.java
@@ -0,0 +1,389 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.ApplicationCommandLine;
+import org.gnome.glib.ApplicationFlags;
+
+/**
+ * This class handles the lifecycle of a java-gnome application. It ensures
+ * that the application is unique and manages a list of top-level windows
+ * whose life-cycle is automatically tied to the life-cycle of the
+ * application.
+ * 
+ * <p>
+ * Applications are unique in your desktop session; once the program is
+ * running subsequent invocations of the binary will result in a signal being
+ * sent to the original, known as the "<var>primary</var>" instance.
+ * 
+ * <p>
+ * You can model several different program styles this way. A straight forward
+ * and common use is for subsequent invocations merely to "wake" the primary,
+ * perhaps bringing it to front. In this example, you start by constructing an
+ * Application object:
+ * 
+ * <pre>
+ * app = new Application("com.example.MasterControlProgram");
+ * </pre>
+ * 
+ * in this case "registering" the DBus name
+ * <code>com.example.MasterControlProgram</code> as the unique identifier for
+ * this application. As with a plain GTK program, you then enter the main
+ * loop, but instead of <code>Gtk.main()</code> you use Application's
+ * {@link #run(String[]) run()} to do so:
+ * 
+ * <pre>
+ * app.run(args);
+ * </pre>
+ * 
+ * <p>
+ * the original process blocks in this call (and runs a GTK main loop and your
+ * widgets start receiving event signals). Subsequent programs attempting to
+ * register that name (ie, this same code being run through a second time but
+ * by a different invocation of your program) will implicitly discover that
+ * they are <i>not</i> the <var>primary</var> instance; the <var>remote</var>
+ * will return from the call to <code>run()</code> although how fast this
+ * occurs depends on actions the <var>primary</var> takes.
+ * 
+ * <h2>Signals</h2>
+ * 
+ * <p>
+ * The <code>Application.Startup</code> will be fired once for an instance
+ * when it becomes <var>primary</var>. So, that's the place to put your UI
+ * setup code.
+ * 
+ * <p>
+ * <code>Application.Activate</code> will occurs when when Application's
+ * {@link #activate() activate()} is called. It is also raised when the
+ * primary begins running the first time if no flags were passed to the
+ * Application constructor.
+ * 
+ * <p>
+ * If the application has been configured as passing command line arguments
+ * from <var>remote</var> instances to the <var>primary</var>, then instead of
+ * <code>Application.Activate</code>, the <code>Application.CommandLine</code>
+ * signal will be raised on the <var>primary</var>. You can always call
+ * <code>activate()</code> from this handler thereby concentrating the code to
+ * deal with raising the UI there.
+ * 
+ * <h2>Life cycle</h2>
+ * 
+ * <p>
+ * For each principle GTK Window you create, call Application's
+ * {@link #addWindow(Window) addWindow()} and be sure to put a call to
+ * Application's {@link Application#removeWindow(Window) removeWindow()} in
+ * that Window's <code>Window.DeleteEvent</code> handler. The runtime system
+ * will keep track of these registered Windows; your application will
+ * terminate when the last one is destroyed.
+ * 
+ * <p>
+ * You can also call Application's {@link Application#quit() quit()} to exit
+ * the program.
+ * 
+ * <h2>Initialization</h2>
+ * 
+ * <p>
+ * The call to <code>Gtk.init()</code> or creating a
+ * <code>new Application()</code> <b>must</b> be the first thing done in your
+ * program.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ * @since 4.1.2
+ */
+public class Application extends org.gnome.glib.Application
+{
+    public Application(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new Application instance. The <code>id</code> needs to be a
+     * valid identifier, see
+     * {@link org.gnome.glib.Application#isValidID(String) isValidID()} for
+     * details. The <code>flags</code> argument allows you to specify
+     * different behaviour, marking this program as a
+     * {@link org.gnome.glib.ApplicationFlags#IS_LAUNCHER launcher} or
+     * {@link org.gnome.glib.ApplicationFlags#IS_SERVICE service}, for
+     * example.
+     * 
+     * @since 4.1.2
+     */
+    public Application(String id, ApplicationFlags flags) {
+        super(GtkApplication.createApplication(isValidId(id), flags));
+    }
+
+    /**
+     * Creates a new Application instance. The <code>id</code> must be a valid
+     * identifier; see {@link org.gnome.glib.Application#isValidID(String)
+     * isValidID()}. This id needs to be common between all instances of the
+     * application; it is what enables the uniqueness mechanism.
+     * 
+     * <p>
+     * This constructor implies a normal application with default uniqueness
+     * behaviour: first instance will become primary, subsequent instances
+     * will communicate activation to the primary then terminate.
+     * 
+     * @since 4.1.2
+     */
+    public Application(String id) {
+        super(GtkApplication.createApplication(isValidId(id), ApplicationFlags.NONE));
+    }
+
+    /**
+     * Adds a window from the Application. GTK+ will keep the Application
+     * running as long as it has any windows. The connection between the
+     * Application and the window will remain until the window is destroyed or
+     * {@link #removeWindow(Window) removeWindow()} is called.
+     * 
+     * @since 4.1.2
+     */
+    public void addWindow(Window window) {
+        GtkApplication.addWindow(this, window);
+    }
+
+    /**
+     * Removes a window from the Application. The Application will stop
+     * running if the last window is removed.
+     * 
+     * @since 4.1.2
+     */
+    public void removeWindow(Window window) {
+        GtkApplication.removeWindow(this, window);
+    }
+
+    /**
+     * Returns an array of the {@link Window windows} currently associated
+     * with Application.
+     * 
+     * @since 4.1.2
+     */
+    public Window[] getWindows() {
+        return GtkApplication.getWindows(this);
+    }
+
+    /**
+     * Inform the session manager that certain types of actions should be
+     * inhibited. This is not guaranteed to work on all platforms and for all
+     * types of actions.
+     * 
+     * <p>
+     * Applications should invoke this method when they begin an operation
+     * that should not be interrupted, such as creating a CD or DVD. The types
+     * of actions that may be blocked are specified by the <code>flags</code>
+     * parameter. When the application completes the operation it should call
+     * {@link #uninhibit(int) uninhibit()} to remove the inhibitor. Note that
+     * an application can have multiple inhibitors, and all of them must be
+     * individually removed. Inhibitors are also cleared when the application
+     * exits.
+     * 
+     * <p>
+     * Applications should not expect that they will always be able to block
+     * the action. In most cases, users will be given the option to force the
+     * action to take place.
+     * 
+     * <p>
+     * Reasons should be short and to the point. If <code>window</code> is not
+     * null, the session manager may point the user to this window to find out
+     * more about why the action is inhibited.
+     * 
+     * @since 4.1.3
+     */
+    public int inhibit(Window window, ApplicationInhibitFlags flags, String reason) {
+        return GtkApplication.inhibit(this, window, flags, reason);
+    }
+
+    /**
+     * Removes an inhibitor that has been established with
+     * {@link #inhibit(Window, ApplicationInhibitFlags, String) inhibit()}.
+     * Inhibitors are also cleared when the application exits.
+     * 
+     * @since 4.1.4
+     */
+    public void uninhibit(int cookie) {
+        GtkApplication.uninhibit(this, cookie);
+    }
+
+    /**
+     * Determines if any of the actions specified in <code>flags</code> are
+     * currently inhibited (possibly by another application).
+     * 
+     * @since 4.1.3
+     */
+    public boolean isInhibited(ApplicationInhibitFlags flags) {
+        return GtkApplication.isInhibited(this, flags);
+    }
+
+    /**
+     * This signal is emitted on the <var>primary</var> instance when an
+     * activation occurs. This is triggered by calling Application's
+     * {@link Application#activate() activate()} method, or, if the
+     * Application is in the {@link ApplicationFlags#NONE default} mode, when
+     * an instance starts.
+     * 
+     * <p>
+     * In the {@link ApplicationFlags#HANDLES_COMMAND_LINE command line} mode,
+     * see the {@link Application.CommandLine Application.CommandLine} signal
+     * is rasied instead.
+     * 
+     * @author Andrew Cowie
+     * @since 4.1.2
+     */
+    public interface Activate
+    {
+        public void onActivate(Application source);
+    }
+
+    private class ActivateHandler implements org.gnome.glib.Application.Activate
+    {
+        private final Activate handler;
+
+        private ActivateHandler(Activate handler) {
+            this.handler = handler;
+        }
+
+        public void onActivate(org.gnome.glib.Application source) {
+            handler.onActivate((org.gnome.gtk.Application) source);
+        }
+    }
+
+    /**
+     * Hook up the <code>Application.Activate</code> handler.
+     * 
+     * @since 4.1.2
+     */
+    public void connect(Application.Activate handler) {
+        super.connect(new ActivateHandler(handler));
+    }
+
+    /**
+     * This signal is emitted on the <var>primary</var> instance when any of
+     * the conditions starting the program are raised. This is a good place to
+     * put your UI intitialization logic.
+     * 
+     * @author Andrew Cowie
+     * @since 4.1.2
+     */
+    public interface Startup
+    {
+        public void onStartup(Application source);
+    }
+
+    private class StartupHandler implements org.gnome.glib.Application.Startup
+    {
+        private final Startup handler;
+
+        private StartupHandler(Startup handler) {
+            this.handler = handler;
+        }
+
+        public void onStartup(org.gnome.glib.Application source) {
+            handler.onStartup((org.gnome.gtk.Application) source);
+        }
+    }
+
+    /**
+     * Hook up the <code>Application.Startup</code> handler.
+     * 
+     * @since 4.1.2
+     */
+    public void connect(Application.Startup handler) {
+        super.connect(new StartupHandler(handler));
+    }
+
+    /**
+     * This signal is emitted on the <var>primary</var> instance when command
+     * line arguments are to be processed. Typical usage would be:
+     * 
+     * <pre>
+     * app.connect(new Application.CommandLine() {
+     *     public int onCommandLine(Application source, ApplicationCommandLine remote) {
+     *         final String[] args;
+     *         
+     *         args = remote.getArguments();
+     *         
+     *         // do stuff here in primary with the passed arguments
+     *         
+     *         remote.exit();
+     *         return 0;
+     *     }
+     * }
+     * </pre>
+     * 
+     * as ever, the name of a parameter in a method implenting an interface is
+     * arbitrary, but naming the ApplicationCommmandLine object
+     * <code>remote</code> makes the point that it represents the command line
+     * arguments being sent over the wire.
+     * 
+     * <p>
+     * When you handle this signal you need to specify the exit code that the
+     * invoking process should in turn return to the shell, ie:
+     * 
+     * <pre>
+     * s = app.run(args);
+     * System.exit(s);
+     * </pre>
+     * 
+     * @author Andrew Cowie
+     * @since 4.1.2
+     */
+    public interface CommandLine
+    {
+        public int onCommandLine(Application source, ApplicationCommandLine cmdline);
+    }
+
+    private class CommandLineHandler implements org.gnome.glib.Application.CommandLine
+    {
+        private final CommandLine handler;
+
+        private CommandLineHandler(CommandLine handler) {
+            this.handler = handler;
+        }
+
+        public int onCommandLine(org.gnome.glib.Application source, ApplicationCommandLine cmdline) {
+            return handler.onCommandLine((org.gnome.gtk.Application) source, cmdline);
+        }
+    }
+
+    /**
+     * Hook up the <code>Application.CommandLine</code> handler. This signal
+     * will only be raised if the Application was constructed with the
+     * {@link ApplicationFlags#HANDLES_COMMAND_LINE HANDLES_COMMAND_LINE}
+     * flag.
+     * 
+     * @since 4.1.2
+     */
+    public void connect(Application.CommandLine handler) {
+        super.connect(new CommandLineHandler(handler));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ApplicationInhibitFlags.java b/src/bindings/org/gnome/gtk/ApplicationInhibitFlags.java
new file mode 100644
index 0000000..421c99e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ApplicationInhibitFlags.java
@@ -0,0 +1,95 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Type of user actions that may be blocked by
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.3
+ */
+public class ApplicationInhibitFlags extends Flag
+{
+    private ApplicationInhibitFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Inhibit ending the user session by logging out or by shutting down the
+     * computer.
+     */
+    public static final ApplicationInhibitFlags LOGOUT = new ApplicationInhibitFlags(
+            GtkApplicationInhibitFlags.LOGOUT, "LOGOUT");
+
+    /**
+     * Inhibit user switching.
+     */
+    public static final ApplicationInhibitFlags SWITCH = new ApplicationInhibitFlags(
+            GtkApplicationInhibitFlags.SWITCH, "SWITCH");
+
+    /**
+     * Inhibit suspending the session or computer.
+     */
+    public static final ApplicationInhibitFlags SUSPEND = new ApplicationInhibitFlags(
+            GtkApplicationInhibitFlags.SUSPEND, "SUSPEND");
+
+    /**
+     * Inhibit the session being marked as idle (and possibly locked).
+     */
+    public static final ApplicationInhibitFlags IDLE = new ApplicationInhibitFlags(
+            GtkApplicationInhibitFlags.IDLE, "IDLE");
+
+    /**
+     * Combines several flags to inhibit several user actions with one
+     * inhibitor.
+     * 
+     * @since 4.1.3
+     */
+    public static ApplicationInhibitFlags or(ApplicationInhibitFlags... flags) {
+        ApplicationInhibitFlags flag;
+
+        if (flags.length < 2) {
+            throw new IllegalArgumentException("You must pass at least two flags to combine them.");
+        }
+
+        flag = flags[0];
+
+        for (int i = 1; i < flags.length; i++) {
+            flag = (ApplicationInhibitFlags) orTwoFlags(flag, flags[i]);
+        }
+
+        return flag;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Arrow.java b/src/bindings/org/gnome/gtk/Arrow.java
new file mode 100644
index 0000000..024a18e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Arrow.java
@@ -0,0 +1,125 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Arrow is a widget to draw simple arrows pointing to up, down, left, or
+ * right. Its style can be either bevelled inwards, bevelled outwards, sunken
+ * or raised. <img src="Arrow.png" class="snapshot">
+ * 
+ * @author Serkan Kaba
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * TODO Mention of defaults only makes sense if we have a no-arg constructor
+ * using those defaults.
+ */
+public class Arrow extends Misc
+{
+    protected Arrow(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Arrow widget with given direction and shadow type.
+     * 
+     * @since 4.0.10
+     */
+    public Arrow(ArrowType direction, ShadowType type) {
+        super(GtkArrow.createArrow(direction, type));
+    }
+
+    /**
+     * Sets the direction to one of {@link ArrowType#UP UP},
+     * {@link ArrowType#DOWN DOWN}, {@link ArrowType#LEFT LEFT},
+     * {@link ArrowType#RIGHT RIGHT}. There's also a special mode,
+     * {@link ArrowType#NONE NONE} which is an Arrow Widget but with no
+     * graphic presently drawn on it.
+     * 
+     * <p>
+     * The default is <code>RIGHT</code>.
+     * 
+     * @since 4.0.10
+     */
+    public void setArrowType(ArrowType direction) {
+        setPropertyEnum("arrow-type", direction);
+    }
+
+    /**
+     * Returns the direction of Arrow. See {@link #setArrowType(ArrowType)
+     * setArrowType()} for possible values.
+     * 
+     * @since 4.0.10
+     */
+    public ArrowType getArrowType() {
+        return (ArrowType) getPropertyEnum("arrow-type");
+    }
+
+    /**
+     * Sets the shadow type to one of {@link ShadowType#IN IN},
+     * {@link ShadowType#OUT OUT}, {@link ShadowType#ETCHED_IN ETCHED_IN} or
+     * {@link ShadowType#ETCHED_OUT ETCHED_OUT}.
+     * 
+     * <p>
+     * The default is <code>OUT</code>.
+     * 
+     * @since 4.0.10
+     */
+    public void setShadowType(ShadowType type) {
+        setPropertyEnum("shadow-type", type);
+    }
+
+    /**
+     * Returns the shadow type of Arrow. See
+     * {@link #setShadowType(ShadowType) setShadowType()} for possible values.
+     * 
+     * @since 4.0.10
+     */
+    public ShadowType getShadowType() {
+        return (ShadowType) getPropertyEnum("shadow-type");
+    }
+
+    /**
+     * Returns amount of spaced used by arrow in the widget. This is the
+     * <var>arrow-scaling</var> style property. Values will be in the range of
+     * <code>0.0</code> to <code>1.0</code>. Its default is <code>0.7</code>,
+     * though really, it's actual value will entirely be up to the theme
+     * engine.
+     * 
+     * @since 4.0.10
+     */
+    public float getArrowScaling() {
+        return getPropertyFloat("arrow-scaling");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ArrowType.java b/src/bindings/org/gnome/gtk/ArrowType.java
new file mode 100644
index 0000000..56ed326
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ArrowType.java
@@ -0,0 +1,81 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Used to indicate the direction in which the arrow graphic on an
+ * {@link Arrow} Widget will point.
+ * 
+ * @author Serkan Kaba
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class ArrowType extends Constant
+{
+    private ArrowType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Represents an upward pointing arrow.
+     */
+    public static final ArrowType UP = new ArrowType(GtkArrowType.UP, "UP");
+
+    /**
+     * Represents an downward pointing arrow.
+     */
+    public static final ArrowType DOWN = new ArrowType(GtkArrowType.DOWN, "DOWN");
+
+    /**
+     * Represents a left pointing arrow.
+     */
+    public static final ArrowType LEFT = new ArrowType(GtkArrowType.LEFT, "LEFT");
+
+    /**
+     * Represents an arrow pointing right.
+     */
+    public static final ArrowType RIGHT = new ArrowType(GtkArrowType.RIGHT, "RIGHT");
+
+    /**
+     * Don't draw an arrow.
+     * 
+     * <p>
+     * <code>NONE</code> is a special mode which causes an Arrow Widget to
+     * occupies the space that an normal Arrow would, but without having an
+     * arrow graphic drawn in it. This can be useful in cases where you are
+     * trying to normalize the size requests for a series of Widgets.
+     */
+    public static final ArrowType NONE = new ArrowType(GtkArrowType.NONE, "NONE");
+}
diff --git a/src/bindings/org/gnome/gtk/AspectFrame.java b/src/bindings/org/gnome/gtk/AspectFrame.java
new file mode 100644
index 0000000..3d255e2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AspectFrame.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class AspectFrame extends Frame
+{
+    protected AspectFrame(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Assistant.java b/src/bindings/org/gnome/gtk/Assistant.java
new file mode 100644
index 0000000..28d25de
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Assistant.java
@@ -0,0 +1,493 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * Guide a user through a multi-step operation one page at a time. You may
+ * recognize the name "wizard" or "druid"; GTK calls these Assistants.
+ * 
+ * <p>
+ * An Assistant contains of multiple pages. While each page is just a Widget
+ * of your choice, in most cases you will use a layout container as you would
+ * in creating a regular top level Window. Each page in the Assistant is
+ * marked as a specific type, set with
+ * {@link #setPageType(Widget, AssistantPageType) setPageType()}. Be aware
+ * that the last page of the Assistant must be of type
+ * {@link AssistantPageType#CONFIRM CONFIRM} or
+ * {@link AssistantPageType#SUMMARY SUMMARY}.
+ * 
+ * <p>
+ * You can hook to a number of signals which indicate user actions specific to
+ * the Assistant:
+ * 
+ * <ul>
+ * <li><code>Assistant.Apply</code> - The user activated the 'Apply' button on
+ * the page.</li>
+ * <li><code>Assistant.Cancel</code> - The user cancelled the Assistant.</li>
+ * <li><code>Assistant.Close</code> - The Assistant closes normally.</li>
+ * <li><code>Assistant.Prepare</code> - Another page is going to be displayed</li>
+ * </ul>
+ * 
+ * <p>
+ * Listening to the <code>Assistant.Prepare</code> signal allows you to modify
+ * the page contents in time, perhaps depending on input made on previous
+ * pages.
+ * 
+ * <p>
+ * You create the Assistant with a number of pages with most of them being of
+ * type CONTENT. To allow a user to go from one page to the next, the page
+ * must be flagged as <var>complete</var>. The 'Next' button will remain
+ * disabled until this property is set for that page. The definition of
+ * "complete" will necessarily depend on what you are doing on a given page,
+ * but typically you hook up to signals emitted from the Widgets inside the
+ * page and when contents have changed call
+ * {@link #setPageComplete(Widget, boolean) setPageComplete(true)}.
+ * 
+ * @author Stefan Prelle
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ * @since 4.0.9
+ */
+public class Assistant extends Window
+{
+    protected Assistant(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new instance of the Assistant.
+     * 
+     * @since 4.0.9
+     */
+    public Assistant() {
+        super(GtkAssistant.createAssistant());
+    }
+
+    /**
+     * Get the page number of the currently displayed page. Page numbers count
+     * from <code>0</code>. If the assistant has no pages, <code>-1</code>
+     * will be returned.
+     * 
+     * @since 4.0.9
+     */
+    public int getCurrentPage() {
+        return GtkAssistant.getCurrentPage(this);
+    }
+
+    /**
+     * Select the page to be displayed to the user.
+     * 
+     * @since 4.0.9
+     */
+    public void setCurrentPage(int pageNum) {
+        GtkAssistant.setCurrentPage(this, pageNum);
+    }
+
+    /**
+     * Get the number of pages in the Assistant.
+     * 
+     * @since 4.0.9
+     */
+    public int getNumPages() {
+        return GtkAssistant.getNPages(this);
+    }
+
+    /**
+     * Returns the child Widget contained in the given page.
+     * 
+     * @param pageNum
+     *            The index of a page in the assistant. Use <code>-1</code> to
+     *            get the last page.
+     * @since 4.0.9
+     */
+    public Widget getPage(int pageNum) {
+        final Widget result;
+
+        result = GtkAssistant.getNthPage(this, pageNum);
+
+        if (result == null) {
+            throw new IndexOutOfBoundsException("Illegal page number requested");
+        }
+        return result;
+    }
+
+    /**
+     * Prepend <code>page</code> to the existing pages in the Assistant.
+     * 
+     * @return the index (starting at 0) of the inserted page.
+     * @since 4.0.9
+     */
+    public int prependPage(Widget page) {
+        return GtkAssistant.prependPage(this, page);
+    }
+
+    /**
+     * Appends a page to the pages in the Assistant.
+     * 
+     * @param page
+     *            Page to add.
+     * @return the index (starting at 0) of the inserted page
+     * @since 4.0.9
+     */
+    public int appendPage(Widget page) {
+        return GtkAssistant.appendPage(this, page);
+    }
+
+    /**
+     * Places a page at a specific position between the pages already existing
+     * in the Assistant.
+     * 
+     * @param page
+     *            Page to add.
+     * @param position
+     *            The index (starting at <code>0</code>) at which to insert
+     *            the page, or <code>-1</code> to append the page to the
+     *            Assistant.
+     * @return The index (starting at <code>0</code>) of the inserted page.
+     * @since 4.0.9
+     */
+    public int insertPage(Widget page, int position) {
+        return GtkAssistant.insertPage(this, page, position);
+    }
+
+    /**
+     * Sets the <var>page-type</var> for the given page. This determines the
+     * page's behaviour in the Assistant; see {@link AssistantPageType}.
+     * 
+     * @since 4.0.9
+     */
+    public void setPageType(Widget page, AssistantPageType type) {
+        GtkAssistant.setPageType(this, page, type);
+    }
+
+    /**
+     * Get the type of the given Assistant page.
+     * 
+     * @since 4.0.9
+     */
+    public AssistantPageType getPageType(Widget page) {
+        return GtkAssistant.getPageType(this, page);
+    }
+
+    /**
+     * Sets the title for a given page. The title is displayed in the header
+     * area of the Assistant when page is the current page.
+     * 
+     * @since 4.0.9
+     */
+    public void setPageTitle(Widget page, String title) {
+        GtkAssistant.setPageTitle(this, page, title);
+    }
+
+    /**
+     * Obtains the title that has been set for a specific page.
+     * 
+     * @since 4.0.9
+     */
+    public String getPageTitle(Widget page) {
+        return GtkAssistant.getPageTitle(this, page);
+    }
+
+    /**
+     * Sets a header image for page. This image is displayed in the header
+     * area of the Assistant when <code>page</code> is the current page.
+     * 
+     * @param page
+     *            A page of assistant
+     * @param image
+     *            the new header image
+     * @since 4.0.9
+     */
+    public void setPageHeaderImage(Widget page, Pixbuf image) {
+        GtkAssistant.setPageHeaderImage(this, page, image);
+    }
+
+    /**
+     * Gets the header image for page.
+     * 
+     * @since 4.0.9
+     */
+    public Pixbuf getPageHeaderImage(Widget page) {
+        return GtkAssistant.getPageHeaderImage(this, page);
+    }
+
+    /**
+     * Sets a side image for page. This image is displayed in the side area of
+     * the assistant when <code>page</code> is the current page.
+     * 
+     * @param page
+     *            A page of assistant
+     * @param image
+     *            the new side image
+     * @since 4.0.9
+     */
+    public void setPageSideImage(Widget page, Pixbuf image) {
+        GtkAssistant.setPageSideImage(this, page, image);
+    }
+
+    /**
+     * Gets the side image for page.
+     * 
+     * @since 4.0.9
+     */
+    public Pixbuf getPageSideImage(Widget page) {
+        return GtkAssistant.getPageSideImage(this, page);
+    }
+
+    /**
+     * Sets whether page contents are complete. This will make assistant
+     * update the buttons state to be able to continue the task.
+     * 
+     * @since 4.0.9
+     */
+    public void setPageComplete(Widget page, boolean complete) {
+        GtkAssistant.setPageComplete(this, page, complete);
+    }
+
+    /**
+     * Gets whether page is complete.
+     * 
+     * @since 4.0.9
+     */
+    public boolean getPageComplete(Widget page) {
+        return GtkAssistant.getPageComplete(this, page);
+    }
+
+    /**
+     * Adds a widget to the action area of a Assistant.
+     * 
+     * @since 4.0.9
+     */
+    public void addActionWidget(Widget child) {
+        GtkAssistant.addActionWidget(this, child);
+    }
+
+    /**
+     * Removes a Widget that has been added with
+     * {@link #addActionWidget(Widget)}.
+     * 
+     * @since 4.0.9
+     */
+    public void removeActionWidget(Widget child) {
+        GtkAssistant.removeActionWidget(this, child);
+    }
+
+    /**
+     * Force the Assistant to recompute the buttons state. In most case, this
+     * method is not useful since GTK+ automatically takes care of this. But
+     * it might be necessary in some situations when changing a value on the
+     * current page.
+     * 
+     * @since 4.0.9
+     */
+    public void updateButtonsState() {
+        GtkAssistant.updateButtonsState(this);
+    }
+
+    /**
+     * Force the Assistant.ForwardPage signal to be emitted.
+     * 
+     * @since 4.0.17
+     */
+    public int emitForwardPage(int currentPage) {
+        return GtkAssistantOverride.emitForward(this, currentPage);
+    }
+
+    /**
+     * The signal emitted every time a page inside the assistant is displayed.
+     * This includes the first page as well as every page when flipping
+     * forward and backward through the Assistant's pages.
+     * 
+     * @since 4.0.9
+     */
+    public interface Prepare extends GtkAssistant.PrepareSignal
+    {
+        public void onPrepare(Assistant source, Widget page);
+    }
+
+    /**
+     * Hook up an <code>Assistant.Prepare</code> handler that is called when a
+     * new page is displayed.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(Assistant.Prepare handler) {
+        GtkAssistant.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when the user is on a <code>CONFIRM</code> page and
+     * confirms the input they have given.
+     * 
+     * @since 4.0.9
+     */
+    public interface Apply extends GtkAssistant.ApplySignal
+    {
+        public void onApply(Assistant source);
+    }
+
+    /**
+     * Hook up an <code>Assistant.Apply</code> handler that will be called
+     * when the user chooses to confirm their selections.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(Assistant.Apply handler) {
+        GtkAssistant.connect(this, handler, false);
+    }
+
+    /**
+     * This signal emitted at the end of the Assistant's life cycle. This is
+     * raised <i>after</i> the <code>Assistant.Apply</code> signal when the
+     * handler ends normally.
+     * 
+     * @since 4.0.9
+     */
+    public interface Close extends GtkAssistant.CloseSignal
+    {
+        public void onClose(Assistant source);
+    }
+
+    /**
+     * Attach a <code>Assistant.Close</code> handler that will be called when
+     * the Assistant is closed normally at a <code>CONFIRM</code> or
+     * <code>SUMMARY</code> page.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(Assistant.Close handler) {
+        GtkAssistant.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted if the user cancels the Assistant. This signal will
+     * be raised regardless of which page the user happens to be on when they
+     * cancel.
+     * 
+     * @since 4.0.9
+     */
+    public interface Cancel extends GtkAssistant.CancelSignal
+    {
+        public void onCancel(Assistant source);
+    }
+
+    /**
+     * Hook up an <code>Assistant.Cancel</code> handler will be called when
+     * the Assistant is cancelled.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(Assistant.Cancel handler) {
+        GtkAssistant.connect(this, handler, false);
+    }
+
+    /**
+     * The callback invoked when an Assistant wants to display another page.
+     * It helps you to determine what page to display after another one.
+     * 
+     * Generally, when you will receive the callback, you will check the
+     * number of the current page and then display the next page according to
+     * the previously found number.The behavior of a default Assistant can be
+     * written like that:
+     * 
+     * <pre>
+     * final Assistant assistant;
+     * 
+     * ...
+     * 
+     * assistant.setForwardPageCallback(new Assistant.ForwardPage() {
+     *     public int onForward(Assistant source, int current) {
+     *         return (current + 1);
+     *     }
+     * });
+     * </pre>
+     * 
+     * <p>
+     * <i>If you are researching the GTK API documentation, see
+     * <code>(*GtkAssistantPageFunc)</code>. Creating and invoking this
+     * "forward" signal is how java-gnome has implemented the function pointer
+     * expected by <code>gtk_assistant_set_forward_page_func()</code>.</i>
+     * 
+     * @since 4.0.17
+     */
+    public interface ForwardPage extends GtkAssistant.ForwardSignal
+    {
+        public int onForward(Assistant source, int currentPage);
+    }
+
+    /**
+     * Hookup the <code>Assistant.ForwardPage</code> callback that will be
+     * used to determine what page should be displayed when
+     * <code>[Forward]</code> is pressed.
+     * 
+     * @since 4.0.17
+     */
+    public void setForwardPageCallback(Assistant.ForwardPage callback) {
+        GtkAssistantOverride.setForwardFunc(this);
+        GtkAssistant.connect(this, callback, false);
+    }
+
+    /*
+     * Performs a sanity check whether you thought about having a CONFIRM or
+     * SUMMARY page at your last page in the assistant.
+     */
+    void checkReadyForDisplay() {
+        final Widget lastPage;
+        final AssistantPageType type;
+
+        lastPage = getPage(getNumPages() - 1);
+        type = getPageType(lastPage);
+
+        if ((type != AssistantPageType.CONFIRM) && (type != AssistantPageType.SUMMARY)) {
+            throw new IllegalArgumentException("Last page must be of type CONFIRM or SUMMARY");
+        }
+    }
+
+    /*
+     * Override Widget to performs additional sanity checks.
+     */
+    public void show() {
+        checkReadyForDisplay();
+        super.show();
+    }
+
+    /*
+     * Override Widget to performs additional sanity checks.
+     */
+    public void showAll() {
+        checkReadyForDisplay();
+        super.showAll();
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/AssistantPageType.java b/src/bindings/org/gnome/gtk/AssistantPageType.java
new file mode 100644
index 0000000..bc81663
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AssistantPageType.java
@@ -0,0 +1,88 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Used for determining the page role inside the {@link Assistant}. It's used
+ * to handle buttons sensitivity and visibility.
+ * 
+ * <p>
+ * Note that an assistant needs to end its page flow with a page of type
+ * {@link #CONFIRM CONFIRM} or {@link #SUMMARY SUMMARY} to be correct.
+ * 
+ * @author Stefan Prelle
+ * @since 4.0.8
+ */
+public final class AssistantPageType extends Constant
+{
+    private AssistantPageType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The page has regular contents. It provides a 'Cancel','Back'
+     */
+    public static final AssistantPageType CONTENT = new AssistantPageType(GtkAssistantPageType.CONTENT,
+            "CONTENT");
+
+    /**
+     * The page contains an introduction to the assistant task.
+     */
+    public static final AssistantPageType INTRO = new AssistantPageType(GtkAssistantPageType.INTRO,
+            "INTRO");
+
+    /**
+     * The page lets the user confirm or deny the changes. It provides a
+     * 'Cancel', 'Back' and 'Apply' button.
+     */
+    public static final AssistantPageType CONFIRM = new AssistantPageType(GtkAssistantPageType.CONFIRM,
+            "CONFIRM");
+
+    /**
+     * The page informs the user of the changes done. It provides a 'Close'
+     * button.
+     */
+    public static final AssistantPageType SUMMARY = new AssistantPageType(GtkAssistantPageType.SUMMARY,
+            "SUMMARY");
+
+    /**
+     * Used for tasks that take a long time to complete, blocks the assistant
+     * until the page is marked as complete with
+     * {@link Assistant#setPageComplete(Widget, boolean) setPageComplete()}
+     */
+    public static final AssistantPageType PROGRESS = new AssistantPageType(
+            GtkAssistantPageType.PROGRESS, "PROGRESS");
+
+}
diff --git a/src/bindings/org/gnome/gtk/AttachOptions.java b/src/bindings/org/gnome/gtk/AttachOptions.java
new file mode 100644
index 0000000..0637062
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/AttachOptions.java
@@ -0,0 +1,90 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Using AttachOptions you control how a Widget placed in a {@link Table} uses
+ * eventually existing additional space, e.g. because another cell in the same
+ * row is much wider or another column much higher.
+ * <p>
+ * It may be necessary to encapsulate your attached Widget in an
+ * {@link Alignment} container. This could look like this:
+ * </p>
+ * 
+ * <pre>
+ * Table table;
+ * ...
+ * TextEntry number = new TextEntry();
+ * number.setWidthChars(4);
+ * Alignment alignNumber = new Alignment(Alignment.LEFT, Alignment.CENTER, 0,0, number);
+ * table.attach(alignNumber, 1, 2, 1, 2, AttachOptions.FILL, AttachOptions.SHRINK, 0,0);
+ * </pre>
+ * 
+ * @since 4.0.10
+ */
+public final class AttachOptions extends Constant
+{
+    private AttachOptions(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Although there is additional space available, the Widget shall keep its
+     * size or even shrink if possible. This usually gets the extra space
+     * distributed evenly among the widget, so you have the Widget centered in
+     * the extra space.
+     * <p>
+     * Encapsulating the Widget in an {@link Alignment} container does not
+     * help, since the Alignment container only gets the same space granted
+     * the shrinked Widget would get.
+     * </p>
+     */
+    public static final AttachOptions SHRINK = new AttachOptions(GtkAttachOptions.SHRINK, "SHRINK");
+
+    /**
+     * The widget gets all the available space. Unless you put the widget
+     * inside an {@link Alignment} container, the Widget is resized to fill
+     * the space. If you do use Alignment containers the Widget itself will
+     * not grow, but keep its size while the container controls where it
+     * resides.
+     */
+    public static final AttachOptions FILL = new AttachOptions(GtkAttachOptions.FILL, "FILL");
+
+    /**
+     * Like FILL, but also causes the cell to expand and use extra space.
+     */
+    public static final AttachOptions EXPAND = new AttachOptions(GtkAttachOptions.EXPAND, "EXPAND");
+
+}
diff --git a/src/bindings/org/gnome/gtk/Bin.java b/src/bindings/org/gnome/gtk/Bin.java
new file mode 100644
index 0000000..9fd3498
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Bin.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Container with only one child Widget.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public abstract class Bin extends Container
+{
+
+    protected Bin(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the child widget of Bin. The return value is either a Widget, if a
+     * child exists, or <code>null</code> if one doesn't.
+     */
+    public Widget getChild() {
+        return GtkBin.getChild(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Border.java b/src/bindings/org/gnome/gtk/Border.java
new file mode 100644
index 0000000..638a3b0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Border.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Border extends Boxed
+{
+    protected Border(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Box.java b/src/bindings/org/gnome/gtk/Box.java
new file mode 100644
index 0000000..771ac8b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Box.java
@@ -0,0 +1,169 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Base class for Containers which organize a variable number of Widgets into
+ * a rectangular area. This is either a single row of child Widgets (in the
+ * case of {@link HBox HBox}), or a single column (for the case of
+ * {@link VBox VBox}). All the children of a Box are allocated one dimension
+ * in common, being the height of a row, or the width of a column,
+ * respectively.
+ * 
+ * <p>
+ * Nested combinations of VBoxes and HBoxes are the cornerstone layout
+ * technique used in GTK. A top level VBox to organize a Window is followed by
+ * a sequence Widgets, many of which will end up being HBoxes, and each of
+ * those in turn might contain further Containers. This sort of thing gives
+ * you great flexibility when laying out your user interface.
+ * 
+ * <p>
+ * Boxes are also used to enable grouping of Widgets at very small scales as
+ * well. For example, the ok Button you see in every GNOME dialog is actually
+ * an Image holding the icon and a Label with the text "OK" packed into an
+ * HBox; the HBox is what was actually added to the Button!
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.1
+ */
+public class Box extends Container implements Orientable
+{
+    protected Box(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Box of the given orientation and specifying a default
+     * spacing. See also the original Widgets {@link HBox} and {@link VBox}.
+     * 
+     * @since 4.1.1
+     */
+    public Box(Orientation orientation, int spacing) {
+        super(GtkBox.createBox(orientation, spacing));
+    }
+
+    /**
+     * Add a Widget to the beginning of the Box. Widget child will be ordered
+     * after any other Widgets that have already been packed with respect to
+     * the start of the Box, but before any Widgets that are packed at the end
+     * of the Box with {@link #packEnd(Widget) packEnd()}.
+     * 
+     * @param child
+     *            the Widget to be added
+     * @param expand
+     *            Whether the new <code>child</code> is to be given extra
+     *            space allocated to Box. The extra space will be divided
+     *            evenly between all children of this Box that were added with
+     *            <code>expand</code> set to <code>true</code>.
+     * @param fill
+     *            Whether space given to <code>child</code> by the
+     *            <code>expand</code> option is actually allocated to child.
+     *            If you specify <code>false</code> here, then any extra space
+     *            will pad the Widget, rather than causing it to grow larger.
+     * @param padding
+     *            extra space (in pixels) to put between this child and its
+     *            neighbours. This is over and above the global amount of
+     *            padding that was specified by the <code>spacing</code>
+     *            parameter when the Box was constructed. If
+     *            <code>child</code> is the Widget at one of the start of the
+     *            Box, then <code>padding</code> pixels are also put between
+     *            the Widget and the leading edge.
+     * @since 4.0.1
+     */
+    public void packStart(Widget child, boolean expand, boolean fill, int padding) {
+        GtkBox.packStart(this, child, expand, fill, padding);
+    }
+
+    /**
+     * Add a Widget to the end of the Box. The parameters work the same as for
+     * {@link #packStart(Widget, boolean, boolean, int) packStart()}, but note
+     * that Widgets packed with respect to the end will pack <i>inwards</i>
+     * from the end, closer to the middle than Widgets already added with
+     * <code>packEnd()</code>.
+     * 
+     * @since 4.0.6
+     */
+    public void packEnd(Widget child, boolean expand, boolean fill, int padding) {
+        GtkBox.packEnd(this, child, expand, fill, padding);
+    }
+
+    /**
+     * Change the position of a Widget in the Box. The child will still be
+     * packed with respect to the beginning (if
+     * {@link #packStart(Widget, boolean, boolean, int) packStart()} was used)
+     * or end (if {@link #packEnd(Widget, boolean, boolean, int) packEnd()}
+     * was used) of the Box, and will be placed just after the Widget at
+     * <code>position</code>.
+     * 
+     * @since 4.0.8
+     */
+    public void reorderChild(Widget child, int position) {
+        GtkBox.reorderChild(this, child, position);
+    }
+
+    /**
+     * Set the amount of spacing between the Widgets in the Box. The spacing
+     * is measured in pixels. By default this is <code>0</code>, but is
+     * actually whatever was set in the {@link HBox#HBox(boolean, int) HBox}
+     * or {@link VBox#VBox(boolean, int) VBox} constructor.
+     * 
+     * <p>
+     * Allowed values are <code>0</code> or greater.
+     * 
+     * @since 4.0.11
+     */
+    public void setSpacing(int spacing) {
+        if (spacing < 0) {
+            throw new IllegalArgumentException("spacing must be >= 0");
+        }
+        GtkBox.setSpacing(this, spacing);
+    }
+
+    /**
+     * Returns the amount of spacing that is set to be places between the
+     * Widgets that are in the Box. The amount is measured in pixels.
+     * 
+     * @since 4.0.11
+     */
+    public int getSpacing() {
+        return GtkBox.getSpacing(this);
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Builder.java b/src/bindings/org/gnome/gtk/Builder.java
new file mode 100644
index 0000000..15ded1b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Builder.java
@@ -0,0 +1,139 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.text.ParseException;
+
+import org.gnome.glib.GlibException;
+import org.gnome.glib.Object;
+
+/**
+ * A tool to load Glade User Interface description files and instantiate the
+ * objects therein as a GTK Widgets and Objects.
+ * 
+ * <p>
+ * Note that this is the replacement for the GNOME 2 "libglade" library, but
+ * you still use the <b><code>Glade</code></b> UI designer to create
+ * GtkBuilder <code>.ui</code> files.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.20
+ */
+public class Builder extends Object
+{
+    protected Builder(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new Builder tree.
+     * 
+     * @since 4.0.20
+     */
+    public Builder() {
+        super(GtkBuilder.createBuilder());
+    }
+
+    /**
+     * Merge the infromation from the given <code>.ui</code> file into the
+     * current Builder tree.
+     * 
+     * @throws ParseException
+     *             The underlying GtkBuilder library was unable to process the
+     *             User Interface description in the given file.
+     * @throws FileNotFoundException
+     * 
+     * @since 4.0.20
+     */
+    /*
+     * You might regard it as somewhat excessive to test the file here, but
+     * path errors (or rather, assumptions about what the current working
+     * directory is turning out to wildly wrong) are so common that we help
+     * out beginners by guarding.
+     */
+    public void addFromFile(String filename) throws FileNotFoundException, ParseException {
+        final File target;
+
+        if (filename == null) {
+            throw new IllegalArgumentException();
+        }
+
+        target = new File(filename);
+
+        if (!target.exists()) {
+            throw new FileNotFoundException("\nCan't find the specified Glade UI file:\n"
+                    + target.getAbsolutePath());
+        }
+        if (!target.canRead()) {
+            throw new FileNotFoundException("\nThe specified Glade UI file,\n"
+                    + target.getAbsolutePath() + "\nis not readable");
+        }
+
+        try {
+            GtkBuilder.addFromFile(this, filename);
+        } catch (GlibException e) {
+            throw new ParseException(e.getMessage(), 0);
+        }
+    }
+
+    /**
+     * Merge the infromation from the given <code>.ui</code> file into the
+     * current Builder tree.
+     * 
+     * @throws ParseException
+     *             The underlying GtkBuilder library was unable to process the
+     *             User Interface description in the given string.
+     * @since 4.0.20
+     */
+    public void addFromString(String buffer) throws ParseException {
+        try {
+            GtkBuilder.addFromString(this, buffer, -1);
+        } catch (GlibException e) {
+            throw new ParseException(e.getMessage(), 0);
+        }
+    }
+
+    /**
+     * Get the Object corresponding to the given name.
+     * 
+     * @since 4.0.20
+     */
+    public Object getObject(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException();
+        }
+        return GtkBuilder.getObject(this, name);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Button.java b/src/bindings/org/gnome/gtk/Button.java
new file mode 100644
index 0000000..a11331e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Button.java
@@ -0,0 +1,384 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Widget that emits a signal when clicked on. Button can hold any just
+ * about any other Widget as its child. The most commonly used child is a
+ * Label, and there are convenience methods to help you just create a button
+ * with the given text automatically, notably the
+ * {@link Button#Button(String) Button(String)} constructor. <img
+ * src="Button.png" class="snapshot">
+ * 
+ * <p>
+ * Since Button is a Bin it strictly only has one child. Internally, however,
+ * it may have both an icon image and some text (which is the look commonly
+ * seen in the action buttons in Dialog boxes). You can add such an image to a
+ * Button by calling {@link #setImage(Image) setImage()}; this works alongside
+ * and with {@link #setLabel(String) setLabel()}. The machinery within Button
+ * will manage creating the necessary internal structure (HBoxes, Alignments,
+ * etc).
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @author Mario Torre
+ * @since 4.0.0
+ */
+public class Button extends Bin implements Activatable
+{
+    protected Button(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create an "empty" button to use as a Container. You'll need to
+     * {@link org.gnome.gtk.Container#add(Widget) add()} the Widget which will
+     * be the Button's child.
+     * 
+     * <p>
+     * For most uses {@link #setImage(Image) setImage()} and
+     * {@link #setLabel(String) setLabel()} will more than take care of
+     * things; they can be used together.
+     * 
+     * @since 4.0.0
+     */
+    public Button() {
+        super(GtkButton.createButton());
+    }
+
+    /**
+     * Create a button with a Label as its child. Simply specify the text you
+     * want for the Label and a Button will be created accordingly. This is
+     * quite a common case - in fact, we're generally more used to thinking of
+     * Buttons as being Labels that you can press than as arbitrary Widget
+     * Containers.
+     * 
+     * <p>
+     * Note that you <i>can</i> use {@link #setImage(Image) setImage()} on a
+     * Button created this way.
+     * 
+     * @param text
+     *            the text you wish on the Label that will be created in the
+     *            Button.
+     * @since 4.0.0
+     */
+    public Button(String text) {
+        super(GtkButton.createButtonWithMnemonic(text));
+    }
+
+    /**
+     * Create a new Button with a Label and Image from a StockItem. By using a
+     * system StockItem, the newly created Button with use the same Label and
+     * Image as other GNOME applications. To ensure consistent look-n-feel
+     * between applications, it is highly recommend that you use provided
+     * StockItems whenever possible.
+     * 
+     * @param stock
+     *            The stock item that will determine the text and icon of the
+     *            Button.
+     * @since 4.0.4
+     */
+    public Button(Stock stock) {
+        super(GtkButton.createButtonFromStock(stock.getStockId()));
+    }
+
+    /**
+     * Set the text showing in the Button.
+     * 
+     * <p>
+     * If you created an empty Button without a Label using {@link #Button()
+     * Button()}, this will create a Label nested in an Alignment for you.
+     * That <i>won't</i> work if you create an empty Button then put a custom
+     * Widget in place with {@link Container#add(Widget) add()} instead of
+     * employing this method and/or {@link #setImage(Image) setImage()}).
+     * 
+     * @since 4.0.0
+     */
+    public void setLabel(String text) {
+        GtkButton.setLabel(this, text);
+    }
+
+    /**
+     * Get the text showing on the Button.
+     * 
+     * @return the text of the Label, or <code>null</code> if the no-arg
+     *         constructor was used and you've just got an arbitrary
+     *         Widget-containing-Button, not the more usual Button-with-Label.
+     * @since 4.0.0
+     */
+    public String getLabel() {
+        return GtkButton.getLabel(this);
+    }
+
+    /**
+     * Paint an arbitrary Image over this Button. If this is used on an empty
+     * Button then the Button will be the size of the Image and will what is
+     * activatable. On the other hand, you <i>can</i> use this in conjunction
+     * with {@link #setLabel(String) setLabel()} in which case you will get an
+     * icon on the left and the label text on the right.
+     * 
+     * @since 4.0.5
+     */
+    public void setImage(Image image) {
+        GtkButton.setImage(this, image);
+    }
+
+    /**
+     * Get the Image associated with this Button.
+     * 
+     * @return the Widget associated with this Button using the
+     *         {@link #setImage(Image) setImage()} method, or
+     *         <code>null</code> if the Button doesn't have one set.
+     * 
+     * @since 4.0.5
+     */
+    public Image getImage() {
+        return (Image) GtkButton.getImage(this);
+    }
+
+    /**
+     * Get the horizontal alignment of the child Widget within this Button.
+     * The return will range from 0.0 (full left) to 1.0 (full right).
+     */
+    public float getAlignmentX() {
+        float[] x = new float[1];
+        float[] y = new float[1];
+
+        GtkButton.getAlignment(this, x, y);
+
+        return x[0];
+    }
+
+    /**
+     * Get the vertical alignment of the child Widget within this Button. The
+     * return will range from 0.0 (top) to 1.0 (bottom).
+     */
+    public float getAlignmentY() {
+        float[] x = new float[1];
+        float[] y = new float[1];
+
+        GtkButton.getAlignment(this, x, y);
+
+        return y[0];
+    }
+
+    /**
+     * Set the alignment of the child Widget within the Button. This has no
+     * impact unless the child of the Button is a Misc (which of course the
+     * default child, a Label, is).
+     * 
+     * @param xalign
+     *            from 0.0f representing fully left-aligned through 1.0f
+     *            representing fully right-aligned.
+     * @param yalign
+     *            from 0.0f for fully top-aligned through 1.0f for fully
+     *            bottom-aligned
+     */
+    public void setAlignment(float xalign, float yalign) {
+        GtkButton.setAlignment(this, xalign, yalign);
+    }
+
+    /**
+     * Set the "relief" style used to determine how the edges of this Button
+     * will be decorated. The default is {@link ReliefStyle#NORMAL NORMAL}
+     * which results in a Button just as you would expect, screaming out to be
+     * pressed! There are two other variations, see {@link ReliefStyle} for
+     * details.
+     * 
+     * @since 4.0.1
+     */
+    public void setRelief(ReliefStyle style) {
+        GtkButton.setRelief(this, style);
+    }
+
+    /**
+     * Get the relief style in use around this Button.
+     * 
+     * @since 4.0.1
+     */
+    public ReliefStyle getRelief() {
+        return GtkButton.getRelief(this);
+    }
+
+    /**
+     * Event generated when a user presses and releases a button, causing it
+     * to activate.
+     * 
+     * <p>
+     * <i>When the mouse is used to click on a Button this signal will be
+     * emitted, but only if the cursor is still in the Button when the mouse
+     * button is released. You're probably used to this behaviour without
+     * realizing it.</i>
+     * 
+     * <h2>All about signal handling</h2>
+     * 
+     * <h3>Use an anonymous inner class</h3>
+     * 
+     * <p>
+     * In general, the way that java-gnome is intended to be used is for you
+     * to create an anonymous inner class right where you call the
+     * <code>connect()</code> method to hook up the signal. A typical example
+     * is as follows:
+     * 
+     * <pre>
+     * final Button b;
+     * 
+     * b.connect(new Button.Clicked() {
+     *     public void onClicked(Button source) {
+     *         doSomething();
+     *     }
+     * }
+     * </pre>
+     * 
+     * This is the form we recommend; it has the advantage that your handler
+     * code is close to the code that declares and configures the Widget.
+     * Also, if variables are declared <code>final</code> then you can access
+     * them from within the nested anonymous class, and that makes things easy
+     * indeed.
+     * 
+     * <h3>Using a concrete instance</h3>
+     * 
+     * <p>
+     * If you have more complex code, perhaps that you need to reuse across
+     * several Widgets, then you can of course create a concrete class that
+     * implements Button.Clicked and then use instances of it if you have
+     * highly complicated algorithms to implement:
+     * 
+     * <pre>
+     * class ComplexHandler implements Button.Clicked
+     * {
+     *     private int field;
+     * 
+     *     ComplexHandler(int param) {
+     *         this.field = param;
+     *     }
+     * 
+     *     public void onClicked(Button source) {
+     *         doSomethingVeryComplicatedWith(field);
+     *     }
+     * }
+     * </pre>
+     * 
+     * and then when you construct the Button:
+     * 
+     * <pre>
+     * b = new Button();
+     * b.connect(new ComplexHandler(42));
+     * </pre>
+     * 
+     * You can just as easily declare one and reuse it if you want to apply
+     * the same logic to a series of Button; this is where the
+     * <code>source</code> parameter that every signal callback signature
+     * includes.
+     * 
+     * <pre>
+     * final ComplexHandler handler;
+     * 
+     * handler = new ComplexHandler(42);
+     * ...
+     * b1.connect(handler);
+     * b2.connect(handler);
+     * b3.connect(handler);
+     * ...
+     * </pre>
+     * 
+     * <h3>Self-delegation</h3>
+     * 
+     * <p>
+     * If you implement Button.Clicked in the class you're currently working
+     * on, then you use a technique called "self-delegation" which can be
+     * useful in certain circumstances:
+     * 
+     * <pre>
+     * b.connect(this);
+     * </pre>
+     * 
+     * This has disadvantage that you can only have one
+     * <code>onClicked()</code> method in your class, so if you have lots of
+     * Buttons then you lose the benefit of being able to connect different
+     * handlers to different Buttons.
+     * 
+     * <p>
+     * We recommend you use anonymous inner classes in-place whenever
+     * possible. In our experience, having the handler logic next to the code
+     * that declares an instance dramatically improves readability.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.0
+     */
+    public interface Clicked extends GtkButton.ClickedSignal
+    {
+        public void onClicked(Button source);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Button.Clicked</code> events on this
+     * Button. See {@link Button.Clicked} for a detailed discussion of how to
+     * connect signals.
+     * 
+     * @since 4.0.0
+     */
+    public void connect(Clicked handler) {
+        GtkButton.connect(this, handler, false);
+    }
+
+    /**
+     * Cause a <code>Button.Clicked</code> signal to be emitted.
+     * 
+     * @since 4.0.6
+     */
+    public void emitClicked() {
+        GtkButton.clicked(this);
+    }
+
+    /**
+     * Set whether clicking the Button will cause the Button to grab the
+     * focus. The default is <code>true</code>, the behaviour you're
+     * accustomed to with regular Buttons. Setting this to <code>false</code>
+     * is only used in unusual situations like toolboxes where you don't want
+     * to steal focus away from where the main action is taking place.
+     * 
+     * @since 4.0.8
+     */
+    public void setFocusOnClick(boolean setting) {
+        GtkButton.setFocusOnClick(this, setting);
+    }
+
+    public void setRelatedAction(Action action) {
+        GtkActivatable.setRelatedAction(this, action);
+    }
+
+    public Action getRelatedAction() {
+        return GtkActivatable.getRelatedAction(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ButtonBox.java b/src/bindings/org/gnome/gtk/ButtonBox.java
new file mode 100644
index 0000000..83035c6
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ButtonBox.java
@@ -0,0 +1,137 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Provide a consistent layout of Buttons throughout your application. Use an
+ * {@link HButtonBox} to lay buttons out horizontally or a {@link VButtonBox}
+ * to lay buttons out vertically.
+ * 
+ * <p>
+ * Buttons are packed into a ButtonBox the same way widgets are added to any
+ * other Container, using {@link Container#add(Widget) add()}. You can also
+ * use Box's {@link Box#packStart(Widget) packStart()} or
+ * {@link Box#packEnd(Widget) packEnd()}, but for ButtonBoxes both these
+ * functions work just like <code>add()</code>, ie., they pack the button in a
+ * way that depends on the current layout style and on whether the button has
+ * had {@link ButtonBox#setChildSecondary(Widget, boolean)
+ * setChildSecondary()} called for it.
+ * 
+ * <p>
+ * The layout/spacing can be altered in a programmatic way in order to alter
+ * the 'feel' of a program to a small degree, although in general overriding
+ * the defaults used by every other application on the desktop will impact the
+ * user's experience and so is not recommended. If you do need to make
+ * adjustments, the arrangement and layout of the Buttons can be changed with
+ * {@link #setLayout(ButtonBoxStyle) setLayout()}.
+ * 
+ * @author Nat Pryce
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+/*
+ * TODO it seems that the methods to control spacing even more minutely were
+ * deprecated. I'm guessing that's because they were moved up to Box or
+ * Container? If so, and if we expose them, then we should add a reference to
+ * the appropriate place in the last paragraph above.
+ */
+public abstract class ButtonBox extends Box
+{
+    protected ButtonBox(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Returns whether <var>child</var> should appear in a secondary group of
+     * children.
+     * 
+     * @param child
+     *            a widget that is a child of this button box
+     * @return whether child should appear in a secondary group of children
+     */
+    public boolean getChildSecondary(Widget child) {
+        return GtkButtonBox.getChildSecondary(this, child);
+    }
+
+    /**
+     * Sets whether <code>child</code> should appear in the "secondary" group
+     * of children. A typical use of the secondary child mechanism is to place
+     * the 'Help' Button in a Dialog; placing it on the far left side while
+     * the 'Ok' and 'Cancel' Buttons are on the far right.
+     * 
+     * <p>
+     * The secondary group appears after the other children if the
+     * ButtonBoxStyle is {@link ButtonBoxStyle#START START},
+     * {@link ButtonBoxStyle#SPREAD SPREAD}, or {@link ButtonBoxStyle#EDGE
+     * EDGE}, and before the other children if the it is
+     * {@link ButtonBoxStyle#END END}. For horizontal ButtonBoxes, the
+     * definition of before/after depends on direction in place (see
+     * {@link Widget#setDirection(TextDirection) setDirection()} on Widget).
+     * If the style is {@link ButtonBoxStyle#START START} or
+     * {@link ButtonBoxStyle#END END}, then the secondary children are aligned
+     * at the other end of the ButtonBox from the main children. For the other
+     * styles, they appear immediately next to the main children.
+     * 
+     * @param child
+     *            a Widget that is a child of this ButtonBox
+     * @param isSecondary
+     *            if <code>true</code>, the child appears in a secondary group
+     *            of the ButtonBox
+     */
+    /*
+     * TODO what happens if child is not already added to this Box? If that is
+     * an error condition, then we need to check for it in code here before
+     * making the actual setChildSecondary() call.
+     */
+    public void setChildSecondary(Widget child, boolean isSecondary) {
+        GtkButtonBox.setChildSecondary(this, child, isSecondary);
+    }
+
+    /**
+     * Change the way the child Buttons are arranged in this ButtonBox. See
+     * {@link ButtonBoxStyle} for the list of possible constants; and see also
+     * {@link #setChildSecondary(Widget, boolean) setChildSecondary()} for
+     * discussion of the impact of these different possibilities.
+     */
+    public void setLayout(ButtonBoxStyle layout) {
+        GtkButtonBox.setLayout(this, layout);
+    }
+
+    /**
+     * Returns the method currently being used to govern arrangement child
+     * Buttons in this ButtonBox.
+     */
+    public ButtonBoxStyle getLayout() {
+        return GtkButtonBox.getLayout(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ButtonBoxStyle.java b/src/bindings/org/gnome/gtk/ButtonBoxStyle.java
new file mode 100644
index 0000000..309163c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ButtonBoxStyle.java
@@ -0,0 +1,88 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Control layout of Buttons in a {@link ButtonBox}. In general you shouldn't
+ * need to use this too much; in GNOME we leave presentation style decisions
+ * up to the the theme engine currently selected by the user.
+ * 
+ * @author Nat Pryce
+ * @see HButtonBox
+ * @see VButtonBox
+ * @since 4.0.4
+ */
+public final class ButtonBoxStyle extends Constant
+{
+    /**
+     * Default packing, allowing the theme engine to control the presentation
+     * of ButtonBoxes.
+     */
+    public static final ButtonBoxStyle DEFAULT_STYLE = new ButtonBoxStyle(
+            GtkButtonBoxStyle.DEFAULT_STYLE, "DEFAULT_STYLE");
+
+    /**
+     * Buttons are to be evenly spread across the Box.
+     */
+    public static final ButtonBoxStyle SPREAD = new ButtonBoxStyle(GtkButtonBoxStyle.SPREAD, "SPREAD");
+
+    /**
+     * Buttons are to be placed at the edges of the Box.
+     */
+    public static final ButtonBoxStyle EDGE = new ButtonBoxStyle(GtkButtonBoxStyle.EDGE, "EDGE");
+
+    /**
+     * Buttons are to be grouped towards the start of the box (on the left for
+     * a HButtonBox, or the top for a VButtonBox).
+     */
+    public static final ButtonBoxStyle START = new ButtonBoxStyle(GtkButtonBoxStyle.START, "START");
+
+    /**
+     * Buttons are to be grouped towards the end of the box (on the right for
+     * a HButtonBox, or the bottom for a VButtonBox).
+     */
+    public static final ButtonBoxStyle END = new ButtonBoxStyle(GtkButtonBoxStyle.END, "END");
+
+    /**
+     * Buttons are to be grouped in the center of the box.
+     * 
+     * @since 4.0.16
+     */
+    public static final ButtonBoxStyle CENTER = new ButtonBoxStyle(GtkButtonBoxStyle.CENTER, "CENTER");
+
+    private ButtonBoxStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ButtonsType.java b/src/bindings/org/gnome/gtk/ButtonsType.java
new file mode 100644
index 0000000..571e534
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ButtonsType.java
@@ -0,0 +1,106 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Specify that a predefined set of Buttons should be used for a
+ * {@link MessageDialog MessageDialog}.
+ * 
+ * When you use one of these ButtonsType, each automatically constructed
+ * Button is automatically associated with its corresponding ResponseType.
+ * 
+ * <p>
+ * If none of these choices represented by the constants in this class are
+ * appropriate, use {@link #NONE NONE} and then call the
+ * {@link MessageDialog#addButton(String, ResponseType) addButton()} methods
+ * manually. You can also specify your own response codes by subclassing
+ * {@link ResponseType}.
+ * 
+ * @author Vreixo Formoso
+ * @version 4.0.5
+ */
+public final class ButtonsType extends Constant
+{
+    private ButtonsType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No Buttons at all. Used when none of these choices are suitable for
+     * your needs and you want to add your own Buttons instead.
+     */
+    public static final ButtonsType NONE = new ButtonsType(GtkButtonsType.NONE, "NONE");
+
+    /**
+     * A single "Ok" Button. Use this for MessageDialogs that present an
+     * information message to which that the user can acknowledge but to which
+     * they can take no other action.
+     */
+    public static final ButtonsType OK = new ButtonsType(GtkButtonsType.OK, "OK");
+
+    /**
+     * A single "Close" Button. In most cases (ie, information providing
+     * Dialogs) the {@link #OK OK} Button is a better alternative, but
+     * <code>CLOSE</code> is the appropriate choice for preferences Dialogs
+     * where the settings are automatically applied.
+     */
+    public static final ButtonsType CLOSE = new ButtonsType(GtkButtonsType.CLOSE, "CLOSE");
+
+    /**
+     * A single "Cancel" Button.
+     * 
+     * <p>
+     * If you intend to use a MessageDialog with only a <code>CANCEL</code>
+     * Button in order to give the user the ability to interrupt a long
+     * running task, you should also include a {@link ProgressBar ProgressBar}
+     * in the Dialog showing the status of the task so far.
+     */
+    public static final ButtonsType CANCEL = new ButtonsType(GtkButtonsType.CANCEL, "CANCEL");
+
+    /**
+     * The MessageDialog will have two Buttons, "Yes" and "No". Use this when
+     * the Dialog asks something to the user. Note that the {@link #OK_CANCEL
+     * OK_CANCEL} may be a better alternative if you want a confirmation to
+     * start some task.
+     */
+    public static final ButtonsType YES_NO = new ButtonsType(GtkButtonsType.YES_NO, "YES_NO");
+
+    /**
+     * The MessageDialog will have two Buttons, "Ok" and "Cancel". Use this
+     * for Dialogs that ask for confirmation or that alert about warning
+     * situations that can be avoided.
+     */
+    public static final ButtonsType OK_CANCEL = new ButtonsType(GtkButtonsType.OK_CANCEL, "OK_CANCEL");
+}
diff --git a/src/bindings/org/gnome/gtk/Calendar.java b/src/bindings/org/gnome/gtk/Calendar.java
new file mode 100644
index 0000000..9fc5df5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Calendar.java
@@ -0,0 +1,231 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Displays a monthly calendar with which users select a date. <img
+ * src="Calendar.png" class="snapshot">
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * This was initially bound to expose and test Flags behaviour. It still lacks
+ * many necessary methods before it will become usable.
+ */
+public class Calendar extends Widget
+{
+    protected Calendar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new Calendar instance.
+     */
+    public Calendar() {
+        super(GtkCalendar.createCalendar());
+    }
+
+    /**
+     * Sets the various options which control the details of how this Calendar
+     * is to be displayed. See the constants in {@link CalendarDisplayOptions}
+     * for details.
+     */
+    public void setDisplayOptions(CalendarDisplayOptions flags) {
+        GtkCalendar.setDisplayOptions(this, flags);
+    }
+
+    /**
+     * Returns the Flags object describing the current options enabled in this
+     * Calendar.
+     */
+    public CalendarDisplayOptions getDisplayOptions() {
+        return GtkCalendar.getDisplayOptions(this);
+    }
+
+    /**
+     * Get the year of the date currently selected in this Calendar. See
+     * companion methods {@link #getDateMonth() getDateMonth()} and
+     * {@link #getDateDay() getDateDay()} for the other components of the
+     * date.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * I hate out parameters
+     */
+    public int getDateYear() {
+        final int[] year;
+
+        year = new int[1];
+
+        GtkCalendar.getDate(this, year, null, null);
+
+        return year[0];
+    }
+
+    /**
+     * Get the month of the date currently selected in this Calendar. See
+     * companion methods {@link #getDateYear() getDateYear()} and
+     * {@link #getDateDay() getDateDay()} for the other components of the
+     * date.
+     * 
+     * @return the numerical month, from <code>1</code> to <code>12</code>.
+     * 
+     * @since 4.0.6
+     */
+    public int getDateMonth() {
+        final int[] month;
+
+        month = new int[1];
+
+        GtkCalendar.getDate(this, null, month, null);
+
+        return month[0] + 1;
+    }
+
+    /**
+     * Get the day of the date currently selected in this Calendar. See
+     * companion methods {@link #getDateYear() getDateYear()} and
+     * {@link #getDateMonth() getDateMonth()} for the other components of the
+     * date.
+     * 
+     * @since 4.0.6
+     */
+    public int getDateDay() {
+        final int[] day;
+        day = new int[1];
+
+        GtkCalendar.getDate(this, null, null, day);
+
+        return day[0];
+    }
+
+    /**
+     * Change the month (and year) showing on this Calendar. See
+     * {@link #selectDay(int) selectDay()} to change the day that is selected.
+     * 
+     * @param month
+     *            is in the range of <code>1</code> (January) to
+     *            <code>12</code> (December).
+     * @param year
+     *            a four-digit year.
+     * @since 4.0.6
+     */
+    /*
+     * As it happens, this is for either historical reasons or reasons of
+     * sheer obfuscation, GTK uses the range 0-11 for months but 1-31 for
+     * days. That's all a bit silly. Present it in human terms in our API.
+     */
+    public void selectMonth(int month, int year) {
+        if ((month < 1) || (month > 12)) {
+            throw new IllegalArgumentException("The month must be in the range 1-12");
+        }
+        GtkCalendar.selectMonth(this, month - 1, year);
+    }
+
+    /**
+     * Select the day showing on this Calendar. See
+     * {@link #selectMonth(int, int) selectMonth()} to change the month and
+     * year.
+     * 
+     * @param day
+     *            should be in the range of <code>1</code> to <code>31</code>.
+     *            Passing <code>0</code> will unselect the day.
+     * @since 4.0.6
+     */
+    public void selectDay(int day) {
+        if ((day < 0) || (day > 31)) {
+            throw new IllegalArgumentException("The day must be in the range 1-31, or 0");
+        }
+        GtkCalendar.selectDay(this, day);
+    }
+
+    /**
+     * Signal emitted when the user double clicks on one of the days showing
+     * in the Calendar.
+     * 
+     * <p>
+     * See the {@link Calendar.DaySelected} signal for the single click
+     * equivalent.
+     * 
+     * <p>
+     * <i>This is used in preference to manipulating individual button press
+     * events as the Calendar Widget itself handles those events and
+     * translates the positional co-ordinates relative the graphic displayed
+     * into a date.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface DaySelectedDoubleClick extends GtkCalendar.DaySelectedDoubleClickSignal
+    {
+        void onDaySelectedDoubleClick(Calendar source);
+    }
+
+    /**
+     * Hook up a handler for <code>Calendar.DaySelectedDoubleClick</code>
+     * signals.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Calendar.DaySelectedDoubleClick handler) {
+        GtkCalendar.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when the user selects on one of the days showing in the
+     * Calendar.
+     * 
+     * <p>
+     * See {@link Calendar.DaySelectedDoubleClick} for the signal emitted when
+     * the user double clicks on a given day.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface DaySelected extends GtkCalendar.DaySelectedSignal
+    {
+        void onDaySelected(Calendar source);
+    }
+
+    /**
+     * Hook up a handler for <code>Calendar.DaySelected</code> signals.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Calendar.DaySelected handler) {
+        GtkCalendar.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CalendarDisplayOptions.java b/src/bindings/org/gnome/gtk/CalendarDisplayOptions.java
new file mode 100644
index 0000000..eb7e518
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CalendarDisplayOptions.java
@@ -0,0 +1,97 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * These options are used to modify the display and behaviour of a
+ * {@link Calendar} Widget.
+ * 
+ * <p>
+ * You can specify one or several of these using the method
+ * {@link Calendar#setDisplayOptions(CalendarDisplayOptions)
+ * setDisplayOptions()} in Calendar.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.3
+ */
+public final class CalendarDisplayOptions extends Flag
+{
+    private CalendarDisplayOptions(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * When set the Calendar will display a heading showing with the current
+     * year and month.
+     * 
+     * <p>
+     * So long as {@link #NO_MONTH_CHANGE} is not specified, the user can
+     * change both the month and the year shown in the Calendar using little
+     * arrows that will appear in the header.
+     */
+    public final static CalendarDisplayOptions SHOW_HEADING = new CalendarDisplayOptions(
+            GtkCalendarDisplayOptions.SHOW_HEADING, "SHOW_HEADING");
+
+    /**
+     * Whether to show the names of the days in the Calendar. The default is
+     * for them not to appear.
+     */
+    public final static CalendarDisplayOptions SHOW_DAY_NAMES = new CalendarDisplayOptions(
+            GtkCalendarDisplayOptions.SHOW_DAY_NAMES, "SHOW_DAY_NAMES");
+
+    /**
+     * Prevents the user from switching months (and years) with the Calendar
+     * widget, forcing it to display only whichever month has been set by the
+     * programmer.
+     */
+    public final static CalendarDisplayOptions NO_MONTH_CHANGE = new CalendarDisplayOptions(
+            GtkCalendarDisplayOptions.NO_MONTH_CHANGE, "NO_MONTH_CHANGE");
+
+    /**
+     * Displays the week number (relative to the start of the current year)
+     * down the left side of the Calendar.
+     */
+    public final static CalendarDisplayOptions SHOW_WEEK_NUMBERS = new CalendarDisplayOptions(
+            GtkCalendarDisplayOptions.SHOW_WEEK_NUMBERS, "SHOW_WEEK_NUMBERS");
+
+    /**
+     * Returns a CalendarDisplayOptions object that contains all options
+     * specified by the two given arguments. It can be thought as the logical
+     * OR between the two Flags.
+     */
+    public static CalendarDisplayOptions or(CalendarDisplayOptions one, CalendarDisplayOptions two) {
+        return (CalendarDisplayOptions) Flag.orTwoFlags(one, two);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellEditable.java b/src/bindings/org/gnome/gtk/CellEditable.java
new file mode 100644
index 0000000..9cf9457
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellEditable.java
@@ -0,0 +1,43 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * User interface controls where text can be edited.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public interface CellEditable
+{
+}
diff --git a/src/bindings/org/gnome/gtk/CellLayout.java b/src/bindings/org/gnome/gtk/CellLayout.java
new file mode 100644
index 0000000..97590ed
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellLayout.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Classes which CellRenderers can be packed into. The most common use of this
+ * interface is when TreeViewColumns are appended to TreeViews and then passed
+ * to the various CellRenderer constructors.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public interface CellLayout
+{
+}
diff --git a/src/bindings/org/gnome/gtk/CellRenderer.java b/src/bindings/org/gnome/gtk/CellRenderer.java
new file mode 100644
index 0000000..2454785
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRenderer.java
@@ -0,0 +1,181 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * Present data in CellLayouts (ie, the TreeViewColumns of TreeView, and
+ * ComboBox).
+ * 
+ * <p>
+ * Note that there is not one CellRenderer per individual cell in the
+ * table-like presentation of a TreeView! Instead, a CellRenderer is an engine
+ * called upon to draw <i>many</i> cells. The Widget employing them will, by
+ * turn, set various properties (the actual data for the current cell in
+ * question would be what changes, though most of the rest of the properties
+ * would likely remain constant) and then ask the CellRenderer to return the
+ * rendered result.
+ * 
+ * <p>
+ * You will see two types of setters in CellRenderers. The most important ones
+ * are those that take a DataColumn for an argument, and will adjust that
+ * property of the CellRenderer for each row of the model based on the value
+ * of the specified column.
+ * 
+ * <p>
+ * While the whole point of the CellRenderers is to present the data from a
+ * given column of your data model, CellRenderers also offer a considerable
+ * number of properties that you <i>don't</i> need to vary row by row but want
+ * to set for the TreeViewColumn as a whole. For these you will notice a a
+ * setter which takes a conventional type as its argument; setting this
+ * property will set it for all rows in that column. (Occasionally you will
+ * see the setter for a property overloaded to offer you both a DataColumn
+ * driven mode and a fixed value mode for the rare occasions where both styles
+ * are useful, but in general it's fairly obvious that you use a property one
+ * way or the other).
+ * 
+ * <p>
+ * It's easy to be tempted into thinking that CellRenderers are Widgets,
+ * especially as they get <code>pack()</code>ed into TreeViewColumns on their
+ * way to being used in TreeViews. They are, however, merely utility elements
+ * that are used to facilitate drawing, and <i>not</i> full power Widgets.
+ * 
+ * <p>
+ * Do not try to reuse a CellRenderer between different TreeViewColumns.
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @since 4.0.5
+ */
+/*
+ * Injunction about reuse from Kristian Rietveld
+ */
+public abstract class CellRenderer extends Object
+{
+    /*
+     * No <init>(long) only constructor implies that you can't get one of
+     * these via objectFor() if it wasn't instantiated Java side. No problem;
+     * it's not like LibGlade does that for you, although GtkBuilder might
+     * someday (in which case you'd have to add logic to figure out which
+     * TreeViewColumn had had this CellRenderer packed into it).
+     */
+
+    /**
+     * The one (and only) TreeViewColumn this CellRenderer has been packed
+     * into. Used by the set<Attribute>() methods.
+     */
+    protected CellLayout vertical;
+
+    /**
+     * Once you've constructed a CellRenderer and tied it to TreeViewColumn by
+     * doing so (ie the way we have designed it), you can't reuse it, which is
+     * why there's no <code>setVertical()</code>.
+     * 
+     * <p>
+     * In case you hadn't noticed yet, TreeViewColumn is a CellLayout.
+     */
+    protected CellRenderer(long pointer, CellLayout vertical, boolean expand) {
+        super(pointer);
+
+        if (vertical == null) {
+            throw new IllegalArgumentException(
+                    "Must pass an instantiated TreeViewColumn to the CellRenderer constructor");
+        }
+
+        GtkCellLayout.packStart(vertical, this, expand);
+
+        this.vertical = vertical;
+    }
+
+    /**
+     * Set the alignment of this CellRenderer in the TreeViewColumn.
+     */
+    /*
+     * Both at once matches the signature found in Button and Misc
+     */
+    public void setAlignment(float xalign, float yalign) {
+        setPropertyFloat("xalign", xalign);
+        setPropertyFloat("yalign", yalign);
+    }
+
+    /**
+     * Indicate the DataColumn containing the name of the colour to use as
+     * background for this CellRenderer. You can set the background
+     * dynamically with TreeModel data via this method, or set it statically
+     * once via the other {@link #setBackground(String) setBackground()}
+     * overload.
+     */
+    /*
+     * Note that we have exposed the "cell-background" property with the name
+     * setBackground(), thereby eclipsing the use of CellRendererText's
+     * "background" property as setBackground(). After extensive tests and
+     * discussions with the GTK hackers, it would seem there is never an
+     * occasion where you want to set the background of the text renderer but
+     * not the cell as a whole. So combine them for the result of a cleaner
+     * API.
+     */
+    public void setBackground(DataColumnString column) {
+        GtkCellLayout.addAttribute(vertical, this, "cell-background", column.getOrdinal());
+    }
+
+    /**
+     * Set the background colour to be used by this CellRenderer for all the
+     * rows it draws.
+     */
+    public void setBackground(String colour) {
+        setPropertyString("cell-background", colour);
+    }
+
+    /**
+     * Indicate if the CellRenderer should be visible, depending on the
+     * content of a DataColumnBoolean. For example, you could set use this
+     * property to control whether or not a {@link CellRendererToggle} was
+     * visible in a TreeView where you want each of the leaf rows to have such
+     * a Button but you do not want the parent node rows to have one.
+     * 
+     * @since 4.0.9
+     */
+    public void setVisible(DataColumnBoolean column) {
+        GtkCellLayout.addAttribute(vertical, this, "visible", column.getOrdinal());
+    }
+
+    /**
+     * Fix the width of this CellRenderer, specified in pixels.
+     * 
+     * @since 4.0.20
+     */
+    public void setWidth(int width) {
+        setPropertyInteger("width", width);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererAccel.java b/src/bindings/org/gnome/gtk/CellRendererAccel.java
new file mode 100644
index 0000000..26bc600
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererAccel.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * Renderer a keyboard accelerator in text form in a TreeViewColumn. TODO What
+ * on earth is this for outside of <code>gconf-editor</code>? Sigh.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class CellRendererAccel extends CellRendererText
+{
+    /*
+     * FIXME constructor stub to permit compilation, although this should be
+     * correct.
+     */
+    public CellRendererAccel(CellLayout vertical) {
+        super(GtkCellRendererAccel.createCellRendererAccel(), vertical);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererAccelMode.java b/src/bindings/org/gnome/gtk/CellRendererAccelMode.java
new file mode 100644
index 0000000..cd76a66
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererAccelMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CellRendererAccelMode extends Constant
+{
+    private CellRendererAccelMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererCombo.java b/src/bindings/org/gnome/gtk/CellRendererCombo.java
new file mode 100644
index 0000000..f6b00a3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererCombo.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class CellRendererCombo extends CellRendererText
+{
+    protected CellRendererCombo(TreeViewColumn vertical) {
+        super(GtkCellRendererCombo.createCellRendererCombo(), vertical);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererMode.java b/src/bindings/org/gnome/gtk/CellRendererMode.java
new file mode 100644
index 0000000..8e23b4b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CellRendererMode extends Constant
+{
+    private CellRendererMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererPixbuf.java b/src/bindings/org/gnome/gtk/CellRendererPixbuf.java
new file mode 100644
index 0000000..8ab019f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererPixbuf.java
@@ -0,0 +1,80 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Display an image in a TreeView. The image data is sourced either from a
+ * DataColumn of type {@link DataColumnPixbuf DataColumnPixbuf} in your
+ * TreeModel, or from a DataColumn of type {@link DataColumnStock
+ * DataColumnStock}.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ */
+public class CellRendererPixbuf extends CellRenderer
+{
+    /**
+     * Construct a new CellRendererPixbuf.
+     */
+    public CellRendererPixbuf(CellLayout vertical) {
+        super(GtkCellRendererPixbuf.createCellRendererPixbuf(), vertical, false);
+    }
+
+    /**
+     * Indicate the DataColumn containing the Pixbuf to render as an image.
+     */
+    public void setPixbuf(DataColumnPixbuf column) {
+        GtkCellLayout.addAttribute(vertical, this, "pixbuf", column.getOrdinal());
+    }
+
+    /**
+     * Indicate the DataColumn containing a Stock icon which you want to have
+     * this CellRendererPixbuf render as an image.
+     * 
+     * @since 4.0.7
+     */
+    public void setStock(DataColumnStock column) {
+        GtkCellLayout.addAttribute(vertical, this, "stock-id", column.getOrdinal());
+    }
+
+    /**
+     * Indicate the DataColumn containing a named Icon which you want to have
+     * this CellRendererPixbuf render as an image.
+     * 
+     * @since 4.0.17
+     */
+    public void setIcon(DataColumnIcon column) {
+        GtkCellLayout.addAttribute(vertical, this, "icon-name", column.getOrdinal());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererProgress.java b/src/bindings/org/gnome/gtk/CellRendererProgress.java
new file mode 100644
index 0000000..08dc56b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererProgress.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Renderer a progress indicator similar to a ProgressBar in a TreeViewColumn.
+ * 
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ * @since 4.0.12
+ */
+public class CellRendererProgress extends CellRenderer
+{
+    /**
+     * Construct a new CellRendererPixbuf.
+     * 
+     * @since 4.0.17
+     */
+    public CellRendererProgress(CellLayout vertical) {
+        super(GtkCellRendererProgress.createCellRendererProgress(), vertical, true);
+    }
+
+    /**
+     * Indicate the DataColumn containing the plain text to render on the
+     * progress indicator. See ProgressBar's
+     * {@link ProgressBar#setText(String) setText()}.
+     * 
+     * @since 4.0.12
+     */
+    public void setText(DataColumnString column) {
+        GtkCellLayout.addAttribute(vertical, this, "text", column.getOrdinal());
+    }
+
+    /**
+     * Indicate the DataColumn containing the percentage complete to show in
+     * the indicator.
+     * 
+     * <p>
+     * Percentage complete is expressed in the range of <code>0</code> to
+     * <code>100</code>.
+     * 
+     * <p>
+     * <i>Note that for some reason this was not implemented in GTK like
+     * ProgressBar's <var>fraction</var> property, where percentage complete
+     * is expressed as a double between <code>0.0</code> and <code>1.0</code>
+     * !</i>
+     * 
+     * @since 4.0.12
+     */
+    public void setValue(DataColumnInteger column) {
+        GtkCellLayout.addAttribute(vertical, this, "value", column.getOrdinal());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererSpin.java b/src/bindings/org/gnome/gtk/CellRendererSpin.java
new file mode 100644
index 0000000..d915e53
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererSpin.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class CellRendererSpin extends CellRendererText
+{
+    protected CellRendererSpin(TreeViewColumn vertical) {
+        super(GtkCellRendererSpin.createCellRendererSpin(), vertical);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererSpinner.java b/src/bindings/org/gnome/gtk/CellRendererSpinner.java
new file mode 100644
index 0000000..ed3b5c0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererSpinner.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class CellRendererSpinner extends CellRenderer
+{
+    protected CellRendererSpinner(long pointer, CellLayout vertical, boolean expand) {
+        super(pointer, vertical, expand);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererState.java b/src/bindings/org/gnome/gtk/CellRendererState.java
new file mode 100644
index 0000000..1674ff8
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererState.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CellRendererState extends Flag
+{
+    private CellRendererState(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererText.java b/src/bindings/org/gnome/gtk/CellRendererText.java
new file mode 100644
index 0000000..b60d181
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererText.java
@@ -0,0 +1,252 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.pango.Alignment;
+import org.gnome.pango.EllipsizeMode;
+
+/**
+ * Render textual data into a TreeViewColumn. This is the most commonly used
+ * CellRenderer, used to present Strings. The fundamental mapping method is
+ * {@link #setText(DataColumnString) setText()} which you use to indicate the
+ * particular DataColumnString from the underlying TreeModel which will
+ * provide the Strings.
+ * 
+ * <p>
+ * CellRendererTexts are also frequently used to present numerical data when
+ * it is desired to apply formatting to that data (converting it to a String
+ * in the process) before rendering it. If you do that, you'll probably want
+ * to use a second (numerically typed) DataColumn to indicate the appropriate
+ * sorting order to be applied if that TreeViewColumn is clicked and sorting
+ * is turned on for it; see {@link TreeViewColumn#setSortColumn(DataColumn)
+ * setSortColumn()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class CellRendererText extends CellRenderer
+{
+    /*
+     * protected <init>(long) constructor removed deliberately, replaced with
+     * this one. TODO mmm, we should test if add an expand parameter!
+     */
+    protected CellRendererText(long pointer, CellLayout vertical) {
+        super(pointer, vertical, true);
+    }
+
+    /**
+     * Construct a new CellRendererText. Specify the TreeViewColumn it will
+     * belong to and from whose parent TreeView has the TreeModel where the
+     * columns of data will come from.
+     * 
+     * @since 4.0.5
+     */
+    public CellRendererText(CellLayout vertical) {
+        super(GtkCellRendererText.createCellRendererText(), vertical, true);
+    }
+
+    /**
+     * Indicate the DataColumn containing the plain text to render. This will
+     * map the DataColumn that will be used to provide the text to be rendered
+     * in the TreeViewColumn this CellRenderer is packed into. This is by far
+     * and away the most commonly used mapping in the entire TreeView API.
+     * 
+     * <p>
+     * If you want to use Pango markup to format the text being rendered, call
+     * {@link #setMarkup(DataColumnString) setMarkup()} instead.
+     * 
+     * @since 4.0.5
+     */
+    public void setText(DataColumnString column) {
+        GtkCellLayout.addAttribute(vertical, this, "text", column.getOrdinal());
+    }
+
+    /**
+     * Indicate the DataColumn containing Pango markup to render as text.
+     * 
+     * <p>
+     * The String in the DataColumn being rendered will be interpreted as
+     * containing markup in Pango's text markup language. Using this allows
+     * you to make very expressive presentations within TreeView cells.
+     * 
+     * <p>
+     * Using this (instead of {@link #setText(DataColumnString) setText()})
+     * has the same effect as using a Label with
+     * {@link Label#setUseMarkup(boolean) setUseMarkup(true)} in normal
+     * layouts.
+     * 
+     * @since 4.0.5
+     */
+    public void setMarkup(DataColumnString column) {
+        GtkCellLayout.addAttribute(vertical, this, "markup", column.getOrdinal());
+    }
+
+    /**
+     * Indicate the DataColumn containing the name of the foreground colour to
+     * used when rendering text.
+     * 
+     * @since 4.0.5
+     */
+    public void setForeground(DataColumnString column) {
+        GtkCellLayout.addAttribute(vertical, this, "foreground", column.getOrdinal());
+    }
+
+    /**
+     * Indicate if the contents rendered by this CellRenderer should be
+     * editable. This affects all rows rendered by this CellRenderer.
+     * 
+     * @since 4.0.8
+     */
+    public void setEditable(boolean editable) {
+        setPropertyBoolean("editable", editable);
+    }
+
+    /**
+     * Indicate the DataColumn containing the information whether the cell
+     * should be editable or not.
+     * 
+     * @since 4.0.9
+     */
+    public void setEditable(DataColumnBoolean column) {
+        GtkCellLayout.addAttribute(vertical, this, "editable", column.getOrdinal());
+    }
+
+    /**
+     * Set the {@link EllipsizeMode ellipsization mode} to use to make the
+     * text fits the cell width.
+     * 
+     * @since 4.0.17
+     */
+    public void setEllipsize(EllipsizeMode setting) {
+        setPropertyEnum("ellipsize", setting);
+    }
+
+    /**
+     * Get the current ellipsization used.
+     * 
+     * @since 4.0.17
+     */
+    public EllipsizeMode getEllipsizeMode() {
+        return (EllipsizeMode) getPropertyEnum("ellipsize");
+    }
+
+    /**
+     * Set the Alignment used when multiple lines of text appear <i>within</i>
+     * the cell. This is specific to CellRendererText; for the position of any
+     * CellRenderer within its enclosing TreeViewColumn, see CellRenderer's
+     * {@link CellRenderer#setAlignment(float, float) setAlignment()}.
+     * 
+     * @since 4.0.20
+     */
+    public void setAlignment(Alignment align) {
+        setPropertyEnum("alignment", align);
+    }
+
+    /**
+     * Event generated after user activated a cell, changed its content and
+     * pressed Return.
+     * 
+     * <p>
+     * Note that the act of editing the cell in the TreeView does <b>not</b>
+     * cause a change in the underlying model. In the usual case (where a
+     * given TreeModel is only being used as the backing store for the
+     * TreeView) then you'll want to update it:
+     * 
+     * <pre>
+     * renderer.connect(new CellRendererText.Edited() {
+     *     public void onEdited(CellRendererText source, TreePath path, String text) {
+     *         model.setValue(model.getIter(path), column, text); 
+     *     }
+     * }
+     * </pre>
+     * 
+     * assuming you have access to the TreeModel and DataColumn variables.
+     * 
+     * @author Stefan Prelle
+     * @author Andrew Cowie
+     * @since 4.0.8
+     */
+    public interface Edited
+    {
+        public void onEdited(CellRendererText source, TreePath path, String text);
+    }
+
+    /**
+     * Hook up a handler to receive "edited" events on this CellRenderer. A
+     * typical example of how this is used is as follows:
+     * 
+     * <pre>
+     * final DataColumnString column;
+     * final TreeView view;
+     * final ListStore store;
+     * final TreeViewColumn visibleColumn 
+     * 
+     * store = new ListStore(new DataColumn[]{
+     *          column = new DataColumnString()
+     * });
+     *      
+     * view = new TreeView(store);
+     * visibleColumn = view.appendColumn();
+     * CellRendererText renderer = new CellRendererText(visibleColumn);
+     * renderer.setText(column);
+     * renderer.setEditable(true);
+     * renderer.connect(new CellRendererText.Edited(){
+     *      public void onEdited(CellRendererText source, TreePath path, String text) {
+     *          System.out.println("New value for path " + path + " is " + text);
+     *          TreeIter row = store.getIter(path);
+     *          store.setValue(row, column, text);
+     *      }});
+     * </pre>
+     * 
+     * @since 4.0.8
+     */
+    public void connect(CellRendererText.Edited handler) {
+        GtkCellRendererText.connect(this, new EditedHandler(handler), false);
+    }
+
+    /*
+     * Helper class to convert second parameter from String to TreePath
+     */
+    private static class EditedHandler implements GtkCellRendererText.EditedSignal
+    {
+        private CellRendererText.Edited handler;
+
+        private EditedHandler(CellRendererText.Edited handler) {
+            this.handler = handler;
+        }
+
+        public void onEdited(CellRendererText source, String path, String text) {
+            handler.onEdited(source, new TreePath(path), text);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellRendererToggle.java b/src/bindings/org/gnome/gtk/CellRendererToggle.java
new file mode 100644
index 0000000..4e0312d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellRendererToggle.java
@@ -0,0 +1,180 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Renders a Toggle Button into a TreeViewColumn. This CellRenderer may be
+ * used to present boolean data to the user. The fundamental mapping method is
+ * {@link #setActive(DataColumnBoolean) setActive()} which you use to indicate
+ * the particular DataColumnBoolean from the underlying TreeModel which will
+ * provide the boolean values.
+ * 
+ * @author Andreas Kuehntopf
+ * @since 4.0.8
+ */
+public class CellRendererToggle extends CellRenderer
+{
+    /**
+     * Construct a new CellRendererToggle. Specify the TreeViewColumn it will
+     * belong to.
+     * 
+     * @since 4.0.17
+     */
+    public CellRendererToggle(CellLayout vertical) {
+        // FIXME does expand to false actually make sense?
+        super(GtkCellRendererToggle.createCellRendererToggle(), vertical, false);
+    }
+
+    /**
+     * Indicate the appearance of this CellRenderer. If this is set to
+     * <code>true</code> a radio button is used instead of the default check
+     * box.
+     * 
+     * @since 4.0.8
+     */
+    public void setRadio(boolean setting) {
+        GtkCellRendererToggle.setRadio(this, setting);
+    }
+
+    /**
+     * Indicate if the CellRendererToggle's toggle button should be active.
+     * 
+     * <p>
+     * If you want to bind the state of the toggle button to a DataColumn you
+     * might want to use the overloaded method
+     * {@link #setActive(DataColumnBoolean) setActive()}.
+     * 
+     * @since 4.0.8
+     */
+    public void setActive(boolean setting) {
+        GtkCellRendererToggle.setActive(this, setting);
+    }
+
+    /**
+     * Get the current state of the toggle button.
+     * 
+     * @since 4.0.8
+     */
+    public boolean getActive() {
+        return GtkCellRendererToggle.getActive(this);
+    }
+
+    /**
+     * Indicate a DataColumnBoolean you want the state of the
+     * CellRendererToggle to be bound to. This is the method you should use if
+     * you want make the toggle's state dynamic based on data in the TreeModel
+     * underlying the TreeView you are presenting in.
+     * 
+     * @since 4.0.8
+     */
+    public void setActive(DataColumnBoolean column) {
+        GtkCellLayout.addAttribute(vertical, this, "active", column.getOrdinal());
+    }
+
+    /**
+     * Indicate if the CellRendererToggle's toggle button is actually
+     * activatable, which means that clicking the toggle button causes a
+     * change in the CellRendererToggle's state. Please note that toggling the
+     * toggle button does not cause a change in the underlying model.
+     * 
+     * <p>
+     * A CellRendererToggle is activatable by default.
+     * 
+     * @since 4.0.8
+     */
+    public void setActivatable(boolean setting) {
+        setPropertyBoolean("activatable", setting);
+    }
+
+    /**
+     * Signal emitted after user toggles the rendered toggle button in a cell.
+     * 
+     * <p>
+     * Note that the act of toggling the cell does not cause a change in the
+     * underlying model.
+     * 
+     * @author Andreas Kuehntopf
+     * @since 4.0.8
+     */
+    public interface Toggled
+    {
+        public void onToggled(CellRendererToggle source, TreePath path);
+    }
+
+    /**
+     * Hook up a signal handler to receive "toggled" events on this
+     * CellRenderer. A typical example of how this is used is as follows:
+     * 
+     * <pre>
+     * final DataColumnBoolean column;
+     * final TreeView view;
+     * final ListStore store;
+     * final TreeViewColumn vertical;
+     * 
+     * store = new ListStore(new DataColumn[] {
+     *     column = new DataColumnBoolean()
+     * });
+     * 
+     * view = new TreeView(store);
+     * vertical = view.appendColumn();
+     * CellRendererToggle renderer = new CellRendererToggle(vertical);
+     * renderer.setActive(column);
+     * renderer.connect(new TOGGLED() {
+     *     public void onToggled(CellRendererToggle renderer, TreePath path) {
+     *         System.out.println("Path " + path + " toggled to " + renderer.getActive());
+     *     }
+     * });
+     * </pre>
+     * 
+     * @since 4.0.8
+     */
+    public void connect(CellRendererToggle.Toggled handler) {
+        GtkCellRendererToggle.connect(this, new ToggledHandler(handler), false);
+    }
+
+    /*
+     * Helper class to convert second parameter from String to TreePath
+     */
+    private static class ToggledHandler implements GtkCellRendererToggle.ToggledSignal
+    {
+        private CellRendererToggle.Toggled handler;
+
+        private ToggledHandler(CellRendererToggle.Toggled handler) {
+            this.handler = handler;
+        }
+
+        public void onToggled(CellRendererToggle source, String path) {
+            handler.onToggled(source, new TreePath(path));
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellType.java b/src/bindings/org/gnome/gtk/CellType.java
new file mode 100644
index 0000000..4987c0a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CellType extends Constant
+{
+    private CellType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CellView.java b/src/bindings/org/gnome/gtk/CellView.java
new file mode 100644
index 0000000..31a947e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CellView.java
@@ -0,0 +1,56 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class CellView extends Widget implements CellLayout, Orientable
+{
+    protected CellView(long pointer) {
+        super(pointer);
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CheckButton.java b/src/bindings/org/gnome/gtk/CheckButton.java
new file mode 100644
index 0000000..afaf27f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CheckButton.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A toggle button widget that consists of a Check box and a Text box.
+ * 
+ * <p>
+ * CheckButtons are similar to ToggleButtons, but look very different.
+ * Contrary to ToggleButtons, which are Buttons with text inside them, they
+ * are small check squares, with descriptive text beside them. As with
+ * ToggleButtons, they can be used to toggle options on or off.
+ * 
+ * <p>
+ * CheckButtons derive from ToggleButtons and hence behave somewhat similarly.
+ * See in particular the {@link ToggleButton.TOGGLED TOGGLED} Signal inherited
+ * from ToggleButton to detect changes in state to the CheckButton.
+ * 
+ * <p>
+ * The choice between a CheckButton and a {@link ToggleButton} is left to the
+ * developer's discretion. A CheckButton can take considerably lesser space
+ * than a ToggleButton. A CheckButton is more useful when you have a list of
+ * related options that need to be set or unset. A ToggleButton could be used
+ * when a single option needs to be toggled.
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @since 4.0.3
+ */
+public class CheckButton extends ToggleButton
+{
+    protected CheckButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new CheckButton.
+     */
+    public CheckButton() {
+        super(GtkCheckButton.createCheckButton());
+    }
+
+    /**
+     * Construct a new CheckButton containing a label with the given text. If
+     * the text contains an underscore (the
+     * <code>_<code> character) it will be taken to be the
+     * mnemonic for the Widget.
+     */
+    public CheckButton(String label) {
+        super(GtkCheckButton.createCheckButtonWithMnemonic(label));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CheckMenuItem.java b/src/bindings/org/gnome/gtk/CheckMenuItem.java
new file mode 100644
index 0000000..a80a978
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CheckMenuItem.java
@@ -0,0 +1,194 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A MenuItem that maintains a binary state.
+ * 
+ * <p>
+ * A CheckMenuItem is just like a MenuItem, but additionally it displays a
+ * "check box" alongside the normal Label, indicating the state of the boolean
+ * value it holds. When that value is set to <code>true</code>, the item is
+ * <i>active</i> and the box shows the check mark.
+ * 
+ * <p>
+ * You can use a CheckMenuItem as a way to allow users of your application
+ * enable or disable a feature in an application. This is often used within to
+ * toggle options, for example to let the user hide an optional Widget of your
+ * user interface.
+ * 
+ * <p>
+ * The active state is switched automatically when the user activates the
+ * MenuItem. You can access the current state with the {@link #getActive()
+ * getActive()} method. And while you can still connect to the
+ * <code>MenuItem.Active</code> signal, CheckMenuItem provides the
+ * {@link CheckMenuItem.Toggled} signal, emitted when the active state
+ * changes.
+ * 
+ * <p>
+ * See the {@link MenuItem parent} class for further details general to all
+ * MenuItems.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+/*
+ * TODO need screenshot.
+ */
+public class CheckMenuItem extends MenuItem
+{
+    protected CheckMenuItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a CheckMenuItem
+     * 
+     * @since 4.0.4
+     */
+    public CheckMenuItem() {
+        super(GtkCheckMenuItem.createCheckMenuItem());
+    }
+
+    /**
+     * Construct a CheckMenuItem with a given text Label. The text may contain
+     * underscores (<code>_<code>) which, if present, will indicate the
+     * mnemonic which will activate that CheckMenuItem directly if that key is
+     * pressed while viewing the Menu.
+     * 
+     * @since 4.0.4
+     */
+    public CheckMenuItem(String mnemonicLabel) {
+        super(GtkCheckMenuItem.createCheckMenuItemWithMnemonic(mnemonicLabel));
+    }
+
+    /**
+     * Construct a CheckMenuItem with a given text label, and additionally
+     * connect a handler to its <code>CheckMenuItem.Toggled</code> signal.
+     * This affords you the convenience of being able to add a MenuItem fairly
+     * compactly:
+     * 
+     * <pre>
+     * editMenu.append(new MenuItem("_Paste", new CheckMenuItem.Toggled() {
+     *     public void onToggled(MenuItem source) {
+     *         ...
+     *     }
+     * }));
+     * </pre>
+     * 
+     * @since 4.0.4
+     */
+    public CheckMenuItem(String mnemonicLabel, CheckMenuItem.Toggled handler) {
+        super(GtkCheckMenuItem.createCheckMenuItemWithMnemonic(mnemonicLabel));
+        connect(handler);
+    }
+
+    /**
+     * Set the active state of the Item. This is switched automatically when
+     * the user activates (clicks) the menu item, but in some situations you
+     * will want to change it manually.
+     * 
+     * @since 4.0.4
+     */
+    public void setActive(boolean isActive) {
+        GtkCheckMenuItem.setActive(this, isActive);
+    }
+
+    /**
+     * Retrieve the active state of the item.
+     * 
+     * @since 4.0.4
+     */
+    public boolean getActive() {
+        return GtkCheckMenuItem.getActive(this);
+    }
+
+    /**
+     * Set the <var>inconsistent</var> state. This refers to an additional
+     * third state meaning that currently it cannot be decided what is the
+     * active state of the item.
+     * 
+     * <p>
+     * Think, for example, in a text editor application, in which a
+     * CheckMenuItem is used to choose between a bold or a normal font. If the
+     * user selects a range of text where both normal and bold fonts are being
+     * used, the state is inconsistent, and we want to mark it in a different
+     * way.
+     * 
+     * <p>
+     * However, note that, while such property can be really useful in a
+     * {@link ToggleButton}, its utility in a CheckMenuItem is really unclear.
+     * 
+     * <p>
+     * Notice also that this property only affects visual appearance, it
+     * doesn't affect the semantics of the Widget.
+     * 
+     * @since 4.0.4
+     */
+    public void setInconsistent(boolean setting) {
+        GtkCheckMenuItem.setInconsistent(this, setting);
+    }
+
+    /**
+     * Get the <var>inconsistent</var> state.
+     * 
+     * @see #setInconsistent(boolean)
+     * @since 4.0.4
+     */
+    public boolean getInconsistent() {
+        return GtkCheckMenuItem.getInconsistent(this);
+    }
+
+    /**
+     * The handler interface for a change in the active state. This is
+     * triggered when the active state changes, either when the user activates
+     * the MenuItem, or when it is changed with
+     * {@link CheckMenuItem#setActive(boolean) setActive()}.
+     * 
+     * @see MenuItem.Activate
+     * @since 4.0.4
+     */
+    public interface Toggled extends GtkCheckMenuItem.ToggledSignal
+    {
+        void onToggled(CheckMenuItem source);
+    }
+
+    /**
+     * Connect a <code>CheckMenuItem.Toggled</code> handler to the Widget.
+     * 
+     * @since 4.0.4
+     */
+    public void connect(CheckMenuItem.Toggled handler) {
+        GtkCheckMenuItem.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Clipboard.java b/src/bindings/org/gnome/gtk/Clipboard.java
new file mode 100644
index 0000000..f7712b5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Clipboard.java
@@ -0,0 +1,188 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.EventOwnerChange;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.Object;
+
+/**
+ * A mechanism allowing a user to copy data between programs.
+ * 
+ * <p>
+ * Clipboards were originally for sharing data between different processes,
+ * but of course conventional practise these days is that cut, copy and paste
+ * are used quite ubiquitously both as a way to copy things from one program
+ * to another, as well as simply moving data around within an application.
+ * 
+ * <p>
+ * You can copy text to the main system Clipboard quite simply, as follows:
+ * 
+ * <pre>
+ * clipboard = Clipboard.getDefault();
+ * clipboard.setText("Hello there");
+ * </pre>
+ * 
+ * @author Serkan Kaba
+ * @author Andrew Cowie
+ * @since 4.0.10
+ * @see <a
+ *      href="http://www.freedesktop.org/wiki/Specifications/clipboards-spec">The
+ *      gory historical details that lead to the FreeDesktop clipboard
+ *      specification</a>
+ */
+/*
+ * TODO The underlying GtkClipboard is wildly complex and very powerful,
+ * allowing for asynchronous data transfer. If anything, it seems a bit
+ * overboard, and perhaps a simpler synchronous implementation would be handy.
+ * Regardless, someone will have to manually set up signals to proxy for these
+ * callbacks as at time of writing we don't have a [generated] way to
+ * automatically represent function pointers. See the native code underneath
+ * TreeModelFilter's setVisibleCallback() for an example.
+ */
+public class Clipboard extends Object
+{
+    protected Clipboard(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the default Clipboard.
+     * 
+     * <p>
+     * <i>There are actually quite a number of different clipboards in the X
+     * server! Normal people are used to there only being one, and current
+     * conventions are that the</i> <code>CLIPBOARD</code> <i>clipboard is the
+     * one that cut, copy, and paste operations go to. That is the clipboard
+     * returned here.</i>
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * FUTURE, so, obviously, if someone desperately needs access to PRIMARY,
+     * they can expose it as getPrimary().
+     */
+    public static Clipboard getDefault() {
+        return GtkClipboardOverride.get();
+    }
+
+    /**
+     * Copy the given text to this Clipboard.
+     * 
+     * @since 4.0.10
+     */
+    public void setText(String text) {
+        GtkClipboard.setText(this, text, -1);
+    }
+
+    /**
+     * Copy the given image to this Clipboard.
+     * 
+     * @since 4.0.10
+     */
+    public void setImage(Pixbuf pixbuf) {
+        GtkClipboard.setImage(this, pixbuf);
+    }
+
+    /**
+     * This signal is emitted any time the owner of the Clipboard [contents]
+     * changes.
+     * 
+     * <p>
+     * Somewhat surprisingly, you will get a hit on this every time you call
+     * Clipboard's {@link Clipboard#setText(String) setText()}. This is
+     * because calling that method passes a copy of the String to the X server
+     * which takes ownership of the data for passage to other applications.
+     * 
+     * <p>
+     * <i>That's a behaviour we might like to fix.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.10
+     */
+    /*
+     * Strincyl
+     */
+    public interface OwnerChange extends GtkClipboard.OwnerChangeSignal
+    {
+        public void onOwnerChange(Clipboard source, EventOwnerChange event);
+    }
+
+    /**
+     * Hook up a <code>Clipboard.OwnerChange</code> handler.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(Clipboard.OwnerChange handler) {
+        GtkClipboard.connect(this, handler, false);
+    }
+
+    /**
+     * Get a textual representation of whatever is in this Clipboard. Some
+     * applications use the system clipboard for internal transfer of complex
+     * state, so if you've gone and copied some complex vector graphic using
+     * an application like Inkscape, you may find that the String you get back
+     * from calling this method is a little obscure.
+     * 
+     * <p>
+     * This call blocks until the text is available, though the main loop may
+     * iterate while it is doing so.
+     * 
+     * <p>
+     * <i>The underlying implementation is actually asynchronous; a request
+     * for the data has to be made through the X server to whatever
+     * application actually placed the data in the clipboard.</i>
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * Signature change to complement setText(). If we end up exposing the
+     * full family of waitForWhatever() functions then this can probably be
+     * kept as a convenience method, but even then they should perhaps be
+     * getWhatever().
+     */
+    public String getText() {
+        return GtkClipboard.waitForText(this);
+    }
+
+    /**
+     * Request that the clipboard be copied somewhere outside your process's
+     * memory so that it will remain accessible to other applications after
+     * your process has terminated.
+     * 
+     * @since 4.0.17
+     */
+    public void store() {
+        GtkClipboard.store(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ColorButton.java b/src/bindings/org/gnome/gtk/ColorButton.java
new file mode 100644
index 0000000..95fbbc0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ColorButton.java
@@ -0,0 +1,125 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.RGBA;
+
+/**
+ * A Button used to select a {@link RGBA RGBA} colour.
+ * 
+ * <p>
+ * This is a Button that presents a little rectangle filled with the currently
+ * selected RGBA colour. When pressed, it opens a ColorSelectionDialog where
+ * the user can select a colour.
+ * 
+ * <p>
+ * You will usually want to connect to the <code>ColorButton.ColorSet</code>
+ * signal, that is emitted each time the user changes the colour. You can get
+ * the currently selected colour with the {@link #getRGBA() getRGBA()} method.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.12
+ */
+public class ColorButton extends Button
+{
+    protected ColorButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new ColorButton.
+     * 
+     * @since 4.0.12
+     */
+    public ColorButton() {
+        super(GtkColorButton.createColorButton());
+    }
+
+    /**
+     * Create a new ColorButton with the specified Color selected.
+     * 
+     * @since 4.1.1
+     */
+    public ColorButton(RGBA color) {
+        super(GtkColorButton.createColorButtonWithRgba(color));
+    }
+
+    /**
+     * Get the colour currently selected.
+     * 
+     * @since 4.1.1
+     */
+    public RGBA getRGBA() {
+        final RGBA color;
+
+        color = new RGBA(0, 0, 0, 0);
+        GtkColorButton.getRgba(this, color);
+
+        return color;
+    }
+
+    /**
+     * Set the selected colour.
+     * 
+     * @since 4.1.1
+     */
+    public void setRGBA(RGBA color) {
+        GtkColorButton.setRgba(this, color);
+    }
+
+    /**
+     * Signal emitted when the user selects a different RGBA colour.
+     * 
+     * <p>
+     * You can use the {@link ColorButton#getRGBA() getRGBA()} to get the
+     * colour selected by the user.
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.12
+     */
+    public interface ColorSet extends GtkColorButton.ColorSetSignal
+    {
+        public void onColorSet(ColorButton source);
+    }
+
+    /**
+     * Hook up a handler for <code>ColorButton.ColorSet</code> signal.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(ColorButton.ColorSet handler) {
+        GtkColorButton.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ColorSelection.java b/src/bindings/org/gnome/gtk/ColorSelection.java
new file mode 100644
index 0000000..1eebdc6
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ColorSelection.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ColorSelection extends VBox
+{
+    protected ColorSelection(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ColorSelectionDialog.java b/src/bindings/org/gnome/gtk/ColorSelectionDialog.java
new file mode 100644
index 0000000..e16afd7
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ColorSelectionDialog.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ColorSelectionDialog extends Dialog
+{
+    protected ColorSelectionDialog(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ComboBox.java b/src/bindings/org/gnome/gtk/ComboBox.java
new file mode 100644
index 0000000..a11d722
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ComboBox.java
@@ -0,0 +1,256 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Widget used to choose from a list of items. <img src="ComboBox.png"
+ * class="snapshot" />
+ * 
+ * <p>
+ * Internally, ComboBox uses a TreeModel to store the items, giving you the
+ * same MVC power of GTK's TreeView/TreeModel system. There is also an
+ * alternative API which can be used to create and manipulate ComboBoxes which
+ * are comprised only of text. If that is your requirement, see
+ * {@link TextComboBox}.
+ * 
+ * <p>
+ * ComboBox is a CellLayout, that is, it possesses many of the same aspects as
+ * a TreeViewColumn, and, along with being backed by a TreeModel, is used in
+ * much the same way as a TreeView: create a ListStore or TreeStore then build
+ * the GUI side by creating CellRenderers against the ComboBox.
+ * 
+ * <p>
+ * An abbreviated example of using this follows; assuming a ListStore
+ * <code>model</code> with at least DataColumnString <code>column</code> in
+ * it,
+ * 
+ * <pre>
+ * combo = new ComboBox(model);
+ * renderer = new CellRendererText(combo);
+ * renderer.setText(column);
+ * </pre>
+ * 
+ * and that's it. While conceptually straight forward, it turns out to be a
+ * lot of work if all you're doing is a single column of DataColumnString. But
+ * the ability to <i>also</i> have a DataColumnReference in your model means
+ * you can get a link back the object that is being represented by the "mere"
+ * text label being displayed to the user, and this can be very powerful.
+ * Likewise, you can build ComboBoxes with more complicated layouts, for
+ * example having with several verticals of text and perhaps an image packed
+ * into the ComboBox as well. Finally, don't forget that you can use several
+ * different views against one TreeModel, so a TreeModel that is in use
+ * somewhere else in your app can also be the source data for your ComboBox.
+ * 
+ * <p>
+ * <i>The underlying <code>GtkComboBox</code> is actually presents two
+ * different APIs that are essentially mutually exclusive, which is why we
+ * have split this into two public classes.</i>
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public class ComboBox extends Bin implements CellEditable, CellLayout
+{
+    protected ComboBox(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new full-power TreeModel-backed ComboBox with a model to be
+     * specified at a future point via the {@link #setModel(TreeModel)
+     * setModel()} method. This constructor is explicitly here to permit
+     * developers to subclass ComboBox in order to create their own ComboBox
+     * based custom Widgets.
+     * 
+     * @since 4.0.6
+     */
+    protected ComboBox() {
+        super(GtkComboBox.createComboBox());
+    }
+
+    /**
+     * Construct a new ComboBox with an embedded Entry. This allows the user
+     * to add values not already in the backing model.
+     * 
+     * <p>
+     * <i>In java-gnome 4.0 we had a ComboBoxEntry class, corresponding to a
+     * GTK 2.x widget. This widget was removed in GTK 3.0, however, and
+     * replaced with a construct-only property</i> <var>has-entry</var>. <i>We
+     * present this mode here.</i>
+     * 
+     * @since 4.1.1
+     */
+    /*
+     * The source code in gtk/gtkcombobox.c indicates that the child widget
+     * must be a GtkEntry and that when it is added is when the appropriate
+     * signals are connected.
+     */
+    protected ComboBox(Entry entry) {
+        super(GtkComboBox.createComboBoxWithEntry());
+        GtkContainer.add(this, entry);
+    }
+
+    /**
+     * Construct a new full-power TreeModel-backed ComboBox.
+     * 
+     * <p>
+     * If subclassing ComboBox, use the <code>protected</code>
+     * {@link #ComboBox() <init>()} no-arg constructor and then set the Model
+     * later with {@link #setModel(TreeModel) setModel()}.
+     * 
+     * @since 4.0.3
+     */
+    public ComboBox(TreeModel model) {
+        super(GtkComboBox.createComboBoxWithModel(model));
+    }
+
+    /**
+     * Construct a new full-power TreeModel-backed ComboBox which also has a
+     * supporting Entry.
+     * 
+     * @since 4.1.1
+     */
+    public ComboBox(TreeModel model, Entry entry) {
+        super(GtkComboBox.createComboBoxWithModelAndEntry(model));
+        GtkContainer.add(this, entry);
+    }
+
+    /**
+     * Set or change the TreeModel from which this ComboBox draws its data.
+     * 
+     * @since 4.0.6
+     */
+    public void setModel(TreeModel model) {
+        GtkComboBox.setModel(this, model);
+    }
+
+    /**
+     * Returns the index of the active item in the ComboBox. This counts from
+     * a zero origin, so a return value of <code>2</code> means the third item
+     * in the list is currently the active item.
+     * 
+     * <p>
+     * This will return <code>-1</code> if there is no active item.
+     * 
+     * @since 4.0.6
+     */
+    public int getActive() {
+        return GtkComboBox.getActive(this);
+    }
+
+    /**
+     * Change the active item within this ComboBox to be the one at the
+     * supplied index. Items are numbered from <code>0</code>.
+     * 
+     * @since 4.0.6
+     */
+    public void setActive(int active) {
+        GtkComboBox.setActive(this, active);
+    }
+
+    /**
+     * This signal emitted whenever a different item is selected by the user.
+     * Use {@link ComboBox#getActive() getActive()} or
+     * {@link ComboBox#getActiveIter() getActiveIter()} to determine which
+     * item was picked.
+     * 
+     * @since 4.0.3
+     */
+    public interface Changed extends GtkComboBox.ChangedSignal
+    {
+        public void onChanged(ComboBox source);
+    }
+
+    /**
+     * Hook up a <code>ComboBox.Changed</code> handler to the Widget.
+     * 
+     * since 4.0.3
+     */
+    public void connect(ComboBox.Changed handler) {
+        GtkComboBox.connect(this, handler, false);
+    }
+
+    /**
+     * Cause the popup part of the ComboBox to raise and present itself. You
+     * don't tend to need this (after all it's the user who clicks on the
+     * ComboBox to cause the popup to present). The ComboBox must already have
+     * been realized to the screen before you will be able to use this.
+     * 
+     * @since 4.0.6
+     */
+    public void popup() {
+        GtkComboBox.popup(this);
+    }
+
+    /**
+     * Programmatically tell the ComboBox popup to go away.
+     * 
+     * @since 4.0.14
+     */
+    public void popdown() {
+        GtkComboBox.popdown(this);
+    }
+
+    TreeModel getModel() {
+        return GtkComboBox.getModel(this);
+    }
+
+    /**
+     * Get a TreeIter pointing at the currently selected row. If no row is
+     * currently active then <code>null</code> will be returned.
+     * 
+     * @since 4.0.6
+     */
+    public TreeIter getActiveIter() {
+        final TreeIter active;
+
+        active = new TreeIter(this.getModel());
+
+        if (GtkComboBox.getActiveIter(this, active)) {
+            return active;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the ComboBox to be pointing at the row nominated by the TreeIter
+     * argument.
+     * 
+     * @since 4.0.6
+     */
+    public void setActiveIter(TreeIter row) {
+        GtkComboBox.setActiveIter(this, row);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ComboBoxText.java b/src/bindings/org/gnome/gtk/ComboBoxText.java
new file mode 100644
index 0000000..d1756dc
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ComboBoxText.java
@@ -0,0 +1,144 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A ComboBox for displaying simple Strings. <img src="ComboBoxText.png"
+ * class="snapshot" /> A common use case for ComboBoxes is to just choose from
+ * a list of textual options. This subclass of ComboBox takes care of the
+ * mechanics of setting up a the ListStore and the appropriate CellRenderers
+ * so as to allow a straight forward interface with a limited number of
+ * convenience methods for adding Strings.
+ * 
+ * <p>
+ * Usage is very straight forward:
+ * 
+ * <pre>
+ * combo = new TextComboBox();
+ * combo.appendText("SYD");
+ * combo.appendText("YYZ");
+ * combo.appendText("JFK");
+ * combo.appendText("LHR");
+ * ...
+ * </pre>
+ * 
+ * You can still use the {@link ComboBox#getActive() getActive()} from
+ * ComboBox, but for simple lists of Strings being displayed be this Widget,
+ * the String specific {@link #getActiveText() getActiveText()} that is
+ * introduced here is probably what you want.
+ * 
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ * @since 4.0.20
+ */
+public class ComboBoxText extends ComboBox
+{
+    /**
+     * Construct a new text-only ComboBox.
+     * 
+     * @since 4.0.20
+     */
+    public ComboBoxText() {
+        super(GtkComboBoxText.createComboBoxText());
+    }
+
+    /**
+     * Unsupported.
+     * 
+     * <p>
+     * <i>If you're using a text mode ComboBox, GTK internally allocates a
+     * ListStore of a certain structure and the methods are designed to work
+     * against it. Things will blow up if you swap it for something different,
+     * unless it had exactly the correct signature. As this signature is not
+     * something that is part of the GTK API, it is not something we're going
+     * to expose; this override is here to prevent you from shooting yourself
+     * in the foot.</i>
+     * 
+     * @throws UnsupportedOperationException
+     *             if called.
+     */
+    /*
+     * Is there a better way of managing the completion visibility and it
+     * appearing in JavaDoc? Using the deprecated tag works for the latter,
+     * but not the former. Hm.
+     */
+    public void setModel(TreeModel model) {
+        throw new UnsupportedOperationException(
+                "Sorry, but you can't change the model being used to back a TextComboBox.");
+    }
+
+    /**
+     * Append an item to the list.
+     * 
+     * @since 4.0.20
+     */
+    public void appendText(String text) {
+        GtkComboBoxText.appendText(this, text);
+    }
+
+    /**
+     * Append an item at the supplied position. Positions are zero origin.
+     * 
+     * @since 4.0.20
+     */
+    public void insertText(int position, String text) {
+        GtkComboBoxText.insertText(this, position, text);
+    }
+
+    /**
+     * Prepend an item to the beginning of the list.
+     * 
+     * @since 4.0.20
+     */
+    public void prependText(String text) {
+        GtkComboBoxText.prependText(this, text);
+    }
+
+    /**
+     * Returns the text of the active item.
+     * 
+     * @since 4.0.20
+     */
+    public String getActiveText() {
+        return GtkComboBoxText.getActiveText(this);
+    }
+
+    /**
+     * Removes the item at given position from the list.
+     * 
+     * @since 4.0.20
+     */
+    public void removeText(int position) {
+        GtkComboBoxText.remove(this, position);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Container.java b/src/bindings/org/gnome/gtk/Container.java
new file mode 100644
index 0000000..b1244ce
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Container.java
@@ -0,0 +1,173 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Widget that contains at least one, and maybe more, other Widgets.
+ * Container is the base of the GTK box packing model; all layouts are
+ * composed of Widgets that are packed into other Widgets.
+ * 
+ * <p>
+ * Containers fall into two major categories. They are either:
+ * <dl>
+ * <dt><b>decorators</b>
+ * <dd>Containers which add something around a Widget. Examples include
+ * {@link Button Button} (adding the push button aspect to a Widget) and
+ * {@link Window Window} (the top level Widget which adds window decorations
+ * via the window manager); <i>or</i>
+ * <dt><b>layout</b>
+ * <dd>Containers which control the layout of other Widgets within a user
+ * interface. Examples include the simplistic {@link Fixed Fixed} layout tool,
+ * the ubiquitous {@link Box Box} subclasses like VBox and HBox, and the more
+ * advanced packing mechanisms like {@link Table}.
+ * </dl>
+ * 
+ * <h2>Size Requests and Size Allocation</h2>
+ * <p>
+ * Containers intermediate in GTK's box packing process. Each Container
+ * aggregates the requests from its children during the <i>size request</i>
+ * phase, and then later, as actual screen real estate is granted to it, the
+ * Container must then divide that space amongst each of its children in the
+ * <i>size allocation</i> phase.
+ * 
+ * <p>
+ * For more information about how this works, and on how you can influence it
+ * if necessary, see Widget's {@link Widget#setSizeRequest(int, int)
+ * setSizeRequest()}. To get an indication of how much space has been (will
+ * be) requested by a child, a Container will also find the
+ * {@link Widget#getRequisition() getRequisition()} method useful. The Actual
+ * size granted is available at {@link Widget#getAllocation() getAllocation()}
+ * once the box packing cycle has been carried out.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public abstract class Container extends Widget
+{
+    protected Container(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Add a child Widget to this Container. This works for all the various
+     * Container types, of course, but most offer more specialized packing
+     * methods that allow you to control the positioning of the Widget being
+     * added with greater finesse.
+     * 
+     * @since 4.0.0
+     */
+    public void add(Widget child) {
+        GtkContainer.add(this, child);
+    }
+
+    /**
+     * Remove a Widget from this Container.
+     * 
+     * <p>
+     * <i>In native GTK, this often results in the destruction of the Widget.
+     * In java-gnome, that will only occur once the last Java reference goes
+     * out of scope and a garbage collection run occurs. So you can, quite
+     * safely, do:</i>
+     * 
+     * <pre>
+     * box1.remove(button);
+     * box2.add(button);
+     * </pre>
+     * 
+     * <i>without worrying that that Button is going to evaporate out from
+     * under you.</i>
+     * 
+     * @param child
+     *            A child Widget that is already <i>in</i> the Container,
+     *            right? If you try to remove a Widget that isn't, don't
+     *            complain when you get all sorts of errors!
+     * @since 4.0.2
+     */
+    /*
+     * TODO, yes, we should probably check that the child is actually in the
+     * Container first.
+     */
+    public void remove(Widget child) {
+        GtkContainer.remove(this, child);
+    }
+
+    /**
+     * Get the Widgets that are children of this Container, i.e. the Widgets
+     * previously added to the Container. An array of Widgets isn't always
+     * ideal, but you can cast the returned objects to the appropriate Widget
+     * subtype should you need to, for example:
+     * 
+     * <pre>
+     * Button button, child;
+     * Widget[] children;
+     * 
+     * box.add(button);
+     * children = box.getChildren();
+     * 
+     * child = (Button) children[0];
+     * </pre>
+     * 
+     * In other situations (wondering just what aggregation of Widgets makes
+     * up something that was handed to you by Glade, perhaps),
+     * <code>instanceof</code> is your friend. Indeed sometimes it's the only
+     * way; the box packing composition of GTK elements means that even things
+     * you might take for granted as elementary (Button) are in fact more
+     * complex (an HBox of an Image and a Label) - and often the only way to
+     * find this out is to walk the Widget hierarchy.
+     * 
+     * @return an array with the Container's child Widgets. The array will be
+     *         empty (zero length) if the Container hasn't got any children.
+     * @since 4.0.3
+     */
+    public Widget[] getChildren() {
+        return GtkContainer.getChildren(this);
+    }
+
+    /**
+     * Set the amount of padding to put around the outside of this Container,
+     * in pixels. This is exterior padding around the outside of the contained
+     * Widgets. The default is 0.
+     * 
+     * @param width
+     *            Although anything under 65535 is a valid value, anyone who
+     *            thinks they need a border width of sixty thousand pixels is
+     *            invited to get their head examined.
+     * @since 4.0.5
+     */
+    public void setBorderWidth(int width) {
+        if (width < 0) {
+            throw new IllegalArgumentException("width must be positive");
+        }
+        GtkContainer.setBorderWidth(this, width);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CornerType.java b/src/bindings/org/gnome/gtk/CornerType.java
new file mode 100644
index 0000000..84c6ae3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CornerType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CornerType extends Constant
+{
+    private CornerType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CurveType.java b/src/bindings/org/gnome/gtk/CurveType.java
new file mode 100644
index 0000000..3c992f1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CurveType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+final class CurveType extends Constant
+{
+    private CurveType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/CustomPaperSize.java b/src/bindings/org/gnome/gtk/CustomPaperSize.java
new file mode 100644
index 0000000..b5dcbf7
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/CustomPaperSize.java
@@ -0,0 +1,100 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.util.Locale;
+
+/**
+ * Page sizes different than the established standards available as constants
+ * in the PaperSize, InternationalPaperSize, and NorthAmericanPaperSize
+ * classes.
+ * 
+ * <p>
+ * 
+ * <pre>
+ * paper = new CustomPaperSize("Business Card", 90, 55, Unit.MM);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+public class CustomPaperSize extends PaperSize
+{
+    /**
+     * Create a PaperSize constant (or, at least, once you've created one you
+     * don't need to create any more) for a custom size.
+     * 
+     * <p>
+     * The <code>width</code> and <code>height</code> parameters are in terms
+     * of <code>units</code>, obviously. Note that you must use a physical
+     * measurement; you can't specify pixels.
+     * 
+     * <p>
+     * You need to specify a human readable display name describing this
+     * PaperSize in a word or two. You should mark it for translation. Try
+     * <code>"Custom"</code> if you're lacking for inspiration.
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * We don't expose internal identifier strings or ordinals in java-gnome.
+     * So, to create the handle we need for the first argument of the native
+     * constructor function, munge the given display name into something
+     * identifier-ish.
+     */
+    public CustomPaperSize(String name, double width, double height, Unit units) {
+        super(GtkPaperSize.createPaperSizeCustom(mungeIntoHandle(name), name, width, height,
+                checkUnits(units)));
+    }
+
+    private static String mungeIntoHandle(String name) {
+        String str;
+
+        if ((name == null) || (name.equals(""))) {
+            throw new IllegalArgumentException("Must specify a human readable display name");
+        }
+
+        str = name.toLowerCase(Locale.ENGLISH);
+        str = str.replaceAll(" ", "_");
+
+        return str;
+    }
+
+    private static Unit checkUnits(Unit units) {
+        if (units == Unit.PIXEL) {
+            throw new IllegalArgumentException(
+                    "Size can't be specified in pixels. You have to use a physical measurement");
+        }
+        return units;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumn.java b/src/bindings/org/gnome/gtk/DataColumn.java
new file mode 100644
index 0000000..3ca13b0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumn.java
@@ -0,0 +1,206 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 1998-2004 The java-gnome Team
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * The concept for this mechanism to represent the combination of ordinal
+ * column number and column type was inspired from several sources.
+ * 
+ * Ironically, we actually tried quite hard not to use this design because in
+ * the old java-gnome 2.x bindings it led to very cumbersome code for
+ * developers to have to write. However, as we carried out our own analysis of
+ * a possible design that would solve the problem on not exposing raw ints as
+ * column identifiers while simultaneously establishing type safety, we ended
+ * up with what turns out to be effectively same solution internally but with
+ * slightly more manageable public API.
+ * 
+ * The actual name "DataColumn" is taken directly from the TreeModel binding
+ * used in java-gnome 2.x as originally written by Mark Howard. Reviewing
+ * their work confirmed that we had hit on almost exactly the same approach
+ * internally. Our code is simpler, of course.
+ * 
+ * Thanks to Murray Cummings for having discussed the original use of this
+ * pattern in gtkmm and for having encouraged presenting column identifiers in
+ * a type safe manner.
+ */
+
+/**
+ * Specify the data type of a column in a TreeModel tabular store and identify
+ * its position for later reference. When instantiating a {@link ListStore} or
+ * {@link TreeStore} you use an array of DataColumns to indicate the data type
+ * that each column of the model is to hold.
+ * 
+ * <p>
+ * The types you can store in a TreeModel is somewhat deliberately constrained
+ * to those that make sense when it comes time to present them. In almost
+ * every case you will be presenting textual data and so will want a
+ * DataColumnString to store it in. And while there are DataColumnInteger and
+ * DataColumnLong, if will often find yourself doing formatting on that data
+ * (currency, dates, etc) on the Java side before pushing it into the model
+ * and so will end up using a DataColumnString anyway.
+ * 
+ * <p>
+ * Keep in mind that you do <i>not</i> need to store all your application data
+ * in the TreeModel. After all, you already have a perfectly sound (and
+ * infinitely more powerful) means to model and represent your data: the Java
+ * language you're working from in the first place. You only need to push data
+ * into a TreeModel that will be directly displayed by a TreeView or that will
+ * be used to help manage that display (such as using a numeric type as an
+ * auxiliary sorting index for textual columns that otherwise wouldn't order
+ * properly). Quite frequently, however, you will want to take a selection or
+ * activation event from the TreeView and get back to the Java object that
+ * where the displayed data came from in the first place. This is the role of
+ * the other significant column type, {@link DataColumnReference}.
+ * 
+ * <h2>Initializing TreeModels</h2>
+ * 
+ * <p>
+ * The optimal way to use this class is as follows. First declare variables to
+ * represent each column (they can be local variables but often you end up
+ * needing to access them from code outside the declaring method, so they
+ * usually end up as private instance variables).
+ * 
+ * <pre>
+ * ...
+ * private final DataColumnString name;
+ * private final DataColumnString dob; // date of birth
+ * private final DataColumnLong dobSort;
+ * private final DataColumnBoolean useful; // is this person valued, or a waste of oxygen?
+ * </pre>
+ * 
+ * and then instantiate them;
+ * 
+ * <pre>
+ *     ...
+ *     name = new DataColumnString();
+ *     dob = new DataColumnString();
+ *     dobSort = new DataColumnLong();
+ *     useful = new DataColumnBoolean();
+ * </pre>
+ * 
+ * It is important to choose useful names for these variables; you'll be using
+ * them to conveniently identify the columns in later code (some people even
+ * go so far as to use all capitals to make them stand out, or use a suffix
+ * like <code>Column</code>, though neither are really necessary). You then
+ * make an array of them and use that for the ListStore constructor:
+ * 
+ * <pre>
+ *     final DataColumn[] types;
+ *     final ListStore model;
+ * 
+ *     types = new DataColumn[] {
+ *         name,
+ *         dob,
+ *         dobSort,
+ *         useful
+ *     }
+ *     model = new ListStore(types);
+ * </pre>
+ * 
+ * You can rather nicely do this all at once:
+ * 
+ * <pre>
+ *     ... 
+ *     model = new ListStore(new DataColumn[] {
+ *         name = new DataColumnString(),
+ *         dob = new DataColumnString(),
+ *         dobSort = new DataColumnInteger(),
+ *         useful = new DataColumnBoolean()
+ *     });
+ * </pre>
+ * 
+ * which is ultimately the API we had in mind for you to use! (Important: do
+ * <b>not</b> do the following:
+ * 
+ * <pre>
+ *     ...
+ *     types = new DataColumn[] {
+ *         new DataColumnString(),
+ *         new DataColumnString(),
+ *         new DataColumnInteger(),
+ *         new DataColumnBoolean()
+ *     };
+ *     new ListStore(types);
+ * </pre>
+ * 
+ * as this means you can only refer to each column as <code>types[2]</code>
+ * thus defeating the whole idea of having a meaningfully named handle to the
+ * column that each instance of this class represents. You will <i>need</i>
+ * those comprehensible names later).
+ * 
+ * <p>
+ * See the list of subclasses of DataColumn to see the current set of
+ * available column types.
+ * 
+ * @author Andrew Cowie
+ * @author Mark Howard
+ * @author Murray Cummings
+ * @author Hanna Wallach
+ * @since 4.0.5
+ */
+public abstract class DataColumn
+{
+    private final Class<?> type;
+
+    private int ordinal = -1;
+
+    protected DataColumn(Class<?> type) {
+        assert (type != null);
+
+        this.type = type;
+    }
+
+    Class<?> getType() {
+        return type;
+    }
+
+    void setOrdinal(int column) {
+        assert (column >= 0);
+
+        if (ordinal != -1) {
+            throw new IllegalArgumentException(
+                    "You've tried to construct a TreeModel with a DataColumn array containing the same DataColumn twice. Each DataColumn must uniquely identify a column in the TreeModel you're constructing.");
+        }
+
+        this.ordinal = column;
+    }
+
+    int getOrdinal() {
+        if (ordinal == -1) {
+            throw new IllegalStateException(
+                    "You have to add the DataColumn to target TreeModel before using it");
+        }
+        return ordinal;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnBoolean.java b/src/bindings/org/gnome/gtk/DataColumnBoolean.java
new file mode 100644
index 0000000..5d7f1c3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnBoolean.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column of <code>boolean</code> values in a TreeModel. These are
+ * particularly useful to drive TreeViewColumns containing a
+ * CellRendererToggle, although they are of course used to set the properties
+ * of any <code>boolean</code> property offered by a CellRenderer.
+ * 
+ * <p>
+ * See {@link DataColumn} for the full discussion of how this family of
+ * classes is employed when working with TreeModels.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class DataColumnBoolean extends DataColumn
+{
+    public DataColumnBoolean() {
+        super(Boolean.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnIcon.java b/src/bindings/org/gnome/gtk/DataColumnIcon.java
new file mode 100644
index 0000000..2ff4df2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnIcon.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column representing a named Icon in a TreeModel. See {@link DataColumn}
+ * for the full discussion of the role of how to employ these. This column
+ * type is primarily used as an alternate way to supply an image to be
+ * rendered in a TreeView using {@link CellRendererPixbuf CellRendererPixbuf}.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.17
+ * @see DataColumnStock
+ */
+public final class DataColumnIcon extends DataColumn
+{
+    public DataColumnIcon() {
+        super(String.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnInteger.java b/src/bindings/org/gnome/gtk/DataColumnInteger.java
new file mode 100644
index 0000000..61abc0d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnInteger.java
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column of <code>int</code> values in a TreeModel.
+ * 
+ * <p>
+ * Note that DataColumnInteger is used for passing information to CellRenderer
+ * property setters which take numeric values, not for rendering the numbers
+ * themselves.
+ * 
+ * <p>
+ * To actually present numeric data in a TreeView, convert it to a String on
+ * the Java side first and to store the data in a DataColumnString. This,
+ * however, sometimes disrupts the natural sorting order of the numeric data
+ * (and certainly will if arbitrary formatting or markup is applied) and so an
+ * additional column of type DataColumnInteger can be added containing the
+ * original numeric data as a sort index and applied to the TreeViewColumn
+ * presenting that data with its
+ * {@link TreeViewColumn#setSortColumn(DataColumn) setSortColumn()}.
+ * 
+ * <p>
+ * See {@link DataColumn} for the full discussion of how to employ this family
+ * of classes.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class DataColumnInteger extends DataColumn
+{
+    public DataColumnInteger() {
+        super(Integer.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnLong.java b/src/bindings/org/gnome/gtk/DataColumnLong.java
new file mode 100644
index 0000000..3ba2c82
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnLong.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column of <code>long</code> values in a TreeModel. This class complements
+ * DataColumnInteger by adding the ability to use <code>long</code> data when
+ * sorting or for CellRenderer properties.
+ * 
+ * <p>
+ * See {@link DataColumnInteger} for discussion of why you may not necessarily
+ * need this column type even though you might think you do.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class DataColumnLong extends DataColumn
+{
+    public DataColumnLong() {
+        super(Long.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnPixbuf.java b/src/bindings/org/gnome/gtk/DataColumnPixbuf.java
new file mode 100644
index 0000000..6195faa
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnPixbuf.java
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column containing image data in a TreeModel. See {@link DataColumn} for
+ * the full discussion of the role of how to employ these. This column type is
+ * used to drive display of images in TreeViews using
+ * {@link CellRendererPixbuf CellRendererPixbuf}s.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class DataColumnPixbuf extends DataColumn
+{
+    public DataColumnPixbuf() {
+        super(org.gnome.gdk.Pixbuf.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnReference.java b/src/bindings/org/gnome/gtk/DataColumnReference.java
new file mode 100644
index 0000000..fc6e048
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnReference.java
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column containing references back to Java objects in a TreeModel.
+ * 
+ * <p>
+ * If your TreeView is a GUI representation of a List of Account objects, say,
+ * and someone selects one of the rows, you quite reasonably want to know
+ * <i>which</i> Account was selected. While you could extract the account name
+ * or some other text field displayed in the TextView and attempt to use that
+ * to look up the Account object back on the Java side, a much better solution
+ * is to merely store a reference to the object that was the source of the
+ * data in that row in the first place. That's what DataColumnReference is
+ * for.
+ * 
+ * <p>
+ * Simply call {@link TreeModel#getValue(TreeIter, DataColumnReference)
+ * getValue()} with the TreeIter the selection gave you and the
+ * DataColumnReference indicating the column you stashed your object in, and
+ * then ta-da you have the Account which was selected, allowing you to carry
+ * on with your application logic in your application's domain model's terms.
+ * 
+ * <p>
+ * Beyond this, see {@link DataColumn} for the full discussion of the role of
+ * these classes and examples of how to employ them.
+ * 
+ * <p>
+ * <b>Don't try to use this in an attempt to somehow magically render a Java
+ * object in a TreeView!</b> That's not what this is for; 99.9% of the time
+ * DataColumnString driving a TreeViewColumn with a CellRendererText, or a
+ * DataColumnPixbuf driving a TreeViewColumn containing a CellRendererPixbuf
+ * will more than handle the job for you.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class DataColumnReference<T> extends DataColumn
+{
+    public DataColumnReference() {
+        super(java.lang.Object.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnStock.java b/src/bindings/org/gnome/gtk/DataColumnStock.java
new file mode 100644
index 0000000..d26ad24
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnStock.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column representing a Stock item in a TreeModel. See {@link DataColumn}
+ * for the full discussion of the role of how to employ these. This column
+ * type is primarily used as an alternate way to supply an image to be
+ * rendered in a TreeView using {@link CellRendererPixbuf CellRendererPixbuf}.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public final class DataColumnStock extends DataColumn
+{
+    public DataColumnStock() {
+        super(String.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DataColumnString.java b/src/bindings/org/gnome/gtk/DataColumnString.java
new file mode 100644
index 0000000..9dc7380
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DataColumnString.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A column containing textual data in a TreeModel. See {@link DataColumn} for
+ * the full discussion of the role of how to employ these.
+ * 
+ * <p>
+ * DataColumnStrings are by far the most commonly used DataColumn type, as
+ * even numerical data is often presented in text form with formatting applied
+ * on the Java side before being passed in to drive presentation in the
+ * TreeView.
+ * 
+ * <p>
+ * Furthermore, there are numerous CellRenderer properties which take String
+ * arguments, and those values are also stored in your model in columns of
+ * type DataColumnString; see
+ * {@link CellRendererText#setForeground(DataColumnString) setForeground()} on
+ * CellRendererText for an example.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class DataColumnString extends DataColumn
+{
+    public DataColumnString() {
+        super(String.class);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DebugFlag.java b/src/bindings/org/gnome/gtk/DebugFlag.java
new file mode 100644
index 0000000..733fc28
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DebugFlag.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class DebugFlag extends Constant
+{
+    private DebugFlag(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DeleteType.java b/src/bindings/org/gnome/gtk/DeleteType.java
new file mode 100644
index 0000000..0b5e671
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DeleteType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class DeleteType extends Constant
+{
+    private DeleteType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DestDefaults.java b/src/bindings/org/gnome/gtk/DestDefaults.java
new file mode 100644
index 0000000..00e3090
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DestDefaults.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class DestDefaults extends Constant
+{
+    private DestDefaults(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Dialog.java b/src/bindings/org/gnome/gtk/Dialog.java
new file mode 100644
index 0000000..cc18365
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Dialog.java
@@ -0,0 +1,371 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Dialog is a special Window which is used to display information for the
+ * user or to get response from her. While a normal Window usually is used to
+ * represent the whole application and to offer sometimes many interactions
+ * for the user, a Dialog should only be opened if a special situation has
+ * occurred.
+ * 
+ * <p>
+ * A Dialog is a composite Window which contains a {@link VBox}. This box is
+ * split by an HSeparator into two areas:
+ * 
+ * <ul>
+ * <li>
+ * <p>
+ * The <var>main area</var> consists of the VBox itself above the separator.
+ * It is used to pack Widgets such as Labels or Icons which will display the
+ * descriptive part of your Dialog. The easiest way to add Widget(s) to the
+ * top area is to simply call the {@link Dialog#add(Widget) add()} method. It
+ * is a good technique to first add your own Container such as an {@link HBox}
+ * to the top area and pack all other Widgets to it if you need more refined
+ * layout control, although this is not compulsory.
+ * 
+ * <li>
+ * <p>
+ * The bottom <var>action area</var> (actually an HButtonBox) is used to pack
+ * buttons to the Dialog which may perform actions such as "Ok" or "Cancel".
+ * You should only add Buttons to the <var>action area</var> using one of the
+ * {@link Dialog#addButton(String, ResponseType) addButton()} methods allowing
+ * you to specify a ResponseType constant to be emitted if the Button is
+ * clicked.
+ * </ul>
+ * 
+ * <p>
+ * To open the Dialog as a normal non-blocking Window you use the
+ * {@link Window#present() present()} method after you have packed the various
+ * child elements into it. On the other hand, for occasions where you are
+ * using a Dialog to get information required for the further progress of the
+ * main application, the {@link Dialog#run() run()} method can be used to open
+ * the Dialog. This method blocks the application and waits for response from
+ * the user.
+ * 
+ * <p>
+ * Like any Window that you are finished with, you have to
+ * {@link Window#hide() hide()} when you receive a
+ * <code>Dialog.Response</code> callback, or after {@link Dialog#run() run()}
+ * returns.
+ * 
+ * <p>
+ * GTK comes with a number of standard Dialogs which can be used for typical
+ * situations such as {@link MessageDialog MessageDialog} to present urgent
+ * information to the user, and {@link FileChooserDialog FileChooserDialog}
+ * which provides the familiar behaviour of popping up a Dialog to select a
+ * file.
+ * 
+ * @author Thomas Schmitz
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class Dialog extends Window
+{
+    protected Dialog(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new Dialog box with both <var>main area</var> and an empty
+     * <var>action area</var>, separated by an HSeparator. You'll need to do
+     * the rest of the Dialog setup manually yourself, including calling
+     * {@link Window#setTransientFor(Window) setTransientFor()} and
+     * {@link Window#setTitle(String) setTitle()}.
+     * 
+     * @since 4.0.5
+     */
+    public Dialog() {
+        super(GtkDialog.createDialog());
+    }
+
+    /**
+     * Create a new Dialog. This is a convenience constructor with the same
+     * effect as:
+     * 
+     * <pre>
+     * d = new Dialog();
+     * d.setTitle(title);
+     * d.setModal(modal);
+     * d.setTransientFor(parent);
+     * </pre>
+     * 
+     * @param title
+     *            Title of the new Dialog.
+     * @param parent
+     *            Transient parent of the dialog, or <code>null</code>. If a
+     *            parent is provided, the window manager will keep the Dialog
+     *            on top of it. If the Dialog is modal, it is highly
+     *            recommended that you provide a parent Window, otherwise the
+     *            user could be trying to interact with the main Window while
+     *            the Dialog is blocking it, but hidden under other Window. In
+     *            that case, the user experience is really bad, as it is not
+     *            easy to figure out the real case of the blocking.
+     * @param modal
+     *            Whether the dialog is to be modal or not. A modal Dialog
+     *            blocks interaction with the other parts of the application.
+     *            Note that you can also get a similar behaviour using the
+     *            {@link #run() run()} method.
+     * @since 4.0.5
+     */
+    public Dialog(String title, Window parent, boolean modal) {
+        super(GtkDialog.createDialogWithButtons(title, parent, modal ? DialogFlags.MODAL
+                : DialogFlags.NONE, null));
+    }
+
+    /**
+     * Add a Widget to the <var>main area</var> of the Dialog.
+     * 
+     * @since 4.0.5
+     */
+    public void add(Widget widget) {
+        final Box box;
+
+        box = (Box) this.getChild();
+        box.add(widget);
+    }
+
+    /**
+     * Adds an action {@link Button} with the given text as its label to the
+     * end of the Dialog's <var>action area</var>. The given ResponseType will
+     * be returned back in the Dialog's {@link Dialog.Response} signal when
+     * the Button added as a result of this call is clicked.
+     * 
+     * @return the added Button. This is a convenience allowing you to hook up
+     *         further handlers to the Button if necessary.
+     * @since 4.0.5
+     */
+    public Button addButton(String text, ResponseType response) {
+        return (Button) GtkDialog.addButton(this, text, response.getResponseId());
+    }
+
+    /**
+     * Add a Button whose icon and label are taken from a given Stock. It is,
+     * as ever, recommended to use a Stock Button for common actions. See
+     * {@link #addButton(String, ResponseType) addButton()}.
+     * 
+     * @since 4.0.5
+     */
+    public Button addButton(Stock stock, ResponseType response) {
+        return (Button) GtkDialog.addButton(this, stock.getStockId(), response.getResponseId());
+    }
+
+    /**
+     * Add a Button Widget you've already constructed to the action area of
+     * this Dialog.
+     * 
+     * <p>
+     * It is, as ever, recommended to use a Stock Button for common actions.
+     * See {@link #addButton(String, ResponseType) addButton()}.
+     * 
+     * <p>
+     * <i>You can pass any Activatable as the <code>widget</code>
+     * parameter.</i>
+     * 
+     * @since 4.0.14
+     */
+    public Button addButton(Widget widget, ResponseType response) {
+        GtkDialog.addActionWidget(this, widget, response.getResponseId());
+
+        /*
+         * The other addButton() signature returns Button, though the native
+         * code here actually takes a GtkActivatable. So workaround in this
+         * overload by returning Button if possible.
+         */
+
+        if (widget instanceof Button) {
+            return (Button) widget;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Block the rest of the application by running in a recursive main loop
+     * until a {@link Dialog.Response} signal arises on the Dialog as a result
+     * of the user activating one of the <var>action area</var> Buttons. This
+     * is known as a 'modal' Dialog. While this loop is running the user is
+     * prevented from interacting with the rest of the application.
+     * 
+     * <pre>
+     * response = dialog.run();
+     * 
+     * dialog.hide();
+     * if (response == ResponseType.CANCEL) {
+     *     return;
+     * }
+     * // take action!
+     * </pre>
+     * 
+     * If you don't care about the response, just go ahead and
+     * <code>hide()</code> right away as soon as <code>run()</code> returns.
+     * 
+     * <pre>
+     * dialog = new AboutDialog();
+     * dialog.run();
+     * dialog.hide();
+     * </pre>
+     * 
+     * <p>
+     * While there are legitimate uses of modal Dialogs, it is a feature that
+     * tends to be badly abused. Therefore, before you call this method,
+     * please consider carefully if it is wise to prevent the rest of the user
+     * interface from being used.
+     * 
+     * <p>
+     * A common bug is for people to neglect to {@link Widget#hide() hide()}
+     * the Dialog after this method returns. If you don't, then the Dialog
+     * will remain on screen despite repeated clicking of (for example) the
+     * "Close" Button [the Window is not hidden automatically because of cases
+     * like "Apply" in preferences Dialogs and "Open" in FileChoosers when a
+     * folder is selected and activation will change directory rather than
+     * finishing the Dialog].
+     * 
+     * <p>
+     * While <code>run()</code> can be very useful in callbacks when popping
+     * up a quick question, you may find hooking up to the
+     * {@link Dialog.Response} signal more flexible.
+     * 
+     * <p>
+     * <b>Warning</b><br>
+     * <i>Using this method will prevent other threads that use GTK from
+     * running. That's a bug as far as we're concerned, but if the goal is to
+     * display a dialog without blocking other threads that use GTK, it is
+     * better (for now) to call Window's</i> {@link Window#present()
+     * present()} <i>and the</i> {@link #connect(Response) connect()} <i>to
+     * the </i> {@link Dialog.Response} <i>signal.</i>
+     * 
+     * <pre>
+     * dialog.connect(new Dialog.Response() {
+     *     public void onResponse(Dialog source, ResponseType response) {
+     *         dialog.hide();
+     *         if (response == ResponseType.CLOSE) {
+     *             return;
+     *         }
+     *         // take action!
+     *     }
+     * });
+     * 
+     * dialog.present();
+     * </pre>
+     * 
+     * @return the emitted response constant. If asking a question, you should
+     *         check this against the various constants in the ResponseType
+     *         class. Don't forget to <code>hide()</code> afterwards.
+     * @since 4.0.5
+     * @see <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606796">the
+     *      bug report</a>
+     */
+    public ResponseType run() {
+        final int value;
+        final ResponseType response;
+
+        value = GtkDialog.run(this);
+        response = ResponseType.constantFor(value);
+
+        return response;
+    }
+
+    /**
+     * This signal arises when a user activates one of the Widgets laid out in
+     * the <var>action area</var> of the Dialog.
+     * 
+     * @author Thomas Schmitz
+     * @author Vreixo Formoso
+     * @since 4.0.5
+     */
+    public interface Response
+    {
+        void onResponse(Dialog source, ResponseType response);
+    }
+
+    /**
+     * Hook up a <code>Dialog.Response</code> handler.
+     */
+    public void connect(Dialog.Response handler) {
+        GtkDialog.connect(this, new ResponseHandler(handler), false);
+    }
+
+    /*
+     * Needed for emit the Dialog.Response signal with a type-safe
+     * ResponseType instead of the underlying int ordinal.
+     */
+    private static class ResponseHandler implements GtkDialog.ResponseSignal
+    {
+        private Dialog.Response handler;
+
+        private ResponseHandler(Dialog.Response handler) {
+            this.handler = handler;
+        }
+
+        public void onResponse(Dialog source, int responseId) {
+            final ResponseType response;
+
+            response = ResponseType.constantFor(responseId);
+
+            handler.onResponse(source, response);
+        }
+    }
+
+    /**
+     * Cause a <code>Dialog.Response</code> signal with the specified
+     * ResponseType to be emitted by this Dialog.
+     * 
+     * @since 4.0.9
+     */
+    public void emitResponse(ResponseType response) {
+        GtkDialog.response(this, response.getResponseId());
+    }
+
+    /**
+     * Tell the Dialog which Button (which ResponseType) is to be activated
+     * when the user presses <b><code>Enter</code></b>.
+     * 
+     * <p>
+     * If you're calling this because you've created a custom Button with
+     * {@link #addButton(Widget, ResponseType) addButton()}, you'll probably
+     * need to call Widget's {@link Widget#setCanDefault(boolean)
+     * setCanDefault()} on that Button first, before using this.
+     * 
+     * <p>
+     * Note that calling Widget's {@link Widget#grabDefault() grabDefault()}
+     * is insufficient; Dialogs have some fairly tricky internal wiring, and
+     * you need to use this method instead.
+     * 
+     * @since 4.0.17
+     */
+    public void setDefaultResponse(ResponseType response) {
+        GtkDialog.setDefaultResponse(this, response.getResponseId());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DialogFlags.java b/src/bindings/org/gnome/gtk/DialogFlags.java
new file mode 100644
index 0000000..398d738
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DialogFlags.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Flags used to control the Dialog creation.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ */
+/*
+ * Only MODAL flag is really useful, we musn't expose DESTROY_WITH_PARENT and
+ * NO_SEPARATOR seems also not very useful. So, I plan to not expose this
+ * class, and instead of that use a boolean for modal property.
+ */
+final class DialogFlags extends Flag
+{
+    private DialogFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    static final DialogFlags NONE = new DialogFlags(0, "NONE");
+
+    static final DialogFlags MODAL = new DialogFlags(GtkDialogFlags.MODAL, "MODAL");
+}
diff --git a/src/bindings/org/gnome/gtk/DirectionType.java b/src/bindings/org/gnome/gtk/DirectionType.java
new file mode 100644
index 0000000..e074876
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DirectionType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class DirectionType extends Constant
+{
+    private DirectionType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/DrawingArea.java b/src/bindings/org/gnome/gtk/DrawingArea.java
new file mode 100644
index 0000000..2b5e24a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/DrawingArea.java
@@ -0,0 +1,66 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A simple blank canvas Widget that you can do arbitrary drawing on.
+ * 
+ * <p>
+ * DrawingArea takes care of handling a number of implementation details
+ * associated with Widget implementations, including basic handling of the
+ * size-request / size-allocation cycle and realizing the necessary underlying
+ * resouces. The end result is blank [<code>org.gnome.gdk</code>] Window that
+ * you can draw on with Cairo in a <code>Widget.Draw</code> signal handler.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * FIXME Explain what assumptions DrawingArea makes, and what requirements it
+ * places on you if you use it, especially as regards event masks.
+ */
+public class DrawingArea extends Widget
+{
+    protected DrawingArea(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a blank DrawingArea.
+     * 
+     * @since 4.0.10
+     */
+    public DrawingArea() {
+        super(GtkDrawingArea.createDrawingArea());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Editable.java b/src/bindings/org/gnome/gtk/Editable.java
new file mode 100644
index 0000000..8c92f45
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Editable.java
@@ -0,0 +1,123 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Methods common to Widgets which allow the line of text they display to be
+ * edited.
+ * 
+ * @author Andrew Cowie
+ * @author Douglas Goulart
+ * @since 4.0.6
+ */
+public interface Editable
+{
+    /**
+     * Set the position of the cursor in this Editable. The cursor will be put
+     * before the character at the position indicated.
+     * 
+     * @param position
+     *            The value given must be less than or equal to the number of
+     *            characters currently in the Editable field. Supplying a
+     *            value of <code>-1</code> will cause the cursor to move to a
+     *            position after the last character in the text.
+     * 
+     * @since 4.0.6
+     */
+    public void setPosition(int position);
+
+    /**
+     * Retrieves the current cursor position.
+     * 
+     * Returns the position of the cursor. The cursor is displayed before the
+     * character with the given (base 0) index in the widget. The value will
+     * be less than or equal to the number of characters in the widget.
+     * 
+     * @since 4.0.16
+     */
+    public int getPosition();
+
+    /**
+     * The signal emitted when the text in the Editable has changed.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface Changed extends GtkEditable.ChangedSignal
+    {
+        void onChanged(Editable source);
+    }
+
+    /**
+     * Hook up a handler for <code>Editable.Changed</code> signals.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Editable.Changed handler);
+
+    /**
+     * Select a region of the text in this Editable. The characters between
+     * <code>start</code> up to <i>but not including</i> <code>end</code> will
+     * be selected.
+     * 
+     * <p>
+     * Calling <code>selectRegion(0, 0)</code> will remove the selection
+     * (although that will only happen if some other Widget has the focus; in
+     * Windows where there is only one control the user can manipulate an
+     * Entry will end up selected no matter what).
+     * 
+     * @param end
+     *            If negative, then the selection will be from
+     *            <code>start</code> to the end of the text in the Editable.
+     * @since 4.0.6
+     */
+    public void selectRegion(int start, int end);
+
+    /**
+     * Retrieves the selection start position of the Editable. If no text was
+     * selected both <code>getSelectionBoundsStart()</code> and
+     * <code>getSelectionBoundsEnd()</code> will be identical.
+     * 
+     * @since 4.0.16
+     */
+    public int getSelectionBoundsStart();
+
+    /**
+     * Retrieves the selection end position of the Editable. If no text was
+     * selected both <code>getSelectionBoundsStart()</code> and
+     * <code>getSelectionBoundsEnd()</code> will be identical.
+     * 
+     * @since 4.0.16
+     */
+    public int getSelectionBoundsEnd();
+}
diff --git a/src/bindings/org/gnome/gtk/Entry.java b/src/bindings/org/gnome/gtk/Entry.java
new file mode 100644
index 0000000..dde997d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Entry.java
@@ -0,0 +1,691 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.icons.Helper;
+import org.freedesktop.icons.Icon;
+import org.gnome.gdk.Event;
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * A data entry field allowing the user to input a single line of text. <img
+ * src="Entry.png" class="snapshot" />
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ * @since 4.0.3
+ */
+public class Entry extends Widget implements Editable, CellEditable
+{
+    protected Entry(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Entry
+     * 
+     * @since 4.0.3
+     */
+    public Entry() {
+        this(GtkEntry.createEntry());
+    }
+
+    /**
+     * Construct a new Entry, initialized with the specified text
+     * 
+     * @since 4.0.3
+     */
+    public Entry(String text) {
+        this(GtkEntry.createEntry());
+        setText(text);
+    }
+
+    /**
+     * Replace the current contents of the Entry with the supplied text.
+     * 
+     * @since 4.0.3
+     */
+    public void setText(String text) {
+        GtkEntry.setText(this, text);
+    }
+
+    /**
+     * Get the text currently showing in the Entry. This is typically the most
+     * significant method as it is the one you use to get the result of the
+     * user's activity upon receiving a {@link Entry.Activate} signal.
+     * 
+     * @since 4.0.3
+     */
+    public String getText() {
+        return GtkEntry.getText(this);
+    }
+
+    /**
+     * Get the length of the text currently showing in the Entry.
+     * 
+     * @since 4.0.13
+     */
+    public char getTextLength() {
+        return GtkEntry.getTextLength(this);
+    }
+
+    /**
+     * Specify the maximum number of characters the user is allowed to enter.
+     * Note that if the current text in the Entry is longer than the specified
+     * length, the contents will be truncated!
+     * 
+     * @param max
+     *            A value of <code>0</code> indicates no maximum length.
+     * @since 4.0.3
+     */
+    public void setMaxLength(int max) {
+        GtkEntry.setMaxLength(this, max);
+    }
+
+    /**
+     * Returns the current maximum width, in characters, the text in the Entry
+     * is allowed to be.
+     * 
+     * @since 4.0.3
+     */
+    public int getMaxLength() {
+        return GtkEntry.getMaxLength(this);
+    }
+
+    /**
+     * Set whether the text in the entry is visible or obscured. This is
+     * typically used for password fields. Use <code>true</code> for showing
+     * and <code>false</code> for hiding input characters.
+     * 
+     * <p>
+     * When set to be not visible, characters entered are shown with a
+     * <code>'*'</code> instead. This default can be changed with
+     * {@link #setInvisibleChar(char) setInvisibleChar()}.
+     * 
+     * @since 4.0.12
+     */
+    public void setVisibility(boolean setting) {
+        GtkEntry.setVisibility(this, setting);
+    }
+
+    /**
+     * Is text in the Entry are visible, or hidden by an obscuring character?
+     * Returns <code>true</code> if characters entered are visible,
+     * <code>false</code> if obscured.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getVisibility() {
+        return GtkEntry.getVisibility(this);
+    }
+
+    /**
+     * Change the character used to obscure text when
+     * {@link #setVisibility(boolean) visibility} is <code>false</code>.
+     * 
+     * @param replacement
+     *            The new character to be used to obscure text. A value of
+     *            <code>0</code> will cause no feedback to displayed at all
+     *            when the user is typing in the Entry.
+     * @since 4.0.3
+     */
+    public void setInvisibleChar(char replacement) {
+        GtkEntry.setInvisibleChar(this, replacement);
+    }
+
+    /**
+     * Set whether the text in the Entry can be change by the user.
+     * 
+     * @since 4.0.3
+     */
+    public void setEditable(boolean editable) {
+        GtkEditable.setEditable(this, editable);
+    }
+
+    /**
+     * Set whether the text should be overwritten when typing in the Entry.
+     * 
+     * @since 4.0.13
+     */
+    public void setOverwriteMode(boolean setting) {
+        GtkEntry.setOverwriteMode(this, setting);
+    }
+
+    /**
+     * Get the value previously set with {@link #setOverwriteMode(boolean)
+     * setOverwriteMode()}.
+     * 
+     * @since 4.0.13
+     */
+    public boolean getOverwriteMode() {
+        return GtkEntry.getOverwriteMode(this);
+    }
+
+    /**
+     * The <code>Entry.Activate</code> signal occurs when the user presses <b>
+     * <code>Enter</code></b> or <b><code>Return</code></b> in an Entry.
+     * 
+     * <p>
+     * Note that the other significant signal on an Entry is
+     * <code>Editable.Changed</code>, inherited from Editable. There is a
+     * {@link Entry#connect(org.gnome.gtk.Editable.Changed) connect()} method.
+     * 
+     * @since 4.0.3
+     */
+    public interface Activate extends GtkEntry.ActivateSignal
+    {
+        public void onActivate(Entry source);
+    }
+
+    /**
+     * Connects an <code>Entry.Activate</code> handler to the Widget.
+     * 
+     * @since 4.0.3
+     */
+    public void connect(Entry.Activate handler) {
+        GtkEntry.connect(this, handler, false);
+    }
+
+    public void setPosition(int position) {
+        if (position < -1) {
+            throw new IllegalArgumentException(
+                    "Position must be -1 to indicate you want it after the last character.");
+        }
+        GtkEditable.setPosition(this, position);
+    }
+
+    public int getPosition() {
+        return GtkEditable.getPosition(this);
+    }
+
+    /**
+     * Request that the width of this Entry be wide enough for a given number
+     * of characters.
+     * 
+     * <p>
+     * As with all font related operations, there are a number of competing
+     * approximations involved. In particular, this method operates by
+     * influencing the size <i>requested</i> by this Widget; the box packing
+     * model will still have the final say in the size-allocation phase.
+     * 
+     * <p>
+     * See also Label's {@link Label#setWidthChars(int) setWidthChars()}; the
+     * challenges and constraints involved are similar.
+     * 
+     * @param width
+     *            A setting of <code>-1</code> will return the Entry to normal
+     *            sizing behaviour.
+     * @since 4.0.6
+     */
+    public void setWidthChars(int width) {
+        GtkEntry.setWidthChars(this, width);
+    }
+
+    /**
+     * The signal emitted when the text in the Entry has changed.
+     * 
+     * @author Andrew Cowie
+     * @since 4.1.1
+     */
+    /*
+     * This signal is a mashup so that we can have Entry in the signature.
+     */
+    public interface Changed
+    {
+        public void onChanged(Entry source);
+    }
+
+    private static class EntryChangedHandler implements Editable.Changed
+    {
+        private final Entry.Changed handler;
+
+        private EntryChangedHandler(Entry.Changed handler) {
+            this.handler = handler;
+        }
+
+        public void onChanged(Editable source) {
+            final Entry entry;
+
+            entry = (Entry) source;
+            handler.onChanged(entry);
+        }
+    }
+
+    /**
+     * Connect a <code>Editable.Changed</code> handler. Use
+     * {@link #connect(org.gnome.gtk.Entry.Changed) connect(Entry.Changed)}
+     * instead, as it saves you having to cast the <code>source</code>
+     * parameter.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Editable.Changed handler) {
+        GtkEditable.connect(this, handler, false);
+    }
+
+    /**
+     * Connect a <code>Entry.Changed</code> handler.
+     * 
+     * @since 4.1.1
+     */
+    public void connect(Entry.Changed handler) {
+        GtkEditable.connect(this, new EntryChangedHandler(handler), false);
+    }
+
+    public void selectRegion(int start, int end) {
+        GtkEditable.selectRegion(this, start, end);
+    }
+
+    public int getSelectionBoundsStart() {
+        int[] start = new int[1];
+        int[] end = new int[1];
+
+        GtkEditable.getSelectionBounds(this, start, end);
+
+        return start[0];
+    }
+
+    public int getSelectionBoundsEnd() {
+        int[] start = new int[1];
+        int[] end = new int[1];
+
+        GtkEditable.getSelectionBounds(this, start, end);
+
+        return end[0];
+    }
+
+    /**
+     * Set the alignment of the the text being displayed in the Entry.
+     * 
+     * @param xalign
+     *            A value from <code>0.0f</code> for fully left-aligned
+     *            through <code>1.0f</code> for fully right-aligned. You can
+     *            use the constants {@link Alignment#LEFT LEFT},
+     *            {@link Alignment#CENTER CENTER} and {@link Alignment#RIGHT
+     *            RIGHT} in Alignment for convenience if you like. No, this
+     *            has nothing to do with politics.
+     * @since 4.0.6
+     */
+    /*
+     * Supposedly this reverses for RTL text layout. It'd be nice of someone
+     * could test that and document it to that effect if true.
+     */
+    public void setAlignment(float xalign) {
+        if ((xalign < 0.0) || (xalign > 1.0)) {
+            throw new IllegalArgumentException("xalign must be between 0.0 and 1.0");
+        }
+        GtkEntry.setAlignment(this, xalign);
+    }
+
+    /**
+     * Set the completion object to use with this Entry.
+     * 
+     * <p>
+     * Completion is a mechanism whereby pre-populated suggestions can be
+     * offered to the user, allowing for faster data entry in some
+     * circumstances.
+     * 
+     * <p>
+     * All configuration of the completion mechanism is done using
+     * {@link EntryCompletion}'s methods, so see there for details.
+     * 
+     * 
+     * @since 4.0.12
+     */
+    public void setCompletion(EntryCompletion completion) {
+        GtkEntry.setCompletion(this, completion);
+    }
+
+    /**
+     * Returns the current {@link EntryCompletion} object which is currently
+     * used by the <code>Entry</code>.
+     * 
+     * @since 4.0.12
+     */
+    public EntryCompletion getCompletion() {
+        return GtkEntry.getCompletion(this);
+    }
+
+    /**
+     * Set whether the Entry has a bevelled frame around it or not. The
+     * default (as you will be well accustomed to seeing) is <code>true</code>
+     * .
+     * 
+     * <p>
+     * As this decoration is a strong visual cue for users to realize that
+     * they are able to enter text into a given control, your are discouraged
+     * from turning it off unless you really need to minutely control
+     * placement; in that case, see also
+     * {@link #setInnerBorder(int, int, int, int) setInnerBorder()}.
+     * 
+     * @since 4.0.8
+     */
+    public void setHasFrame(boolean setting) {
+        GtkEntry.setHasFrame(this, setting);
+    }
+
+    /**
+     * Set the padding between the text entry control itself, and the
+     * surrounding decoration. This overrides the <var>inner-border</var>
+     * style property set by the theme.
+     * 
+     * <p>
+     * Ordinarily you shouldn't need this; in general you should leave things
+     * alone so that Entries appear uniform across the user's desktop. This is
+     * provided for the rare cases that minute positioning control is required
+     * (think of what goes on when you edit text in a CellRendererText) it is
+     * possible to do so.
+     * 
+     * @since 4.0.8
+     */
+    public void setInnerBorder(int left, int right, int top, int bottom) {
+        GtkEntryOverride.setInnerBorder(this, left, right, top, bottom);
+    }
+
+    /**
+     * Set the fraction of the progress that shows the <code>Entry</code> as
+     * "filled-in".
+     * 
+     * @since 4.0.13
+     */
+    public void setProgressFraction(double fraction) {
+        if ((fraction < 0.0) || (fraction > 1.0)) {
+            throw new IllegalArgumentException("fraction must be between 0.0 and 1.0, inclusive.");
+        }
+        GtkEntry.setProgressFraction(this, fraction);
+    }
+
+    /**
+     * Get the current progress fraction of the <code>Entry</code>.
+     * 
+     * @since 4.0.13
+     */
+    public double getProgressFraction() {
+        return GtkEntry.getProgressFraction(this);
+    }
+
+    /**
+     * Set the progress pulse step of the <code>Entry</code>.
+     * 
+     * @since 4.0.13
+     */
+    public void setProgressPulseStep(double fraction) {
+        if ((fraction < 0.0) || (fraction > 1.0)) {
+            throw new IllegalArgumentException("fraction must be between 0.0 and 1.0, inclusive.");
+        }
+        GtkEntry.setProgressPulseStep(this, fraction);
+    }
+
+    /**
+     * Get the current progress pulse step of the <code>Entry</code>.
+     * 
+     * @since 4.0.13
+     */
+    public double getProgressPulseStep() {
+        return GtkEntry.getProgressPulseStep(this);
+    }
+
+    /**
+     * Cause the <code>Entry</code>'s progress indicator to enter
+     * "activity mode", used to indicate that the application is
+     * making progress but in a way that can't be strictly quantized.
+     * 
+     * @since 4.0.13
+     */
+    public void progressPulse() {
+        GtkEntry.progressPulse(this);
+    }
+
+    /**
+     * Set the icon to a given <code>position</code> using a {@link Pixbuf}.
+     * If <code>pixbuf</code> is <code>null</code>, no icon will be shown.
+     * 
+     * @since 4.0.13
+     */
+    public void setIconFromPixbuf(EntryIconPosition position, Pixbuf pixbuf) {
+        GtkEntry.setIconFromPixbuf(this, position, pixbuf);
+    }
+
+    /**
+     * Set the icon to a given <code>position</code> using a {@link Stock}
+     * item. If <code>stock</code> is <code>null</code>, no icon will be
+     * shown.
+     * 
+     * @since 4.0.13
+     */
+    public void setIconFromStock(EntryIconPosition position, Stock stock) {
+        GtkEntry.setIconFromStock(this, position, stock == null ? null : stock.getStockId());
+    }
+
+    /**
+     * Cause the Entry to have an icon at the given <code>position</code>
+     * using an Icon from the current icon theme. If <code>name</code> is
+     * <code>null</code>, no icon will be shown. If for whatever reason the
+     * icon lookup fails, a "broken image" icon will be used
+     * instead.
+     * 
+     * @since 4.0.17
+     */
+    public void setIconFromIcon(EntryIconPosition position, Icon icon) {
+        GtkEntry.setIconFromIconName(this, position, Helper.getName(icon));
+    }
+
+    /**
+     * Get the type used by the icon to store image data.
+     * 
+     * @since 4.0.13
+     */
+    public ImageType getIconStorageType(EntryIconPosition position) {
+        return GtkEntry.getIconStorageType(this, position);
+    }
+
+    /**
+     * Retrieves the image used for the icon as a {@link Pixbuf}.
+     * 
+     * <p>
+     * A <code>null</code> value will be returned if no icon is set for this
+     * <code>position<code>.
+     * 
+     * @since 4.0.13
+     */
+    public Pixbuf getIconPixbuf(EntryIconPosition position) {
+        return GtkEntry.getIconPixbuf(this, position);
+    }
+
+    /**
+     * Retrieves the image used for the icon as a {@link Stock} item.
+     * 
+     * <p>
+     * A <code>null</code> value will be returned if the icon was not set from
+     * a {@link Stock} item.
+     * 
+     * @since 4.0.13
+     */
+    public Stock getIconStock(EntryIconPosition position) {
+        return Stock.instanceFor(GtkEntry.getIconStock(this, position));
+    }
+
+    /**
+     * Retrieves the named Icon used for illustrating icon at
+     * <code>position</code> on this Entry.
+     * 
+     * <p>
+     * A <code>null</code> value will be returned if the icon was not set from
+     * an named Icon.
+     * 
+     * @since 4.0.17
+     */
+    public Icon getIconIcon(EntryIconPosition position) {
+        final String name;
+        final Icon result;
+
+        name = GtkEntry.getIconName(this, position);
+        result = Helper.instanceFor(name);
+
+        return result;
+    }
+
+    /**
+     * Set whether the icon at the given <code>position</code> is activatable
+     * or not.
+     * 
+     * @since 4.0.13
+     */
+    public void setIconActivatable(EntryIconPosition position, boolean setting) {
+        GtkEntry.setIconActivatable(this, position, setting);
+    }
+
+    /**
+     * Return <code>true</code> if the icon at the given <code>position</code>
+     * is activatable.
+     * 
+     * @since 4.0.13
+     */
+    public boolean getIconActivatable(EntryIconPosition position) {
+        return GtkEntry.getIconActivatable(this, position);
+    }
+
+    /**
+     * Set whether the icon at the given <code>position</code> should be
+     * sensitive or insensitive.
+     * 
+     * @since 4.0.13
+     */
+    public void setIconSensitive(EntryIconPosition position, boolean setting) {
+        GtkEntry.setIconSensitive(this, position, setting);
+    }
+
+    /**
+     * Return <code>true</code> if the icon at the given <code>position</code>
+     * is sensitive.
+     * 
+     * @since 4.0.13
+     */
+    public boolean getIconSensitive(EntryIconPosition position) {
+        return GtkEntry.getIconSensitive(this, position);
+    }
+
+    /**
+     * Find the icon at the given position and return its index.
+     * 
+     * <p>
+     * If <code>x</code> or <code>y</code> are not inside an icon,
+     * <code>-1</code> will be returned.
+     * 
+     * @since 4.0.13
+     */
+    public int getIconAtPos(int x, int y) {
+        return GtkEntry.getIconAtPos(this, x, y);
+    }
+
+    /**
+     * Set the note (without Pango markup) that will be displayed when the
+     * mouse pointer will be over the icon. The <code>text</code> string
+     * should be in plain text (without any Pango markup).
+     * 
+     * @since 4.0.13
+     */
+    public void setIconTooltipText(EntryIconPosition position, String text) {
+        GtkEntry.setIconTooltipText(this, position, text);
+    }
+
+    /**
+     * Return the note that is displayed when the mouse pointer is over the
+     * icon.
+     * 
+     * @since 4.0.13
+     */
+    public String getIconTooltipText(EntryIconPosition position) {
+        return GtkEntry.getIconTooltipText(this, position);
+    }
+
+    /**
+     * Set the note (with Pango markup) that will be displayed when the mouse
+     * pointer will be over the icon.
+     * 
+     * @since 4.0.13
+     */
+    public void setIconTooltipMarkup(EntryIconPosition position, String markup) {
+        GtkEntry.setIconTooltipMarkup(this, position, markup);
+    }
+
+    /**
+     * Return the note that is displayed when the mouse pointer is over the
+     * icon.
+     * 
+     * @since 4.0.13
+     */
+    public String getIconTooltipMarkup(EntryIconPosition position) {
+        return GtkEntry.getIconTooltipMarkup(this, position);
+    }
+
+    /**
+     * Emitted when an activatable icon is clicked.
+     * 
+     * @since 4.0.13
+     */
+    public interface IconPress extends GtkEntry.IconPressSignal
+    {
+        public void onIconPress(Entry source, EntryIconPosition position, Event event);
+    }
+
+    /**
+     * Hook up the <code>Entry.IconPress</code> handler.
+     * 
+     * @since 4.0.13
+     */
+    public void connect(Entry.IconPress handler) {
+        GtkEntry.connect(this, handler, false);
+    }
+
+    /**
+     * Emitted on the button release from a mouse click over an activatable
+     * icon.
+     * 
+     * @since 4.0.13
+     */
+    public interface IconRelease extends GtkEntry.IconReleaseSignal
+    {
+        public void onIconRelease(Entry source, EntryIconPosition position, Event event);
+    }
+
+    /**
+     * Hook up the <code>Entry.IconRelease</code> handler.
+     * 
+     * @since 4.0.13
+     */
+    public void connect(Entry.IconRelease handler) {
+        GtkEntry.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/EntryBuffer.java b/src/bindings/org/gnome/gtk/EntryBuffer.java
new file mode 100644
index 0000000..0cb554b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/EntryBuffer.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class EntryBuffer extends Object
+{
+    protected EntryBuffer(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/EntryCompletion.java b/src/bindings/org/gnome/gtk/EntryCompletion.java
new file mode 100644
index 0000000..e7d2cca
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/EntryCompletion.java
@@ -0,0 +1,647 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * An object to use in conjunction with {@link Entry} to provide completion
+ * functionality. <img src="EntryCompletion.png" class="snapshot" />
+ * 
+ * <p>
+ * To add completion functionality to an Entry, use its
+ * {@link Entry#setCompletion(EntryCompletion) setCompletion()} method.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.12
+ */
+public class EntryCompletion extends Object implements CellLayout
+{
+    protected EntryCompletion(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new EntryCompletion.
+     * 
+     * @since 4.0.12
+     */
+    public EntryCompletion() {
+        this(GtkEntryCompletion.createEntryCompletion());
+    }
+
+    /**
+     * Retrieve the Entry that this EntryCompletion is attached to.
+     * 
+     * @since 4.0.12
+     */
+    public Entry getEntry() {
+        return (Entry) GtkEntryCompletion.getEntry(this);
+    }
+
+    /**
+     * Set the TreeModel being used to source data for this EntryCompletion.
+     * If a model has already been set, calling this will replace it.
+     * 
+     * @param store
+     *            a value of <code>null</code> will remove the data model
+     *            underlying this EntryCompletion, leaving it unset for the
+     *            present.
+     * @since 4.0.12
+     */
+    public void setModel(TreeModel store) {
+        GtkEntryCompletion.setModel(this, store);
+    }
+
+    /**
+     * Get the TreeModel currently providing the data powering this
+     * EntryCompletion, or <code>null</code> if not yet set.
+     * 
+     * @since 4.0.12
+     */
+    public TreeModel getModel() {
+        return GtkEntryCompletion.getModel(this);
+    }
+
+    /**
+     * Set the minimum length of the search key to the value specified by
+     * <code>length</code>. This means that the key string (which is in the
+     * Entry) must be at least length characters before a completion list will
+     * be displayed.
+     * 
+     * <p>
+     * This is useful for long lists, where completing using a small key will
+     * take too much time and will return a too large dataset.
+     * 
+     * @since 4.0.12
+     */
+    public void setMinimumKeyLength(int length) {
+        GtkEntryCompletion.setMinimumKeyLength(this, length);
+    }
+
+    /**
+     * Return the minimum key length set for the entry completion. See
+     * {@link #setMinimumKeyLength(int) setMinimumKeyLength()} for more
+     * information.
+     * 
+     * @since 4.0.12
+     */
+    public int getMinimumKeyLength() {
+        return GtkEntryCompletion.getMinimumKeyLength(this);
+    }
+
+    /**
+     * Refilter the current list of completions based on the current key. Be
+     * aware that this method will <i>not</i> put the completion in the Entry;
+     * this is just a command to update completion popup.
+     * 
+     * <p>
+     * If you are looking to duplicate the effect of a line in the completion
+     * list being selected by the user see
+     * {@link #emitMatchSelected(TreeIter) emitMatchSelected()} instead.
+     * 
+     * @since 4.0.12
+     */
+    public void complete() {
+        GtkEntryCompletion.complete(this);
+    }
+
+    /**
+     * Force the {@link EntryCompletion.MatchSelected} signal to be emitted.
+     * This action will result in the completion of the associated Entry using
+     * the completion string pointed at by the given TreeIter.
+     * 
+     * @since 4.0.12
+     */
+    public boolean emitMatchSelected(TreeIter row) {
+        if (row == null) {
+            throw new IllegalArgumentException(
+                    "TreeIter passed to EntryCompletion emitMatchSelected(TreeIter) must not be null");
+        }
+
+        return GtkEntryCompletionOverride.emitMatchSelected(this, row);
+    }
+
+    /**
+     * Insert an action in the action item list of the EntryCompletion at the
+     * position specified by <code>index</code> with the text specified by
+     * <code>text</code>.
+     * 
+     * <p>
+     * If you want the action item to have markup, use
+     * {@link #insertActionMarkup(int, String) insertActionMarkup()} instead.
+     * 
+     * @since 4.0.12
+     */
+    public void insertActionText(int index, String text) {
+        GtkEntryCompletion.insertActionText(this, index, text);
+    }
+
+    /**
+     * Insert an action item in the action item list of the EntryCompletion at
+     * the position specified by <code>index</code> with the markup specified
+     * by <code>markup</code>.
+     * 
+     * @since 4.0.12
+     */
+    public void insertActionMarkup(int index, String markup) {
+        GtkEntryCompletion.insertActionMarkup(this, index, markup);
+    }
+
+    /**
+     * Delete the item at the position in the action item list specified by
+     * <code>index</code>.
+     * 
+     * @since 4.0.12
+     */
+    public void deleteAction(int index) {
+        GtkEntryCompletion.deleteAction(this, index);
+    }
+
+    /**
+     * Create and adds a {@link CellRendererText} using the specified
+     * DataColumn in your TreeModel as the source for completion strings
+     * 
+     * @since 4.0.12
+     */
+    public void setTextColumn(DataColumn column) {
+        GtkEntryCompletion.setTextColumn(this, column.getOrdinal());
+    }
+
+    /**
+     * Request a prefix insertion. The prefix is the string that will trigger
+     * the completion. For example, the prefix for "Alice" and
+     * "Albert" is "Al".
+     * 
+     * @since 4.0.12
+     */
+    public void insertPrefix() {
+        GtkEntryCompletion.insertPrefix(this);
+    }
+
+    /**
+     * Enable or disable the automatic inline completion.
+     * 
+     * <p>
+     * If <code>setting</code> is <code>true</code>, the common prefix of the
+     * possible completions will be automatically inserted in the Entry.
+     * 
+     * <p>
+     * The default is <code>false</code>.
+     * 
+     * @since 4.0.12
+     */
+    public void setInlineCompletion(boolean setting) {
+        GtkEntryCompletion.setInlineCompletion(this, setting);
+    }
+
+    /**
+     * Has automatic inline completion been enabled?
+     * 
+     * @since 4.0.12
+     */
+    public boolean getInlineCompletion() {
+        return GtkEntryCompletion.getInlineCompletion(this);
+    }
+
+    /**
+     * Enable or disable completion popup.
+     * 
+     * <p>
+     * The default is <code>true</code>, which is that completions will be
+     * presented in a popup window.
+     * 
+     * @since 4.0.12
+     */
+    public void setPopupCompletion(boolean setting) {
+        GtkEntryCompletion.setPopupCompletion(this, setting);
+    }
+
+    /**
+     * Return <code>true</code> if automatic completion popup is enabled.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getPopupCompletion() {
+        return GtkEntryCompletion.getPopupCompletion(this);
+    }
+
+    /**
+     * Enable or disable the completion popup resize.
+     * 
+     * <p>
+     * If <code>setting</code> is <code>true</code> the popup window will be
+     * resized according to the completion width.
+     * 
+     * @since 4.0.12
+     */
+    public void setPopupSetWidth(boolean setting) {
+        GtkEntryCompletion.setPopupSetWidth(this, setting);
+    }
+
+    /**
+     * Return <code>true</code> if completion popup resize is enabled.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getPopupSetWidth() {
+        return GtkEntryCompletion.getPopupSetWidth(this);
+    }
+
+    /**
+     * Enable or disable the popup when there is only a single match.
+     * 
+     * <p>
+     * If <code>setting</code> is <code>true</code> the popup will appear even
+     * if there is a single match. The default is that this is the case.
+     * 
+     * @since 4.0.12
+     */
+    public void setPopupSingleMatch(boolean setting) {
+        GtkEntryCompletion.setPopupSingleMatch(this, setting);
+    }
+
+    /**
+     * Return <code>true</code> if completion popup appears when there is a
+     * single match.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getPopupSingleMatch() {
+        return GtkEntryCompletion.getPopupSingleMatch(this);
+    }
+
+    /**
+     * Get the original text entered that triggered the completion or
+     * <code>null</code> if there is no completion.
+     * 
+     * @since 4.0.12
+     */
+    public String getCompletionPrefix() {
+        return GtkEntryCompletion.getCompletionPrefix(this);
+    }
+
+    /**
+     * Return <code>true</code> if inline-selection mode is turned on.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getInlineSelection() {
+        return GtkEntryCompletion.getInlineSelection(this);
+    }
+
+    /**
+     * Enable or disable the possibility of cycle through the possible
+     * completions inside the entry.
+     * 
+     * <p>
+     * This is ordinarily unset.
+     * 
+     * @since 4.0.12
+     */
+    public void setInlineSelection(boolean setting) {
+        GtkEntryCompletion.setInlineSelection(this, setting);
+    }
+
+    /*
+     * This internal class is needed because the TreeIter passed to the
+     * handler does not have the model field properly set, so we need to set
+     * it before passing the TreeIter to the user.
+     */
+    private static class MatchSelectedHandler implements GtkEntryCompletion.MatchSelectedSignal
+    {
+        private final EntryCompletion.MatchSelected handler;
+
+        private MatchSelectedHandler(EntryCompletion.MatchSelected handler) {
+            super();
+            this.handler = handler;
+        }
+
+        public boolean onMatchSelected(EntryCompletion source, TreeModel model, TreeIter iter) {
+            iter.setModel(model);
+            return handler.onMatchSelected(source, model, iter);
+        }
+    }
+
+    /**
+     * Emitted when a completion string was selected from the completion list.
+     * 
+     * <p>
+     * Generally, this signal is enough to handle a completion selection and
+     * it just used to complete the entry according to the selected completion
+     * string.
+     * 
+     * <pre>
+     * final DataColumnString column;
+     * final EntryCompletion completion;
+     * 
+     * completion.connect(new EntryCompletion.MatchSelected() {
+     *     final String text;
+     *     final Entry entry;
+     * 
+     *     entry = source.getEntry();
+     *     text = model.getValue(iter, column);
+     * 
+     *     entry.setText(text);
+     *     ...
+     * });
+     * </pre>
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.0.12
+     */
+    public interface MatchSelected extends GtkEntryCompletion.MatchSelectedSignal
+    {
+        /**
+         * The useful parameter are <code>model</code> and <code>iter</code>
+         * which will make you able to get the value of the selected
+         * completion using the TreeModel's
+         * {@link TreeModel#getValue(TreeIter, DataColumnString) getValue()}
+         * method.
+         * 
+         * @since 4.0.12
+         */
+        public boolean onMatchSelected(EntryCompletion source, TreeModel model, TreeIter iter);
+    }
+
+    /**
+     * Hook up the <code>EntryCompletion.MatchSelected</code> handler.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(EntryCompletion.MatchSelected handler) {
+        GtkEntryCompletion.connect(this, new MatchSelectedHandler(handler), false);
+    }
+
+    /**
+     * Emitted when an action item is selected from the popup action list.
+     * 
+     * <p>
+     * In this way, you can do something different from the
+     * {@link MatchSelected} signal.
+     * 
+     * <pre>
+     * final EntryCompletion completion;
+     * 
+     * ...
+     * 
+     * completion.insertActionText(0, "complete");
+     * completion.insertActionText(1, "another");
+     * 
+     * completion.connect(new EntryCompletion.ActionActivated() {
+     *     public void onActionActivated(EntryCompletion source, int index) {
+     *         System.out.println("Action " + index + " activated.");
+     *     }
+     * });
+     * </pre>
+     * 
+     * @since 4.0.12
+     */
+    public interface ActionActivated extends GtkEntryCompletion.ActionActivatedSignal
+    {
+        /**
+         * The only two parameters give references to the EntryCompletion
+         * <code>source</code> which has emitted the signal and the activated
+         * action <code>index</code>.
+         * 
+         * @since 4.0.12
+         */
+        public void onActionActivated(EntryCompletion source, int index);
+    }
+
+    /**
+     * Hook up the <code>EntryCompletion.ActionActivated</code> handler.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(EntryCompletion.ActionActivated handler) {
+        GtkEntryCompletion.connect(this, handler, false);
+    }
+
+    /**
+     * Emitted when the inline auto-completion is triggered. The default
+     * behavior is to make the entry display the whole prefix and select the
+     * newly inserted part.
+     * 
+     * <pre>
+     * final EntryCompletion completion;
+     * 
+     * ...
+     * 
+     * completion.setInlineCompletion(true);
+     * completion.connect(new EntryCompletion.InsertPrefix() {
+     *     public boolean onInsertPrefix(EntryCompletion source, String prefix) {
+     *         final Entry entry;
+     * 
+     *         entry = source.getEntry();
+     *         entry.setText(prefix);
+     *         entry.selectRegion(0, prefix.length());
+     *     }
+     * });
+     * </pre>
+     * 
+     * @since 4.0.12
+     */
+    public interface InsertPrefix extends GtkEntryCompletion.InsertPrefixSignal
+    {
+        /**
+         * The only two parameters give references to the EntryCompletion
+         * <code>source</code> which has emitted the signal and the selected
+         * <code>prefix</code>.
+         * 
+         * @since 4.0.12
+         */
+        public boolean onInsertPrefix(EntryCompletion source, String prefix);
+    }
+
+    /**
+     * Hook up the <code>EntryCompletion.InsertPrefix</code> handler.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(EntryCompletion.InsertPrefix handler) {
+        GtkEntryCompletion.connect(this, handler, false);
+    }
+
+    /*
+     * This internal class is needed because the TreeIter passed to the
+     * handler does not have the model field properly set, so we need to set
+     * it before passing the TreeIter to the user.
+     */
+    private static class CursorOnMatchHandler implements GtkEntryCompletion.CursorOnMatchSignal
+    {
+        private final EntryCompletion.CursorOnMatch handler;
+
+        private CursorOnMatchHandler(EntryCompletion.CursorOnMatch handler) {
+            super();
+            this.handler = handler;
+        }
+
+        public boolean onCursorOnMatch(EntryCompletion source, TreeModel model, TreeIter iter) {
+            iter.setModel(model);
+            return handler.onCursorOnMatch(source, model, iter);
+        }
+    }
+
+    /**
+     * Emitted when the cursor is on a completion string without select it.
+     * The default behavior is to make the entry display the contents of the
+     * row column pointed by <code>iter</code>.
+     * 
+     * <pre>
+     * final DataColumnString column;
+     * final EntryCompletion completion;
+     * 
+     * ...
+     * 
+     * completion.connect(new CursorOnMatch.InsertPrefix() {
+     *     public boolean onCursorOnMatch(EntryCompletion source, TreeModel model, TreeIter iter) {
+     *         final Entry entry;
+     *         final String content;
+     * 
+     *         entry = source.getEntry();
+     *         content = model.getValue(iter, column);
+     * 
+     *         entry.setText(content);
+     * 
+     *         return true;
+     *     }
+     * });
+     * </pre>
+     * 
+     * @since 4.0.12
+     */
+    public interface CursorOnMatch extends GtkEntryCompletion.CursorOnMatchSignal
+    {
+        /**
+         * The useful parameters are <code>model</code> and <code>iter</code>
+         * which will make you able to get the value of the selected
+         * completion using the TreeModel's
+         * {@link TreeModel#getValue(TreeIter, DataColumnString) getValue()}
+         * method.
+         * 
+         * @since 4.0.12
+         */
+        public boolean onCursorOnMatch(EntryCompletion source, TreeModel model, TreeIter iter);
+    }
+
+    /**
+     * Hook up the <code>EntryCompletion.CursorOnMatch</code> handler.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(EntryCompletion.CursorOnMatch handler) {
+        GtkEntryCompletion.connect(this, new CursorOnMatchHandler(handler), false);
+    }
+
+    /*
+     * This internal class is needed because the TreeIter passed to the
+     * handler does not have the model field properly set, so we need to set
+     * it before passing the TreeIter to the user.
+     */
+    private static class MatchHandler implements GtkEntryCompletion.MatchSignal
+    {
+        private final Match handler;
+
+        private MatchHandler(Match handler) {
+            this.handler = handler;
+        }
+
+        public boolean onMatch(EntryCompletion source, String key, TreeIter iter) {
+            iter.setModel(source.getModel());
+            return handler.onMatch(source, key, iter);
+        }
+    }
+
+    /**
+     * The callback invoked when a EntryCompletion wants to ask if a given row
+     * in the TreeModel should be in the completion list.
+     * 
+     * Generally, when you will receive the callback you will reach into the
+     * source's {@link #getModel() model} and query a column by which you will
+     * determine whether or not to include this row. It allows you to a create
+     * a more complex completion behavior into the
+     * <code>EntryCompletion.Match</code> callback. The behavior of a default
+     * EntryCompletion can be written like that:
+     * 
+     * <pre>
+     * final DataColumnString column;
+     * final EntryCompletion completion;
+     * 
+     * ...
+     * 
+     * completion.setMatchCallback(new EntryCompletion.Match() {
+     *     public boolean onMatch(EntryCompletion source, String key, TreeIter iter) {
+     *         final TreeModel model;
+     *         final String text;
+     * 
+     *         model = source.getModel();
+     *         text = model.getValue(iter, column);
+     * 
+     *         return text.startsWith(key);
+     *     }
+     * });
+     * </pre>
+     * 
+     * <p>
+     * <i>If you are researching the GTK API documentation, see
+     * <code>(*GtkEntryCompletionMatchFunc)</code>. Creating and invoking this
+     * "match" signal is how java-gnome has implemented the function pointer
+     * expected by <code>gtk_entry_completion_set_match_func()</code>.</i>
+     * 
+     * @since 4.0.12
+     */
+    public interface Match
+    {
+        /**
+         * Tell if a row should be in the completion list or not. Return
+         * <code>true</code> for the row to be included in the list, or
+         * <code>false</code> for the row to be excluded.
+         * 
+         * @since 4.0.12
+         */
+        public boolean onMatch(EntryCompletion source, String key, TreeIter iter);
+    }
+
+    /**
+     * Hookup the <code>EntryCompletion.Match</code> callback that will be
+     * used to determine if a row of the associated TreeModel should be in the
+     * completion list.
+     * 
+     * @since 4.0.12
+     */
+    public void setMatchCallback(EntryCompletion.Match callback) {
+        GtkEntryCompletionOverride.setMatchFunc(this);
+        GtkEntryCompletion.connect(this, new MatchHandler(callback), false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/EntryIconPosition.java b/src/bindings/org/gnome/gtk/EntryIconPosition.java
new file mode 100644
index 0000000..44ab1db
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/EntryIconPosition.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants used to specify where an icon will be placed in an {@link Entry}.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.13
+ */
+public final class EntryIconPosition extends Constant
+{
+    private EntryIconPosition(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The icon will be placed at the beginning of the {@link Entry}
+     * (depending on the text direction).
+     */
+    public static final EntryIconPosition PRIMARY = new EntryIconPosition(GtkEntryIconPosition.PRIMARY,
+            "PRIMARY");
+
+    /**
+     * The icon will be placed at the end of the {@link Entry} (depending on
+     * the text direction).
+     */
+    public static final EntryIconPosition SECONDARY = new EntryIconPosition(
+            GtkEntryIconPosition.SECONDARY, "SECONDARY");
+}
diff --git a/src/bindings/org/gnome/gtk/ErrorMessageDialog.java b/src/bindings/org/gnome/gtk/ErrorMessageDialog.java
new file mode 100644
index 0000000..63d4170
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ErrorMessageDialog.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Dialog preconfigured to present an urgent error message to the user.
+ * 
+ * <p>
+ * This is a modal MessageDialog of type {@link MessageType#ERROR ERROR} with
+ * an "Ok" Button.
+ * 
+ * <p>
+ * See {@link InfoMessageDialog InfoMessageDialog} for an example of how to
+ * use these convenience MessageDialog subclasses.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class ErrorMessageDialog extends MessageDialog
+{
+    public ErrorMessageDialog(Window parent, String primary, String secondary) {
+        super(parent, true, MessageType.ERROR, ButtonsType.OK, primary);
+        if (secondary != null) {
+            this.setSecondaryText(secondary);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/EventBox.java b/src/bindings/org/gnome/gtk/EventBox.java
new file mode 100644
index 0000000..e9fce18
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/EventBox.java
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Add the ability for a Widget to accept events. A fair number of Widgets do
+ * <i>not</i> have the ability to process events coming from the user because,
+ * under ordinary circumstances, they don't need it. If you want a Label or
+ * Image to take keystrokes or mouse clicks, then you instantiate an EventBox
+ * and pack your Widget into it.
+ * 
+ * <p>
+ * Quite a number of Widgets share underlying resources. That's not something
+ * you normally need to worry about as a developer, but if you have called
+ * {@link Widget#getWindow() getWindow()} and find yourself needing an
+ * underlying [<code>org.gnome.gdk</code>] Window specifically for your
+ * Widget, then use an EventBox.
+ * 
+ * <p>
+ * EventBoxes can also be used for things like painting a different background
+ * colour behind an otherwise transparent Widget.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class EventBox extends Bin
+{
+    protected EventBox(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new EventBox. Be sure to call {@link #setAboveChild(boolean)
+     * setAboveChild()} and {@link #setVisibleWindow(boolean)
+     * setVisibleWindow()} if necessary.
+     * 
+     * @since 4.0.6
+     */
+    public EventBox() {
+        super(GtkEventBox.createEventBox());
+    }
+
+    /**
+     * Whether the EventBox should be "above" its child or not. If above, the
+     * EventBox will receive <i>all</i> the events targeted at the child. If
+     * below, then the events will first go to the child and then to the
+     * EventBox. The default is <code>false</code> which is usually what you
+     * want (ie, you don't want to mess with existing functionality in a
+     * Widget, just add to it).
+     * 
+     * @since 4.0.6
+     */
+    public void setAboveChild(boolean setting) {
+        GtkEventBox.setAboveChild(this, setting);
+    }
+
+    /**
+     * Whether the EventBox will have a "visible" child. The default is
+     * <code>true</code>; ordinarily you want the child Widget to be displayed
+     * normally.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * TODO there is a lot more to this than described here. Someone please
+     * read the GTK docs, experiment with this, and improve our API
+     * documentation accordingly.
+     */
+    public void setVisibleWindow(boolean setting) {
+        GtkEventBox.setVisibleWindow(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Expander.java b/src/bindings/org/gnome/gtk/Expander.java
new file mode 100644
index 0000000..3689d78
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Expander.java
@@ -0,0 +1,107 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Container that can hide its child. It can be in two states: one, called
+ * "expanded", where the child Widget is shown; and another where the child
+ * Widget is "hidden". In both states, it shows a control, usually a little
+ * triangle, that the user can click to change between both states, i.e. to
+ * alternatively show or hide the child.
+ * 
+ * <p>
+ * This Container is useful for hiding advanced options from a Dialog, while
+ * still providing a way to let users access those options. You usually
+ * specify a text label that is show near the expander triangle that contains
+ * a brief description of the hidden elements.
+ * 
+ * <p>
+ * To add the child Widget, you should use the Container
+ * {@link Container#add(Widget) add()} method, as follows:
+ * 
+ * <pre>
+ * Widget advancedOptionsWidget;
+ * Expander advancedOptions;
+ * 
+ * // create a Widget with some options we want to hide 
+ * advancedOptionsWidget = ... 
+ * advancedOptions = new Expander("Advanced Options");
+ * advancedOptions.add(advancedOptionsWidget);
+ * </pre>
+ * 
+ * Note that the child Widget is hidden by default, you can use the
+ * {@link #setExpanded(boolean) setExpanded()} method to show it from the
+ * beginning.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class Expander extends Bin
+{
+    protected Expander(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Expander with the given label. Underscore characters will
+     * be interpreted as marking mnemonic keys.
+     * 
+     * @since 4.0.7
+     */
+    public Expander(String label) {
+        super(GtkExpander.createExpanderWithMnemonic(label));
+    }
+
+    /**
+     * Set the state of this Expander.
+     * 
+     * @param expanded
+     *            <code>true</code> to show the child Widget,
+     *            <code>false</code> to hide it.
+     * @since 4.0.7
+     */
+    public void setExpanded(boolean expanded) {
+        GtkExpander.setExpanded(this, expanded);
+    }
+
+    /**
+     * Get the expanded state of this Expander, i.e., whether its child is
+     * shown or hidden.
+     * 
+     * @since 4.0.7
+     */
+    public boolean getExpanded() {
+        return GtkExpander.getExpanded(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ExpanderStyle.java b/src/bindings/org/gnome/gtk/ExpanderStyle.java
new file mode 100644
index 0000000..c6a74fc
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ExpanderStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class ExpanderStyle extends Constant
+{
+    private ExpanderStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FatalError.java b/src/bindings/org/gnome/gtk/FatalError.java
new file mode 100644
index 0000000..feb0692
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FatalError.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Misuse of the GTK.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ * @see org.gnome.glib.FatalError
+ */
+public class FatalError extends org.freedesktop.bindings.FatalError
+{
+    private static final long serialVersionUID = 1;
+
+    protected FatalError() {
+        super();
+    }
+
+    protected FatalError(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooser.java b/src/bindings/org/gnome/gtk/FileChooser.java
new file mode 100644
index 0000000..d42aa8b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooser.java
@@ -0,0 +1,206 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+
+/**
+ * Widgets which allow you to select a file or directory. <img
+ * src="FileChooserDialog.png" class="snapshot"> GNOME has a unified
+ * FileChooser which is used by all applications to select files. It comes in
+ * several pre-baked forms, notably {@link FileChooserDialog} (a Dialog which
+ * can be used as a modal popup), and {@link FileChooserButton} (which is a
+ * Button which displays the selected filename and pops up a FileChooserDialog
+ * when activated).
+ * 
+ * <p>
+ * Be aware that much of FileChooser's internal behaviour depends on the main
+ * loop cycling; calls to methods like {@link #setCurrentFolder(String)
+ * setCurrentFolder()} and {@link #setFilename(String) setFilename()} will not
+ * actually take effect until you start the main loop or return from the
+ * current signal handler (as the case may be).
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.2
+ */
+public interface FileChooser
+{
+    /**
+     * Get the filename currently selected by this FileChooser.
+     * 
+     * @return The filename, or if no file is selected then this will return
+     *         <code>null</code>. If multiple files are selected, one of the
+     *         filenames will be returned at random. If the FileChooser is in
+     *         one of the folder modes, this returns the selected folder's
+     *         name.
+     * @since 4.0.2
+     */
+    public String getFilename();
+
+    /**
+     * Get the current folder being displayed in this FileChooser. Note that
+     * this is not the same as the currently-selected folder if the
+     * FileChooser is in {@link FileChooserAction#SELECT_FOLDER SELECT_FOLDER}
+     * mode. To get the currently-selected folder in that mode, you can use
+     * {@link #getURI()} instead.
+     * 
+     * @return The current folder, or <code>null</code> if if the FileChooser
+     *         was unable to load the last folder that was requested of it (as
+     *         would happen if calling {@link #setCurrentFolder(String)} on a
+     *         nonexistent directory).
+     * @see #getFilename()
+     * @since 4.0.2
+     */
+    public String getCurrentFolder();
+
+    /**
+     * Set the current directory for this FileChooser. The user will be shown
+     * the full contents of that folder, plus user interface elements for
+     * navigating to other folders.
+     * 
+     * @param directory
+     *            the full path of the new current folder
+     * @return <code>true</code> if the folder could be changed successfully,
+     *         <code>false</code> otherwise.
+     * @since 4.0.2
+     */
+    public boolean setCurrentFolder(String directory);
+
+    /**
+     * Sets the type of operation that the chooser is performing; the user
+     * interface is adapted to suit the selected action. For example, an
+     * option to create a new folder might be shown if the action is
+     * {@link FileChooserAction#SAVE SAVE} but not if the action is
+     * {@link FileChooserAction#OPEN OPEN}.
+     * 
+     * @since 4.0.3
+     */
+    public void setAction(FileChooserAction action);
+
+    /**
+     * Gets the type of operation that the file chooser is performing.
+     * 
+     * @see #setAction(FileChooserAction)
+     * @since 4.0.3
+     */
+    public FileChooserAction getAction();
+
+    /**
+     * Get the URI representing the file or directory currently selected by
+     * this FileChooser.
+     * 
+     * @return The selected file's URI, or if no file is selected then this
+     *         will return <code>null</code>. If multiple files are selected,
+     *         one of the filenames will be returned at random. If the
+     *         FileChooser is in one of the folder modes, this returns the
+     *         selected folder's URI.
+     * @since 4.0.2
+     */
+    /*
+     * A direct mapping would be getUri(), but that looks stupid, and
+     * java.io.File uses URI in its method names. But is actually returning a
+     * Java URI object a good idea? I think so - it helps bridge the gap a bit
+     * better, I think.
+     */
+    public URI getURI();
+
+    /*
+     * We do not expose SelectionChanged or FileActivated, as they are
+     * internal signals (and besides, testing it didn't seem to result in the
+     * signal being fired in a visible way).
+     */
+
+    /**
+     * Set the file you want selected in the FileChooser.
+     * 
+     * <p>
+     * If the folder currently showing in the FileChooser isn't the directory
+     * containing the filename you specify, then the FileChooser will be
+     * changed to that directory.
+     * 
+     * @param filename
+     *            Must be an absolute path.
+     * @return <code>true</code> if the the directory was changed (if
+     *         necessary) and a file was successfully selected.
+     * @since 4.0.5
+     */
+    /*
+     * Calling this method is the equivalent of calling unselectAll() then
+     * selectFilename(filename).
+     * 
+     * I was thus very tempted not to expose this, but it makes a better
+     * complement to getFilename() than selectFilename() and so decided not to
+     * expose the latter after all. If anyone ever implements multiple
+     * selection they can [re]add it, but this is nice and clean at the
+     * moment.
+     */
+    public boolean setFilename(String filename);
+
+    /**
+     * Add a FileFilter to the list of filters that the user can select
+     * between. When a filter is selected, only files that are passed by that
+     * filter are displayed.
+     * 
+     * @see FileFilter
+     * @since 4.0.12
+     */
+    public void addFilter(FileFilter filter);
+
+    /**
+     * Sets the current filter; only the files that pass the filter will be
+     * displayed. If the user-selectable list of filters is non-empty, then
+     * the filter should be one of the filters in that list.
+     * 
+     * <p>
+     * Setting the current filter when the list of filters is empty is useful
+     * if you want to restrict the displayed set of files without letting the
+     * user change it.
+     * 
+     * @see FileFilter
+     * @since 4.0.12
+     */
+    public void setFilter(FileFilter filter);
+
+    /**
+     * Gets the current filter.
+     * 
+     * <p>
+     * This function is specially useful on "Save" FileChoosers, to know the
+     * file type chosen by the user.
+     * 
+     * @see FileFilter
+     * @since 4.0.12
+     */
+    public FileFilter getFilter();
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooserAction.java b/src/bindings/org/gnome/gtk/FileChooserAction.java
new file mode 100644
index 0000000..e557e8f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooserAction.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Set which kind of FileChooser Dialog will appear.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.2
+ */
+public final class FileChooserAction extends Constant
+{
+    private FileChooserAction(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Open mode: the FileChooser will only let the user pick an existing
+     * file.
+     */
+    public static final FileChooserAction OPEN = new FileChooserAction(GtkFileChooserAction.OPEN, "OPEN");
+
+    /**
+     * Save mode: the FileChooser will come up in a form suited to saving
+     * files. It will let the user pick an existing file [TODO: which will
+     * lead to an overwrite yes/no question, right?], or type in a new
+     * filename.
+     */
+    public static final FileChooserAction SAVE = new FileChooserAction(GtkFileChooserAction.SAVE, "SAVE");
+
+    /**
+     * Open folder mode: set the FileChooser to enable the user pick a
+     * specific directory.
+     */
+
+    public static final FileChooserAction SELECT_FOLDER = new FileChooserAction(
+            GtkFileChooserAction.SELECT_FOLDER, "SELECT_FOLDER");
+
+    /**
+     * Create folder mode: put the FileChooser into a mode whereby it is
+     * creating a new directory. It will, however, let the user name an
+     * existing directory, which might be thought of as a bit odd, but it's a
+     * usability feature making the interface consistent across GNOME.
+     */
+    public static final FileChooserAction CREATE_FOLDER = new FileChooserAction(
+            GtkFileChooserAction.CREATE_FOLDER, "CREATE_FOLDER");
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooserButton.java b/src/bindings/org/gnome/gtk/FileChooserButton.java
new file mode 100644
index 0000000..9476721
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooserButton.java
@@ -0,0 +1,156 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+
+/**
+ * Displays a filename and a Button which, if pressed, opens a
+ * FileChooserDialog allowing the user to select the file.
+ * 
+ * <p>
+ * This Widget implements the FileChooser interface, which has most of the
+ * methods necessary to manipulate the selection in the Widget.
+ * 
+ * <p>
+ * Note that FileChooserButton only supports selecting files (mode
+ * {@link FileChooserAction#OPEN OPEN}) or directories (mode
+ * {@link FileChooserAction#SELECT_FOLDER SELECT_FOLDER}). If you need
+ * something more complicated, then you'll need to use wrap a
+ * FileChooserWidget in a custom Widget or launch a FileChooserDialog.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.2
+ * @see FileChooserWidget
+ * @see FileChooserDialog
+ */
+public class FileChooserButton extends HBox implements FileChooser
+{
+    protected FileChooserButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new FileChooserButton. The selected file is unset, and will
+     * appear as "(none)" in the display.
+     * 
+     * @param title
+     *            a title for the FileChooserDialog when it is popped.
+     * @param action
+     *            which style of FileChooser you want. Only
+     *            {@link FileChooserAction#OPEN OPEN} (selecting a single
+     *            file), and {@link FileChooserAction#SELECT_FOLDER
+     *            SELECT_FOLDER}, (selecting a single directory) are enabled
+     *            for FileChooserButton.
+     * @since 4.0.2
+     */
+    public FileChooserButton(String title, FileChooserAction action) {
+        super(GtkFileChooserButton.createFileChooserButton(title, action));
+    }
+
+    public String getFilename() {
+        return GtkFileChooser.getFilename(this);
+    }
+
+    public String getCurrentFolder() {
+        return GtkFileChooser.getCurrentFolder(this);
+    }
+
+    public boolean setCurrentFolder(String directory) {
+        return GtkFileChooser.setCurrentFolder(this, directory);
+    }
+
+    public void setAction(FileChooserAction action) {
+        GtkFileChooser.setAction(this, action);
+    }
+
+    public FileChooserAction getAction() {
+        return GtkFileChooser.getAction(this);
+    }
+
+    /*
+     * Changes to this implementation need to be dittoed in FileChooserDialog
+     * and FileChooserWidget!
+     */
+    public URI getURI() {
+        String uri = GtkFileChooser.getUri(this);
+        if (uri != null) {
+            return URI.create(uri);
+        } else {
+            return null;
+        }
+    }
+
+    public void addFilter(FileFilter filter) {
+        GtkFileChooser.addFilter(this, filter);
+    }
+
+    public void setFilter(FileFilter filter) {
+        GtkFileChooser.setFilter(this, filter);
+    }
+
+    public FileFilter getFilter() {
+        return GtkFileChooser.getFilter(this);
+    }
+
+    /**
+     * Signal emitted when the file indicated by this FileChooserButton has
+     * been set by the user.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.5
+     */
+    public interface FileSet extends GtkFileChooserButton.FileSetSignal
+    {
+        public void onFileSet(FileChooserButton source);
+    }
+
+    /**
+     * Hook up a callback to handle the <code>FileChooserButton.FileSet</code>
+     * signal generated when the file or directory has been selected by the
+     * user using this FileChooserButton.
+     * 
+     * @since 4.0.5
+     */
+    public void connect(FileChooserButton.FileSet handler) {
+        GtkFileChooserButton.connect(this, handler, false);
+    }
+
+    public boolean setFilename(String filename) {
+        if (filename.charAt(0) == '/') {
+            return GtkFileChooser.setFilename(this, filename);
+        } else {
+            throw new IllegalArgumentException("The filename argument must be an absolute path");
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooserConfirmation.java b/src/bindings/org/gnome/gtk/FileChooserConfirmation.java
new file mode 100644
index 0000000..9525aaa
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooserConfirmation.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FileChooserConfirmation extends Constant
+{
+    private FileChooserConfirmation(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooserDialog.java b/src/bindings/org/gnome/gtk/FileChooserDialog.java
new file mode 100644
index 0000000..fb0e25f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooserDialog.java
@@ -0,0 +1,162 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+
+/**
+ * A Dialog suitable for operations that need to select a file, such as "File
+ * -> Open" or "File -> Save" commands.
+ * 
+ * <p>
+ * A FileChooserDialog is just a Dialog with a FileChooserWidget plus
+ * appropriate Buttons that corresponding to the specified
+ * {@link FileChooserAction FileChooserAction}. Otherwise, all the methods
+ * provided by the FileChooser interface are available which gives you the
+ * necessary power to manipulate the selection received from the Dialog.
+ * 
+ * <p>
+ * Using a FileChooserDialog to open a file could go like this:
+ * 
+ * <pre>
+ * FileChooserDialog dialog;
+ * ResponseType response;
+ * 
+ * // instantiate
+ * dialog = new FileChooserDialog("Open File", window, FileChooserAction.OPEN);
+ * 
+ * // run the Dialog
+ * response = dialog.run();
+ * dialog.hide();
+ * 
+ * // deal with the result
+ * if (response == ResponseType.OK) {
+ *     open(dialog.getFilename());
+ * }
+ * </pre>
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class FileChooserDialog extends Dialog implements FileChooser
+{
+    protected FileChooserDialog(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new FileChooserDialog.
+     * 
+     * <p>
+     * Buttons appropriate to each of the different FileChooserActions have
+     * been preconfigured in the <var>action area</var> of the Dialog. In all
+     * cases, the executive to go ahead with the action will be the return of
+     * ResponseType <code>OK</code>.
+     * 
+     * @param title
+     *            the text to use in the title bar of the Dialog Window as
+     *            drawn by the window manager, or <code>null</code> if you
+     *            want a blank title.
+     * @param parent
+     *            the transient parent of the Dialog. While <code>null</code>
+     *            is allowed, things are designed to work properly on the
+     *            assumption that a parent is specified so it is recommended
+     *            that you do so.
+     * @param action
+     *            which style of FileChooser you want.
+     */
+    public FileChooserDialog(String title, Window parent, FileChooserAction action) {
+        super(GtkFileChooserDialog.createFileChooserDialog(title, parent, action, null));
+
+        this.addButton(Stock.CANCEL, ResponseType.CANCEL);
+        if (action == FileChooserAction.SAVE) {
+            this.addButton(Stock.SAVE, ResponseType.OK);
+        } else if (action == FileChooserAction.OPEN) {
+            this.addButton(Stock.OPEN, ResponseType.OK);
+        } else if (action == FileChooserAction.SELECT_FOLDER) {
+            this.addButton(Stock.OK, ResponseType.OK);
+        } else if (action == FileChooserAction.CREATE_FOLDER) {
+            this.addButton(Stock.NEW, ResponseType.OK);
+        }
+    }
+
+    public String getCurrentFolder() {
+        return GtkFileChooser.getCurrentFolder(this);
+    }
+
+    public boolean setCurrentFolder(String directory) {
+        return GtkFileChooser.setCurrentFolder(this, directory);
+    }
+
+    public String getFilename() {
+        return GtkFileChooser.getFilename(this);
+    }
+
+    public void setAction(FileChooserAction action) {
+        GtkFileChooser.setAction(this, action);
+    }
+
+    public FileChooserAction getAction() {
+        return GtkFileChooser.getAction(this);
+    }
+
+    public URI getURI() {
+        String uri = GtkFileChooser.getUri(this);
+        if (uri != null) {
+            return URI.create(uri);
+        } else {
+            return null;
+        }
+    }
+
+    public void addFilter(FileFilter filter) {
+        GtkFileChooser.addFilter(this, filter);
+    }
+
+    public void setFilter(FileFilter filter) {
+        GtkFileChooser.setFilter(this, filter);
+    }
+
+    public FileFilter getFilter() {
+        return GtkFileChooser.getFilter(this);
+    }
+
+    public boolean setFilename(String filename) {
+        if (filename.charAt(0) == '/') {
+            return GtkFileChooser.setFilename(this, filename);
+        } else {
+            throw new IllegalArgumentException("The filename argument must be an absolute path");
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooserError.java b/src/bindings/org/gnome/gtk/FileChooserError.java
new file mode 100644
index 0000000..762113a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooserError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FileChooserError extends Constant
+{
+    private FileChooserError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileChooserWidget.java b/src/bindings/org/gnome/gtk/FileChooserWidget.java
new file mode 100644
index 0000000..6706e6e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileChooserWidget.java
@@ -0,0 +1,112 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+
+/**
+ * A Widget used to select files.
+ * 
+ * <p>
+ * Note that in most cases you don't need this at all! If you only want to
+ * provide a way to let user select a file, {@link FileChooserDialog} or
+ * {@link FileChooserButton} are much better alternatives.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.12
+ */
+public class FileChooserWidget extends VBox implements FileChooser
+{
+    protected FileChooserWidget(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new FileChooserWidget.
+     * 
+     * @since 4.0.12
+     */
+    public FileChooserWidget(FileChooserAction action) {
+        super(GtkFileChooserWidget.createFileChooserWidget(action));
+    }
+
+    public String getCurrentFolder() {
+        return GtkFileChooser.getCurrentFolder(this);
+    }
+
+    public boolean setCurrentFolder(String directory) {
+        return GtkFileChooser.setCurrentFolder(this, directory);
+    }
+
+    public String getFilename() {
+        return GtkFileChooser.getFilename(this);
+    }
+
+    public void setAction(FileChooserAction action) {
+        GtkFileChooser.setAction(this, action);
+    }
+
+    public FileChooserAction getAction() {
+        return GtkFileChooser.getAction(this);
+    }
+
+    public URI getURI() {
+        String uri = GtkFileChooser.getUri(this);
+        if (uri != null) {
+            return URI.create(uri);
+        } else {
+            return null;
+        }
+    }
+
+    public void addFilter(FileFilter filter) {
+        GtkFileChooser.addFilter(this, filter);
+    }
+
+    public void setFilter(FileFilter filter) {
+        GtkFileChooser.setFilter(this, filter);
+    }
+
+    public FileFilter getFilter() {
+        return GtkFileChooser.getFilter(this);
+    }
+
+    public boolean setFilename(String filename) {
+        if (filename.charAt(0) == '/') {
+            return GtkFileChooser.setFilename(this, filename);
+        } else {
+            throw new IllegalArgumentException("The filename argument must be an absolute path");
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileFilter.java b/src/bindings/org/gnome/gtk/FileFilter.java
new file mode 100644
index 0000000..c3de03c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileFilter.java
@@ -0,0 +1,163 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * FileFilters objects are used to restrict the files being shown on a
+ * {@link FileChooser FileChooser}.
+ * 
+ * <p>
+ * The most typical usage is to only show the file types the application can
+ * deal with. On "Open" Dialogs, a FileFilter can be used to only shown the
+ * files the application can open. On the other side, on "Save as" Dialogs
+ * they can be used as a way to let users choose the format in which to save
+ * the document.
+ * 
+ * <p>
+ * You will usually {@link FileChooser#addFilter(FileFilter) add} several
+ * FileFilters to your FileChooser Widget. The FileChooser will show a
+ * ComboBox with the different Filters, that the user can use to choose a
+ * specific file type. You should use the {@link #setName(String) setName()}
+ * method to set the name used as the label for the FileFilter on the
+ * ComboBox.
+ * 
+ * <p>
+ * In a FileFilter, you specify the files to shown either as with its MIME
+ * type, with the {@link #addMimeType(String) addMimeType()} method, or as a
+ * shell style glob pattern, with the {@link #addPattern(String) addPattern()}
+ * method. You can add several MIME types or patterns to a single FileFilter.
+ * This is useful, for example, to provide a "All Supported Files" filter.
+ * 
+ * <p>
+ * As an example, consider the following code:
+ * 
+ * <pre>
+ * FileChooserDialog openDialog;
+ * FileFilter pngImages, jpegImages, allImages;
+ * 
+ * openDialog = new FileChooserDialog("Open...", w, FileChooserAction.OPEN);
+ * 
+ * // you can specify a MIME type...
+ * pngImages = new FileFilter("Portable Network Graphics (PNG)");
+ * pngImages.addMimeType("image/png");
+ * 
+ * // ...or a pattern
+ * jpegImages = new FileFilter("JPEG Image");
+ * jpegImages.addPattern("*.jpg");
+ * 
+ * // of course you can use several patterns or MIME types per filter
+ * jpegImages.addPattern("*.jpeg");
+ * 
+ * // and you can use both MIME types and patterns in a single filter
+ * allImages = new FileFilter("All supported images");
+ * allImages.addMimeType("image/png");
+ * allImages.addPattern("*.jpg");
+ * allImages.addPattern("*.jpeg");
+ * 
+ * // Finally, you should add each filter to the FileChooser
+ * openDialog.addFilter(allImages);
+ * openDialog.addFilter(pngImages);
+ * openDialog.addFilter(jpegImages);
+ * </pre>
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.12
+ */
+public class FileFilter extends Object
+{
+    protected FileFilter(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new FileFilter
+     * 
+     * @since 4.0.12
+     */
+    public FileFilter() {
+        super(GtkFileFilter.createFileFilter());
+    }
+
+    /**
+     * Create a new FileFilter with the given name. This is equivalent to
+     * create a FileFilter and the call {@link #setName(String) setName()}
+     * method.
+     * 
+     * @since 4.0.12
+     */
+    public FileFilter(String name) {
+        super(GtkFileFilter.createFileFilter());
+        setName(name);
+    }
+
+    /**
+     * Sets the human-readable name of the filter; this is the String that
+     * will be displayed in the FileChooser user interface if there is a
+     * selectable list of filters.
+     * 
+     * @since 4.0.12
+     */
+    public void setName(String name) {
+        GtkFileFilter.setName(this, name);
+    }
+
+    /**
+     * Add a rule allowing a given MIME type to the filter.
+     * 
+     * <p>
+     * Filtering by MIME types handles aliasing and subclassing of mime types;
+     * e.g. a filter for <code>"text/plain"</code> also matches a file with
+     * MIME type <code>"application/rtf"</code>, since
+     * <code>"application/rtf"</code> is a subclass of
+     * <code>"text/plain"</code>. Note that FileFilter allows wildcards for
+     * the subtype of a MIME type, so you can e.g. filter for
+     * <code>"image/*"</code>.
+     * 
+     * @since 4.0.12
+     */
+    public void addMimeType(String mimeType) {
+        GtkFileFilter.addMimeType(this, mimeType);
+    }
+
+    /**
+     * Adds a rule allowing a shell style glob to the filter.
+     * 
+     * @since 4.0.12
+     */
+    public void addPattern(String pattern) {
+        GtkFileFilter.addPattern(this, pattern);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileFilterFlags.java b/src/bindings/org/gnome/gtk/FileFilterFlags.java
new file mode 100644
index 0000000..4aed049
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileFilterFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FileFilterFlags extends Flag
+{
+    private FileFilterFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileFolder.java b/src/bindings/org/gnome/gtk/FileFolder.java
new file mode 100644
index 0000000..b542ebb
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileFolder.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface FileFolder
+{
+}
diff --git a/src/bindings/org/gnome/gtk/FileInfo.java b/src/bindings/org/gnome/gtk/FileInfo.java
new file mode 100644
index 0000000..946b698
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileInfo.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FileInfo extends Boxed
+{
+    protected FileInfo(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileInfoType.java b/src/bindings/org/gnome/gtk/FileInfoType.java
new file mode 100644
index 0000000..99126c3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileInfoType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FileInfoType extends Constant
+{
+    private FileInfoType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FilePath.java b/src/bindings/org/gnome/gtk/FilePath.java
new file mode 100644
index 0000000..8ef807e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FilePath.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FilePath extends Boxed
+{
+    protected FilePath(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileSystem.java b/src/bindings/org/gnome/gtk/FileSystem.java
new file mode 100644
index 0000000..0bc5e27
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileSystem.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface FileSystem
+{
+}
diff --git a/src/bindings/org/gnome/gtk/FileSystemError.java b/src/bindings/org/gnome/gtk/FileSystemError.java
new file mode 100644
index 0000000..276b38d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileSystemError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FileSystemError extends Constant
+{
+    private FileSystemError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FileSystemHandle.java b/src/bindings/org/gnome/gtk/FileSystemHandle.java
new file mode 100644
index 0000000..370e584
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FileSystemHandle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FileSystemHandle extends Object
+{
+    protected FileSystemHandle(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Fixed.java b/src/bindings/org/gnome/gtk/Fixed.java
new file mode 100644
index 0000000..409df5b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Fixed.java
@@ -0,0 +1,141 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006      Srichand Pendyala
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Fixed is a Container Widget that allows you to position other widgets on it
+ * at fixed coordinates. These could include Buttons and Labels as well as
+ * more complex composite widgets like Boxes.
+ * 
+ * <p>
+ * You should not use Fixed for any non-trivial purpose. While you might think
+ * at first that it would simplify your application, the reality is that Fixed
+ * is almost always the wrong Container choice. Because GTK is the widget
+ * toolkit used to power the user interfaces of GNOME applications, the
+ * appearance of Widgets is very dynamic. Different window managers and theme
+ * engines can radically change the size and appearance of Widgets to suit
+ * varying accessibility and usability requirements; different fonts available
+ * to your users will cause Labels to be sized differently than you'd expect,
+ * and of course translation completely throws predictability right out the
+ * window. Since the Fixed Container does <i>not</i> adapt to the size
+ * requests of the Widgets with in it, the frequent result is truncated text,
+ * overlapping Widgets, and other visual bugs.
+ * 
+ * <p>
+ * The Fixed widget can't be properly mirrored in right-to-left languages such
+ * as Hebrew and Arabic. A Fixed widget with a right-to-left font will render
+ * your application unusable.
+ * 
+ * <p>
+ * Adding or removing any GUI elements from this Fixed requires you to
+ * reposition all the other Widgets within it. As you can imagine, this will
+ * end up a long-term maintenance headache for your application.
+ * 
+ * <p>
+ * If any of those are a concern for your application, then you should be
+ * using a different Container, either combinations of {@link VBox VBox} and
+ * {@link HBox HBox}, or perhaps {@link Table Table}. You have been warned!
+ * 
+ * @see Layout
+ * @see DrawingArea
+ * 
+ * @author Srichand Pendyala
+ * @author Andrew Cowie
+ * @since 4.0.1
+ */
+public class Fixed extends Container
+{
+    protected Fixed(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Fixed Widget.
+     * 
+     * @since 4.0.1
+     */
+    public Fixed() {
+        super(GtkFixed.createFixed());
+    }
+
+    /**
+     * Place a Widget into the Fixed Container at a specified location.
+     * 
+     * <p>
+     * It is up to you to ensure that the placing of the new Widget will not
+     * overlap any existing Widgets. If this is starting to be a burden, it's
+     * a good sign you're using the wrong Container!
+     * 
+     * <p>
+     * The x and y co-ordinates are measured in pixels from the top left
+     * corner of the Fixed.
+     * 
+     * @param widget
+     *            the Widget to be placed in the Fixed.
+     * @param x
+     *            horizontal position for the Widget being added
+     * @param y
+     *            vertical position for the Widget being added
+     * @since 4.0.1
+     */
+    public void put(Widget widget, int x, int y) {
+        GtkFixed.put(this, widget, x, y);
+    }
+
+    /**
+     * Move a Widget that has already been added to this Fixed to a new
+     * location.
+     * 
+     * <p>
+     * Calling <code>move()</code> will cause GTK to inherently redraw the
+     * entire Fixed surface. If you have many Widgets in a Fixed, this can
+     * lead to flickering. Consider using {@link Layout} or
+     * {@link DrawingArea} instead.
+     * 
+     * <p>
+     * The x and y co-ordinates are measured in pixels from the top left
+     * corner of the Fixed.
+     * 
+     * @param widget
+     *            the Widget that will be moved.
+     * @param x
+     *            the horizontal position to move <code>widget</code> to.
+     * @param y
+     *            the vertical position to move <code>widget</code> to.
+     * @since 4.0.1
+     */
+    public void move(Widget widget, int x, int y) {
+        GtkFixed.move(this, widget, x, y);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FontButton.java b/src/bindings/org/gnome/gtk/FontButton.java
new file mode 100644
index 0000000..0f1ef9e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FontButton.java
@@ -0,0 +1,104 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontButton extends Button
+{
+    protected FontButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a FontButton.
+     * 
+     * @since 4.0.10
+     */
+    public FontButton() {
+        super(GtkFontButton.createFontButton());
+    }
+
+    /**
+     * The signal emitted when a font is selected.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.10
+     */
+    public interface FontSet extends GtkFontButton.FontSetSignal
+    {
+        void onFontSet(FontButton source);
+    }
+
+    /**
+     * Hook up a <code>FontButton.FontSet</code> handler.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(FontButton.FontSet handler) {
+        GtkFontButton.connect(this, handler, false);
+    }
+
+    /**
+     * Get the name of the font currently selected by this FontButton.
+     * 
+     * @since 4.0.10
+     */
+    public String getFontName() {
+        return GtkFontButton.getFontName(this);
+    }
+
+    /**
+     * Set the font name to be show in this FontButton.
+     * 
+     * @since 4.0.17
+     */
+    public void setFontName(String name) {
+        GtkFontButton.setFontName(this, name);
+    }
+
+    /**
+     * Whether the font size is to be shown on the FontButton.
+     * 
+     * @since 4.0.17
+     */
+    public void setShowSize(boolean setting) {
+        GtkFontButton.setShowSize(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FontSelection.java b/src/bindings/org/gnome/gtk/FontSelection.java
new file mode 100644
index 0000000..66b469d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FontSelection.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontSelection extends VBox
+{
+    protected FontSelection(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/FontSelectionDialog.java b/src/bindings/org/gnome/gtk/FontSelectionDialog.java
new file mode 100644
index 0000000..f0b88fe
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/FontSelectionDialog.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontSelectionDialog extends Dialog
+{
+    protected FontSelectionDialog(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Frame.java b/src/bindings/org/gnome/gtk/Frame.java
new file mode 100644
index 0000000..7581c88
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Frame.java
@@ -0,0 +1,139 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A decorative border frame with an optional label. This is typically used to
+ * surround a group of widgets with a a visual hint grouping them together.
+ * 
+ * <p>
+ * These are frequently over-used and so using Frames is actually highly
+ * discouraged: in general Widgets already have sufficient decoration and
+ * adding extra horizontal and vertical lines distracts the user and actually
+ * makes it <b>harder</b> to distinguish the Widgets from one another. If you
+ * need to group widgets, do so with white space or use a technique like
+ * applying {@link SizeGroup}s to give a set of Widgets a consistent
+ * appearance.
+ * 
+ * <p>
+ * Note that the "label" can be a full Widget in its own right; if you use the
+ * methods which take a text string they will transparently create a Label for
+ * you containing that text and using it on the edge of the Frame.
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.3
+ */
+public class Frame extends Bin
+{
+    protected Frame(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Frame with a simple text label.
+     * 
+     * @param label
+     *            The desired label, or <code>null</code> if you don't want to
+     *            use any label.
+     */
+    public Frame(String label) {
+        super(GtkFrame.createFrame(label));
+    }
+
+    /**
+     * Set the text label for the Frame (assuming you created it with a Label
+     * in the first place).
+     */
+    public void setLabel(String label) {
+        GtkFrame.setLabel(this, label);
+    }
+
+    /**
+     * Returns the text from the frame's edge (assuming it's a Label Widget as
+     * is usual practise).
+     */
+    public String getLabel() {
+        return GtkFrame.getLabel(this);
+    }
+
+    /**
+     * Set a Widget to be the "label" for the Frame.
+     */
+    public void setLabelWidget(Widget label) {
+        GtkFrame.setLabelWidget(this, label);
+    }
+
+    /**
+     * Returns the Widget being used as the "label" of the Frame.
+     */
+    public Widget getLabelWidget() {
+        return GtkFrame.getLabelWidget(this);
+    }
+
+    /**
+     * Set the ShadowType of the Frame, that will determine the appearance of
+     * the outline. The default is {@link ShadowType#ETCHED_IN ETCHED_IN}.
+     * 
+     * @since 4.0.7
+     */
+    public void setShadowType(ShadowType type) {
+        GtkFrame.setShadowType(this, type);
+    }
+
+    /**
+     * Sets the alignment of the Frame's label.
+     * 
+     * @param xalign
+     *            The position of the label along the top edge of the widget.
+     *            A value of <code>0.0f</code> represents left alignment;
+     *            <code>1.0f</code> represents right alignment. The default
+     *            value is <code>0.0f</code>
+     * @param yalign
+     *            The vertical alignment of the label. A value of
+     *            <code>0.0f</code> aligns under the frame; <code>1.0f</code>
+     *            aligns above the frame. The default value is
+     *            <code>0.5f</code>.
+     * @since 4.0.7
+     */
+    public void setLabelAlign(float xalign, float yalign) {
+        if ((xalign < 0.0) || (xalign > 1.0)) {
+            throw new IllegalArgumentException("xalign must be between 0.0 and 1.0, inclusive.");
+        }
+        if ((yalign < 0.0) || (yalign > 1.0)) {
+            throw new IllegalArgumentException("yalign must be between 0.0 and 1.0, inclusive.");
+        }
+        GtkFrame.setLabelAlign(this, xalign, yalign);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Grid.java b/src/bindings/org/gnome/gtk/Grid.java
new file mode 100644
index 0000000..b9f587e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Grid.java
@@ -0,0 +1,106 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * Created from Table.java
+ */
+
+/**
+ * Layout Widgets in a row (horizontally or vertically), or in a table.
+ * 
+ * <p>
+ * <i>This replaces GTK 2's VBox, HBox, and Table.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.1.1
+ */
+public class Grid extends Container implements Orientable
+{
+    protected Grid(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Grid.
+     * 
+     * @since 4.1.1
+     */
+    public Grid() {
+        super(GtkGrid.createGrid());
+    }
+
+    /**
+     * Add a child Widget to this Grid.
+     * 
+     * @since 4.1.1
+     */
+    public void attach(Widget child, int left, int top, int width, int height) {
+        GtkGrid.attach(this, child, left, top, width, height);
+    }
+
+    /**
+     * Set the (extra) spacing between all columns.
+     * 
+     * @since 4.1.1
+     */
+    public void setColumnSpacing(int spacing) {
+        GtkGrid.setColumnSpacing(this, spacing);
+    }
+
+    /**
+     * Set the (extra) spacing between all rows.
+     * 
+     * @since 4.1.1
+     */
+    public void setRowSpacing(int spacing) {
+        GtkGrid.setRowSpacing(this, spacing);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    /**
+     * Retrieve a widget at a specific cell or null if there isn't any.
+     * 
+     * @since 4.1.3
+     */
+    public Widget getChildAt(int left, int top) {
+        return GtkGrid.getChildAt(this, left, top);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Gtk.java b/src/bindings/org/gnome/gtk/Gtk.java
new file mode 100644
index 0000000..2895d87
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Gtk.java
@@ -0,0 +1,276 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.Glib;
+import org.gnome.glib.GlibException;
+
+/**
+ * The GTK widget toolkit initialization and main loop entry point. A typical
+ * program written with java-gnome will boil down to this:
+ * 
+ * <pre>
+ * public class ComeOnBabyLightMyFire
+ * {
+ *     public static void main(String[] args) {
+ *         Gtk.init(args);
+ * 
+ *         // build user interface
+ * 
+ *         Gtk.main();
+ *     }
+ * }
+ * </pre>
+ * 
+ * There. Now you know everything you need to know. <code>:)</code> In due
+ * course we will write some tutorials to help you along.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public final class Gtk extends Glib
+{
+    /**
+     * No instantiation. Static methods only!
+     */
+    private Gtk() {}
+
+    /**
+     * A guard against someone calling init() twice
+     */
+    private static boolean initialized = false;
+
+    /**
+     * Initialize the GTK libraries. <b>This must be called before any other
+     * org.gnome.* classes are used.</b>
+     * 
+     * @param args
+     *            The command line arguments array. This is passed to the
+     *            underlying library to allowing user (or window manager) to
+     *            alter GTK's behaviour.
+     * @since 4.0.0
+     */
+    public static void init(String[] args) {
+        if (initialized) {
+            throw new IllegalStateException("Gtk already initialized");
+        }
+        initialized = true;
+
+        /*
+         * Initialize GTK and along with it GLib, GObject, etc.
+         */
+        GtkMain.init(args);
+    }
+
+    /**
+     * Has GTK been initialized yet?
+     * 
+     * @since 4.0.15
+     */
+    public static boolean isInitialized() {
+        return initialized;
+    }
+
+    /**
+     * This method blocks, ie, it does not return until the GTK main loop is
+     * terminated.
+     * <p>
+     * You can nest calls to <code>Gtk.main()</code>! If you do, then calling
+     * {@link #mainQuit() mainQuit()} will make the innermost invocation of
+     * the main loop return. (This is how modal Dialog boxes run and block the
+     * rest of the application while still accepting events themselves)
+     * 
+     * @since 4.0.0
+     */
+    public static void main() {
+        GtkMain.main();
+    }
+
+    /**
+     * Exit the main loop. Since main loops can be nested, this does not
+     * necessarily imply application termination, but if you have a typical
+     * GTK program with a single call to <code>Gtk.main()</code> at the end of
+     * your Java <code>main()</code> function, then calling
+     * <code>Gtk.mainQuit()</code> in a signal handler somewhere will return
+     * the program flow to <code>main()</code> on your way exiting.
+     * 
+     * @since 4.0.0
+     */
+    public static void mainQuit() {
+        GtkMain.mainQuit();
+    }
+
+    /**
+     * Are there any internal Events queued up waiting to be processed? Use
+     * this in conjunction with {@link #mainIterationDo(boolean)
+     * Gtk.mainIterationDo()}.
+     * 
+     * @since 4.0.19
+     */
+    public static boolean eventsPending() {
+        return GtkMain.eventsPending();
+    }
+
+    /**
+     * Run a single iteration of the GTK main loop.
+     * 
+     * <p>
+     * In GUI programming we work extremely hard <i>not</i> to block the main
+     * loop since this will cause the user interface to "freeze"; ordinarily
+     * we do intensive computations in a worker thread and since java-gnome is
+     * thread safe you can simply call your GUI updates from there.
+     * 
+     * <p>
+     * Occasionally, however, there is a circumstance where you are in the
+     * midst of a busy computation and need to explicitly let the GUI update
+     * itself and to let other idle handlers run. If so you can use the
+     * following idiom:
+     * 
+     * <pre>
+     * while (Gtk.eventsPending()) {
+     *     Gtk.mainIterationDo(false);
+     * }
+     * </pre>
+     * 
+     * <p>
+     * This function is <b>not</b> a replacement for using {@link #main()
+     * Gtk.main()} to initiate event handling in your program.
+     * 
+     * <p>
+     * <i>Because we have worker threads you really should not need it in
+     * normal work. We have exposed it as we found it a workaround for
+     * TextView not doing its vertical size allocation until after the current
+     * signal handlers have run.</i>
+     * 
+     * @since 4.0.19
+     * @return <code>true</code> if {@link Gtk#mainQuit() Gtk.mainQuit()} was
+     *         called inside the inner-most main loop.
+     */
+    public static boolean mainIterationDo(boolean block) {
+        return GtkMain.mainIterationDo(block);
+    }
+
+    /**
+     * Set the icon that will be used for all Windows in this application that
+     * do not have an one explicitly set. See the documentation for Window's
+     * {@link Window#setIcon(Pixbuf) setIcon()} for further details about how
+     * to specify icons.
+     * 
+     * @since 4.0.5
+     */
+    /*
+     * YES this is a function on GtkWindow, but it has such global impact that
+     * this is a better place for it. If we ever get a real GtkApplication
+     * class, we might move it there instead.
+     */
+    public static void setDefaultIcon(Pixbuf icon) {
+        GtkWindow.setDefaultIcon(icon);
+    }
+
+    /**
+     * Lookup the Pixbuf corresponding to a stock icon of a certain size.
+     * 
+     * <p>
+     * You need to specify a Widget in order that the most correct theme
+     * engine and Style are employed to pick the appropriate image. This is
+     * redundant in most programs where we don't interfere with the theming or
+     * styling; just pass in your top level Window (or for that matter, any
+     * other Widget you have handy).
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * YES this is a function on GtkWidget, but it really has nothing to do
+     * with Widgets (and certainly is not a method that every single Widget
+     * subclass needs to inherit or have visible).
+     */
+    public static Pixbuf renderIcon(Widget source, Stock stock, IconSize size) {
+        return GtkWidget.renderIcon(source, stock.getStockId(), size, null);
+    }
+
+    /**
+     * Launch the user's preferred application to handle (display) the the
+     * supplied URI. This is most commonly used for raising URLs in the user's
+     * web browser, but the capability is more general than that; any URI
+     * conveying a MIME type that the desktop knows how to interpret will be
+     * handled.
+     * 
+     * <p>
+     * Typical examples for URIs understood by GNOME are:<br>
+     * <br>
+     * <code>file:///home/george/Desktop/image.png</code><br>
+     * <code>http://java-gnome.sourceforge.net/</code><br>
+     * <code>mailto:george at example.com</code><br>
+     * 
+     * <p>
+     * The launching will take appreciable real time, but this call does not
+     * block on the application being launched terminating. Think fork+exec.
+     * 
+     * <p>
+     * This function will return <code>true</code> if the call succeeds, and
+     * <code>false</code> otherwise.
+     * 
+     * @since 4.0.9
+     */
+    public static boolean showURI(URI uri) {
+        try {
+            return GtkMain.showURI(uri.toString());
+        } catch (GlibException e) {
+            // This will fall through to return false
+        }
+
+        return false;
+    }
+
+    /**
+     * Get the Settings object for the default Screen.
+     * 
+     * @since 4.0.14
+     */
+    public static Settings getSettings() {
+        return GtkSettings.getDefault();
+    }
+
+    /**
+     * Get the Settings object for the given Screen.
+     */
+    /*
+     * We still haven't really exposed Screen. Do we need this?
+     */
+    // static Settings getSettings(Screen screen) {
+    // return GtkSettings.getForScreen(screen);
+    // }
+}
diff --git a/src/bindings/org/gnome/gtk/GtkAllocationOverride.c b/src/bindings/org/gnome/gtk/GtkAllocationOverride.c
new file mode 100644
index 0000000..f128d95
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkAllocationOverride.c
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkAllocationOverride.h"
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkAllocationOverride_gtk_1allocation_1new
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	GtkAllocation* result;
+	
+	/*
+	 * This is a dynamic allocation.
+	 */	
+	result = g_slice_new0(GtkAllocation);
+
+	// and finally
+	return (jlong) result;
+}
+
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_AllocationOverride_gtk_1allocation_1free
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkAllocation* self;
+	
+	// convert paramter self
+	self = (GtkAllocation*) _self;
+	
+	// call function
+	g_slice_free(GtkAllocation, self);
+	
+	// cleanup parameter self
+}
diff --git a/src/bindings/org/gnome/gtk/GtkAllocationOverride.java b/src/bindings/org/gnome/gtk/GtkAllocationOverride.java
new file mode 100644
index 0000000..33227aa
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkAllocationOverride.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Kenneth Prugh
+ */
+final class GtkAllocationOverride extends Plumbing
+{
+    private GtkAllocationOverride() {}
+
+    static final long createAllocation() {
+        synchronized (lock) {
+            return gtk_allocation_new();
+        }
+    }
+
+    private static native final long gtk_allocation_new();
+
+    static final void free(Allocation self) {
+        synchronized (lock) {
+            gtk_allocation_free(pointerOf(self));
+        }
+    }
+
+    private static native final void gtk_allocation_free(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkAssistantOverride.c b/src/bindings/org/gnome/gtk/GtkAssistantOverride.c
new file mode 100644
index 0000000..a2a2afa
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkAssistantOverride.c
@@ -0,0 +1,127 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkAssistantOverride.h"
+
+static guint signalID = 0;
+static GtkAssistant* source;
+
+/*
+ * Meets the signature requirement of (*GtkAssistantPageFunc) in
+ * order to be the second parameter to the call to
+ * gtk_assistant_set_forward_page_func() below.
+ */
+static gint
+emit_forward
+(
+	const gint current_page,
+	gpointer user_data
+)
+{
+	gint result;
+
+	g_signal_emit_by_name(source, "forward", current_page, &result);
+
+	return result;
+}
+
+/**
+ * called from
+ *   org.gnome.gtk.GtkAssistantOverride.emitForward()
+ * called from
+ *   org.gnome.gtk.Assistant.emitForwardPage()
+ */
+JNIEXPORT jint JNICALL
+Java_org_gnome_gtk_GtkAssistantOverride_gtk_1assistant_1emit_1forward
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jint _current
+)
+{
+	GtkAssistant* self;
+	jint current;
+	gint result;
+	jint _result;
+
+	// convert parameters
+	self = (GtkAssistant*) _self;
+	current = (gint) _current;
+
+	// emit the signal
+	g_signal_emit_by_name(self, "forward", current, &result);
+
+	// translate return value to JNI type
+	_result = (jint) result;
+
+	// finally, return signal result
+	return _result;
+}
+
+/**
+ * called from
+ *   org.gnome.gtk.GtkAssistantOverride.setForwardFunc()
+ * called from
+ *   org.gnome.gtk.Assistant.setForwardPageCallback()
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkAssistantOverride_gtk_1assistant_1set_1forward_1page_1func
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	// convert parameter self
+	source = (GtkAssistant*) _self;
+
+	if (signalID == 0) {
+		signalID = g_signal_new("forward",
+					GTK_TYPE_ASSISTANT,
+					G_SIGNAL_ACTION,
+					0,
+					NULL,
+					NULL,
+					NULL,
+					G_TYPE_INT,
+					1,
+					G_TYPE_INT);
+	}
+
+	// call function
+	gtk_assistant_set_forward_page_func(source, emit_forward, NULL, NULL);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkAssistantOverride.java b/src/bindings/org/gnome/gtk/GtkAssistantOverride.java
new file mode 100644
index 0000000..f2dbe0d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkAssistantOverride.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Manual code allowing us to hookup the Assistant callback function as if it
+ * were a signal.
+ * 
+ * @author Guillaume Mazoyer
+ */
+final class GtkAssistantOverride extends Plumbing
+{
+    /**
+     * Custom method to emit Forward signal.
+     */
+    static final int emitForward(Assistant self, int currentPage) {
+        return gtk_assistant_emit_forward(pointerOf(self), currentPage);
+    }
+
+    private static native final int gtk_assistant_emit_forward(long self, int currentPage);
+
+    /**
+     * Manually hookup the function that will emit our custom visible signal.
+     */
+    static final void setForwardFunc(Assistant self) {
+        gtk_assistant_set_forward_page_func(pointerOf(self));
+    }
+
+    private static native final void gtk_assistant_set_forward_page_func(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkClipboardOverride.c b/src/bindings/org/gnome/gtk/GtkClipboardOverride.c
new file mode 100644
index 0000000..0174dad
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkClipboardOverride.c
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkClipboardOverride.h"
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkClipboardOverride_gtk_1clipboard_1get
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	GtkClipboard* result;
+	
+	result = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+	
+	return (jlong) result;
+}
diff --git a/src/bindings/org/gnome/gtk/GtkClipboardOverride.java b/src/bindings/org/gnome/gtk/GtkClipboardOverride.java
new file mode 100644
index 0000000..6742d2d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkClipboardOverride.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Hand crafted to get around the fact that we don't otherwise need to model
+ * GdkAtom, which is what identifies the clipboard being used because we only
+ * care about the CLIPBOARD clipboard.
+ */
+final class GtkClipboardOverride extends Plumbing
+{
+    static final Clipboard get() {
+        long result;
+
+        synchronized (lock) {
+            result = gtk_clipboard_get();
+
+            return (Clipboard) objectFor(result);
+        }
+    }
+
+    private static native final long gtk_clipboard_get();
+}
diff --git a/src/bindings/org/gnome/gtk/GtkEntryCompletionOverride.c b/src/bindings/org/gnome/gtk/GtkEntryCompletionOverride.c
new file mode 100644
index 0000000..9184d7e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkEntryCompletionOverride.c
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkEntryCompletionOverride.h"
+
+static guint signalID = 0;
+
+/**
+ * called from
+ *   org.gnome.gtk.GtkEntryCompletionOverride.emitMatchSelected()
+ * called from
+ *   org.gnome.gtk.EntryCompletion.emitMatchSelected()
+ */
+JNIEXPORT jboolean JNICALL
+Java_org_gnome_gtk_GtkEntryCompletionOverride_gtk_1entry_1completion_1emit_1match_1selected
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jlong _iter
+)
+{
+	GtkEntryCompletion* self;
+	GtkTreeModel* model;
+	GtkTreeIter* iter;
+	gboolean result;
+	jboolean _result;
+
+	// convert parameters
+	self = (GtkEntryCompletion*) _self;
+	model = gtk_entry_completion_get_model(self);
+	iter = (GtkTreeIter*) _iter;
+
+	// emit the signal
+	g_signal_emit_by_name(self, "match_selected", model, iter, &result);
+
+	// translate return value to JNI type
+	_result = (jboolean) result;
+
+	// finally, return signal result
+	return _result;
+}
+
+/*
+ * Meets the signature requirement of (*GtkEntryCompletionMatchFunc) in
+ * order to be the second parameter to the call to
+ * gtk_entry_completion_set_match_func() below.
+ */
+static gboolean
+emit_match
+(
+	GtkEntryCompletion* completion,
+	const gchar* key,
+	GtkTreeIter* iter,
+	gpointer user_data
+)
+{
+	gboolean result;
+
+	g_signal_emit_by_name(completion, "match", key, iter, &result);
+	
+	return result;
+}
+
+/**
+ * called from
+ *   org.gnome.gtk.GtkEntryCompletionOverride.setMatchFunc()
+ * called from
+ *   org.gnome.gtk.EntryCompletion.setMatchCallback()
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkEntryCompletionOverride_gtk_1entry_1completion_1set_1match_1func
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkEntryCompletion* self;
+
+	// convert parameter self
+	self = (GtkEntryCompletion*) _self;
+
+	if (signalID == 0) {
+		signalID = g_signal_new("match",
+					GTK_TYPE_ENTRY_COMPLETION,
+					G_SIGNAL_ACTION,
+					0,
+					NULL,
+					NULL,
+					NULL,
+					G_TYPE_BOOLEAN,
+					2,
+					G_TYPE_STRING,
+					GTK_TYPE_TREE_ITER);
+	}
+
+	// call function
+	gtk_entry_completion_set_match_func(self, emit_match, NULL, NULL);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkEntryCompletionOverride.java b/src/bindings/org/gnome/gtk/GtkEntryCompletionOverride.java
new file mode 100644
index 0000000..9f328c3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkEntryCompletionOverride.java
@@ -0,0 +1,61 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Manual code allowing us to hookup the EntryCompletion callback function as
+ * if it were a signal.
+ * 
+ * @author Guillaume Mazoyer
+ */
+final class GtkEntryCompletionOverride extends Plumbing
+{
+    /**
+     * Custom method to emit MatchSelected signal and force entry to be
+     * completed.
+     */
+    static final boolean emitMatchSelected(EntryCompletion self, TreeIter iter) {
+        return gtk_entry_completion_emit_match_selected(pointerOf(self), pointerOf(iter));
+    }
+
+    private static native final boolean gtk_entry_completion_emit_match_selected(long self, long iter);
+
+    /**
+     * Manually hookup the function that will emit our custom visible signal.
+     */
+    static final void setMatchFunc(EntryCompletion self) {
+        gtk_entry_completion_set_match_func(pointerOf(self));
+    }
+
+    private static native final void gtk_entry_completion_set_match_func(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkEntryOverride.c b/src/bindings/org/gnome/gtk/GtkEntryOverride.c
new file mode 100644
index 0000000..7821626
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkEntryOverride.c
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkEntryOverride.h"
+
+
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkEntryOverride_gtk_1entry_1set_1inner_1border
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jint _left,
+	jint _right,
+	jint _top,
+	jint _bottom
+)
+{
+	GtkEntry* self;
+	GtkBorder border = { 0, };
+
+	// convert parameter self
+	self = (GtkEntry*) _self;
+
+	// convert parameters
+	border.left = (gint) _left;
+	border.right = (gint) _right;
+	border.top = (gint) _top;
+	border.bottom = (gint) _bottom;
+	
+	// call function
+	gtk_entry_set_inner_border(self, &border);
+
+	// cleanup parameter self
+
+	// cleanup parameters
+}
+
diff --git a/src/bindings/org/gnome/gtk/GtkEntryOverride.java b/src/bindings/org/gnome/gtk/GtkEntryOverride.java
new file mode 100644
index 0000000..e360446
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkEntryOverride.java
@@ -0,0 +1,47 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+final class GtkEntryOverride extends Plumbing
+{
+    private GtkEntryOverride() {}
+
+    static final void setInnerBorder(Entry self, int left, int right, int top, int bottom) {
+        synchronized (lock) {
+            gtk_entry_set_inner_border(pointerOf(self), left, right, top, bottom);
+        }
+    }
+
+    private static native final void gtk_entry_set_inner_border(long self, int left, int right, int top,
+            int bottom);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkMain.c b/src/bindings/org/gnome/gtk/GtkMain.c
new file mode 100644
index 0000000..ffe01e3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkMain.c
@@ -0,0 +1,251 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkMain.h"
+
+/*
+ * Implements
+ *   org.gnome.gtk.Gtk.gtk_init(Object lock, String[] args)
+ * called from
+ *   org.gnome.gtk.Gtk.init(String[] args)
+ *
+ * FIXME we still have to handle returning the trimmed args array.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkMain_gtk_1init
+(
+	JNIEnv *env,
+	jclass cls,
+	jobject _lock,
+	jobjectArray _args
+)
+{
+	int argc;
+	char** argv;
+	gint i;
+	jstring _arg;
+	gchar* arg;
+
+	/*
+	 * The call to g_threads_init() needs to be be the very first thing
+	 * that happens in our use of GLib; it will have happened care of
+	 * the static initializer in [org.gnome.gib] Plumbing.
+	 */
+
+	// convert args
+	if (_args == NULL) {
+		argc = 0;
+	} else {
+		argc = (*env)->GetArrayLength(env, _args);
+	}
+	argv = (char**) g_newa(char**, argc+1);
+
+	for (i = 0; i < argc; i++) {
+		_arg = (jstring) (*env)->GetObjectArrayElement(env, _args, i);
+		arg = (gchar*) bindings_java_getString(env, _arg);
+		argv[i+1] = arg;
+	}
+
+	/*
+	 * In C, the first element in the argv is the program name from the
+	 * command line. Java skips this, so we need to re-introduce a dummy
+	 * value here. This is also why it was [i+1] above.
+	 */
+	argv[0] = "";
+	argc++;
+
+	// call function
+	gtk_init(&argc, &argv);
+
+ 	/*
+	 * TODO can we release argv elements?
+	 */
+
+	/*
+	 * Work around for what may be bug #85715. It appears that the root
+	 * window is not given an initial Ref by GDK; if you call Window's
+	 * getScreen() the resultant org.gnome.gdk.Screen's ToogleRef is the
+	 * only ref count, and when we go through a garbage collection cycle
+	 * the ref count drops to zero, resulting in an attempt to "destroy
+	 * the root window" which, needless to say, GDK objects to somewhat
+	 * vehemently.
+	 */
+	g_object_ref(gdk_screen_get_default());
+}
+
+
+/*
+ * Implements
+ *   org.gnome.gtk.Gtk.gtk_main()
+ * called from
+ *   org.gnome.gtk.Gtk.main()
+ *
+ * Atypically we do the necessary operations to take and release the GDK lock
+ * here on the JNI side; everywhere else in the library we use a Java side
+ * synchronized block. This works around a strange behaviour in Eclipse and
+ * hopefully results in a better debugging experience.
+ *
+ * Note that the main loop implicitly uses the gdk_threads_enter/leave()
+ * mechanism while spinning. This means that although the Gdk$Lock monitor is
+ * held upon making this call (which blocks), the lock is released briefly
+ * each time the main loop iterates.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkMain_gtk_1main
+(
+	JNIEnv *env,
+	jclass cls
+)
+{
+	// call function
+	gdk_threads_enter();
+	gtk_main();
+	gdk_threads_leave();
+}
+
+/*
+ * Implements
+ *   org.gnome.gtk.Gtk.gtk_main_quit()
+ * called from
+ *   org.gnome.gtk.Gtk.mainQuit()
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkMain_gtk_1main_1quit
+(
+	JNIEnv *env,
+	jclass cls
+)
+{
+	// call function
+	gtk_main_quit();
+}
+
+
+/*
+ * Implements
+ *   org.gnome.gtk.Gtk.gtk_events_pending()
+ * called from
+ *   org.gnome.gtk.Gtk.eventsPending()
+ */
+JNIEXPORT jboolean JNICALL
+Java_org_gnome_gtk_GtkMain_gtk_1events_1pending
+(
+	JNIEnv *env,
+	jclass cls
+)
+{
+	gboolean result;
+
+	// call function
+	result = gtk_events_pending();
+
+	// return result
+	return (jboolean) result;
+}
+
+
+/*
+ * Implements
+ *   org.gnome.gtk.Gtk.gtk_main_iteration_do()
+ * called from
+ *   org.gnome.gtk.Gtk.mainIterationDo()
+ */
+JNIEXPORT jboolean JNICALL
+Java_org_gnome_gtk_GtkMain_gtk_1main_1iteration_1do
+(
+	JNIEnv *env,
+	jclass cls,
+	jboolean _blocking
+)
+{
+	gboolean blocking;
+	gboolean result;
+
+	// translate blocking
+	blocking = (gboolean) _blocking;
+
+	// call function
+	result = gtk_main_iteration_do(blocking);
+
+	// clean up blocking
+
+	// return result
+	return (jboolean) result;
+}
+
+/*
+ * Implements
+ *   org.gnome.gtk.Gtk.gtk_show_uri()
+ * called from
+ *   org.gnome.gtk.Gtk.showURI()
+ */
+JNIEXPORT jboolean JNICALL
+Java_org_gnome_gtk_GtkMain_gtk_1show_1uri
+(
+	JNIEnv *env,
+	jclass cls,
+	jstring _uri
+)
+{
+	const gchar* uri;
+	gboolean result;
+	GError* error = NULL;
+
+	// convert parameter uri
+	uri = bindings_java_getString(env, _uri);
+	if (uri == NULL) {
+		return FALSE; // Java Exception already thrown
+	}
+
+	// call function
+	result = gtk_show_uri(NULL, uri, GDK_CURRENT_TIME, &error);
+
+	// cleanup parameter uri
+	bindings_java_releaseString(uri);
+
+	// check for error
+	if (error) {
+		bindings_java_throwGlibException(env, error);
+		return FALSE;
+	}
+
+	// return result
+	return (jboolean) result;
+}
+
diff --git a/src/bindings/org/gnome/gtk/GtkMain.java b/src/bindings/org/gnome/gtk/GtkMain.java
new file mode 100644
index 0000000..f38de96
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkMain.java
@@ -0,0 +1,158 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.GlibException;
+
+/*
+ * This code originally lived in Gtk.java
+ */
+
+/**
+ * Crafted to avail ourselves of a dependency on Plumbing, whose ultimate
+ * class initializer loads our shared library, which of course we need to have
+ * completed before any of the native methods here will be available.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+final class GtkMain extends Plumbing
+{
+    private GtkMain() {}
+
+    static final void init(String[] args) {
+        gtk_init(lock, args);
+    }
+
+    /*
+     * This is one of the rarer cases where the arguments we pass to the JNI
+     * side have little relation to the signature of the actual target
+     * function. In this case, the first argument is a reference to the GDK
+     * lock used to permit multithreaded access to the GTK library.
+     */
+    private static native final void gtk_init(java.lang.Object lock, String[] args);
+
+    /*
+     * Note that although this code is marked as being within our Gdk$Lock,
+     * there is, in effect, a wait() within this call: as the GTK main loop
+     * cycles it releases the lock. The effect is that the monitor on Gdk.lock
+     * is frequently relinquished, which is the behaviour that is expected if
+     * a piece of Java code object executes wait() within a monitor block.
+     * Which is exactly what we need!
+     * 
+     * We'd rather have a synchronized (lock) {...} block here like we do for
+     * every other translation layer method in java-gnome; ensuring the main
+     * loop is within the GDK lock is critical to our successful thread safety
+     * story. For obscure reasons relating to optimizing Eclipse's debugging
+     * behaviour, for this one method ONLY we enter the monitor on the JNI
+     * side.
+     */
+    static final void main() {
+        // enter synchronized block
+        gtk_main();
+        // leave synchronized block
+    }
+
+    private static native final void gtk_main();
+
+    static final void mainQuit() {
+        synchronized (lock) {
+            gtk_main_quit();
+        }
+    }
+
+    private static native final void gtk_main_quit();
+
+    /**
+     * Are there any events pending for the main loop to process?
+     * 
+     * <p>
+     * <b>This is not for general use! Do not expose this and do not encourage
+     * anyone to use this to hack into the main loop.</b>
+     * 
+     * <p>
+     * In a test case, this could be used as follows; see
+     * <code>TestCaseGtk.cycleMainLoop()</code> in the <code>tests/</code>
+     * tree for details:
+     * 
+     * <pre>
+     * while (Gtk.eventsPending()) {
+     *     Gtk.mainIterationDo(false);
+     * }
+     * </pre>
+     */
+    static final boolean eventsPending() {
+        synchronized (lock) {
+            return gtk_events_pending();
+        }
+    }
+
+    private static native final boolean gtk_events_pending();
+
+    /**
+     * Run a single iteration of the main loop.
+     * 
+     * <p>
+     * Not public! This is for internal use only, notably by test cases.
+     * 
+     * @param block
+     *            Whether to block or not. If <code>true</code>, this method
+     *            will block until an event is processed.
+     * @return Will result in <code>true</code> if <code>Gtk.mainQuit()</code>
+     *         (aka <code>gtk_main_quit()</code>) has been called on the
+     *         innermost active main loop. <code>true</code> will also be
+     *         returned if there <i>is</i> no main loop running.
+     */
+    static final boolean mainIterationDo(boolean block) {
+        synchronized (lock) {
+            return gtk_main_iteration_do(block);
+        }
+    }
+
+    private static native final boolean gtk_main_iteration_do(boolean blocking);
+
+    static final boolean showURI(String uri) throws GlibException {
+        boolean result;
+
+        if (uri == null) {
+            throw new IllegalArgumentException("uri can't be null");
+        }
+
+        synchronized (lock) {
+            result = gtk_show_uri(uri);
+            return result;
+        }
+    }
+
+    private static native final boolean gtk_show_uri(String uri) throws GlibException;
+}
diff --git a/src/bindings/org/gnome/gtk/GtkMenuOverride.c b/src/bindings/org/gnome/gtk/GtkMenuOverride.c
new file mode 100644
index 0000000..425abca
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkMenuOverride.c
@@ -0,0 +1,168 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkMenuOverride.h"
+
+/**
+ * This is hand written to deal with the fact that in conventional use all
+ * the arguments to gtk_menu_popup() are completely useless.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkMenuOverride_gtk_1menu_1popup
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkMenu* self;
+
+	// convert parameter self
+	self = (GtkMenu*) _self;
+
+	// call function
+	gtk_menu_popup(self, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
+	
+	// cleanup parameter self
+}
+
+/*
+ * Call gtk_menu_popup(), but hardwired to use
+ * gtk_status_icon_position_menu() as the (*GtkMenuPositionFunc).
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkMenuOverride_gtk_1menu_1popup_1status_1icon
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jlong _status
+)
+{
+	GtkMenu* self;
+	GtkStatusIcon* status;
+
+	// convert parameter self
+	self = (GtkMenu*) _self;
+
+	// convert parameter status
+	status = (GtkStatusIcon*) _status;
+
+	// call function
+	gtk_menu_popup(self, NULL, NULL, gtk_status_icon_position_menu, status, 0, gtk_get_current_event_time());
+	
+	// cleanup parameter self
+}
+
+typedef struct {
+	gint x;
+	gint y;
+} Pair;
+
+/**
+ * Return the x and y variables passed when this was constructed. This is
+ * just some hoop jumping to get around a) not really wanting to create a
+ * custom menu position function callback signal, and b) there not being a
+ * straight forward "position at location" call in GtkMenu.
+ */
+/*
+ * Matches the signature of (*GtkMenuPositionFunc) as required by the fourth
+ * parameter of gtk_menu_popup().
+ */
+static void
+fixed_position
+(
+	GtkMenu *menu,
+	gint *x,
+	gint *y,
+	gboolean *push_in,
+	gpointer user_data
+)
+{
+	Pair* pair;
+
+	pair = (Pair*) user_data;
+	
+	*x = pair->x;
+	*y = pair->y;
+}
+
+/**
+ * A special case of popup() where we specifiy x,y [ie, in response to a Menu
+ * key press.
+ */
+/*
+ * DANGER is it acceptable to use a stack allocated Pair struct? I think so;
+ * the call to popup appears to be straight ahead (and this doesn't crash).
+ * Otherwise we need to heap allocate and somehow clean up afterwards.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkMenuOverride_gtk_1menu_1popup_1at_1position
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jint _x,
+	jint _y
+)
+{
+	GtkMenu* self;
+	gint x;
+	gint y;
+	Pair pair = { 0, };
+
+	// convert parameter self
+	self = (GtkMenu*) _self;
+
+	// convert parameter x
+	x = (gint) _x;
+
+	// convert parameter y
+	y = (gint) _y;
+
+	/*
+	 * Setup a struct to carry the two variables
+	 */
+
+	pair.x = x;
+	pair.y = y;
+
+	// call function
+	gtk_menu_popup(self, NULL, NULL, fixed_position, &pair, 0, gtk_get_current_event_time());
+	
+	// cleanup parameter self
+}
+
diff --git a/src/bindings/org/gnome/gtk/GtkMenuOverride.java b/src/bindings/org/gnome/gtk/GtkMenuOverride.java
new file mode 100644
index 0000000..405b00c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkMenuOverride.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Expose a custom workaround for the craziness of the real gtk_menu_popup()'s
+ * required arguments.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkMenuOverride extends Plumbing
+{
+    private GtkMenuOverride() {}
+
+    static final void popup(Menu self) {
+        synchronized (lock) {
+            gtk_menu_popup(pointerOf(self));
+        }
+    }
+
+    private static native final void gtk_menu_popup(long self);
+
+    /**
+     * Call gtk_menu_popup(), but hardwired to use
+     * gtk_status_icon_position_menu() as the (*GtkMenuPositionFunc).
+     */
+    static final void popupStatusIcon(Menu self, StatusIcon status) {
+        synchronized (lock) {
+            gtk_menu_popup_status_icon(pointerOf(self), pointerOf(status));
+        }
+    }
+
+    private static native final void gtk_menu_popup_status_icon(long self, long status);
+
+    /**
+     * Call gtk_menu_popup(), with native code taking care of composing a
+     * one-time (*GtkMenuPositionFunc) to place the menu at x,y.
+     */
+    static final void popupAtPosition(Menu self, int x, int y) {
+        gtk_menu_popup_at_position(pointerOf(self), x, y);
+    }
+
+    private static native final void gtk_menu_popup_at_position(long self, int x, int y);
+
+}
diff --git a/src/bindings/org/gnome/gtk/GtkRequisitionOverride.c b/src/bindings/org/gnome/gtk/GtkRequisitionOverride.c
new file mode 100644
index 0000000..74c9a08
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkRequisitionOverride.c
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkRequisitionOverride.h"
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkRequisitionOverride_gtk_1requisition_1new
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	GtkRequisition* result;
+	
+	/*
+	 * This is a dynamic requisition.
+	 */	
+	result = g_slice_new0(GtkRequisition);
+
+	// and finally
+	return (jlong) result;
+}
+
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_RequisitionOverride_gtk_1requisition_1free
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkRequisition* self;
+	
+	// convert paramter self
+	self = (GtkRequisition*) _self;
+	
+	// call function
+	g_slice_free(GtkRequisition, self);
+	
+	// cleanup parameter self
+}
diff --git a/src/bindings/org/gnome/gtk/GtkRequisitionOverride.java b/src/bindings/org/gnome/gtk/GtkRequisitionOverride.java
new file mode 100644
index 0000000..a1d5550
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkRequisitionOverride.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Kenneth Prugh
+ */
+final class GtkRequisitionOverride extends Plumbing
+{
+    private GtkRequisitionOverride() {}
+
+    static final long createRequisition() {
+        synchronized (lock) {
+            return gtk_requisition_new();
+        }
+    }
+
+    private static native final long gtk_requisition_new();
+
+    static final void free(Requisition self) {
+        synchronized (lock) {
+            gtk_requisition_free(pointerOf(self));
+        }
+    }
+
+    private static native final void gtk_requisition_free(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkResponseTypeOverride.java b/src/bindings/org/gnome/gtk/GtkResponseTypeOverride.java
new file mode 100644
index 0000000..3dba4d5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkResponseTypeOverride.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * This gives us package visible access to the utility methods which are of of
+ * course visible to the translation layer hierarchy but needed to permit
+ * subclassing of ResponseType and its use by Dialog.
+ * 
+ * This smacks of being something that will be needed more generally, but I do
+ * NOT want to expose numOf() or enumFor() from the top level
+ * org.freedesktop.bindings.Plumbing class unncessarily.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkResponseTypeOverride extends Plumbing
+{
+    private GtkResponseTypeOverride() {}
+
+    static ResponseType enumFor(int ordinal) {
+        return (ResponseType) Plumbing.enumFor(ResponseType.class, ordinal);
+    }
+
+    static int numOf(ResponseType reference) {
+        return Plumbing.numOf(reference);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/GtkStyleContextOverride.c b/src/bindings/org/gnome/gtk/GtkStyleContextOverride.c
new file mode 100644
index 0000000..88c36a0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkStyleContextOverride.c
@@ -0,0 +1,157 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkStyleContextOverride.h"
+
+JNIEXPORT jint JNICALL
+Java_org_gnome_gtk_GtkStyleContextOverride_gtk_1style_1context_1contains_1region
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jstring _region
+)
+{
+	const gchar* region;
+	gboolean result;
+	GtkStyleContext* self;
+	GtkRegionFlags flags;
+
+	// convert string to gchar*
+	region = (const gchar*) bindings_java_getString(env, _region);
+	if (region == NULL) {
+		return -1;
+	}
+
+	self = (GtkStyleContext*) _self;
+
+	// call function
+	result = gtk_style_context_has_region(self, region, &flags);
+	bindings_java_releaseString(region);
+
+	// return nothing equivalent to false
+	return result ? (jint) flags : -1;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_gnome_gtk_GtkStyleContextOverride_gtk_1style_1context_1get_1classes
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkStyleContext* self;
+	jobjectArray array;
+	int i, size;
+	jclass String;
+	GList* classes;
+	GList* iter;
+	jstring class;
+
+	self = (GtkStyleContext*) _self;
+	classes = gtk_style_context_list_classes(self);
+
+	size = g_list_length(classes);
+
+	String = (*env)->FindClass(env, "java/lang/String");
+	if (String == NULL) {
+		// exception already thrown
+		return NULL;
+	}
+
+	array = (*env)->NewObjectArray(env, size, String, NULL);
+	if (array == NULL) {
+		// exception already thrown
+		return NULL;
+	}
+
+	iter = classes;
+	for (i = 0; i < size; i++) {
+		class = bindings_java_newString(env, iter->data);
+		(*env)->SetObjectArrayElement(env, array, i, class);
+		iter = iter->next;
+	}
+
+	g_list_free(classes);
+
+	return array;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_gnome_gtk_GtkStyleContextOverride_gtk_1style_1context_1get_1regions
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkStyleContext* self;
+	jobjectArray array;
+	int i, size;
+	jclass String;
+	GList* regions;
+	GList* iter;
+	jstring region;
+
+	self = (GtkStyleContext*) _self;
+	regions = gtk_style_context_list_regions(self);
+
+	size = g_list_length(regions);
+
+	String = (*env)->FindClass(env, "java/lang/String");
+	if (String == NULL) {
+		// exception already thown
+		return NULL;
+	}
+
+	array = (*env)->NewObjectArray(env, size, String, NULL);
+	if (array == NULL) {
+		// exception already thrown
+		return NULL;
+	}
+
+	iter = regions;
+	for (i = 0; i < size; i++) {
+		region = bindings_java_newString(env, iter->data);
+		(*env)->SetObjectArrayElement(env, array, i, region);
+		iter = iter->next;
+	}
+
+	g_list_free(regions);
+
+	return array;
+}
diff --git a/src/bindings/org/gnome/gtk/GtkStyleContextOverride.java b/src/bindings/org/gnome/gtk/GtkStyleContextOverride.java
new file mode 100644
index 0000000..11cdee3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkStyleContextOverride.java
@@ -0,0 +1,91 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+package org.gnome.gtk;
+
+/**
+ * Manual code allowing us to handle some data returned by GtkStyleContext
+ * methods.
+ * 
+ * @author Guillaume Mazoyer
+ */
+final class GtkStyleContextOverride extends Plumbing
+{
+    static final RegionFlags hasRegion(StyleContext self, String region) {
+        int result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = gtk_style_context_contains_region(pointerOf(self), region);
+
+            return (RegionFlags) enumFor(RegionFlags.class, result);
+        }
+    }
+
+    private static native final int gtk_style_context_contains_region(long self, String region);
+
+    static final String[] getClasses(StyleContext self) {
+        String[] result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = gtk_style_context_get_classes(pointerOf(self));
+
+            return result;
+        }
+    }
+
+    private static native final String[] gtk_style_context_get_classes(long self);
+
+    static final String[] getRegions(StyleContext self) {
+        String[] result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = gtk_style_context_get_regions(pointerOf(self));
+
+            return result;
+        }
+    }
+
+    private static native final String[] gtk_style_context_get_regions(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkSwitchOverride.c b/src/bindings/org/gnome/gtk/GtkSwitchOverride.c
new file mode 100644
index 0000000..83b4834
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkSwitchOverride.c
@@ -0,0 +1,84 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkSwitchOverride.h"
+
+static guint signalID = 0;
+static GtkSwitch* source;
+
+static void
+emit_activated
+(
+	GObject *obj,
+	GParamSpec *pspec,
+	gpointer *data
+)
+{
+	g_signal_emit_by_name(source, "notify-activated", NULL);
+}
+
+/**
+ * called from
+ *   org.gnome.gtk.GtkSwitchOverride.setActivateSignal()
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkSwitchOverride_gtk_1switch_1set_1activated_1signal
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	// convert parameter self
+	source = (GtkSwitch*) _self;
+
+	if (signalID == 0) {
+		signalID = g_signal_new("notify-activated",
+					GTK_TYPE_SWITCH,
+					G_SIGNAL_ACTION,
+					0,
+					NULL,
+					NULL,
+					NULL,
+					G_TYPE_NONE,
+					0,
+					NULL);
+	}
+
+	// call function
+	g_signal_connect_object(source, "notify::active",
+			G_CALLBACK(emit_activated), NULL, G_CONNECT_AFTER);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkSwitchOverride.java b/src/bindings/org/gnome/gtk/GtkSwitchOverride.java
new file mode 100644
index 0000000..bd52187
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkSwitchOverride.java
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Manual code allowing us to hookup the Switch notify::active signal as if it
+ * was a Switch specific signal.
+ * 
+ * @author Guillaume Mazoyer
+ */
+final class GtkSwitchOverride extends Plumbing
+{
+    /**
+     * Manually hookup the function that will emit our custom visible signal.
+     */
+    static final void setActivatedSignal(Switch self) {
+        gtk_switch_set_activated_signal(pointerOf(self));
+    }
+
+    private static native final void gtk_switch_set_activated_signal(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTextBufferOverride.c b/src/bindings/org/gnome/gtk/GtkTextBufferOverride.c
new file mode 100644
index 0000000..4ca4057
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTextBufferOverride.c
@@ -0,0 +1,63 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkTextBufferOverride.h"
+
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkTextBufferOverride_g_1signal_1stop_1emission
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jstring _name
+)
+{
+	GtkTextBuffer* self;
+	const gchar* name;
+
+	// convert self
+	self = (GtkTextBuffer*) _self;
+
+	// convert name
+	name = bindings_java_getString(env, _name);
+
+	g_signal_stop_emission_by_name(self, name);
+
+	// cleanup self
+
+	// cleanup name
+	bindings_java_releaseString(name);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTextBufferOverride.java b/src/bindings/org/gnome/gtk/GtkTextBufferOverride.java
new file mode 100644
index 0000000..82c61f8
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTextBufferOverride.java
@@ -0,0 +1,77 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Signal;
+
+/**
+ * Hand crafted to allow us to prototype accessing a GtkTextBuffer notify
+ * signal.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkTextBufferOverride extends Plumbing
+{
+    private GtkTextBufferOverride() {}
+
+    interface NotifyCursorPositionSignal extends Signal
+    {
+        public void onNotifyCursorPosition(TextBuffer source);
+    }
+
+    static final void connect(TextBuffer self, GtkTextBufferOverride.NotifyCursorPositionSignal handler,
+            boolean after) {
+        connectSignal(self, handler, GtkTextBufferOverride.class, "notify::cursor-position", after);
+    }
+
+    /*
+     * Ignore GParamSpec
+     */
+    protected static final void receiveNotifyCursorPosition(Signal handler, long source, long pspec) {
+        ((GtkTextBufferOverride.NotifyCursorPositionSignal) handler).onNotifyCursorPosition((TextBuffer) objectFor(source));
+    }
+
+    static final void stopInsertText(TextBuffer self) {
+        synchronized (lock) {
+            g_signal_stop_emission(pointerOf(self), "insert-text");
+        }
+    }
+
+    static final void stopDeleteRange(TextBuffer self) {
+        synchronized (lock) {
+            g_signal_stop_emission(pointerOf(self), "delete-range");
+        }
+    }
+
+    private static native final void g_signal_stop_emission(long self, String name);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTextIterOverride.c b/src/bindings/org/gnome/gtk/GtkTextIterOverride.c
new file mode 100644
index 0000000..478316d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTextIterOverride.c
@@ -0,0 +1,61 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkTextIterOverride.h"
+
+/*
+ * Allocates a GtkTextIter by calling the boxed's _copy() function on a local
+ * struct variable. See GtkTreeIterOverride.c for discussion and possible
+ * remedies.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkTextIterOverride_gtk_1text_1iter_1new
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	GtkTextIter blank = { 0, };
+	GtkTextIter* result;
+	
+	// blank is allocated locally on the stack
+
+	// copy blank
+	result = gtk_text_iter_copy(&blank);
+
+	// and finally
+	return (jlong) result;
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTextIterOverride.java b/src/bindings/org/gnome/gtk/GtkTextIterOverride.java
new file mode 100644
index 0000000..3d689e6
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTextIterOverride.java
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Expose an allocator for blank TextIters. See the comment in
+ * GtkTreeIterOverride.c for details of the mechanics involved.
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ */
+final class GtkTextIterOverride extends Plumbing
+{
+    static final long createTextIter() {
+        synchronized (lock) {
+            return gtk_text_iter_new();
+        }
+    }
+
+    private static native final long gtk_text_iter_new();
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTextTagOverride.java b/src/bindings/org/gnome/gtk/GtkTextTagOverride.java
new file mode 100644
index 0000000..75fe81c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTextTagOverride.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+import org.freedesktop.bindings.DoubleConstant;
+import org.gnome.pango.Weight;
+
+final class GtkTextTagOverride extends Plumbing
+{
+    private GtkTextTagOverride() {}
+
+    /*
+     * The usual visibility workaround; this one more complicated since it is
+     * cross package which is why org.gnome.pango.Scale is a DoubleConstant.
+     */
+    static final double valueOf(DoubleConstant reference) {
+        return org.freedesktop.bindings.Plumbing.numOf(reference);
+    }
+
+    static final int valueOf(Constant reference) {
+        return org.freedesktop.bindings.Plumbing.numOf(reference);
+    }
+
+    static final Weight weightFor(int value) {
+        return (Weight) org.freedesktop.bindings.Plumbing.flagFor(Weight.class, value);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTreeIterOverride.c b/src/bindings/org/gnome/gtk/GtkTreeIterOverride.c
new file mode 100644
index 0000000..dd91c7d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTreeIterOverride.c
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkTreeIterOverride.h"
+
+/*
+ * Allocates a GtkTreeIter by calling the boxed's _copy() function on a local
+ * struct variable. By definition, a "boxed" is a struct. Local variables, of
+ * course, all have local storage on the stack. So with the & operater you
+ * can pass them to a function that takes a pointer so it can modify them; in
+ * our usage we need one in pointer form so use gtk_tree_iter_copy() to get
+ * us one in a manner that will be safely released by a later call to
+ * gtk_tree_iter_free().
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkTreeIterOverride_gtk_1tree_1iter_1new
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	GtkTreeIter blank = { 0, };
+	GtkTreeIter* result;
+	
+	// blank is allocated locally on the stack
+
+	// copy blank
+	result = gtk_tree_iter_copy(&blank);
+
+	// and finally
+	return (jlong) result;
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTreeIterOverride.java b/src/bindings/org/gnome/gtk/GtkTreeIterOverride.java
new file mode 100644
index 0000000..22b7ffb
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTreeIterOverride.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Expose an allocator for blank TreeIters. See the detailed comment in
+ * GtkTreeIterOverride.c for the mechanics of how this is done. FIXME Indeed,
+ * this should probably be something that the code generator creates for us,
+ * although that has to be done with some care as it would need to be aware of
+ * the copy function, and would have to not collide with an existing _new()
+ * function if one exists (as it does in Pango)
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkTreeIterOverride extends Plumbing
+{
+    static final long createTreeIter() {
+        synchronized (lock) {
+            return gtk_tree_iter_new();
+        }
+    }
+
+    private static native final long gtk_tree_iter_new();
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTreeModelFilterOverride.c b/src/bindings/org/gnome/gtk/GtkTreeModelFilterOverride.c
new file mode 100644
index 0000000..620482e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTreeModelFilterOverride.c
@@ -0,0 +1,121 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkTreeModelFilterOverride.h"
+
+static guint signalID = 0;
+
+/**
+ * Find out whether a given row is to be visible by emitting our custom
+ * "visible" signal, to which the we have connected a Java side signal handler
+ * returning boolean.
+ *
+ * Note that the reference to self is prepended by the g_signal_emit() code
+ * automatically. You need it in the callback signature, but not in the .defs
+ * or in the parameters here.
+ */
+/*
+ * Meets the signature requirement of (*GtkTreeModelFilterVisibleFunc) in
+ * order to be the second parameter to the call to
+ * gtk_tree_model_filter_set_visible_func() below.
+ */
+static gboolean
+emit_visible
+(
+	GtkTreeModel *child,
+	GtkTreeIter *iter,
+	gpointer instance
+)
+{
+	gboolean result;
+	
+	g_signal_emit_by_name(GTK_TREE_MODEL_FILTER(instance), "visible", child, iter, &result);
+	
+	return result;
+}
+
+/**
+ * called from
+ *   org.gnome.gtk.GtkTreeModelFilterOverride.setVisibleFunc()
+ * called from
+ *   org.gnome.gtk.TreeModelFilter.setVisibleCallback()
+ *
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkTreeModelFilterOverride_gtk_1tree_1model_1filter_1set_1visible_1func
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkTreeModelFilter* self;
+
+	// convert parameter self
+	self = (GtkTreeModelFilter*) _self;
+
+	if (signalID == 0) {
+		signalID = g_signal_new("visible",
+					GTK_TYPE_TREE_MODEL_FILTER,
+					G_SIGNAL_ACTION,
+					0,
+					NULL,
+					NULL,
+					NULL, // note 1
+					G_TYPE_BOOLEAN,
+					2,    // note 2
+					GTK_TYPE_TREE_MODEL,
+					GTK_TYPE_TREE_ITER);
+		/*
+		 * Notes:
+		 *
+		 * 1. Don't need to register a marshall function; the
+		 * subsequent g_signal_connect() as invoked by our
+		 * TreeModelFilter's setVisibleHandler() will register a
+		 * dynamic bindings_java_marshaller().
+		 *
+		 * 2. As ever, there is an implicit reference to self
+		 * automatically added as the first parameter for the signal.
+		 * Good of them, but confusing, because in this case, the
+		 * model parameter is the _child_, not the reference to self.
+		 */
+	}
+
+	// call function
+	gtk_tree_model_filter_set_visible_func(self, emit_visible, self, NULL);
+
+	// clean up
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTreeModelFilterOverride.java b/src/bindings/org/gnome/gtk/GtkTreeModelFilterOverride.java
new file mode 100644
index 0000000..b1de276
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTreeModelFilterOverride.java
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Manual code allowing us to hookup the TreeModelFilter callback function as
+ * if it were a signal.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkTreeModelFilterOverride extends Plumbing
+{
+    /**
+     * Manually hookup the function that will emit our custom visible signal.
+     */
+    static final void setVisibleFunc(TreeModelFilter self) {
+        gtk_tree_model_filter_set_visible_func(pointerOf(self));
+    }
+
+    private static native final void gtk_tree_model_filter_set_visible_func(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTreeModelOverride.c b/src/bindings/org/gnome/gtk/GtkTreeModelOverride.c
new file mode 100644
index 0000000..a4a7d3c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTreeModelOverride.c
@@ -0,0 +1,292 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkTreeModelOverride.h"
+
+/**
+ * Called from
+ *   org.gnome.gtk.GtkTreeModeOverride.gtk_list_store_new(String[])
+ * called from
+ *   org.gnome.gtk.GtkTreeModeOverride.createListStore(Class[])
+ * called from
+ *   org.gnome.gtk.ListStore.<init>(???)
+ *
+ * You should already have established Java side that ther array is bigger
+ * that 0 elements before calling this.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkTreeModelOverride_gtk_1list_1store_1new
+(
+	JNIEnv* env,
+	jclass cls,
+	jobjectArray _columns
+)
+{
+	GtkListStore* result;
+	gint num_columns;
+	GType* columns; // GType[]
+	gint i;
+	jstring _name;
+	const gchar* name;
+	
+	num_columns = (gint) (*env)->GetArrayLength(env, _columns);
+	columns = g_newa(GType, num_columns);
+		
+	for (i = 0; i < num_columns; i++) {
+		_name = (jstring) (*env)->GetObjectArrayElement(env, _columns, i);
+
+		name = bindings_java_getString(env, _name);
+		if (name == NULL) {
+			return 0L; // OutOfMemory already thrown
+		}
+
+		columns[i] = bindings_java_type_lookup(name);
+		
+		if (columns[i] == G_TYPE_INVALID) {
+			bindings_java_throw(env, "Don't know how to map %s into a GType", name);
+			return 0L;
+		}
+
+		bindings_java_releaseString(name);
+		(*env)->DeleteLocalRef(env, _name);
+	}
+
+	// call constructor
+	result = gtk_list_store_newv(num_columns, columns);
+
+	// clean up of columns is automatic
+
+	// and finally
+	return (jlong) result;
+}
+
+/**
+ * Called from
+ *   org.gnome.gtk.GtkTreeModeOverride.gtk_tree_store_new(String[])
+ * called from
+ *   org.gnome.gtk.GtkTreeModeOverride.createTreeStore(Class[])
+ * called from
+ *   org.gnome.gtk.TreeStore.<init>(???)
+ *
+ * You should already have established Java side that ther array is bigger
+ * that 0 elements before calling this.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_gtk_GtkTreeModelOverride_gtk_1tree_1store_1new
+(
+	JNIEnv* env,
+	jclass cls,
+	jobjectArray _columns
+)
+{
+	GtkTreeStore* result;
+	gint num_columns;
+	GType* columns; // GType[]
+	gint i;
+	jstring _name;
+	const gchar* name;
+
+	num_columns = (gint) (*env)->GetArrayLength(env, _columns);
+	columns = g_newa(GType, num_columns);
+
+	for (i = 0; i < num_columns; i++) {
+		_name = (jstring) (*env)->GetObjectArrayElement(env, _columns, i);
+
+		name = bindings_java_getString(env, _name);
+		if (name == NULL) {
+			return 0L; // OutOfMemory already thrown
+		}
+
+		columns[i] = bindings_java_type_lookup(name);
+
+		if (columns[i] == G_TYPE_INVALID) {
+			bindings_java_throw(env, "Don't know how to map %s into a GType", name);
+			return 0L;
+		}
+
+		bindings_java_releaseString(name);
+		(*env)->DeleteLocalRef(env, _name);
+	}
+
+	// call constructor
+	result = gtk_tree_store_newv(num_columns, columns);
+
+	// clean up of columns is automatic
+
+	// and finally
+	return (jlong) result;
+}
+
+/*
+ * This could _potentially_ be replaced if we were to expose Value binding of
+ * GBoxed types on the Java side.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkTreeModelOverride_gtk_1list_1store_1set_1reference
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _self,
+	jlong _row,
+	jint _column,
+	jobject _reference
+)
+{
+	GtkListStore* self;
+	GtkTreeIter* row;
+	gint column;
+	GValue value = { 0, };
+	gpointer reference;
+
+	// convert parameter self
+	self = (GtkListStore*) _self;
+
+	// convert parameter iter
+	row = (GtkTreeIter*) _row;
+
+	// convert parameter column
+	column = (gint) _column;
+
+	// convert parameter reference
+	g_value_init(&value, BINDINGS_JAVA_TYPE_REFERENCE);
+	reference = (gpointer) _reference;
+
+	g_value_set_boxed(&value, reference);
+
+	// call function
+	gtk_list_store_set_value(self, row, column, &value);
+
+	// clean up
+	g_value_unset(&value);
+}
+
+/*
+ * This could _potentially_ be replaced if we were to expose Value binding of
+ * GBoxed types on the Java side.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkTreeModelOverride_gtk_1tree_1store_1set_1reference
+(
+    JNIEnv *env,
+    jclass cls,
+    jlong _self,
+    jlong _row,
+    jint _column,
+    jobject _reference
+)
+{
+    GtkTreeStore* self;
+    GtkTreeIter* row;
+    gint column;
+    GValue value = { 0, };
+    gpointer reference;
+
+    // convert parameter self
+    self = (GtkTreeStore*) _self;
+
+    // convert parameter iter
+    row = (GtkTreeIter*) _row;
+
+    // convert parameter column
+    column = (gint) _column;
+
+    // convert parameter reference
+    g_value_init(&value, BINDINGS_JAVA_TYPE_REFERENCE);
+    reference = (gpointer) _reference;
+
+    g_value_set_boxed(&value, reference);
+
+    // call function
+    gtk_tree_store_set_value(self, row, column, &value);
+
+    // clean up
+    g_value_unset(&value);
+}
+	
+JNIEXPORT jobject JNICALL
+Java_org_gnome_gtk_GtkTreeModelOverride_gtk_1tree_1model_1get_1reference
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _self,
+	jlong _row,
+	jint _column
+)
+{
+	GtkTreeModel* self;
+	GtkTreeIter* row;
+	gint column;
+	GValue value = { 0, };
+	gpointer result;
+	jobject safe;
+
+	// convert parameter self
+	self = (GtkTreeModel*) GTK_TREE_MODEL((GtkListStore*) _self);
+
+	// convert parameter iter
+	row = (GtkTreeIter*) _row;
+
+	// convert parameter column
+	column = (gint) _column;
+
+	/*
+	 * Somewhat strangely, you don't call g_value_init() because the
+	 * gtk_tree_model_get_value() call does it for you.
+	 */
+
+	// call function
+	gtk_tree_model_get_value(self, row, column, &value);
+	result = g_value_get_boxed(&value);
+
+	// clean up value
+	/*
+	 * This is insanely nasty. When g_value_unset() is called, the result
+	 * jobject reference gets smashed. This appears to be the result of
+	 * DeleteGlobalRef() being called in bindings_java_reference_free().
+	 * While dropping the reference is, of course, the whole point, the
+	 * result is that the value of result is no longer usable. jobjects
+	 * really _do_ behave like pointers.
+	 *
+	 * The solution is to create a new local reference right here before
+	 * calling g_value_unset() method; this jobject will remain safe for
+	 * the duration of this native method and can be returned to Java.
+	 */
+	safe = (*env)->NewLocalRef(env, (jobject) result);
+	g_value_unset(&value);
+
+	// return reference
+	return safe;
+}
diff --git a/src/bindings/org/gnome/gtk/GtkTreeModelOverride.java b/src/bindings/org/gnome/gtk/GtkTreeModelOverride.java
new file mode 100644
index 0000000..1ba0ee4
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkTreeModelOverride.java
@@ -0,0 +1,127 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Manual code relating to TreeModel. We have to customize the constructor to
+ * deal with the (deliberate) lack of a Java type to GType mapping.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkTreeModelOverride extends Plumbing
+{
+    /**
+     * Hand written a) to enalbe our custom signature, b) to do manually do
+     * the mapping from Class objects to fully qualified class names.
+     */
+    static final long createListStore(Class<?>[] columns) {
+        final String[] names;
+
+        assert (columns != null) : "Array passed to createListStore() must not be null";
+        assert (columns.length > 0) : "Minimum one column when constructing ListStore";
+
+        names = new String[columns.length];
+
+        for (int i = 0; i < columns.length; i++) {
+            names[i] = columns[i].getName();
+        }
+
+        synchronized (lock) {
+            return gtk_list_store_new(names);
+        }
+    }
+
+    private static native final long gtk_list_store_new(String[] columns);
+
+    static final long createTreeStore(Class<?>[] columns) {
+        final String[] names;
+
+        assert (columns != null) : "Array passed to createTreeStore() must not be null";
+        assert (columns.length > 0) : "Minimum one column when constructing ListStore";
+
+        names = new String[columns.length];
+
+        for (int i = 0; i < columns.length; i++) {
+            names[i] = columns[i].getName();
+        }
+
+        synchronized (lock) {
+            return gtk_tree_store_new(names);
+        }
+    }
+
+    private static native final long gtk_tree_store_new(String[] columns);
+
+    /**
+     * Hand written because of the necessary custom C code to deal with our
+     * BindingsJavaReference wrapping.
+     */
+    static final void setReference(TreeModel self, TreeIter row, int column, java.lang.Object reference) {
+        if (self instanceof ListStore) {
+            synchronized (lock) {
+                gtk_list_store_set_reference(pointerOf(self), pointerOf(row), column, reference);
+            }
+        } else if (self instanceof TreeStore) {
+            synchronized (lock) {
+                gtk_tree_store_set_reference(pointerOf(self), pointerOf(row), column, reference);
+            }
+        } else {
+            throw new UnsupportedOperationException(
+                    "You need to implement setReference() for your TreeModel subclass");
+        }
+    }
+
+    private static native final void gtk_list_store_set_reference(long self, long row, int column,
+            java.lang.Object reference);
+
+    private static native final void gtk_tree_store_set_reference(long self, long row, int column,
+            java.lang.Object reference);
+
+    /**
+     * Hand written because of the necessary custom C code to deal with our
+     * BindingsJavaReference wrapping, especially the reference corruption
+     * prevention.
+     */
+    static final java.lang.Object getReference(TreeModel self, TreeIter row, int column) {
+        java.lang.Object result;
+
+        synchronized (lock) {
+            result = gtk_tree_model_get_reference(pointerOf(self), pointerOf(row), column);
+
+            return result;
+        }
+    }
+
+    private static final native java.lang.Object gtk_tree_model_get_reference(long self, long row,
+            int column);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkWidgetOverride.c b/src/bindings/org/gnome/gtk/GtkWidgetOverride.c
new file mode 100644
index 0000000..179691b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkWidgetOverride.c
@@ -0,0 +1,158 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkWidgetOverride.h"
+
+/**
+ * Access GtkWidget's allocation field, a GtkAllocation struct.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkWidgetOverride_gtk_1widget_1get_1allocation
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jlong _allocation
+)
+{
+	GtkWidget* self;
+	GtkAllocation* allocation;
+
+	// convert parameter self
+	self = (GtkWidget*) _self;
+
+	// convert parameter allocation
+	allocation = (GtkAllocation*) _allocation;
+	
+	gtk_widget_get_allocation(self, allocation);
+
+	// cleanup parameter self
+
+	// cleanup parameter allocation
+}
+
+/**
+ * Access GtkWidget's requisition field, a GtkRequisition struct.
+ *
+ * This implementation also [is forced to] get on with calling
+ * gtk_widget_size_request() on the assumption that the Requisition isn't
+ * much use without data in it.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkWidgetOverride_gtk_1widget_1get_1requisition
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jlong _requisition
+)
+{
+	GtkRequisition temp = { 0, };
+	GtkRequisition* requisition;
+	GtkWidget* self;
+
+	// convert parameter self
+	self = (GtkWidget*) _self;
+
+	// convert parameter requisition
+	requisition = (GtkRequisition*) _requisition;
+
+	/*
+	 * To avoid the necessity to instantiate the silly GtkRequisition
+	 * struct as a complete object Java side (along with attendant
+	 * GtkRequisitionOverride code to allocate them), we take a fairly
+	 * sharp shortcut here: we will programatically get on with it and
+	 * call size_request() here.
+	 */
+
+	gtk_widget_size_request(self, &temp);
+	
+	gtk_widget_get_requisition(self, requisition);
+
+	// cleanup parameter self
+	
+	// cleanup parameter requisition
+}
+
+/**
+ * Get the events that the underlying GdkWindow receives.
+ */
+JNIEXPORT jint JNICALL
+Java_org_gnome_gtk_GtkWidgetOverride_gtk_1widget_1get_1events
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkWidget* self;
+	GdkWindow* window;
+	GdkEventMask mask;
+
+	// convert parameter self
+	self = (GtkWidget*) _self;
+
+	window = gtk_widget_get_window(self);
+
+	mask = gdk_window_get_events(window);
+	return (jint) mask;
+}
+
+/**
+ * Set the events that the underlying GdkWindow will receive.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkWidgetOverride_gtk_1widget_1set_1events
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jint _mask
+)
+{
+	GtkWidget* self;
+	GdkWindow* window;
+	GdkEventMask mask;
+
+	// convert parameter self
+	self = (GtkWidget*) _self;
+
+	mask = (GdkEventMask) _mask;
+
+	window = gtk_widget_get_window(self);
+	gdk_window_set_events(window, mask);
+}
+
diff --git a/src/bindings/org/gnome/gtk/GtkWidgetOverride.java b/src/bindings/org/gnome/gtk/GtkWidgetOverride.java
new file mode 100644
index 0000000..acf3923
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkWidgetOverride.java
@@ -0,0 +1,97 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.EventMask;
+
+/**
+ * Hand crafted to get at the fields of Widget.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkWidgetOverride extends Plumbing
+{
+    private GtkWidgetOverride() {}
+
+    static final void getAllocation(Widget self, Allocation allocation) {
+        synchronized (lock) {
+            gtk_widget_get_allocation(pointerOf(self), pointerOf(allocation));
+        }
+    }
+
+    private static native final void gtk_widget_get_allocation(long self, long allocation);
+
+    static final void getRequisition(Widget self, Requisition requisition) {
+        synchronized (lock) {
+            gtk_widget_get_requisition(pointerOf(self), pointerOf(requisition));
+        }
+    }
+
+    private static native final void gtk_widget_get_requisition(long self, long requisition);
+
+    /**
+     * Set the events that the underlying GdkWindow will receive. As a
+     * necessary convenience, the Widget will be realized first if necessary.
+     */
+    static final void setEvents(Widget self, EventMask eventMask) {
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        if (eventMask == null) {
+            throw new IllegalArgumentException("eventMask can't be null");
+        }
+
+        synchronized (lock) {
+            gtk_widget_set_events(pointerOf(self), numOf(eventMask));
+        }
+    }
+
+    private static native final void gtk_widget_set_events(long self, int eventMask);
+
+    static final EventMask getEvents(Widget self) {
+        int result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = gtk_widget_get_events(pointerOf(self));
+
+            return (EventMask) flagFor(EventMask.class, result);
+        }
+    }
+
+    private static native final int gtk_widget_get_events(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/GtkWindowOverride.c b/src/bindings/org/gnome/gtk/GtkWindowOverride.c
new file mode 100644
index 0000000..85d1494
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkWindowOverride.c
@@ -0,0 +1,196 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * We run into problems with the default GtkWindow memory management.
+ * The default behaviour for 'delete-event' is to propegate to the dispose
+ * code path, which among other things, releases all its child GtkWidgets.
+ * The GtkWindow itself is not released, however, because we could still hold
+ * a valid ToggleRef to it if we still have a reference on the Java side to
+ * the Java side Proxy; show()ing the Window again is possible, but if you do
+ * its contents will be gone.
+ *
+ * To work around this we use a bit of GTK hackery. First we block
+ * 'delete-event' from propegating into dispose, and instead just hide() the
+ * window. Then we take advantage of there is an internal property
+ * called GtkWindow->has_user_ref_count. By overriding it to 0 we can tell
+ * GTK that we are managing the Ref to the GtkWindow representing it being on
+ * screen, and we can safely drop GTK's Ref to the GtkWindow. Finally, in
+ * operation, we restore this Ref count on windows that are show()n and
+ * re-remove it on hide(). Thus a hidden GtkWindow that is also not strongly
+ * referenced from any Java code will be eligigble for cleanup.
+ *
+ * Thanks to Owen Taylor for having researched these scenarios and in
+ * particular for having verified that the 'hide' signal is indeed emitted by
+ * gtk_widget_dispose(). The original suggestion to leverage the 'show' and
+ * 'hide' signals was from Vreixo Formoso.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_gtk_GtkWindowOverride.h"
+
+/*
+ * When we hit a 'delete-event' signal, hide the window and block further
+ * signal emission, preventing the native dispose hierarchy from running. It
+ * is critical that this be connected to run "after", otherwise standard GTK
+ * expected behaviours will be subverted.
+ */
+/*
+ * Signature the prototype of a (*delete-event) callback, meeting the
+ * requirements of the third parameter to g_signal_connect_after() for signal
+ * 'delete-event'.
+ */
+static gboolean
+window_delete_handler
+(
+	GtkWidget* object,
+	gpointer user_data
+)
+{
+	if (DEBUG_MEMORY_MANAGEMENT) {
+		g_printerr("mem: delete caught for\t\t%s\n", bindings_java_memory_pointerToString(object));
+	}
+	gtk_widget_hide(object);
+	
+	return TRUE;
+}
+
+/*
+ * Signature the prototype of a (*GSourceFunc) callback, meeting the
+ * requirements of the third argument to gdk_threads_add_timeout_full()
+ */
+static gboolean
+window_hide_deref
+(
+	gpointer data
+)
+{
+	GtkWidget* window;
+	
+	window = (GtkWidget*) data;
+	
+	g_object_unref(window);
+	return FALSE;
+}
+
+
+/*
+ * On hide, drop a Ref count. This replaces the built in behaviour of GTK but
+ * is safe becuase we have told GtkWindow that we are holding the user Ref count
+ * to the object.
+ */
+/*
+ * Signature the prototype of a (*hide) callback, meeting the requirements of
+ * the third parameter to g_signal_connect() for signal 'hide'.
+ */
+static void
+window_hide_handler
+(
+	GtkWidget* widget,
+	gpointer user_data
+)
+{
+	if (DEBUG_MEMORY_MANAGEMENT) {
+		g_printerr("mem: hide caught for\t\t%s\n", bindings_java_memory_pointerToString(widget));
+	}
+	gdk_threads_add_timeout_full(G_PRIORITY_LOW, 100, window_hide_deref, widget, NULL);
+}
+
+
+/*
+ * On show, restore a Ref count.
+ */
+/*
+ * Signature the prototype of a (*show) callback, meeting the requirements
+ * of the third parameter to g_signal_connect() for signal 'show'.
+ */
+static void
+window_show_handler
+(
+	GtkWidget* widget,
+	gpointer user_data
+)
+{
+	if (DEBUG_MEMORY_MANAGEMENT) {
+		g_printerr("mem: show caught for\t\t%s\n", bindings_java_memory_pointerToString(widget));
+	}
+	g_object_ref(widget);
+}
+
+
+/**
+ * Implements
+ *   org.gnome.gtk.GtkWindowOverride.gtk_window_drop_user_ref(long self)
+ * called from
+ *   org.gnome.gtk.GtkWindowOverride.dropUserRef(Window self)
+ * called from all
+ *   org.gnome.gtk.Window.<init>()
+ * constructors after instantiation in order to change memory management
+ * behaviour by changing has_user_ref_count field and dropping a Ref count.
+ */
+JNIEXPORT void JNICALL
+Java_org_gnome_gtk_GtkWindowOverride_gtk_1window_1drop_1user_1ref
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	GtkWindow* self;
+
+	// convert parameter self
+	self = (GtkWindow*) _self;
+
+	/*
+	 * Hook up our custom overrides to unref on 'hide' and ref on 'show',
+	 * and to block 'delete-event' from propegating and to instead hide()
+	 * only.
+	 */
+
+	g_signal_connect_after(self, "delete-event", G_CALLBACK(window_delete_handler), NULL);
+	g_signal_connect(self, "hide", G_CALLBACK(window_hide_handler), NULL);
+	g_signal_connect(self, "show", G_CALLBACK(window_show_handler), NULL);
+
+	/*
+	 * Now. force the behaviour change on GtkWindow. We reconfigure its
+	 * memory management mode, and then drop the reference to self that
+	 * GTK places in GtkWindows.
+	 */
+
+	gtk_window_set_has_user_ref_count(self, FALSE);
+	g_object_unref(self);
+
+	// cleanup parameter self
+}
diff --git a/src/bindings/org/gnome/gtk/GtkWindowOverride.java b/src/bindings/org/gnome/gtk/GtkWindowOverride.java
new file mode 100644
index 0000000..b76cd18
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/GtkWindowOverride.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Hand crafted to allow us to reconfigure GtkWindow memory management. See
+ * implementing C file for a detailed discussion.
+ * 
+ * @author Andrew Cowie
+ */
+final class GtkWindowOverride extends Plumbing
+{
+    private GtkWindowOverride() {}
+
+    static final void dropUserRef(Window self) {
+        synchronized (lock) {
+            gtk_window_drop_user_ref(pointerOf(self));
+        }
+    }
+
+    private static native final void gtk_window_drop_user_ref(long self);
+}
diff --git a/src/bindings/org/gnome/gtk/HBox.java b/src/bindings/org/gnome/gtk/HBox.java
new file mode 100644
index 0000000..7ca9b06
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HBox.java
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Container which holds a variable number of Widgets in a single horizontal
+ * row. All the children of this HBox are allocated the same height - that of
+ * the tallest Widget packed into the HBox.
+ * 
+ * <p>
+ * All the methods you need to add Widgets to HBoxes are on the parent class;
+ * to get started, see Box's {@link Box#packStart(Widget) packStart()}, no pun
+ * intended.
+ * 
+ * @author Andrew Cowie
+ * @see VBox
+ * @since 4.0.1
+ */
+public class HBox extends Box
+{
+    protected HBox(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new HBox.
+     * 
+     * @param homogeneous
+     *            If <code>true</code>, all children will be given equal space
+     *            allotments.
+     * @param spacing
+     *            the number of pixels to place (by default) between children.
+     */
+    public HBox(boolean homogeneous, int spacing) {
+        super(GtkHBox.createHBox(homogeneous, spacing));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/HButtonBox.java b/src/bindings/org/gnome/gtk/HButtonBox.java
new file mode 100644
index 0000000..a544bb4
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HButtonBox.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Lay Buttons out horizontally with consistent spacing properties. This is
+ * one of the principal mechanisms used to create (and indeed enforce) the
+ * common look and feel between to Dialogs and other data entry Windows across
+ * the GNOME desktop.
+ * 
+ * <p>
+ * See {@link ButtonBox} for the methods giving you control over presentation.
+ * 
+ * @author Nat Pryce
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class HButtonBox extends ButtonBox
+{
+    public HButtonBox() {
+        this(GtkHButtonBox.createHButtonBox());
+    }
+
+    protected HButtonBox(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/HPaned.java b/src/bindings/org/gnome/gtk/HPaned.java
new file mode 100644
index 0000000..978471a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HPaned.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A {@link Paned Paned} that disposes horizontally the two children, one at
+ * the left, the other at the right.
+ * 
+ * @see Paned
+ * @see VPaned
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class HPaned extends Paned
+{
+    protected HPaned(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new HPaned.
+     */
+    public HPaned() {
+        super(GtkHPaned.createHPaned());
+    }
+
+    /**
+     * Create a new HPaned and set its children.
+     * 
+     * <p>
+     * Each child will be added with the correspondent <code>add()</code>
+     * function.
+     */
+    public HPaned(Widget child1, Widget child2) {
+        super(GtkHPaned.createHPaned());
+        add1(child1);
+        add2(child2);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/HScale.java b/src/bindings/org/gnome/gtk/HScale.java
new file mode 100644
index 0000000..38a19ab
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HScale.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A horizontal slider allowing you to visually represent data and offer the
+ * user the ability to manipulate it. <img src="HScale.png" class="snapshot">
+ * See {@link Scale} and {@link Range} for the methods used to manipulate
+ * instances of these classes.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class HScale extends Scale
+{
+    protected HScale(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new HScale allowing the user to enter a number a number
+     * between <code>min</code> and <code>max</code>, sliding in increments of
+     * <code>step</code>.
+     * 
+     * <p>
+     * The internal algorithms work best if <code>step</code> is specified as
+     * a power of 10. That shouldn't hassle you, as you can round the value
+     * showing in the HScale with {@link Scale#setDigits(int) setDigits()}.
+     * And in any case, <code>step</code> only impacts the jumps that are made
+     * if the HScale is changed via the <b><code>Left</code></b> and <b>
+     * <code>Right</code></b> key strokes.
+     * 
+     * @since 4.0.6
+     */
+    public HScale(int min, int max, int step) {
+        super(GtkHScale.createHScaleWithRange(min, max, step));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/HScrollbar.java b/src/bindings/org/gnome/gtk/HScrollbar.java
new file mode 100644
index 0000000..3b3767c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HScrollbar.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A horizontal Scrollbar. These are just constituent parts of
+ * ScrolledWindows; you rarely if ever will need to talk to this Widget
+ * directly, but if you need access to it call ScrolledWindow's
+ * {@link ScrolledWindow#getHScrollbar() getHScrollbar()}.
+ * 
+ * @since 4.0.8
+ */
+public class HScrollbar extends Scrollbar
+{
+    protected HScrollbar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new HScrollbar. Ordinarily you pass in the Adjustment object
+     * you plan to control this Scrollbar with, but if you pass
+     * <code>null</code> one will be created.
+     * 
+     * @since 4.0.17
+     */
+    public HScrollbar(Adjustment adj) {
+        super(GtkHScrollbar.createHScrollbar(adj));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/HSeparator.java b/src/bindings/org/gnome/gtk/HSeparator.java
new file mode 100644
index 0000000..7e6b1c5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HSeparator.java
@@ -0,0 +1,56 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A horizontal line used to create visual distinction between Widgets being
+ * laid out vertically.
+ * 
+ * @see VSeparator
+ * 
+ * @author Sebastian Mancke
+ * @since 4.0.3
+ */
+public class HSeparator extends Separator
+{
+    protected HSeparator(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new HSeparator
+     */
+    public HSeparator() {
+        super(GtkHSeparator.createHSeparator());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/HandleBox.java b/src/bindings/org/gnome/gtk/HandleBox.java
new file mode 100644
index 0000000..11fd55c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/HandleBox.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class HandleBox extends Bin
+{
+    protected HandleBox(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IMPreeditStyle.java b/src/bindings/org/gnome/gtk/IMPreeditStyle.java
new file mode 100644
index 0000000..f86a8f2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IMPreeditStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IMPreeditStyle extends Constant
+{
+    private IMPreeditStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IMStatusStyle.java b/src/bindings/org/gnome/gtk/IMStatusStyle.java
new file mode 100644
index 0000000..e97f6b5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IMStatusStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IMStatusStyle extends Constant
+{
+    private IMStatusStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconFactory.java b/src/bindings/org/gnome/gtk/IconFactory.java
new file mode 100644
index 0000000..4d94d72
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconFactory.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class IconFactory extends Object
+{
+    protected IconFactory(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconInfo.java b/src/bindings/org/gnome/gtk/IconInfo.java
new file mode 100644
index 0000000..8d1ce40
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconInfo.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IconInfo extends Boxed
+{
+    protected IconInfo(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconLookupFlags.java b/src/bindings/org/gnome/gtk/IconLookupFlags.java
new file mode 100644
index 0000000..fd58a79
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconLookupFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IconLookupFlags extends Constant
+{
+    private IconLookupFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconSet.java b/src/bindings/org/gnome/gtk/IconSet.java
new file mode 100644
index 0000000..9a14f0a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconSet.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IconSet extends Boxed
+{
+    protected IconSet(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconSize.java b/src/bindings/org/gnome/gtk/IconSize.java
new file mode 100644
index 0000000..3311968
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconSize.java
@@ -0,0 +1,90 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants referring to the size of an icon. These are typically used when
+ * working with Stock icons, for example with the
+ * {@link Image#Image(Stock, IconSize) Image} constructor that takes a Stock
+ * image identifier and one of these constants to specify the size you want.
+ * 
+ * <p>
+ * We're rather deliberately <i>not</i> indicated the pixel dimensions
+ * associated with each IconSize constant, as this is the sort of thing that
+ * can evolve over time - and be theme dependant.
+ * 
+ * <p>
+ * In some sense you don't need this; when working with Stock items in
+ * conjunction with Buttons or Menus, the images will be arranged to be the
+ * appropriate size automatically.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class IconSize extends Constant
+{
+    private IconSize(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The standard size used for icons on Buttons. See also
+     * {@link Button#setImage(Image)} for setting an image of arbitrary size.
+     */
+    public static final IconSize BUTTON = new IconSize(GtkIconSize.BUTTON, "BUTTON");
+
+    /**
+     * The standard size used for icons appearing on Menus. See
+     * {@link ImageMenuItem}.
+     */
+    public static final IconSize MENU = new IconSize(GtkIconSize.MENU, "MENU");
+
+    /**
+     * The size used when Toolbars are being rendered in their smaller
+     * incarnation. Some have noted that icons created for this case bear a
+     * striking resemblance to the MENU size.
+     */
+    public static final IconSize SMALL_TOOLBAR = new IconSize(GtkIconSize.SMALL_TOOLBAR, "SMALL_TOOLBAR");
+
+    /**
+     * The size used for icons appearing in large (some would call this
+     * normal) size Toolbars.
+     */
+    public static final IconSize LARGE_TOOLBAR = new IconSize(GtkIconSize.LARGE_TOOLBAR, "LARGE_TOOLBAR");
+
+    public static final IconSize DIALOG = new IconSize(GtkIconSize.DIALOG, "DIALOG");
+
+    public static final IconSize DND = new IconSize(GtkIconSize.DND, "DND");
+}
diff --git a/src/bindings/org/gnome/gtk/IconSource.java b/src/bindings/org/gnome/gtk/IconSource.java
new file mode 100644
index 0000000..d239d35
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconSource.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IconSource extends Boxed
+{
+    protected IconSource(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconTheme.java b/src/bindings/org/gnome/gtk/IconTheme.java
new file mode 100644
index 0000000..c5f64ac
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconTheme.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class IconTheme extends Object
+{
+    protected IconTheme(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconThemeError.java b/src/bindings/org/gnome/gtk/IconThemeError.java
new file mode 100644
index 0000000..bb938f2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconThemeError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IconThemeError extends Constant
+{
+    private IconThemeError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconView.java b/src/bindings/org/gnome/gtk/IconView.java
new file mode 100644
index 0000000..3e42134
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconView.java
@@ -0,0 +1,371 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Widget that displays the data of a {@link TreeModel} as a grid of icons
+ * with labels. It is thus an alternative to TreeView, and like it, IconView
+ * is the view part of GTK's model-view-controller pattern list, and thus it
+ * needs a TreeModel where the data to be displayed is actually stored.
+ * 
+ * <p>
+ * It is however, much simpler and less powerful than TreeView. First of all,
+ * you cannot display a hierarchical model (such as {@link TreeStore}) in an
+ * IconView. Only list models, such as {@link ListStore} can be used.
+ * 
+ * <p>
+ * In an IconView the rows of the underlying TreeModel are represented as
+ * items with an icon and a text label. The icon is taken from a
+ * {@link DataColumnPixbuf} column of the model, and the label is taken from a
+ * {@link DataColumnString}. As you may guess, only those two columns of the
+ * model can be displayed in an IconView.
+ * 
+ * <p>
+ * On the other side, configuring an IconView is easier than a TreeView. First
+ * of all, you should configure the model:
+ * 
+ * <pre>
+ * final ListStore model;
+ * final DataColumnString labelColumn;
+ * final DataColumnPixbuf iconColumn;
+ * final IconView view;
+ * 
+ * ...
+ * model = new ListStore(new DataColumn[] {
+ *     labelColumn,
+ *     ...
+ * }
+ * </pre>
+ * 
+ * Of course, you don't need to populate the model before configuring the
+ * IconView. That configuration is easy, as you only need to set the data
+ * columns from which the icon and label will be taken.
+ * 
+ * <pre>
+ * view = new IconView(model);
+ * view.setPixbufColumn(iconColumn);
+ * 
+ * // you can use setMarkupColumn() as an alternative
+ * view.setTextColumn(labelColumn);
+ * </pre>
+ * 
+ * Once the IconView is configured, you may want to hook up a handler for the
+ * {@link IconView.ItemActivated} signal, emitted when the user activates an
+ * item (for example, by double-clicking over it).
+ * 
+ * <p>
+ * Finally, an IconView has methods to handle the selection, so you don't need
+ * to use the TreeSelection object.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ * @since 4.0.7
+ */
+public class IconView extends Container implements CellLayout
+{
+    protected IconView(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new IconView
+     * 
+     * <p>
+     * Remember you cannot use a TreeStore model with an IconView.
+     * 
+     * @since 4.0.7
+     */
+    public IconView(TreeModel model) {
+        super(GtkIconView.createIconViewWithModel(checkModel(model)));
+    }
+
+    /**
+     * Construct an IconView whose backing model will be assigned later.
+     * You'll need to use {@link #setModel(TreeModel) setModel()} to set it.
+     * 
+     * @since 4.0.8
+     */
+    public IconView() {
+        super(GtkIconView.createIconView());
+    }
+
+    /**
+     * Set or change the TreeModel from which this IconView draws its data.
+     * 
+     * @since 4.0.7
+     */
+    public void setModel(TreeModel model) {
+        GtkIconView.setModel(this, checkModel(model));
+    }
+
+    private static TreeModel checkModel(final TreeModel model) {
+        if (model instanceof TreeStore) {
+            throw new IllegalArgumentException("model has to be a ListStore");
+            // or what else?
+        }
+        return model;
+    }
+
+    /**
+     * Set the DataColumn in the TreeModel containing the plain text to use as
+     * label of each item. Usually you will use this method to choose the
+     * model column to map to the label. Alternatively you can use
+     * {@link #setMarkupColumn(DataColumnString) setMarkupColumn()} to provide
+     * a text with Pango markup.
+     * 
+     * @since 4.0.7
+     */
+    public void setTextColumn(DataColumnString column) {
+        GtkIconView.setTextColumn(this, column.getOrdinal());
+    }
+
+    /**
+     * Set the DataColumn, containing Pango markup, to render as the label of
+     * each item.
+     * 
+     * @since 4.0.7
+     */
+    public void setMarkupColumn(DataColumnString column) {
+        GtkIconView.setMarkupColumn(this, column.getOrdinal());
+    }
+
+    /**
+     * Set the DataColumn of the model that contains the Pixbuf to use as the
+     * icon of each item.
+     * 
+     * @since 4.0.7
+     */
+    public void setPixbufColumn(DataColumnPixbuf column) {
+        GtkIconView.setPixbufColumn(this, column.getOrdinal());
+    }
+
+    /**
+     * Emitted when an item in the IconView has been activated. Activation
+     * occurs when an item in the view is double-clicked, or when <b>
+     * <code>Space</code></b> or <b><code>Enter</code></b> are pressed while
+     * an item is selected.
+     * 
+     * <p>
+     * In general, you've got the TreeModel and especially its DataColumns
+     * visible, so to use <code>IconView.ItemActivated</code> you can just:
+     * 
+     * <pre>
+     * final TreeModel model;
+     * final DataColumnString column;
+     * 
+     * view.connect(new IconView.ItemActivated() {
+     *     public void onItemActivated(IconView source, TreePath path) {
+     *         final TreeIter row;
+     * 
+     *         row = model.getIter(path);
+     * 
+     *         ... = model.getValue(row, column);
+     *     }
+     * });
+     * </pre>
+     * 
+     * Remember that TreeIters and TreePaths are not stable over changes to
+     * the model, so get on with using <code>path</code> right away.
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.7
+     */
+    public interface ItemActivated extends GtkIconView.ItemActivatedSignal
+    {
+        /**
+         * The useful parameter is usually <code>path</code> which can be
+         * converted into a TreeIter with your TreeModel's
+         * {@link TreeModel#getIter(TreePath) getIter()} allowing you to then
+         * lookup a particular value from the data model.
+         */
+        public void onItemActivated(IconView source, TreePath path);
+    }
+
+    /**
+     * Hook up a <code>IconView.ItemActivated</code> handler.
+     * 
+     * @since 4.0.7
+     */
+    public void connect(IconView.ItemActivated handler) {
+        GtkIconView.connect(this, handler, false);
+    }
+
+    /**
+     * Set what kinds of selections are allowed. The interesting constants
+     * you'll use most often are {@link SelectionMode#NONE NONE} and
+     * {@link SelectionMode#MULTIPLE MULTIPLE} since
+     * {@link SelectionMode#SINGLE SINGLE} is the default. See SelectionMode
+     * for the details of the behaviour implied by each option.
+     * 
+     * @since 4.0.7
+     */
+    public void setSelectionMode(SelectionMode mode) {
+        GtkIconView.setSelectionMode(this, mode);
+    }
+
+    /**
+     * Get the items currently selected.
+     * 
+     * <p>
+     * You can use the TreeModel's {@link TreeModel#getIter(TreePath)
+     * getIter()} method to convert the returned TreePaths to the more
+     * convenient TreeIter:
+     * 
+     * <pre>
+     * IconView view;
+     * TreeModel model;
+     * 
+     * for (TreePath path : view.getSelectedItems()) {
+     *     TreeIter item = model.getIter(path);
+     *     // do something with the item
+     * }
+     * </pre>
+     * 
+     * <p>
+     * Also remember that both TreeIter and TreePath are temporally objects no
+     * longer valid once you make any change to the model. Thus, if you plan
+     * to modify the model, you may want to convert the returned TreePaths to
+     * {@link TreeRowReference TreeRowReferences}.
+     * 
+     * @return An arrays with the selected items. If no item is selected, an
+     *         empty array is returned.
+     * 
+     * @since 4.0.7
+     */
+    public TreePath[] getSelectedItems() {
+        return GtkIconView.getSelectedItems(this);
+    }
+
+    /**
+     * Signal emitted when the selection changes, i.e. when a new item is
+     * selected or a previously selected item was unselected.
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.7
+     */
+    public interface SelectionChanged extends GtkIconView.SelectionChangedSignal
+    {
+        public void onSelectionChanged(IconView source);
+    }
+
+    /**
+     * Hook up a handler for the <code>IconView.SelectionChanged</code>
+     * signal.
+     * 
+     * @since 4.0.7
+     */
+    public void connect(IconView.SelectionChanged handler) {
+        GtkIconView.connect(this, handler, false);
+    }
+
+    /**
+     * The number of columns in which icons should be displayed. The default
+     * is <code>-1</code> which indicates that the IconView will determine
+     * this automatically based on the size allocated to it.
+     * 
+     * @since 4.0.8
+     */
+    public void setColumns(int num) {
+        if ((num < 1) && (num != -1)) {
+            throw new IllegalArgumentException("num must be positive, or -1 to indicate automatic");
+        }
+        GtkIconView.setColumns(this, num);
+    }
+
+    /**
+     * Set the maximum width that will be given to each column of icons. The
+     * width is measured in pixels. The default value is <code>-1</code> which
+     * indicates
+     * 
+     * @since 4.0.8
+     */
+    public void setItemWidth(int width) {
+        if ((width < 1) && (width != -1)) {
+            throw new IllegalArgumentException("width must be positive, or -1 to indicate automatic");
+        }
+        GtkIconView.setItemWidth(this, width);
+    }
+
+    /**
+     * Select the row at <code>path</code>.
+     * 
+     * @since 4.0.15
+     */
+    public void selectPath(TreePath path) {
+        GtkIconView.selectPath(this, path);
+    }
+
+    /**
+     * Unselect the row at <code>path</code>.
+     * 
+     * @since 4.0.15
+     */
+    public void unselectPath(TreePath path) {
+        GtkIconView.unselectPath(this, path);
+    }
+
+    /**
+     * Select all the icons, in order to work, you must have set the
+     * {@link SelectionMode} to {@link SelectionMode#MULTIPLE MULTIPLE}.
+     * 
+     * @since 4.0.15
+     */
+    public void selectAll() {
+        GtkIconView.selectAll(this);
+    }
+
+    /**
+     * Unselect all the icons.
+     * 
+     * @since 4.0.15
+     */
+    public void unselectAll() {
+        GtkIconView.unselectAll(this);
+    }
+
+    /**
+     * Return <code>true</code> if the currently selected icon is pointed by
+     * <code>path</code>.
+     * 
+     * @since 4.0.15
+     */
+    public boolean isSelected(TreePath path) {
+        /*
+         * The name should be pathIsSelected but it looks prettier with the
+         * current name.
+         */
+        return GtkIconView.pathIsSelected(this, path);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/IconViewDropPosition.java b/src/bindings/org/gnome/gtk/IconViewDropPosition.java
new file mode 100644
index 0000000..8941d7a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/IconViewDropPosition.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class IconViewDropPosition extends Constant
+{
+    private IconViewDropPosition(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Image.java b/src/bindings/org/gnome/gtk/Image.java
new file mode 100644
index 0000000..3b4c613
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Image.java
@@ -0,0 +1,175 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.icons.Helper;
+import org.freedesktop.icons.Icon;
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * A Widget that displays an image.
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ * @since 4.0.3
+ */
+public class Image extends Misc
+{
+    protected Image(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Image Widget from the image located at the specified
+     * path. This always results in a new Image; if the file is not found the
+     * Image will be populated with the "broken image" icon.
+     */
+    /*
+     * I'm not entirely convinced about this - I am inclined instead to have
+     * this throw FileNotFoundException; FUTURE revisit this question when we
+     * bind GdkPixbuf.createPixbufFromFile().
+     */
+    public Image(String filename) {
+        super(GtkImage.createImageFromFile(filename));
+    }
+
+    /**
+     * Create a new, but empty, Image Widget. You can use the setters on this
+     * class to emplace image data later.
+     * 
+     * <p>
+     * Although this can be used as a blank slate upon which you can do
+     * arbitrary Cairo drawing in an <code>Widget.Draw</code> signal handler,
+     * you are better off using {@link DrawingArea} for that purpose.
+     * 
+     * @since 4.0.7
+     */
+    public Image() {
+        super(GtkImage.createImage());
+    }
+
+    /**
+     * Construct a new Image Widget from an image already loaded into a
+     * Pixbuf.
+     * 
+     * @since 4.0.5
+     */
+    public Image(Pixbuf pixbuf) {
+        super(GtkImage.createImageFromPixbuf(pixbuf));
+    }
+
+    /**
+     * Construct a new Image based on one of the Stock icons. As each one
+     * actually comes in various sizes, you have to say which variant you
+     * want.
+     * 
+     * <p>
+     * In most cases, you shouldn't need this; most of the special purpose
+     * Widgets have constructors which directly use a Stock item (see
+     * {@link ImageMenuItem#ImageMenuItem(Stock) ImageMenuItem} or
+     * {@link ToolButton#ToolButton(Stock) ToolButton} for example) and which
+     * will take care of the sizing issues for you.
+     * 
+     * @since 4.0.6
+     */
+    public Image(Stock stock, IconSize size) {
+        super(GtkImage.createImageFromStock(stock.getStockId(), size));
+    }
+
+    /**
+     * Construct a new Image based on an icon which is in the icons theme. As
+     * each one actually comes in various sizes, you have to say which variant
+     * you want. If, for a reason or another, the icon is not in the theme, a
+     * broken icon will be used.
+     * 
+     * @since 4.0.17
+     */
+    public Image(Icon icon, IconSize size) {
+        super(GtkImage.createImageFromIconName(Helper.getName(icon), size));
+    }
+
+    /**
+     * Specify the Pixbuf to be presented by this Image.
+     * 
+     * @since 4.0.8
+     */
+    /*
+     * The first of numerous overloads, one each matching the constructors we
+     * support. Bit of a toss-up as to what the name of these should be;
+     * clearly setFrom() won't do and setFromPixbuf() etc precludes the use of
+     * an overload which is far better Java form.
+     */
+    public void setImage(Pixbuf pixbuf) {
+        GtkImage.setFromPixbuf(this, pixbuf);
+    }
+
+    /**
+     * Specify a stock icon to be displayed by this Image. See the
+     * {@link #Image(Stock, IconSize) constructor} taking a Stock instance.
+     * 
+     * @since 4.0.8
+     */
+    public void setImage(Stock stock, IconSize size) {
+        GtkImage.setFromStock(this, stock.getStockId(), size);
+    }
+
+    /**
+     * Specify the filename to load and parse as image data to be displayed in
+     * this Image. See the filename {@link #Image(String) constructor}.
+     * 
+     * @since 4.0.8
+     */
+    public void setImage(String filename) {
+        GtkImage.setFromFile(this, filename);
+    }
+
+    /**
+     * Specify the icon to be displayed by this Image. See the
+     * {@link #Image(Icon, IconSize) constructor} taking an Icon instance.
+     * 
+     * @since 4.0.17
+     */
+    public void setImage(Icon icon, IconSize size) {
+        GtkImage.setFromIconName(this, Helper.getName(icon), size);
+    }
+
+    /**
+     * Reset this Image to be empty.
+     * 
+     * @since 4.0.8
+     */
+    public void clear() {
+        GtkImage.clear(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ImageMenuItem.java b/src/bindings/org/gnome/gtk/ImageMenuItem.java
new file mode 100644
index 0000000..bf3ca26
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ImageMenuItem.java
@@ -0,0 +1,161 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A MenuItem which displays an icon Image to the left of the Label text. This
+ * is used almost exclusively to add the MenuItems with common behaviour from
+ * the family of Stock icons, for example "File->Quit" and "Edit->Copy", so
+ * that the icons used are consistent with the rest of the GNOME Desktop.
+ * Indeed, it is somewhat discouraged to create ImageMenuItems with your own
+ * icons as too many icons can distract visually from the fact that the stock
+ * ones allow the eye to quickly recognize expected UI elements.
+ * 
+ * <p>
+ * See Action's {@link Action#createMenuItem() createMenuItem()}; you
+ * frequently need to do a UI activity from more than one place and Action
+ * will (among other things) generate the ImageMenuItem for a given Stock
+ * item. See also Button's {@link Button#setImage(Image) setImage()} for a
+ * discussion of the relationship between Images and Label text.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class ImageMenuItem extends MenuItem
+{
+    protected ImageMenuItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a MenuItem displaying a stock icon image.
+     */
+    /*
+     * TODO Passing null as the second argument probably isn't quite what we
+     * want. You can change the AccelGroup separately, but that's available to
+     * support overriding the default accelerators. All in all this will need
+     * updating.
+     * 
+     * From Azania: this should no longer need any updating unless you want to
+     * force the user to use the accelerator keybindings from the stock icon.
+     */
+    public ImageMenuItem(Stock stock) {
+        super(GtkImageMenuItem.createImageMenuItemFromStock(stock.getStockId(), null));
+    }
+
+    /**
+     * Convenience constructor, allowing you to create a MenuItem displaying a
+     * stock icon while simultaneously hooking up the handler which will take
+     * its <code>MenuItem.Activate</code> signals.
+     */
+    public ImageMenuItem(Stock stock, MenuItem.Activate handler) {
+        this(stock);
+        connect(handler);
+    }
+
+    /**
+     * Create a MenuItem displaying an image next to text. When you have a
+     * custom visual that is appropriate to show beside the label of a given
+     * MenuItem, you can use this to construct it.
+     * 
+     * <p>
+     * Don't use an empty string as a label! Users can turn off display of
+     * icons in menus, and if they do you'll end up with a MenuItem with
+     * "nothing" in it.
+     * 
+     * <p>
+     * There is also a constructor which allows you to connect an
+     * <code>MenuItem.Activate</code> handler in-line, see
+     * {@link ImageMenuItem#ImageMenuItem(Image, String, org.gnome.gtk.MenuItem.Activate)
+     * here}.
+     * 
+     * @since 4.0.6
+     */
+    public ImageMenuItem(Image image, String label) {
+        super(GtkImageMenuItem.createImageMenuItemWithMnemonic(label));
+        GtkImageMenuItem.setImage(this, image);
+    }
+
+    /**
+     * Create a MenuItem displaying an image next to text, and hook up an
+     * <code>MenuItem.Activate</code> handler at the same time.
+     * 
+     * @since 4.0.6
+     */
+    public ImageMenuItem(Image image, String label, MenuItem.Activate handler) {
+        super(GtkImageMenuItem.createImageMenuItemWithMnemonic(label));
+        GtkImageMenuItem.setImage(this, image);
+        connect(handler);
+    }
+
+    /**
+     * Set the Image that will be used as an icon beside the text in the
+     * ImageMenuItem.
+     * 
+     * <p>
+     * Be aware that there are system wide settings which allow a user to turn
+     * off icons appearing in menus. Since there is always a chance that the
+     * "image" Widget being added will be hidden, don't create an
+     * ImageMenuItem with an empty label.
+     * 
+     * @since 4.0.6
+     */
+    public void setImage(Image image) {
+        GtkImageMenuItem.setImage(this, image);
+    }
+
+    /**
+     * Force the icon accompanying this ImageMenuItem to always be shown,
+     * overriding the setting inherited from GtkSettings and GNOME.
+     * 
+     * <p>
+     * <i>As at GNOME 2.28, the default was changed by the `control-center`
+     * hackers to not show menu and button icons. This is very inconvenient,
+     * so you'll find yourself needing to call this frequently.</i>
+     * 
+     * @since 4.0.14
+     */
+    public void setAlwaysShowImage(boolean setting) {
+        GtkImageMenuItem.setAlwaysShowImage(this, setting);
+    }
+
+    /**
+     * Activate the key binding that comes with the stock configuration, for
+     * the case that this ImageMenuItem was constructed using a Stock item.
+     * 
+     * @since 4.0.16
+     */
+    public void setAccelerator(AcceleratorGroup group) {
+        GtkImageMenuItem.setAccelGroup(this, group);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ImageType.java b/src/bindings/org/gnome/gtk/ImageType.java
new file mode 100644
index 0000000..81d5645
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ImageType.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+import org.gnome.gdk.PixbufAnimation;
+
+/**
+ * The type of image in a {@link Image} or a {@link StatusIcon}.
+ * 
+ * @author Nat Pryce
+ * @since 4.0.4
+ */
+public final class ImageType extends Constant
+{
+    /**
+     * There is no image displayed by the Widget.
+     */
+    public static final ImageType EMPTY = new ImageType(GtkImageType.EMPTY, "EMPTY");
+
+    /**
+     * The Widget contains a {@link org.gnome.gdk.Pixbuf}.
+     */
+    public static final ImageType PIXBUF = new ImageType(GtkImageType.PIXBUF, "PIXBUF");
+
+    /**
+     * The Widget contains an icon derived specified by a stock item (see
+     * {@link Stock Stock}).
+     */
+    public static final ImageType STOCK = new ImageType(GtkImageType.STOCK, "STOCK");
+
+    /**
+     * The Widget contains a {@link IconSet}.
+     */
+    public static final ImageType ICON_SET = new ImageType(GtkImageType.ICON_SET, "ICON_SET");
+
+    /**
+     * The Widget contains a {@link PixbufAnimation}.
+     */
+    public static final ImageType ANIMATION = new ImageType(GtkImageType.ANIMATION, "ANIMATION");
+
+    /**
+     * The Widget contains a named icon. See
+     * {@link org.freedesktop.icons.Icon Icon}.
+     * 
+     * @since 4.1.1
+     */
+    public static final ImageType ICON_NAME = new ImageType(GtkImageType.ICON_NAME, "ICON_NAME");
+
+    private ImageType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/InfoBar.java b/src/bindings/org/gnome/gtk/InfoBar.java
new file mode 100644
index 0000000..61f292a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/InfoBar.java
@@ -0,0 +1,220 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A <code>InfoBar</code> is a widget that can be used to show messages to a
+ * user without showing a dialog. You can add buttons and widgets like in a
+ * {@link Dialog}. <img src="InfoBar.png" class="snapshot">
+ * 
+ * <p>
+ * The style of the <code>InfoBar</code> can be changed using the
+ * {@link MessageType type} of the message to show to the user. It is possible
+ * to control the sensitivity of the action widgets by using the
+ * {@link #setResponseSensitive(ResponseType, boolean) setResponseSensitive()}
+ * method.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.16
+ */
+public class InfoBar extends HBox
+{
+    protected InfoBar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new <code>InfoBar</code>.
+     * 
+     * @since 4.0.16
+     */
+    public InfoBar() {
+        this(GtkInfoBar.createInfoBar());
+    }
+
+    /**
+     * Add a Widget to the <var>content area</var> of the InfoBar.
+     * 
+     * @since 4.0.16
+     */
+    public void add(Widget widget) {
+        final Container container;
+
+        container = (Container) GtkInfoBar.getContentArea(this);
+        container.add(widget);
+    }
+
+    /**
+     * Add an activatable widget to the action area of this InfoBar.
+     * 
+     * @since 4.0.16
+     */
+    public void addActionWidget(Widget child, ResponseType response) {
+        GtkInfoBar.addActionWidget(this, child, response.getResponseId());
+    }
+
+    /**
+     * Add a Button whose icon and label are taken from a given Stock. It is,
+     * as ever, recommended to use a Stock Button for common actions. See
+     * {@link #addButton(String, ResponseType) addButton()}.
+     * 
+     * @since 4.0.16
+     */
+    public Button addButton(Stock stock, ResponseType response) {
+        return (Button) GtkInfoBar.addButton(this, stock.getStockId(), response.getResponseId());
+    }
+
+    /**
+     * Adds an action {@link Button} with the given text as its label to the
+     * end of the InfoBar's <var>action area</var>. The given ResponseType
+     * will be returned back in the InfoBar's {@link InfoBar.Response
+     * Response} signal when the Button added as a result of this call is
+     * clicked.
+     * 
+     * @since 4.0.16
+     */
+    public Button addButton(String text, ResponseType response) {
+        return (Button) GtkInfoBar.addButton(this, text, response.getResponseId());
+    }
+
+    /**
+     * Set the sensitivity of the widget associated with the given
+     * <code>response</code>.
+     * 
+     * @since 4.0.16
+     */
+    public void setResponseSensitive(ResponseType response, boolean setting) {
+        GtkInfoBar.setResponseSensitive(this, response.getResponseId(), setting);
+    }
+
+    /**
+     * Set the widget with the given <var>response</var> as the default widget
+     * of this InfoBar. Pressing "Enter" activates the default
+     * widget.
+     * 
+     * <p>
+     * Be careful! The InfoBar must be in a widget hierarchy to use this
+     * method.
+     * 
+     * @since 4.0.16
+     */
+    public void setDefaultResponse(ResponseType response) {
+        GtkInfoBar.setDefaultResponse(this, response.getResponseId());
+    }
+
+    /**
+     * Cause a <var>InfoBar.Response</var> signal with the specified
+     * ResponseType to be emitted by this InfoBar.
+     * 
+     * @since 4.0.16
+     */
+    public void response(ResponseType response) {
+        GtkInfoBar.response(this, response.getResponseId());
+    }
+
+    /**
+     * Set the type of the message. It is used to define what color to use
+     * when drawing the message area.
+     * 
+     * @since 4.0.16
+     */
+    public void setMessageType(MessageType type) {
+        GtkInfoBar.setMessageType(this, type);
+    }
+
+    /**
+     * This signal arises when a user uses a keybinding to dismiss the
+     * InfoBar.
+     * 
+     * <p>
+     * The default binding for this signal is the "Escape" key.
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.0.16
+     */
+    public interface Close extends GtkInfoBar.CloseSignal
+    {
+        public void onClose(InfoBar source);
+    }
+
+    /**
+     * Hook up a <code>InfoBar.Close</code> handler.
+     * 
+     * @since 4.0.16
+     */
+    public void connect(InfoBar.Close handler) {
+        GtkInfoBar.connect(this, handler, false);
+    }
+
+    /**
+     * This signal arises when a user activates one of the Widgets laid out in
+     * the <var>action area</var> of the InfoBar.
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.0.16
+     */
+    public interface Response
+    {
+        void onResponse(InfoBar source, ResponseType response);
+    }
+
+    /**
+     * Hook up a <code>InfoBar.Response</code> handler.
+     * 
+     * @since 4.0.16
+     */
+    public void connect(InfoBar.Response handler) {
+        GtkInfoBar.connect(this, new ResponseHandler(handler), false);
+    }
+
+    /*
+     * Needed to emit the InfoBar.Response signal with a type-safe
+     * ResponseType instead of the underlying int ordinal.
+     */
+    private static class ResponseHandler implements GtkInfoBar.ResponseSignal
+    {
+        private InfoBar.Response handler;
+
+        private ResponseHandler(InfoBar.Response handler) {
+            this.handler = handler;
+        }
+
+        public void onResponse(InfoBar source, int responseId) {
+            final ResponseType response;
+
+            response = ResponseType.constantFor(responseId);
+
+            handler.onResponse(source, response);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/InfoMessageDialog.java b/src/bindings/org/gnome/gtk/InfoMessageDialog.java
new file mode 100644
index 0000000..8a505d6
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/InfoMessageDialog.java
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Dialog preconfigured to present an information message to the user.
+ * 
+ * <p>
+ * This is a modal MessageDialog of type {@link MessageType#INFO INFO} with an
+ * "Ok" Button.
+ * 
+ * <p>
+ * You <code>show()</code>ing this Dialog will prevent interaction with the
+ * rest of the application; calling <code>run()</code> will of course block
+ * until the user clicks the "Ok" Button or closes the Dialog.
+ * 
+ * <p>
+ * You can use this as follows:
+ * 
+ * <pre>
+ * final Dialog d;
+ * 
+ * d = new InfoMessageDialog(w, "You should feel privileged", "He hardly lands for anyone.");
+ * d.run();
+ * d.hide();
+ * </pre>
+ * 
+ * which will result in:
+ * 
+ * <p>
+ * <img src="InfoMessageDialog.png">
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class InfoMessageDialog extends MessageDialog
+{
+    public InfoMessageDialog(Window parent, String primary, String secondary) {
+        super(parent, true, MessageType.INFO, ButtonsType.OK, primary);
+        if (secondary != null) {
+            this.setSecondaryText(secondary);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/InputMethod.java b/src/bindings/org/gnome/gtk/InputMethod.java
new file mode 100644
index 0000000..794ecaa
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/InputMethod.java
@@ -0,0 +1,135 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.EventKey;
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * Complex input handling.
+ * 
+ * <p>
+ * <i>In GTK, these are <code>GtkIMContext</code> objects. This class and its
+ * concrete subclasses are presented here according to the Java naming
+ * conventions.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+/*
+ * We are not exposing this as an application programming interface for you to
+ * implement your own input methods; if you need to create a custom input
+ * method it needs to be done in C and via GTK's dynamic module loading
+ * machinery.
+ */
+public abstract class InputMethod extends Object
+{
+    protected InputMethod(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Signal emitted when the input method completes its composition.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.14
+     */
+    public interface Commit extends GtkIMContext.CommitSignal
+    {
+        public void onCommit(InputMethod source, String str);
+    }
+
+    /**
+     * Hookup a <code>InputMethod.Commit</code> handler.
+     * 
+     * @since 4.0.14
+     */
+    public void connect(InputMethod.Commit handler) {
+        GtkIMContext.connect(this, handler, false);
+    }
+
+    /**
+     * Find out whether the input method has handled a keystroke, or whether
+     * it needs to be further handled or propegated.
+     * <p>
+     * This is for use in <code>Widget.KeyPressEvent</code> and
+     * <code>Widget.KeyReleaseEvent</code> handlers when hooking up an input
+     * method to a Widget, where the code will look something like:
+     * 
+     * <pre>
+     * drawing.connect(new Widget.KeyPressEvent() {
+     *     public boolean onKeyPressEvent(Widget source, EventKey event) {
+     *         if (input.filterKeypress(event)) {
+     *             return true;
+     *         }
+     * 
+     *         // or carry on with your logic,
+     *         if (doSomething()) {
+     *             return true;
+     *         }
+     * 
+     *         // otherwise progegate the keystroke up to the default handler
+     *         return false;
+     *     }
+     * });
+     * </pre>
+     * 
+     * You need to do call this for both key presses and releases (at least,
+     * for the default input method to work right, anyway).
+     * 
+     * @since 4.0.14
+     */
+    public boolean filterKeypress(EventKey event) {
+        return GtkIMContext.filterKeypress(this, event);
+    }
+
+    /**
+     * How hould the InputMethod provide feedback to the user? The default is
+     * <code>true</code>, which is to ask the Widget to display in-line,
+     * communicating the preedit string via the signal handlers. Otherwise,
+     * the InputMethod can attempt to use some alternative (internal) means.
+     * 
+     * @since 4.0.14
+     */
+    public void setUsePreedit(boolean setting) {
+        GtkIMContext.setUsePreedit(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/InternationalPaperSize.java b/src/bindings/org/gnome/gtk/InternationalPaperSize.java
new file mode 100644
index 0000000..bcfd78b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/InternationalPaperSize.java
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Constants for the ISO standard paper types, used everywhere in the world
+ * except south, central, and northern North America.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * TODO someone should do up "BusinessCard"
+ */
+public class InternationalPaperSize extends PaperSize
+{
+    protected InternationalPaperSize(String name) {
+        super(name);
+    }
+
+    public static final InternationalPaperSize A6 = new InternationalPaperSize("iso_a6");
+
+    public static final InternationalPaperSize A5 = new InternationalPaperSize("iso_a5");
+
+    public static final InternationalPaperSize A3 = new InternationalPaperSize("iso_a3");
+
+    public static final InternationalPaperSize A2 = new InternationalPaperSize("iso_a2");
+
+    public static final InternationalPaperSize A1 = new InternationalPaperSize("iso_a1");
+
+    /**
+     * The largest standard paper size, and has an area of 1 m².
+     */
+    public static final InternationalPaperSize A0 = new InternationalPaperSize("iso_a0");
+}
diff --git a/src/bindings/org/gnome/gtk/JunctionSides.java b/src/bindings/org/gnome/gtk/JunctionSides.java
new file mode 100644
index 0000000..0e917f1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/JunctionSides.java
@@ -0,0 +1,98 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants that describe how a rendered element connects to adjacent
+ * elements.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class JunctionSides extends Constant
+{
+    public JunctionSides(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No junctions.
+     */
+    public static final JunctionSides NONE = new JunctionSides(GtkJunctionSides.NONE, "NONE");
+
+    /**
+     * Element connects on the top-left corner.
+     */
+    public static final JunctionSides CORNER_TOPLEFT = new JunctionSides(
+            GtkJunctionSides.CORNER_TOPLEFT, "CORNER_TOPLEFT");
+
+    /**
+     * Element connects on the top-right corner.
+     */
+    public static final JunctionSides CORNER_TOPRIGHT = new JunctionSides(
+            GtkJunctionSides.CORNER_TOPRIGHT, "CORNER_TOPRIGHT");
+
+    /**
+     * Element connects on the bottom-left corner.
+     */
+    public static final JunctionSides CORNER_BOTTOMLEFT = new JunctionSides(
+            GtkJunctionSides.CORNER_BOTTOMLEFT, "CORNER_BOTTOMLEFT");
+
+    /**
+     * Element connects on the bottom-right corner.
+     */
+    public static final JunctionSides CORNER_BOTTOMRIGHT = new JunctionSides(
+            GtkJunctionSides.CORNER_BOTTOMRIGHT, "CORNER_BOTTOMRIGHT");
+
+    /**
+     * Element connects on the top side.
+     */
+    public static final JunctionSides TOP = new JunctionSides(GtkJunctionSides.TOP, "TOP");
+
+    /**
+     * Element connects on the bottom side.
+     */
+    public static final JunctionSides BOTTOM = new JunctionSides(GtkJunctionSides.BOTTOM, "BOTTOM");
+
+    /**
+     * Element connects on the left side.
+     */
+    public static final JunctionSides LEFT = new JunctionSides(GtkJunctionSides.LEFT, "LEFT");
+
+    /**
+     * Element connects on the right side.
+     */
+    public static final JunctionSides RIGHT = new JunctionSides(GtkJunctionSides.RIGHT, "RIGHT");
+}
diff --git a/src/bindings/org/gnome/gtk/Justification.java b/src/bindings/org/gnome/gtk/Justification.java
new file mode 100644
index 0000000..ffba47c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Justification.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants that represent the justification of text. Most notably, this is
+ * used by Label; see its {@link Label#setJustify(Justification) setJustify()}
+ * as well as TextView's {@link TextView#setJustify(Justification)
+ * setJustify()} and TextTag's {@link TextTag#setJustify(Justification)
+ * setJustify()}.
+ * 
+ * @author Nat Pryce
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public final class Justification extends Constant
+{
+    /**
+     * Indicate text should justify to the left edge of the Label. This is the
+     * default with newly created Labels.
+     */
+    public static final Justification LEFT = new Justification(GtkJustification.LEFT, "LEFT");
+
+    /**
+     * Indicate text should be justified to the right edge of the Label.
+     */
+    public static final Justification RIGHT = new Justification(GtkJustification.RIGHT, "RIGHT");
+
+    /**
+     * Indicate text should be justified to the center of the Label.
+     */
+    public static final Justification CENTER = new Justification(GtkJustification.CENTER, "CENTER");
+
+    /**
+     * Indicate text should be distributed evenly across the width of Label.
+     * This is sometimes known as "proper" or "even" justification.
+     */
+    public static final Justification FILL = new Justification(GtkJustification.FILL, "FILL");
+
+    private Justification(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Label.java b/src/bindings/org/gnome/gtk/Label.java
new file mode 100644
index 0000000..122a015
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Label.java
@@ -0,0 +1,365 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.pango.EllipsizeMode;
+
+/**
+ * A Widget that displays a small amount of text.
+ * 
+ * <p>
+ * Labels are the backbone of any Window. They are frequently used to identify
+ * other controls with names, as headings in Windows, and are the building
+ * blocks that Menus and Buttons are made up of. All the difficult parts about
+ * rendering text are taken care of here, such as text direction, fonts. And,
+ * of course, you can enable them to allow their text to be copied.
+ * 
+ * <p>
+ * Labels can display normal text or text that has been formatted with Pango
+ * markup. FIXME with a reference to our Pango guide page.
+ * 
+ * <p>
+ * Although you can pack multiple lines into a Label, there does come a point
+ * when the amount of text you're trying to show gets out of hand. At that
+ * point you might want to investigate the {@link TextView TextView} Widget.
+ * 
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @author Wouter Bolsterlee
+ * @author Guillaume Mazoyer
+ * @since 4.0.1
+ */
+public class Label extends Misc
+{
+    protected Label(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a Label with the specified text. This Label will be an ordinary
+     * one and will interpret the argument as plain unformatted text. Note
+     * that if you use this constructor you can later switch the Label to
+     * interpreting the text as Pango markup by calling
+     * {@link #setUseMarkup(boolean) setUseMarkup(true)}.
+     * 
+     * @param text
+     *            the text you wish on the Label.
+     * @since 4.0.1
+     */
+    public Label(String text) {
+        super(GtkLabel.createLabel(text));
+    }
+
+    /**
+     * Create an empty Label. You'll need to call {@link #setLabel(String)
+     * setLabel()} to place some text it.
+     * 
+     * @since 4.0.11
+     */
+    public Label() {
+        super(GtkLabel.createLabel(null));
+    }
+
+    /**
+     * Set the text showing in the Label.
+     * 
+     * 
+     * If the Label has been told to interpret Pango markup with
+     * {@link #setUseMarkup(boolean) setUseMarkup(true)}, then any markup
+     * included in text will be interpreted as such.
+     * 
+     * <p>
+     * <b>WARNING</b>:<br>
+     * If you have enabled <var>use-markup</var> (as is often the case),
+     * beware that you must escape whatever you to this method (like you would
+     * for feeding user data to any other XML or HTML like target). This
+     * specifically means you need to convert <code>&</code> into
+     * <code>&amp;</code> and likewise for angle brackets. Use
+     * {@link org.gnome.glib.Glib#markupEscapeText(String)
+     * Glib.markupEscapeText()}.
+     * 
+     * @since 4.0.1
+     */
+    public void setLabel(String text) {
+        GtkLabel.setLabel(this, text);
+    }
+
+    /**
+     * Get the text showing in the Label, including any characters which
+     * indicate Pango markup syntax and embedded mnemonic underline characters
+     * that may be present. Contrast with {@link #getText() getText()} which
+     * returns the text unadorned.
+     * 
+     * @since 4.0.1
+     */
+    public String getLabel() {
+        return GtkLabel.getLabel(this);
+    }
+
+    /**
+     * Get the text showing in the Label, but with any Pango markup stripped
+     * away. This is useful if you've applied some fancy formatting but just
+     * want to find out the actual words that appear to the user. It also
+     * strips away any embedded underlines indicating mnemonics. If you need
+     * the raw text including markup, then you want {@link #getLabel()
+     * getLabel()}.
+     * 
+     * @since 4.0.1
+     */
+    public String getText() {
+        return GtkLabel.getText(this);
+    }
+
+    /**
+     * Set whether the text showing in the Label is to be parsed as containing
+     * markup in Pango's text markup language. Using this allows Labels to be
+     * created with expressive formatting considerably more advanced than a
+     * simple line of text.
+     * 
+     * @param setting
+     *            If setting is true, then any markup included in the text is
+     *            interpreted as such. If its set to false, markup is ignored
+     *            and included as-is.
+     * @since 4.0.1
+     */
+    public void setUseMarkup(boolean setting) {
+        GtkLabel.setUseMarkup(this, setting);
+    }
+
+    /**
+     * Get the current setting indicating whether the the label text is to be
+     * interpreted as marked up with Pango's text markup language. When
+     * enabled, the label can show formatted text instead of just a simple
+     * line of text.
+     * 
+     * @since 4.0.4
+     */
+    public boolean getUseMarkup() {
+        return GtkLabel.getUseMarkup(this);
+    }
+
+    /**
+     * Set the {@link EllipsizeMode ellipsization mode} to use to make the
+     * text fits the label width.
+     * 
+     * @since 4.0.13
+     */
+    public void setEllipsize(EllipsizeMode setting) {
+        GtkLabel.setEllipsize(this, setting);
+    }
+
+    /**
+     * Get the current ellipsization used.
+     * 
+     * @since 4.0.13
+     */
+    public EllipsizeMode getEllipsizeMode() {
+        return GtkLabel.getEllipsize(this);
+    }
+
+    /**
+     * Sets the angle of rotation for the Label. The angle is measured in
+     * degrees from the horizontal, going counter-clockwise. An angle of
+     * 90° reads from bottom to top, an angle of 270° from top to
+     * bottom. The angle setting for the Label will be ignored if the Label is
+     * selectable, wrapped, or ellipsized.
+     * 
+     * @param angle
+     *            The angle that the baseline of the Label's text makes with
+     *            the horizontal. The valid range (as you'd expect) is from
+     *            0° through 360°.
+     * 
+     * @since 4.0.1
+     */
+    public void setAngle(double angle) {
+        GtkLabel.setAngle(this, angle);
+    }
+
+    /**
+     * Get the current angle of the Label. An angle of 90° means the text
+     * reads in an upwards direction (ie from bottom to top), whereas an angle
+     * of 270° means the text reads in a downwards direction (ie from top
+     * to bottom).
+     * 
+     * @since 4.0.1
+     */
+    public double getAngle() {
+        return GtkLabel.getAngle(this);
+    }
+
+    /**
+     * Gets the justification of the text within the Label.
+     * 
+     * @since 4.0.4
+     */
+    public Justification getJustify() {
+        return GtkLabel.getJustify(this);
+    }
+
+    /**
+     * Sets the justification of the text within the Label. The default is
+     * {@link Justification#LEFT LEFT}. Note that this has no effect on Labels
+     * only containing a single line of text.
+     * 
+     * <p>
+     * If you're trying to control the positioning of the Label within its
+     * parent, see Misc's {@link Misc#setAlignment(float,float)
+     * setAlignment()}.
+     * 
+     * @since 4.0.4
+     */
+    /*
+     * TODO Advise developer to setLineWrap(true)?
+     */
+    public void setJustify(Justification setting) {
+        GtkLabel.setJustify(this, setting);
+    }
+
+    /**
+     * Explicitly set the width of the Label, in characters.
+     * 
+     * <p>
+     * This sets the <var>width-chars</var> property. Note that if set, this
+     * will take precedence over the <var>max-width-chars</var> property as
+     * set by {@link #setMaxWidthChars(int) setMaxWidthChars()}.
+     * 
+     * <p>
+     * This is not precisely reliable as a way to enforce sizing across
+     * different Labels, since the character sizes could be different owing to
+     * differing languages or fonts that may be in use. Still, this is
+     * superior to trying to manually control Widget size by specifying the
+     * horizontal dimension in pixels. If you need a series of Widgets (be
+     * they Labels or otherwise) to have the same size, apply a
+     * {@link SizeGroup SizeGroup}.
+     * 
+     * @param width
+     *            The width to base the size of the Label on, in characters. A
+     *            value of <code>-1</code> will turn off the override, and
+     *            return the Label to automatically sizing based on the
+     *            content within and the <var>max-width</var> property, if
+     *            activated.
+     * @since 4.0.4
+     */
+    public void setWidthChars(int width) {
+        GtkLabel.setWidthChars(this, width);
+    }
+
+    /**
+     * Set a maximum width for the Label, in characters. This will allow the
+     * Label to dynamically size up to a maximum of <code>width</code> but not
+     * to expand beyond that point. This is useful in conjunction with turning
+     * {@link Label#setEllipsize(org.gnome.pango.EllipsizeMode)
+     * setEllipsize()} on.
+     * 
+     * <p>
+     * This sets the <var>max-width-chars</var> property.
+     * 
+     * <p>
+     * <b>Warning</b>: If a value greater than <code>-1</code> has been
+     * explicitly set as the width using {@link #setWidthChars(int)
+     * setWidthChars()}, setting this property will have no effect.
+     * 
+     * @param width
+     *            The width you wish to truncate the Label at, in characters.
+     *            A value of <code>-1</code> to remove the override and return
+     *            the Label to automatic sizing.
+     * @since 4.0.4
+     */
+    public void setMaxWidthChars(int width) {
+        GtkLabel.setMaxWidthChars(this, width);
+    }
+
+    /**
+     * Select a region of the text in this Label. The characters between
+     * <code>start</code> up to <i>but not including</i> <code>end</code> will
+     * be selected. This assumes that the Label has been made selectable with
+     * {@link #setSelectable(boolean) setSelectable(true)}.
+     * 
+     * @param end
+     *            If negative, then the selection will be from
+     *            <code>start</code> to the end of the text in the Label.
+     * @since 4.0.6
+     */
+    /*
+     * Description cloned from Editable
+     */
+    public void selectRegion(int start, int end) {
+        GtkLabel.selectRegion(this, start, end);
+    }
+
+    /**
+     * Whether the text in this Label can be selected by the user.
+     * 
+     * @since 4.0.6
+     */
+    public void setSelectable(boolean setting) {
+        GtkLabel.setSelectable(this, setting);
+    }
+
+    /**
+     * Set whether this Label will attempt to wrap the text provided. This
+     * will always work, but not necessarily as you might expect. The nature
+     * of the size-request/size-allocate process is such that the Label cannot
+     * make it's requisition based on the parent's size because the parent's
+     * size will depend on the child's request. To enforce wrapping at a
+     * specific width, simply enforce the width of the Label itself with
+     * {@link Widget#setSizeRequest(int, int) setSizeRequest()}.
+     * 
+     * <p>
+     * The default is <code>false</code>.
+     * 
+     * @since 4.0.6
+     */
+    public void setLineWrap(boolean setting) {
+        GtkLabel.setLineWrap(this, setting);
+
+    }
+
+    /**
+     * Set whether underscores will be interpreted as signifying that the next
+     * character should be drawn with an underline, thereby creating the
+     * visual effect of a mnemonic.
+     * 
+     * For example, with this set to <code>true</code>, text of the form
+     * <code>"Op_en a copy"</code> will result in
+     * <blockquote>Op<u>e</u>n a copy</blockquote>
+     * 
+     * <p>
+     * The default is <code>false</code>.
+     * 
+     * @since 4.0.11
+     */
+    public void setUseUnderline(boolean setting) {
+        GtkLabel.setUseUnderline(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Layout.java b/src/bindings/org/gnome/gtk/Layout.java
new file mode 100644
index 0000000..5f5ad44
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Layout.java
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Container that is able to hold present a limited view of Widgets laid out
+ * on a larger canvas. Layouts are designed for scrolling and should be added
+ * to a ScrolledWindow with {@link ScrolledWindow#add(Widget) add()}.
+ * 
+ * <p>
+ * Note that this Widget has the same limitations as Fixed due to it
+ * positioning child Widgets by co-ordinates and not by box packing (no layout
+ * management, no resizing, likelihood of rendering collisions, etc). You are
+ * better off adding a proper Container and adding scrolling with
+ * ScrolledWindow's {@link ScrolledWindow#addWithViewport(Widget)
+ * addWithViewport()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.8
+ */
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Layout extends Container
+{
+    protected Layout(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a Layout with default adjustments.
+     * 
+     * @since 4.0.8
+     */
+    public Layout() {
+        // call createScrolledWindow and let it create the adjustments
+        super(GtkLayout.createLayout(null, null));
+    }
+
+    /**
+     * Construct a Layout, supplying the Adjustment object used to control the
+     * panning. You'd use this if you are manually managing the Adjustment
+     * values yourself.
+     * 
+     * @since 4.0.8
+     */
+    public Layout(Adjustment hadjustment, Adjustment vadjustment) {
+        super(GtkLayout.createLayout(hadjustment, vadjustment));
+    }
+
+    /**
+     * Add a child Widget at the specified co-ordinates.
+     * 
+     * @since 4.0.8
+     */
+    public void put(Widget child, int x, int y) {
+        GtkLayout.put(this, child, x, y);
+    }
+
+    /**
+     * Relocate a child Widget to the specified co-ordinates.
+     * 
+     * @since 4.0.8
+     */
+    public void move(Widget child, int x, int y) {
+        GtkLayout.move(this, child, x, y);
+    }
+
+    /**
+     * Set the total extent of the canvas that this Layout will scroll its
+     * viewport over.
+     * 
+     * @since 4.0.8
+     */
+    public void setSize(int width, int height) {
+        GtkLayout.setSize(this, width, height);
+    }
+
+    /**
+     * Get the Adjustment that is being used to drive the horizontal position
+     * of the viewport showing over this Layout's canvas.
+     * 
+     * @since 4.0.8
+     */
+    public Adjustment getHAdjustment() {
+        return GtkLayout.getHadjustment(this);
+    }
+
+    /**
+     * Get the Adjustment that is being used to drive the vertical position of
+     * the viewport showing over this Layout's canvas.
+     * 
+     * @since 4.0.8
+     */
+    public Adjustment getVAdjustment() {
+        return GtkLayout.getVadjustment(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/License.java b/src/bindings/org/gnome/gtk/License.java
new file mode 100644
index 0000000..555b11f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/License.java
@@ -0,0 +1,93 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants used to specify the type of license for an application.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public class License extends Flag
+{
+    protected License(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No license specified.
+     */
+    public static final License UNKNOWN = new License(GtkLicense.UNKNOWN, "UNKNOWN");
+
+    /**
+     * A license text is to be specified by the developer.
+     */
+    public static final License CUSTOM = new License(GtkLicense.CUSTOM, "CUSTOM");
+
+    /**
+     * The GNU General Public License, version 2.0.
+     */
+    public static final License GPL_2_0 = new License(GtkLicense.GPL_2_0, "GPL_2_0");
+
+    /**
+     * The GNU General Public License, version 3.0.
+     */
+    public static final License GPL_3_0 = new License(GtkLicense.GPL_3_0, "GPL_3_0");
+
+    /**
+     * The GNU Lesser General Public License, version 2.1.
+     */
+    public static final License LGPL_2_1 = new License(GtkLicense.LGPL_2_1, "LGPL_2_1");
+
+    /**
+     * The GNU Lesser General Public License, version 3.0.
+     */
+    public static final License LGPL_3_0 = new License(GtkLicense.LGPL_3_0, "LGPL_3_0");
+
+    /**
+     * The BSD standard license.
+     */
+    public static final License BSD = new License(GtkLicense.BSD, "BSD");
+
+    /**
+     * The MIT/X11 standard license.
+     */
+    public static final License MIT_X11 = new License(GtkLicense.MIT_X11, "MIT_X11");
+
+    /**
+     * The Artistic License, version 2.0.
+     */
+    public static final License ARTISTIC = new License(GtkLicense.ARTISTIC, "ARTISTIC");
+}
diff --git a/src/bindings/org/gnome/gtk/LinkButton.java b/src/bindings/org/gnome/gtk/LinkButton.java
new file mode 100644
index 0000000..710bc00
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/LinkButton.java
@@ -0,0 +1,117 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * LinkButton is a specialized subclass of Button for linking to URIs. The
+ * default action is to open the URI with its associated application
+ * determined by the desktop environment. <img src="LinkButton.png"
+ * class="snapshot">
+ * 
+ * @author Serkan Kaba
+ * @author Guillaume Mazoyer
+ * @since 4.0.14
+ */
+public class LinkButton extends Button
+{
+    protected LinkButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a button pointing to given URI. The <code>uri</code> will also
+     * be used as the label.
+     * 
+     * @since 4.0.14
+     */
+    public LinkButton(URI uri) {
+        super(GtkLinkButton.createLinkButton(uri.toString()));
+    }
+
+    /**
+     * Create a button pointing to given URI and the given <code>label</code>
+     * as you would expect from a normal hyperlink.
+     * 
+     * @since 4.0.14
+     */
+    public LinkButton(URI uri, String label) {
+        super(GtkLinkButton.createLinkButtonWithLabel(uri.toString(), label));
+    }
+
+    /**
+     * Return the button's URI.
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * Naming convention same as FileChooser's getURI().
+     */
+    public URI getURI() {
+        try {
+            return new URI(GtkLinkButton.getUri(this));
+        } catch (URISyntaxException e) {
+            throw new RuntimeException("We shouldn't be throwing this exception", e);
+        }
+    }
+
+    /**
+     * Modify the button's {@link URI}.
+     * 
+     * @since 4.0.14
+     */
+    public void setURI(URI uri) {
+        GtkLinkButton.setUri(this, uri.toString());
+    }
+
+    /**
+     * Return the button's visited state. Note that this might be modified
+     * programatically by {@link #setVisited(boolean)}.
+     * 
+     * @since 4.0.14
+     */
+    public boolean getVisited() {
+        return GtkLinkButton.getVisited(this);
+    }
+
+    /**
+     * Modify the button's visited state.
+     * 
+     * @since 4.0.14
+     */
+    public void setVisited(boolean visited) {
+        GtkLinkButton.setVisited(this, visited);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ListStore.java b/src/bindings/org/gnome/gtk/ListStore.java
new file mode 100644
index 0000000..f162e75
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ListStore.java
@@ -0,0 +1,195 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * The model storing a list of data. ListStores are the concrete TreeModel
+ * subclass used as the backing data store by a TreeView displaying tabular
+ * data, storing both the material to be presented as well as meta-information
+ * used to fine tune the presentation of that data. ListStores are also used
+ * as the backing store for the list of options in a ComboBoxes.
+ * 
+ * <p>
+ * Detailed discussion of how to instantiate ListStores is included in the
+ * {@link DataColumn} class. In summary, given
+ * 
+ * <pre>
+ * final DataColumnString monarchName;
+ * final DataColumnInteger coronatedYear;
+ * final DataColumnPixbuf portrait;
+ * final ListStore model;
+ * ...
+ * </pre>
+ * 
+ * you build a three column model as follows:
+ * 
+ * <pre>
+ * model = new ListStore(new DataColumn[] {
+ *     monarchName = new DataColumnString(),
+ *     coronatedYear = new DataColumnInteger(),
+ *     portrait = new DataColumnPixbuf()
+ * });
+ * </pre>
+ * 
+ * <p>
+ * Although we talk about TreeModels all the time as the base superclass, it's
+ * not a good idea to declare your model as a TreeModel when instantiating
+ * because you'll need {@link #appendRow() appendRow()} method which is here,
+ * on the concrete type ListStore. In other words, do:
+ * 
+ * <pre>
+ * ListStore model = new ListStore(...);
+ * </pre>
+ * 
+ * as shown above, not:
+ * 
+ * <pre>
+ * TreeModel model = new ListStore(...);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public class ListStore extends TreeModel implements TreeDragSource, TreeDragDest, TreeSortable
+{
+    protected ListStore(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new ListStore with the given column types. See
+     * {@link DataColumn DataColumn} for details. You must include at least
+     * one DataColumn in your <code>types</code> array (you can't have a
+     * ListStore with no columns).
+     */
+    public ListStore(DataColumn[] types) {
+        super(GtkTreeModelOverride.createListStore(typesToClassNames(types)));
+    }
+
+    protected void dispatch(TreeIter row, DataColumn column, Value value) {
+        GtkListStore.setValue(this, row, column.getOrdinal(), value);
+    }
+
+    /**
+     * Add a new row to the ListStore. You'll need to fill in the various
+     * columns with one of the various
+     * {@link TreeModel#setValue(TreeIter, DataColumnString, String)
+     * setValue()} methods, of course.
+     */
+    public TreeIter appendRow() {
+        final TreeIter iter;
+
+        iter = new TreeIter(this);
+
+        GtkListStore.append(this, iter);
+
+        return iter;
+    }
+
+    /**
+     * Remove all rows (and their contents) from this ListStore.
+     * 
+     * @since 4.0.6
+     */
+    public void clear() {
+        GtkListStore.clear(this);
+    }
+
+    public void setSortColumn(DataColumn column, SortType ordering) {
+        GtkTreeSortable.setSortColumnId(this, column.getOrdinal(), ordering);
+    }
+
+    /**
+     * Delete a row from the ListStore. If there is another row after this
+     * then <code>true</code> will be returned and <code>row</code> will still
+     * be valid. Otherwise, <code>false</code> is returned and
+     * <code>row</code> is invalid from here on.
+     * 
+     * @since 4.0.7
+     */
+    public boolean removeRow(TreeIter row) {
+        return GtkListStore.remove(this, row);
+    }
+
+    /**
+     * Insert a new row in the ListStore. The row will be placed at
+     * <code>position</code>, which must be between <code>0</code> and the
+     * number or rows in the model.
+     * 
+     * <p>
+     * If you have a TreeIter pointing at a row already you can instead use
+     * the other form of {@link #insertRow(TreeIter) insertRow()} to inject an
+     * new row there.
+     * 
+     * <p>
+     * As with {@link #appendRow() appendRow()} the new row will be empty;
+     * you'll need to call one of the various <code>setValue()</code> methods
+     * to populate it.
+     * 
+     * @since 4.0.7
+     */
+    public TreeIter insertRow(int position) {
+        final TreeIter iter;
+
+        if (position < 0) {
+            throw new IllegalArgumentException("position can't be negative");
+        }
+
+        iter = new TreeIter(this);
+
+        GtkListStore.insert(this, iter, position);
+
+        return iter;
+    }
+
+    /**
+     * Insert a new row in the ListStore. The empty row will be placed in
+     * front of the supplied <code>sibling</code>.
+     * 
+     * <p>
+     * Alternately, see {@link #insertRow(int) insertRow()} to insert a row at
+     * a given position, and {@link #appendRow() appendRow()} to add a blank
+     * row at the end of the model.
+     * 
+     * @since 4.0.7
+     */
+    public TreeIter insertRow(TreeIter sibling) {
+        final TreeIter iter;
+
+        iter = new TreeIter(this);
+
+        GtkListStore.insertBefore(this, iter, sibling);
+
+        return iter;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Menu.java b/src/bindings/org/gnome/gtk/Menu.java
new file mode 100644
index 0000000..9c81a88
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Menu.java
@@ -0,0 +1,149 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A drop-down set of Widgets creating a menu. Menus consist of other
+ * {@link MenuItem}s. Menus are either placed inside a {@link MenuBar} or
+ * another MenuItem, thereby forming a sub-menu. An entire hierarchy of Menu
+ * structures can thus be created by appropriately placing Menus inside
+ * MenuBars or MenuItems.
+ * 
+ * <p>
+ * A "context menu" (a stand-alone menu which pops-up) can also be created;
+ * this is commonly used to create a context sensitive popup menu in response
+ * to a right-click (or left-click as the case may be); see the popup()
+ * method.
+ * 
+ * <p>
+ * For a broader explanation of the Menu API see {@link MenuShell}.
+ * 
+ * <p>
+ * <i>GTK does have the ability to "tear" Menus off from the parent Container.
+ * After consistently poor results in usability testing, however, tear-off
+ * menus are now highly discouraged in the GNOME community. They are therefore
+ * not presented in the java-gnome bindings.</i>
+ * 
+ * @author Sebastian Mancke
+ * @author Srichand Pendyala
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public class Menu extends MenuShell
+{
+    protected Menu(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Menu.
+     * 
+     * @since 4.0.3
+     */
+    public Menu() {
+        super(GtkMenu.createMenu());
+    }
+
+    /**
+     * Popup a context menu. Use this when you create a Menu that will be used
+     * for the popup context menu in response to a right-click somewhere. The
+     * menu will appear where the mouse pointer is.
+     * 
+     * <p>
+     * Unlike normal Menus that are part of an application's MenuBar, context
+     * menus are not mapped automatically, so you need to have
+     * {@link Widget#showAll() showAll()} called on them once you're done
+     * building them to allocate their resources (otherwise you end up with a
+     * 1x1 pixel sized menu with nothing in it).
+     * 
+     * @since 4.0.3
+     */
+    public void popup() {
+        GtkMenuOverride.popup(this);
+    }
+
+    /**
+     * Having constructed a Menu to be used as the context menu, present it at
+     * the specified location. This is useful in conjunction with TextView's
+     * {@link TextView#getLocation(TextIter) getLocation()} if you wish to
+     * place the menu at the "cursor position" rather than where the mouse
+     * pointer is.
+     * 
+     * @since 4.0.15
+     */
+    public void popup(int x, int y) {
+        GtkMenuOverride.popupAtPosition(this, x, y);
+    }
+
+    /**
+     * A special case for popping up the context menu associated with a
+     * StatusIcon. Having constructed a Menu to be used as the context menu,
+     * you then call this from the <code>StatusIcon.PopupMenu</code> signal
+     * callback as follows:
+     * 
+     * <pre>
+     * StatusIcon si;
+     * Menu context;
+     * ...
+     * 
+     * si.connect(new StatusIcon.PopupMenu() {
+     *     public void onPopupMenu(StatusIcon source, int button, int activateTime) {
+     *         context.popup(source);
+     *     }
+     * });
+     * </pre>
+     * 
+     * Don't forget to call {@link Widget#showAll() showAll()} on the Menu
+     * when you're done constructing it before trying to use it the first
+     * time.
+     * 
+     * @since 4.0.3
+     */
+    public void popup(StatusIcon status) {
+        GtkMenuOverride.popupStatusIcon(this, status);
+    }
+
+    /**
+     * This method must be called in order to have the key bindings in
+     * MenuItems work. It has to be the same AcceleratorGroup that was
+     * specified for the enclosing top level Window that this Menu will be a
+     * part of via Window's
+     * {@link Window#addAcceleratorGroup(AcceleratorGroup)
+     * addAcceleratorGroup()}.
+     * 
+     * @since 4.0.16
+     */
+    public void setAcceleratorGroup(AcceleratorGroup group) {
+        GtkMenu.setAccelGroup(this, group);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MenuBar.java b/src/bindings/org/gnome/gtk/MenuBar.java
new file mode 100644
index 0000000..6dc8160
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MenuBar.java
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A MenuBar is a Container widget for {@link Menu}s.
+ * 
+ * <p>
+ * A MenuBar is added to a Container {@link Window} just like any other
+ * Widget. The MenuBar holds only Menu subitems. It is generally a convention
+ * to have a MenuBar at the top of the Window. Hence it must be the first
+ * Widget you should add to the top of the VBox in a Window.
+ * </p>
+ * 
+ * <p>
+ * For a broader explanation of how to use the Menus APIs, see
+ * {@link MenuShell}.
+ * </p>
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @since 4.0.3
+ */
+public class MenuBar extends MenuShell
+{
+    protected MenuBar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Constructs a MenuBar
+     */
+    public MenuBar() {
+        super(GtkMenuBar.createMenuBar());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MenuDirectionType.java b/src/bindings/org/gnome/gtk/MenuDirectionType.java
new file mode 100644
index 0000000..9428c15
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MenuDirectionType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class MenuDirectionType extends Constant
+{
+    private MenuDirectionType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MenuItem.java b/src/bindings/org/gnome/gtk/MenuItem.java
new file mode 100644
index 0000000..0bc17c8
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MenuItem.java
@@ -0,0 +1,206 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+
+/**
+ * MenuItems are the basic elements that form a Menu.
+ * 
+ * While MenuItems are Containers and are thus capable of containing other
+ * Widgets; in practise only the specialized MenuItem classes will work
+ * properly as they are what support highlighting, alignment, submenus, etc.
+ * 
+ * <p>
+ * MenuItems can be either left justified or right justified, but in general
+ * you should just leave this alone and it will do the right thing for your
+ * locale (left aligned for western languages, right aligned for right-to-left
+ * languages like Arabic).
+ * 
+ * <p>
+ * <i>Right justification was initially designed to be used for "Help" Menus,
+ * but this is now considered a bad idea and is no longer used in GNOME.</i>
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @author Vreixo Formoso
+ * @since 4.0.3
+ */
+public class MenuItem extends Bin implements Activatable
+{
+    protected MenuItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a MenuItem
+     * 
+     * @since 4.0.3
+     */
+    public MenuItem() {
+        super(GtkMenuItem.createMenuItem());
+    }
+
+    /**
+     * Construct a MenuItem with a given text label. The label may contain
+     * underscores (the <code>_</code> character) which, if present, will
+     * indicate the mnemonic which will activate that MenuItem directly if
+     * that key is pressed (whilst the Menu is showing, obviously).
+     * 
+     * @since 4.0.3
+     */
+    public MenuItem(String mnemonicLabel) {
+        super(GtkMenuItem.createMenuItemWithMnemonic(mnemonicLabel));
+    }
+
+    /**
+     * Construct a MenuItem with a given text label, and additionally connect
+     * a handler to its <code>MenuItem.Activate</code> signal.
+     * 
+     * <p>
+     * This is equivalent to:
+     * 
+     * <pre>
+     * item = new MenuItem("_My menu item");
+     * item.connect(handler);
+     * </pre>
+     * 
+     * and affords you the convenience of being able to add a MenuItem fairly
+     * compactly:
+     * 
+     * <pre>
+     * Menu editMenu;
+     *    
+     * editMenu.append(new MenuItem("_Paste", new MenuItem.Activate() {
+     *     public void onActivate(MenuItem source) {
+     *         ...
+     *     }
+     * }));
+     * </pre>
+     * 
+     * @since 4.0.4
+     */
+    public MenuItem(String mnemonicLabel, MenuItem.Activate handler) {
+        super(GtkMenuItem.createMenuItemWithMnemonic(mnemonicLabel));
+        connect(handler);
+    }
+
+    /**
+     * Sets or replaces the MenuItem's submenu, or removes it if a
+     * <code>null</code> Menu is passed.
+     * 
+     * @since 4.0.3
+     */
+    public void setSubmenu(Menu child) {
+        GtkMenuItem.setSubmenu(this, child);
+    }
+
+    /**
+     * Returns the submenu underneath this menu item, if any
+     * 
+     * @return submenu for this menu item, or <code>null</code> if none.
+     * @since 4.0.3
+     */
+    public Widget getSubmenu() {
+        return GtkMenuItem.getSubmenu(this);
+    }
+
+    /**
+     * The handler interface for an activation. An activation is triggered
+     * either when the user clicks the MenuItem, or activates it with the
+     * keyboard either by typing that MenuItem's mnemonic character (if it has
+     * one) or selecting the MenuItem via the arrow keys and then pressing <b>
+     * <code>Enter</code></b>.
+     * 
+     * @since 4.0.3
+     */
+    public interface Activate extends GtkMenuItem.ActivateSignal
+    {
+        public void onActivate(MenuItem source);
+    }
+
+    /**
+     * Connect an <code>MenuItem.Activate</code> handler to the widget.
+     * 
+     * @since 4.0.3
+     */
+    public void connect(MenuItem.Activate handler) {
+        GtkMenuItem.connect(this, handler, false);
+    }
+
+    public void setRelatedAction(Action action) {
+        GtkActivatable.setRelatedAction(this, action);
+    }
+
+    public Action getRelatedAction() {
+        return GtkActivatable.getRelatedAction(this);
+    }
+
+    /**
+     * Set a key binding for this MenuItem.
+     * 
+     * @since 4.0.16
+     */
+    public void setAccelerator(AcceleratorGroup group, Keyval keyval, ModifierType modifier) {
+        String path;
+        boolean exists, result;
+
+        /*
+         * Check whether it has already has a path and whether it is known, if
+         * so then change it. If not, generate a path, set it and add it the
+         * map to be registered.
+         */
+
+        path = GtkMenuItem.getAccelPath(this);
+
+        if (path == null) {
+            exists = false;
+            path = group.generateRandomPath();
+            GtkMenuItem.setAccelPath(this, path);
+        } else {
+            exists = GtkAccelMap.lookupEntry(path, null);
+        }
+
+        if (exists) {
+            result = GtkAccelMap.changeEntry(path, keyval, modifier, true);
+
+            if (!result) {
+                throw new IllegalStateException("Can't change exising accelerator");
+            }
+        } else {
+            GtkAccelMap.addEntry(path, keyval, modifier);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MenuShell.java b/src/bindings/org/gnome/gtk/MenuShell.java
new file mode 100644
index 0000000..e24b219
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MenuShell.java
@@ -0,0 +1,113 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * The MenuShell is the abstract super class of {@link Menu} and
+ * {@link MenuBar}. It provides the common methods for adding and organizing
+ * {@link MenuItem}s.
+ * 
+ * <p>
+ * The following example creates one simple menu with a submenu and adds it to
+ * a menu bar:
+ * 
+ * <pre>
+ * Menu subMenu = new Menu();
+ * subMenu.append(new MenuItem("Sub Item _1"));
+ * subMenu.append(new MenuItem("Sub Item _2"));
+ * MenuItem subMenuItem = new MenuItem("Sub menu ..");
+ * subMenuItem.setSubmenu(subMenu);
+ * 
+ * Menu aMenu = new Menu();
+ * aMenu.append(new MenuItem("Item _1"));
+ * aMenu.append(new MenuItem("Item _2"));
+ * aMenu.append(subMenuItem);
+ * MenuItem aMenuItem = new MenuItem("_Other menu ..");
+ * aMenuItem.setSubmenu(aMenu);
+ * 
+ * MenuBar menuBar = new MenuBar();
+ * menuBar.append(aMenuItem);
+ * // finally add menuBar to the Window's VBox
+ * </pre>
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public abstract class MenuShell extends Container
+{
+    protected MenuShell(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Append one Widget to the MenuShell.
+     * 
+     * @since 4.0.3
+     */
+    public void append(Widget child) {
+        GtkMenuShell.append(this, child);
+    }
+
+    /**
+     * Prepend one Widget to the MenuShell.
+     * 
+     * @since 4.0.3
+     */
+    public void prepend(Widget child) {
+        GtkMenuShell.prepend(this, child);
+    }
+
+    /**
+     * Insert one Widget to the MenuShell at the specified position.
+     * 
+     * @since 4.0.3
+     */
+    public void insert(Widget child, int position) {
+        GtkMenuShell.insert(this, child, position);
+    }
+
+    /**
+     * Deactivate the MenuShell.
+     * 
+     * <p>
+     * <i>According to the GTK API documentation, this "typically" results in
+     * the Menu being erased from the screen. TODO what other effect could it
+     * have?</i>
+     * 
+     * @since 4.0.3
+     */
+    public void deactivate() {
+        GtkMenuShell.deactivate(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MenuToolButton.java b/src/bindings/org/gnome/gtk/MenuToolButton.java
new file mode 100644
index 0000000..bd046ff
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MenuToolButton.java
@@ -0,0 +1,121 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A MenuToolButton is an special kind of ToolButton that has an additional
+ * drop-down Menu.
+ * 
+ * <p>
+ * Next to the ToolButton itself, a MenuToolButton shows another little Button
+ * with an arrow. When the user clicks this additional Button, a drop-down
+ * Menu pops up.
+ * 
+ * <p>
+ * The main usage of a MenuToolButton is to provide access to several related
+ * actions in a Toolbar without wasting too much screen space. For example,
+ * your application can have a MenuToolButton for the "New Document" action,
+ * using the attached Menu to let users choose what kind of new document they
+ * want to create.
+ * 
+ * <p>
+ * A MenuToolButton has a default action, to be executed when user clicks the
+ * main Button itself and not the the arrow Button. You can capture that
+ * default event with the {@link ToolButton.Clicked} signal. User Menu
+ * selections are captured with the usual {@link MenuItem.Activate} signal of
+ * each <code>MenuItem</code>.
+ * 
+ * @see Toolbar
+ * @see Menu
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+public class MenuToolButton extends ToolButton
+{
+    protected MenuToolButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new MenuToolButton using the given icon and Label.
+     * 
+     * @param iconWidget
+     *            The Widget to be used as the icon for the MenuToolButton.
+     *            Usually you will want to use a Widget display an image, such
+     *            as {@link Image}. Use <code>null</code> if you do not want
+     *            an icon.
+     * @param label
+     *            The Label for the MenuToolButton, or <code>null</code> to
+     *            provide not Label.
+     */
+    public MenuToolButton(Widget iconWidget, String label) {
+        super(GtkMenuToolButton.createMenuToolButton(iconWidget, label));
+    }
+
+    /**
+     * Creates a new MenuToolButton from the specific stock item. Both the
+     * Label and icon will be set properly from the stock item. By using a
+     * system stock item, the newly created MenuToolButton with use the same
+     * Label and Image as other GNOME applications. To ensure consistent look
+     * and feel between applications, it is highly recommended that you use
+     * provided stock items whenever possible.
+     * 
+     * @param stock
+     *            The StockId that will determine the Label and icon of the
+     *            MenuToolButton.
+     */
+    public MenuToolButton(Stock stock) {
+        super(GtkMenuToolButton.createMenuToolButtonFromStock(stock.getStockId()));
+    }
+
+    /**
+     * Sets the Menu to be popped up when the user clicks the arrow Button.
+     * 
+     * <p>
+     * You can pass <code>null</code> to make arrow insensitive.
+     */
+    public void setMenu(Menu menu) {
+        GtkMenuToolButton.setMenu(this, menu);
+    }
+
+    /**
+     * Get the Menu associated with the MenuToolButton.
+     * 
+     * @return The associated Menu or <code>null</code> if no Menu has been
+     *         set.
+     */
+    public Menu getMenu() {
+        return (Menu) GtkMenuToolButton.getMenu(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MessageDialog.java b/src/bindings/org/gnome/gtk/MessageDialog.java
new file mode 100644
index 0000000..5beeebb
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MessageDialog.java
@@ -0,0 +1,207 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A convenient Dialog to show a message to the user.
+ * 
+ * <p>
+ * MessageDialogs are used to show some information message to the user, warn
+ * him about application errors or problems, and let him choose what action to
+ * take.
+ * 
+ * <p>
+ * A MessageDialog is a simple Dialog with an image representing the type of
+ * the message (error, warning, etc... take a look at {@link MessageType
+ * MessageType}), the message text and some Buttons to let the user decide how
+ * to respond to the message. The {@link ButtonsType ButtonsType} enumeration
+ * can be used to choose among some common combination of Buttons, but you can
+ * also add other Buttons via the usual Dialog's
+ * {@link #addButton(String, ResponseType) addButton()} method.
+ * 
+ * <p>
+ * Optionally you can provide a secondary text that displays more information
+ * about the message. Both the main message and the secondary text can be
+ * formatted with Pango markup.
+ * 
+ * <p>
+ * In most cases, MessageDialog is a modal Dialog that you will show with the
+ * {@link #run() run()} method, and <code>hide()</code> once the user has
+ * responded to it, much like in the following example:
+ * 
+ * <pre>
+ * // create the Dialog
+ * MessageDialog dialog = new MessageDialog(window, true, MessageType.WARNING, ButtonsType.OK_CANCEL,
+ *         "Do you want to delete file.txt?");
+ * dialog.setSecondaryText("If you delete that file, you will loose all the information there");
+ * 
+ * // Show the Dialog
+ * ResponseType choice = dialog.run();
+ * 
+ * // Hide it once the user has responded
+ * dialog.hide();
+ * 
+ * // process
+ * if (choice == ResponseType.OK) {
+ *     // delete the file...
+ * } else {
+ *     // cancel...
+ * }
+ * </pre>
+ * 
+ * @see MessageType
+ * @see ButtonsType
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ */
+public class MessageDialog extends Dialog
+{
+    protected MessageDialog(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new MessageDialog.
+     * 
+     * @param parent
+     *            Transient parent for the MessageDialog. It can be
+     *            <code>null</code>, but if you have a parent Window you
+     *            should pass it here to force the Dialog to be on top of the
+     *            parent Window and to be presented to the user when they
+     *            select the parent Window.
+     * @param modal
+     *            Whether the Dialog will be modal.
+     * @param type
+     *            Type of the Dialog
+     * @param buttons
+     *            Set of Buttons to be presented.
+     * @param message
+     *            The main message of the Dialog. If you want to use a String
+     *            formatted with the Pango markup, you will need to call
+     *            {@link #setUseMarkup(boolean) setUseMarkup()} later.
+     */
+    public MessageDialog(Window parent, boolean modal, MessageType type, ButtonsType buttons,
+            String message) {
+
+        super(GtkMessageDialog.createMessageDialog(parent, modal ? DialogFlags.MODAL : DialogFlags.NONE,
+                type, buttons, null));
+
+        /*
+         * We set the property instead of passing it in the constructor to
+         * avoid possible problems with the printf()-style.
+         */
+        setPropertyString("text", message);
+    }
+
+    /**
+     * Set whether the message text is to be parsed as containing markup in
+     * Pango's text markup language. Using this allows MessageDialog to be
+     * created with expressive formatting considerably more advanced than a
+     * simple line of text.
+     * 
+     * @param setting
+     *            If setting is true, then any markup included in the text is
+     *            interpreted as such. If its set to false, markup is ignored
+     *            and included as-is.
+     */
+    public void setUseMarkup(boolean setting) {
+        setPropertyBoolean("use-markup", setting);
+    }
+
+    /**
+     * Whether the message text is to be interpreted as marked up with Pango's
+     * text markup language. When enabled, the MessageDialog can show
+     * formatted text instead of just a simple line of text.
+     */
+    public boolean getUseMarkup() {
+        return getPropertyBoolean("use-markup");
+    }
+
+    /**
+     * Sets the secondary text for the MessageDialog.
+     * 
+     * <p>
+     * Note that setting a secondary text makes the primary text become bold,
+     * unless you are using markup.
+     * 
+     * @param text
+     *            The text to be used as secondary text.
+     * @param markup
+     *            Whether to interpret this secondary text as marked up with
+     *            Pango's text markup language.
+     */
+    public void setSecondaryText(String text, boolean markup) {
+        setPropertyString("secondary-text", text);
+        setPropertyBoolean("secondary-use-markup", markup);
+    }
+
+    /**
+     * Sets the secondary text for the MessageDialog. This text is interpreted
+     * as plain text, if you want to use Pango markup format you should call
+     * {@link #setSecondaryUseMarkup(boolean) setSecondaryUseMarkup()} or call
+     * {@link #setSecondaryText(String, boolean) setSecondaryText(String,
+     * true)} instead.
+     */
+    public void setSecondaryText(String text) {
+        setPropertyString("secondary-text", text);
+    }
+
+    /**
+     * Whether the secondary text is to be interpreted as marked up with
+     * Pango's text markup language.
+     */
+    public boolean getSecondaryUseMarkup() {
+        return getPropertyBoolean("secondary-use-markup");
+    }
+
+    /**
+     * Set whether the secondary text is to be parsed as containing markup in
+     * Pango's text markup language.
+     */
+    public void setSecondaryUseMarkup(boolean setting) {
+        setPropertyBoolean("secondary-use-markup", setting);
+    }
+
+    /**
+     * Set the Widget to be used as the image for the MessageDialog. For
+     * common {@link MessageType types}, the image is set to an appropriate
+     * icon from the Stock. That is what you must use in most cases. However,
+     * there can be some cases where you want to provide your own Widget. In
+     * that cases, you should set the message type to
+     * {@link MessageType#OTHER OTHER} when creating the Dialog.
+     */
+    public void setImage(Widget image) {
+        GtkMessageDialog.setImage(this, image);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MessageType.java b/src/bindings/org/gnome/gtk/MessageType.java
new file mode 100644
index 0000000..215079b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MessageType.java
@@ -0,0 +1,130 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The type of the message shown in a {@link MessageDialog MessageDialog}.
+ * Mostly this is about determining the type of icon that will be shown.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ */
+public final class MessageType extends Constant
+{
+    private MessageType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The Dialog shows an informational message.
+     * 
+     * <p>
+     * Only use this kind of messages for important information the user must
+     * know before continuing to use the application, or for information the
+     * user has requested. For less important information you shouldn't use a
+     * MessageDialog, but other informational Widgets such as a
+     * {@link Statusbar Statusbar}.
+     * 
+     * <p>
+     * Consider using a single {@link ButtonsType#OK OK} Button to let the
+     * user close the Dialog.
+     */
+    public static final MessageType INFO = new MessageType(GtkMessageType.INFO, "INFO");
+
+    /**
+     * The Dialog present a choice to the user.
+     * 
+     * <p>
+     * Use this type to present Dialogs that ask users to take a non serious
+     * decision. Usually you will provide {@link ButtonsType#YES_NO YES_NO}
+     * Buttons to let the user express his choice.
+     * 
+     * <p>
+     * If the choice can have a serious impact in the application, such as the
+     * lost of data, a {@link #WARNING WARNING} message is a better
+     * alternative.
+     */
+    public static final MessageType QUESTION = new MessageType(GtkMessageType.QUESTION, "QUESTION");
+
+    /**
+     * The Dialog shows a warning message.
+     * 
+     * <p>
+     * A typical usage of these messages is to request user confirmation to a
+     * potentially dangerous action. You should present such messages when the
+     * the task that is going to be executed may destroy user data, create a
+     * security risk, or take more than 30 seconds of user effort to recover
+     * from if it was selected in error.
+     * 
+     * <p>
+     * While simple warning messages can be correctly handled by
+     * {@link ButtonsType#OK_CANCEL OK_CANCEL} Buttons, in many cases you may
+     * want to provide a Help Button to give the user more information about
+     * the risk, or to replace the OK Button with a message that clearly show
+     * what the Button does. For example, in a "Close without saving?" alert,
+     * the OK text could be "Discard changes". A third Button can also be
+     * useful (for example, a "Save changes" Button in the previous" case. In
+     * all cases a CANCEL Button must be present to let the user cancel the
+     * operation.
+     */
+    public static final MessageType WARNING = new MessageType(GtkMessageType.WARNING, "WARNING");
+
+    /**
+     * The Dialog shows an error message.
+     * 
+     * <p>
+     * You should use this kind of MessageDialog when an operation requested
+     * by the user cannot be successfully completed. However, if the operation
+     * that has caused the error is a background or periodic operation, you
+     * may want to consider displaying the error by other means, such as a
+     * {@link Statusbar Statusbar} message, unless the error could result in
+     * data loss or other serious problems.
+     * 
+     * <p>
+     * You should present an {@link ButtonsType#OK OK} Button to let user
+     * close the Dialog. Optionally, if the error can be immediately fixed,
+     * you may add a Button to launch the repair operation (a "Format..."
+     * Button in a "This disk is not formatted" alert, for example).
+     */
+    public static final MessageType ERROR = new MessageType(GtkMessageType.ERROR, "ERROR");
+
+    /**
+     * Use this when the predefined MessageTypes are not suitable for your
+     * MessageDialog. In that cases you may want to add a custom icon to the
+     * Dialog.
+     */
+    public static final MessageType OTHER = new MessageType(GtkMessageType.OTHER, "OTHER");
+
+}
diff --git a/src/bindings/org/gnome/gtk/MetricType.java b/src/bindings/org/gnome/gtk/MetricType.java
new file mode 100644
index 0000000..eaee508
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MetricType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class MetricType extends Constant
+{
+    private MetricType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Misc.java b/src/bindings/org/gnome/gtk/Misc.java
new file mode 100644
index 0000000..eef00c0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Misc.java
@@ -0,0 +1,136 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Base class for Widgets that have notions of alignment and padding.
+ * 
+ * @author Andrew Cowie
+ * @author Nat Pryce
+ * @since 4.0.0
+ */
+public abstract class Misc extends Widget
+{
+    protected Misc(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Set the horizontal and vertical alignment attributes, enabling the
+     * Widget to be positioned within its allocated area. Note that if the
+     * Widget is added to a Container in such a way that it expands
+     * automatically to fill its allocated area, the alignment settings will
+     * not alter the Widget's position.
+     * 
+     * @param xalign
+     *            the horizontal alignment, from <code>0.0f</code> (full left)
+     *            to <code>1.0f</code> (full right).
+     * @param yalign
+     *            the vertical alignment, from <code>0.0f</code> (top) to
+     *            <code>1.0f</code> (bottom).
+     * @since 4.0.4
+     */
+    /*
+     * TODO add reference to Container (or where ever) when we get around to
+     * documenting the Request to Allocation process.
+     */
+    public void setAlignment(float xalign, float yalign) {
+        GtkMisc.setAlignment(this, xalign, yalign);
+    }
+
+    /**
+     * Gets the horizontal alignment of the Widget within its allocation. See
+     * {@link #setAlignment(float, float) setAlignment()}.
+     * 
+     * @since 4.0.4
+     */
+    public float getAlignmentX() {
+        float[] xalign = new float[1];
+        float[] yalign = new float[1];
+        GtkMisc.getAlignment(this, xalign, yalign);
+        return xalign[0];
+    }
+
+    /**
+     * Gets the vertical alignment of the Widget within its allocation. See
+     * {@link #setAlignment(float, float) setAlignment()}.
+     * 
+     * @since 4.0.4
+     */
+    public float getAlignmentY() {
+        float[] xalign = new float[1];
+        float[] yalign = new float[1];
+        GtkMisc.getAlignment(this, xalign, yalign);
+        return yalign[0];
+    }
+
+    /**
+     * Set the amount of extra horizontal and vertical padding space to added
+     * around the Widget.
+     * 
+     * @param xpad
+     *            the amount of space to add on the left and right of the
+     *            Widget, in pixels.
+     * @param ypad
+     *            the amount of space to add on the top and bottom of the
+     *            Widget, in pixels.
+     * @since 4.0.4
+     */
+    public void setPadding(int xpad, int ypad) {
+        GtkMisc.setPadding(this, xpad, ypad);
+    }
+
+    /**
+     * Returns the horizontal padding of the Widget, in pixels.
+     * 
+     * @since 4.0.4
+     */
+    public int getPaddingX() {
+        int[] xpad = new int[1];
+        int[] ypad = new int[1];
+        GtkMisc.getPadding(this, xpad, ypad);
+        return xpad[0];
+    }
+
+    /**
+     * Returns the vertical padding of the Widget, in pixels.
+     * 
+     * @since 4.0.4
+     */
+    public int getPaddingY() {
+        int[] xpad = new int[1];
+        int[] ypad = new int[1];
+        GtkMisc.getPadding(this, xpad, ypad);
+        return ypad[0];
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/MovementStep.java b/src/bindings/org/gnome/gtk/MovementStep.java
new file mode 100644
index 0000000..5984516
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MovementStep.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * Constants describing the nature of a motion in <code>MoveCursor</code>
+ * signal handlers found in {@link TextView}, {@link TreeView}, {@link Entry},
+ * etc.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * FIXME Make constants public as necessary. What is the difference between
+ * these? Especially, what are "logical" and "virtual" positions and why would
+ * you care?
+ */
+public final class MovementStep extends Constant
+{
+    private MovementStep(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    static final MovementStep LOGICAL_POSITIONS = new MovementStep(GtkMovementStep.LOGICAL_POSITIONS,
+            "LOGICAL_POSITIONS");
+
+    static final MovementStep VISUAL_POSITIONS = new MovementStep(GtkMovementStep.VISUAL_POSITIONS,
+            "VISUAL_POSITIONS");
+
+    static final MovementStep WORDS = new MovementStep(GtkMovementStep.WORDS, "WORDS");
+
+    static final MovementStep DISPLAY_LINES = new MovementStep(GtkMovementStep.DISPLAY_LINES,
+            "DISPLAY_LINES");
+
+    static final MovementStep DISPLAY_LINE_ENDS = new MovementStep(GtkMovementStep.DISPLAY_LINE_ENDS,
+            "DISPLAY_LINE_ENDS");
+
+    static final MovementStep PARAGRAPHS = new MovementStep(GtkMovementStep.PARAGRAPHS, "PARAGRAPHS");
+
+    static final MovementStep PARAGRAPH_ENDS = new MovementStep(GtkMovementStep.PARAGRAPH_ENDS,
+            "PARAGRAPH_ENDS");
+
+    static final MovementStep PAGES = new MovementStep(GtkMovementStep.PAGES, "PAGES");
+}
diff --git a/src/bindings/org/gnome/gtk/MulticontextInputMethod.java b/src/bindings/org/gnome/gtk/MulticontextInputMethod.java
new file mode 100644
index 0000000..99e3b17
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/MulticontextInputMethod.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * A dynamic input method that enables the user to switch between input
+ * methods.
+ * 
+ * <p>
+ * Apparently you should use this in preference to "simple", although if using
+ * this without having specified a different input method you'll get GTK's
+ * default which seems to be a (the?) SimpleInputMethod.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+public class MulticontextInputMethod extends InputMethod
+{
+    protected MulticontextInputMethod(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create an input method.
+     * 
+     * @since 4.0.14
+     */
+    public MulticontextInputMethod() {
+        super(GtkIMMulticontext.createMulticontextInputMethod());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/NorthAmericanPaperSize.java b/src/bindings/org/gnome/gtk/NorthAmericanPaperSize.java
new file mode 100644
index 0000000..352f93c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/NorthAmericanPaperSize.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Constants for the other standard paper types typically in use in Canada and
+ * the United States, as well as Mexico, The Philippines, Chile, and Columbia.
+ * 
+ * <pre>
+ * use = NorthAmericanPaperSize.LETTER;
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * TODO someone should do up "BusinessCard"
+ */
+public class NorthAmericanPaperSize extends PaperSize
+{
+    protected NorthAmericanPaperSize(String name) {
+        super(name);
+    }
+
+    /**
+     * A piece of paper which is 8.5 inch x 14 inch in size. This is sometimes
+     * mistakenly referred to as "foolscap".
+     */
+    public static final NorthAmericanPaperSize LEGAL = new NorthAmericanPaperSize("na_legal");
+
+    public static final NorthAmericanPaperSize EXECUTIVE = new NorthAmericanPaperSize("na_executive");
+}
diff --git a/src/bindings/org/gnome/gtk/Notebook.java b/src/bindings/org/gnome/gtk/Notebook.java
new file mode 100644
index 0000000..fb53e96
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Notebook.java
@@ -0,0 +1,313 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A tabbed notebook container. These are common sights in web browsers and
+ * text editors and are the recommended way to create user interfaces that
+ * must manage multiple documents if creating a completely independent window
+ * per document (the preferred GNOME approach) is inappropriate. <img
+ * src="Notebook.png" class="snapshot">
+ * 
+ * <p>
+ * Note that Notebooks are a poor way to organize pages of application
+ * preferences; if your program has that many options there is probably
+ * something very wrong with your design in the first place. Do you
+ * <i>really</i> need to present that many different configuration settings to
+ * the user?
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @author Stefan Schweizer
+ * @since 4.0.3
+ */
+/*
+ * The various add page functions return -1 on failure. This should be
+ * intercepted and a RuntimeException thrown.
+ */
+public class Notebook extends Container
+{
+    protected Notebook(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Constructs a new Notebook.
+     * 
+     * @since 4.0.3
+     */
+    public Notebook() {
+        super(GtkNotebook.createNotebook());
+    }
+
+    /**
+     * Append a new tab to the Notebook after the current tab.
+     * 
+     * @param child
+     *            The Widget to be shown on the new Notebook page.
+     * @param tabLabel
+     *            The Label Widget you want to use for the tab itself.
+     * @since 4.0.3
+     */
+    public int appendPage(Widget child, Widget tabLabel) {
+        return GtkNotebook.appendPage(this, child, tabLabel);
+    }
+
+    /**
+     * Insert a tab to the Notebook before the current tab.
+     * 
+     * @param child
+     *            The Widget shown on the new Notebook page.
+     * @param tabLabel
+     *            The Label Widget for the tab
+     * @return the position of the prepended tab.
+     * @since 4.0.3
+     */
+    public int prependPage(Widget child, Widget tabLabel) {
+        return GtkNotebook.prependPage(this, child, tabLabel);
+    }
+
+    /**
+     * Insert a tab at the supplied position in the Notebook.
+     * 
+     * @param child
+     *            The Widget shown on the new Notebook page.
+     * @param tabLabel
+     *            The Label Widget to use on the tab itself.
+     * @param position
+     *            The position at which to insert the page.
+     * @return the position in the Notebook of the inserted tab.
+     * @since 4.0.3
+     */
+    public int insertPage(Widget child, Widget tabLabel, int position) {
+        return GtkNotebook.insertPage(this, child, tabLabel, position);
+    }
+
+    /**
+     * Remove a tab.
+     * 
+     * @param pageNum
+     *            The position number (from 0) of the page to remove.
+     * @since 4.0.3
+     */
+    public void removePage(int pageNum) {
+        GtkNotebook.removePage(this, pageNum);
+    }
+
+    /**
+     * Activate/show the page at the supplied position.
+     * 
+     * @param pageNum
+     *            Position of the page to activate
+     * @since 4.0.3
+     */
+    public void setCurrentPage(int pageNum) {
+        GtkNotebook.setCurrentPage(this, pageNum);
+    }
+
+    /**
+     * Returns the number of the active page
+     * 
+     * @since 4.0.9
+     */
+    public int getCurrentPage() {
+        return GtkNotebook.getCurrentPage(this);
+    }
+
+    /**
+     * The handler interface for notification of changes in the current page.
+     * 
+     * <p>
+     * Note that this handler is only used when the page is changed with the
+     * keyboard using Ctrl+Page Up/Down. If you want to get informed every
+     * time the page is changed, you should use the
+     * <code>Notebook.SwitchPage</code> signal instead.
+     * 
+     * @since 4.0.3
+     */
+    public interface ChangeCurrentPage extends GtkNotebook.ChangeCurrentPageSignal
+    {
+        /**
+         * @param offset
+         *            The number of pages to move forward/backward (negative
+         *            value for backward)
+         */
+        public boolean onChangeCurrentPage(Notebook source, int offset);
+    }
+
+    /**
+     * Connects a <code>Notebook.ChangeCurrentPage</code> handler to the
+     * Notebook.
+     * 
+     * @since 4.0.3
+     */
+    public void connect(Notebook.ChangeCurrentPage handler) {
+        GtkNotebook.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when the user or the program switches to a new page.
+     * 
+     * <p>
+     * Use this in preference to <code>Notebook.ChangeCurrentPage</code>.
+     * 
+     * @author Stefan Schweizer
+     * @since 4.0.10
+     */
+    public interface SwitchPage
+    {
+        /**
+         * Callback received when the page showing in the Notebook changes.
+         * Values of the page number parameter start from 0.
+         */
+        public void onSwitchPage(Notebook source, int pageNum);
+    }
+
+    /**
+     * Connects a <code>Notebook.SwitchPage</code> handler to this Notebook.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(Notebook.SwitchPage handler) {
+        GtkNotebook.connect(this, new SwitchPageHandler(handler), false);
+    }
+
+    /*
+     * Eliminate page parameter from handler interface.
+     */
+    private static class SwitchPageHandler implements GtkNotebook.SwitchPageSignal
+    {
+        private final SwitchPage handler;
+
+        private SwitchPageHandler(SwitchPage handler) {
+            this.handler = handler;
+        }
+
+        public void onSwitchPage(Notebook source, long page, int pageNum) {
+            handler.onSwitchPage(source, pageNum);
+        }
+    }
+
+    /**
+     * Specify where the Notebook tabs will be located.
+     * {@link PositionType#TOP TOP} is the default.
+     * 
+     * @since 4.0.6
+     */
+    public void setTabPosition(PositionType position) {
+        GtkNotebook.setTabPos(this, position);
+    }
+
+    /**
+     * Returns the number of pages in the Notebook.
+     * 
+     * @since 4.0.9
+     */
+    public int getPageCount() {
+        return GtkNotebook.getNPages(this);
+    }
+
+    /**
+     * Returns the page number of the given Widget.
+     * 
+     * @return The page number or <code>-1</code> if <code>child</code> is not
+     *         in the Notebook.
+     * 
+     * @since 4.0.9
+     */
+    public int getPageNumber(Widget child) {
+        return GtkNotebook.pageNum(this, child);
+    }
+
+    /**
+     * Get the Widget which is the page at a given index. Page numbers start
+     * at <code>0</code>.
+     * 
+     * @since 4.0.9
+     */
+    public Widget getPage(int pageNum) {
+        return GtkNotebook.getNthPage(this, pageNum);
+    }
+
+    /**
+     * Should the tabs of the Notebook actually be there?
+     * 
+     * <p>
+     * The default is <code>true</code>, as you'd expect.
+     * 
+     * <p>
+     * Turning this off might be useful if you're trying to create the effect
+     * of toggling user interface from one set of controls to another in the
+     * same space on screen. That might seem nifty, but keep in mind that
+     * you're going to have to come up with a convincingly clear UI for your
+     * users to be able to change modes, else they won't have any clue that
+     * there <i>are</i> any other states to change to.
+     * 
+     * @since 4.0.10
+     */
+    public void setShowTabs(boolean setting) {
+        GtkNotebook.setShowTabs(this, setting);
+    }
+
+    /**
+     * Do you want a border drawn around the Notebook?
+     * 
+     * <p>
+     * The border decoration drawn around the Notebook pages only optional if
+     * you've turned tabs off with {@link #setShowTabs(boolean) setShowTabs()}.
+     * 
+     * @since 4.0.10
+     */
+    public void setShowBorder(boolean setting) {
+        GtkNotebook.setShowBorder(this, setting);
+    }
+
+    /**
+     * Sets whether all the tabs will be visible, thus increasing the size the
+     * Notebook takes, or instead only show as many tabs as the current size
+     * of the Notebook allows. In this later case, an pair of arrows for
+     * scrolling among all tabs will be show in the tab label area.
+     * 
+     * <p>
+     * It is desirable to call this with a <code>true</code> value if the
+     * Notebook has many pages. Otherwise, the tabs will artificially increase
+     * the size of the Notebook, sometimes even leading to a Window that
+     * cannot fit in the screen space.
+     * 
+     * @since 4.0.12
+     */
+    public void setScrollable(boolean setting) {
+        GtkNotebook.setScrollable(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/NotebookTab.java b/src/bindings/org/gnome/gtk/NotebookTab.java
new file mode 100644
index 0000000..d5f14f3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/NotebookTab.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class NotebookTab extends Constant
+{
+    private NotebookTab(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/OffscreenWindow.java b/src/bindings/org/gnome/gtk/OffscreenWindow.java
new file mode 100644
index 0000000..7a22e2e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/OffscreenWindow.java
@@ -0,0 +1,46 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class OffscreenWindow extends Window
+{
+
+}
diff --git a/src/bindings/org/gnome/gtk/Orientable.java b/src/bindings/org/gnome/gtk/Orientable.java
new file mode 100644
index 0000000..cbd90fc
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Orientable.java
@@ -0,0 +1,56 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Widgets which allow you to make them horizontal or vertical.
+ * 
+ * @author Andrew Cowie
+ * @since 4.1.1
+ */
+public interface Orientable
+{
+    /**
+     * Get the orientation of this Orientable.
+     * 
+     * @since 4.1.1
+     */
+    public Orientation getOrientation();
+
+    /**
+     * Set the orientation of this Orientable.
+     * 
+     * @since 4.1.1
+     */
+    public void setOrientation(Orientation orientation);
+}
diff --git a/src/bindings/org/gnome/gtk/Orientation.java b/src/bindings/org/gnome/gtk/Orientation.java
new file mode 100644
index 0000000..2fb3ada
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Orientation.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Determine the orientation of some Widgets, such as Toolbar, that can be
+ * switched between horizontal and vertical orientation during execution.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+public final class Orientation extends Constant
+{
+    private Orientation(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Horizontal orientation.
+     */
+    public static final Orientation HORIZONTAL = new Orientation(GtkOrientation.HORIZONTAL, "HORIZONTAL");
+
+    /**
+     * Vertical orientation.
+     */
+    public static final Orientation VERTICAL = new Orientation(GtkOrientation.VERTICAL, "VERTICAL");
+
+}
diff --git a/src/bindings/org/gnome/gtk/PackDirection.java b/src/bindings/org/gnome/gtk/PackDirection.java
new file mode 100644
index 0000000..75b6abf
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PackDirection.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PackDirection extends Constant
+{
+    private PackDirection(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PackType.java b/src/bindings/org/gnome/gtk/PackType.java
new file mode 100644
index 0000000..8b56e27
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PackType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PackType extends Constant
+{
+    private PackType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PageOrientation.java b/src/bindings/org/gnome/gtk/PageOrientation.java
new file mode 100644
index 0000000..5a711c2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PageOrientation.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PageOrientation extends Constant
+{
+    private PageOrientation(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PageSet.java b/src/bindings/org/gnome/gtk/PageSet.java
new file mode 100644
index 0000000..9d8194a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PageSet.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PageSet extends Constant
+{
+    private PageSet(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PageSetup.java b/src/bindings/org/gnome/gtk/PageSetup.java
new file mode 100644
index 0000000..d8fcbb5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PageSetup.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PageSetup extends Object
+{
+    protected PageSetup(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Paned.java b/src/bindings/org/gnome/gtk/Paned.java
new file mode 100644
index 0000000..4954a0d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Paned.java
@@ -0,0 +1,194 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2008 Vreixo Formoso
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Base type for Containers that dispose child Widgets in two panes, arranged
+ * either horizontally ({@link HPaned HPaned}) or vertically ({@link VPaned
+ * VPaned}). A Paned will have two children, referred as child <code>1</code>
+ * and <code>2</code>.
+ * 
+ * <p>
+ * This Widget is mainly used to divide the Window area in two parts. The user
+ * can adjust the size of the panes by dragging the separator that appears
+ * between them. This way, the user can choose at any time how much size
+ * allocate for each of the two child Widgets.
+ * 
+ * <p>
+ * A typical usage of the Paned Container is to provide some kind of navigator
+ * facilities to a application, generally with a list of bookmarks or an
+ * index. In those cases, a HPaned is used to divide the application Window in
+ * two columns, one at the left, with the index in a TreeView, and another,
+ * wider, at the right, with the contents.
+ * 
+ * <p>
+ * Note that Paned should only be used when we really need to allow users to
+ * dynamically change the way size is distributed between the two children.
+ * Otherwise, a {@link HBox HBox} or {@link VBox VBox} would be a better
+ * choice.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class Paned extends Container implements Orientable
+{
+    protected Paned(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Paned of the given orientation. See also the original
+     * Widgets {@link HPaned} and {@link VPaned}.
+     * 
+     * @since 4.1.1
+     */
+    public Paned(Orientation orientation) {
+        super(GtkPaned.createPaned(orientation));
+    }
+
+    /**
+     * Adds a child Widget to the top (in case of VPaned) or to the left (in
+     * case of HPaned) pane.
+     * 
+     * <p>
+     * This call is equivalent to {@link #pack1(Widget, boolean, boolean)
+     * pack1(child, false, true)}.
+     * 
+     * @since 4.0.7
+     */
+    public void add1(Widget child) {
+        GtkPaned.add1(this, child);
+    }
+
+    /**
+     * Adds a child Widget to the bottom (in case of VPaned) or to the right
+     * (in case of HPaned) pane.
+     * 
+     * <p>
+     * This call is equivalent to {@link #pack2(Widget, boolean, boolean)
+     * pack2(child, false, true)}.
+     * 
+     * @since 4.0.7
+     */
+    public void add2(Widget child) {
+        GtkPaned.add2(this, child);
+    }
+
+    /**
+     * Adds a child Widget to the top (in case of VPaned) or to the left (in
+     * case of HPaned) pane.
+     * 
+     * @param child
+     *            the Widget to be added
+     * @param resize
+     *            Whether this pane (and thus its Widget) should be resized
+     *            when the Paned is resize.
+     * @param shrink
+     *            Whether the user can make the pane smaller than the size
+     *            requested by the child Widget. This can be useful to let the
+     *            user hide one of the two panels, but depending of the child
+     *            Widget type it can lead to poor visual results. Use with
+     *            caution.
+     * @since 4.0.7
+     */
+    public void pack1(Widget child, boolean resize, boolean shrink) {
+        GtkPaned.pack1(this, child, resize, shrink);
+    }
+
+    /**
+     * Adds a child Widget to the bottom (in case of a VPaned) or to the right
+     * (in case of an HPaned) pane. See
+     * {@link #pack1(Widget, boolean, boolean) pack1()} for details.
+     * 
+     * @since 4.0.7
+     */
+    public void pack2(Widget child, boolean resize, boolean shrink) {
+        GtkPaned.pack2(this, child, resize, shrink);
+    }
+
+    /**
+     * Get the child Widget in the top (in case of a VPaned) or in the left
+     * (in case of an HPaned) pane.
+     * 
+     * @since 4.0.7
+     */
+    public Widget getChild1() {
+        return GtkPaned.getChild1(this);
+    }
+
+    /**
+     * Get the child Widget at the bottom (in case of VPaned) or at the right
+     * (in case of HPaned) pane.
+     * 
+     * @since 4.0.7
+     */
+    public Widget getChild2() {
+        return GtkPaned.getChild2(this);
+    }
+
+    /**
+     * Sets the position of the divider between the two panes.
+     * 
+     * <p>
+     * Note that the main utility of a Paned is to let user to set the
+     * position, so in most cases you don't want to call this method. It can
+     * be useful to set the initial position, if you feel that the default
+     * value chosen by Gtk is not suitable for your application.
+     * 
+     * @param position
+     *            The position of the divider, in pixels. A negative value
+     *            means that the position is not being forced.
+     * @since 4.0.7
+     */
+    public void setPosition(int position) {
+        GtkPaned.setPosition(this, position);
+    }
+
+    /**
+     * Obtains the position of the divider between the two panes.
+     * 
+     * @return the position in pixels.
+     */
+    public int getPosition() {
+        return GtkPaned.getPosition(this);
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PaperSize.java b/src/bindings/org/gnome/gtk/PaperSize.java
new file mode 100644
index 0000000..e386c33
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PaperSize.java
@@ -0,0 +1,186 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * Representations of different sizes of paper used in printing operations.
+ * 
+ * <p>
+ * Usage is straight forward:
+ * 
+ * <pre>
+ * paper = PaperSize.A4;
+ * width = paper.getWidth(Unit.MM);
+ * height = paper.getHeight(Unit.MM);
+ * </pre>
+ * 
+ * <p>
+ * The √2 relationships between the various ISO sizes are shown in the
+ * following diagram (the imperialist paper sizes are included for
+ * comparison):
+ * 
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Paper_size"><img src=
+ * "http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/A_size_illustration2_with_letter_and_legal.svg/439px-A_size_illustration2_with_letter_and_legal.svg.png"
+ * border="0" width="439" height="599"></a><br>
+ * 
+ * <p>
+ * Constants for the two common page sizes are here. If you need one of the
+ * more obscure cases, see subclasses {@link InternationalPaperSize} or
+ * {@link NorthAmericanPaperSize}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ * @see <a href="http://en.wikipedia.org/wiki/Paper_size">Wikipedia's article
+ *      on paper sizes</a>
+ */
+/*
+ * This class has the two most common sizes, with the rest delegated off to
+ * subclasses. It would seem that loading a paper size causes a significant
+ * amount of initializing to go on in GTK, and it seems a bit silly to do all
+ * of that for each weirdo size when you're probably just here to get A4 or
+ * LETTER. If we're wrong about the cost (ie, if they're all already loaded by
+ * default) then the cost of having all the constants here would be far less.
+ */
+public class PaperSize extends Boxed
+{
+    protected PaperSize(long pointer) {
+        super(pointer);
+    }
+
+    protected final void release() {
+        GtkPaperSize.free(this);
+    }
+
+    /**
+     * Standard sheet size in use worldwide. Corresponds to a piece of paper
+     * 210 mm x 297 mm. See {@link InternationalPaperSize} for other ISO paper
+     * size constants.
+     */
+    public static final PaperSize A4 = new PaperSize("iso_a4");
+
+    /**
+     * Standard sheet size used in North America. Corresponds to a piece of
+     * paper which is roughly 216 mm x 279 mm (which is 8.5 inch x 11 inch in
+     * pre-SI units). See {@link NorthAmericanPaperSize} for other imperialist
+     * paper sizes.
+     */
+    public static final PaperSize LETTER = new PaperSize("na_letter");
+
+    private static PaperSize platform;
+
+    /**
+     * Returns the PaperSize corresponding to the default in effect for the
+     * current locale.
+     */
+    /*
+     * FUTURE it would be nice if this returned one of the already initialized
+     * constants above, although Boxeds aren't really something you can
+     * compare by identity, and in any case finding out what the default is
+     * implies creating a boxed anyway.
+     */
+    public static PaperSize getDefault() {
+        if (platform == null) {
+            platform = new PaperSize(null);
+        }
+        return platform;
+    }
+
+    /**
+     * Get a PaperSize corresponding to a PWG 5101.1-2002 paper size
+     * descriptor.
+     * 
+     * <p>
+     * <b>WARNING</b><br>
+     * <i>You're on your own to provide a correct descriptor if you use
+     * this!</i>
+     * 
+     * @since 4.0.10
+     */
+    protected PaperSize(String name) {
+        super(GtkPaperSize.createPaperSize(name));
+    }
+
+    /**
+     * Get the width of a piece of paper in the specified units. You can call
+     * this as:
+     * 
+     * <pre>
+     * w = paper.getWidth(Unit.MM);
+     * </pre>
+     * 
+     * or
+     * 
+     * <pre>
+     * w = paper.getWidth(Unit.POINTS);
+     * </pre>
+     * 
+     * depending on your need.
+     * 
+     * 
+     * @since 4.0.10
+     */
+    public double getWidth(Unit in) {
+        return GtkPaperSize.getWidth(this, in);
+    }
+
+    /**
+     * Get the height of a piece of paper in the specified units.
+     * 
+     * @since 4.0.10
+     */
+    public double getHeight(Unit in) {
+        return GtkPaperSize.getHeight(this, in);
+    }
+
+    public boolean equals(java.lang.Object obj) {
+        final PaperSize size;
+
+        if (!(obj instanceof PaperSize)) {
+            return false;
+        }
+        size = (PaperSize) obj;
+
+        return GtkPaperSize.isEqual(this, size);
+    }
+
+    public String getDisplayName() {
+        return GtkPaperSize.getDisplayName(this);
+    }
+
+    public String toString() {
+        return this.getClass().getSimpleName() + "'s " + getDisplayName();
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PathPriorityType.java b/src/bindings/org/gnome/gtk/PathPriorityType.java
new file mode 100644
index 0000000..fde0d88
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PathPriorityType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PathPriorityType extends Constant
+{
+    private PathPriorityType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PathType.java b/src/bindings/org/gnome/gtk/PathType.java
new file mode 100644
index 0000000..768eee5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PathType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PathType extends Constant
+{
+    private PathType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Plug.java b/src/bindings/org/gnome/gtk/Plug.java
new file mode 100644
index 0000000..9a81713
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Plug.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Plug extends Window
+{
+    protected Plug(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Plumbing.java b/src/bindings/org/gnome/gtk/Plumbing.java
new file mode 100644
index 0000000..d943432
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Plumbing.java
@@ -0,0 +1,38 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+public abstract class Plumbing extends org.gnome.gdk.Plumbing
+{
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/gtk/PolicyType.java b/src/bindings/org/gnome/gtk/PolicyType.java
new file mode 100644
index 0000000..c60f6e0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PolicyType.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants to determines when a scrollbar will be visible.
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public final class PolicyType extends Constant
+{
+    private PolicyType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Force the scrollbar to be always visible.
+     */
+    public static final PolicyType ALWAYS = new PolicyType(GtkPolicyType.ALWAYS, "ALWAYS");
+
+    /**
+     * The scrollbar will appear when necessary and disappear when the child
+     * widget is smaller than the allocated region.
+     */
+    public static final PolicyType AUTOMATIC = new PolicyType(GtkPolicyType.AUTOMATIC, "AUTOMATIC");
+
+    /**
+     * Prevent the scrollbar from ever appearing. You probably want to be
+     * fairly careful about choosing this as the user will have no way to get
+     * to the information that will likely be obscured as a result of turning
+     * off panning.
+     */
+    public static final PolicyType NEVER = new PolicyType(GtkPolicyType.NEVER, "NEVER");
+}
diff --git a/src/bindings/org/gnome/gtk/PositionType.java b/src/bindings/org/gnome/gtk/PositionType.java
new file mode 100644
index 0000000..bb670fa
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PositionType.java
@@ -0,0 +1,72 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Which edge of a Widget an adornment is placed at. These constants are used
+ * by Scale and Notebook to specify where the value is located or where the
+ * tabs will be placed (see {@link Scale#setValuePosition(PositionType)
+ * setValuePosition()} and {@link Notebook#setTabPosition(PositionType)
+ * setTabPosition()} respectively).
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class PositionType extends Constant
+{
+    private PositionType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Feature will be placed to the left side of the Widget.
+     */
+    public static final PositionType LEFT = new PositionType(GtkPositionType.LEFT, "LEFT");
+
+    /**
+     * Feature will be placed to the right side of the Widget.
+     */
+    public static final PositionType RIGHT = new PositionType(GtkPositionType.RIGHT, "RIGHT");
+
+    /**
+     * Feature will be placed above the Widget.
+     */
+    public static final PositionType TOP = new PositionType(GtkPositionType.TOP, "TOP");
+
+    /**
+     * Feature will be placed below the Widget.
+     */
+    public static final PositionType BOTTOM = new PositionType(GtkPositionType.BOTTOM, "BOTTOM");
+}
diff --git a/src/bindings/org/gnome/gtk/PrintContext.java b/src/bindings/org/gnome/gtk/PrintContext.java
new file mode 100644
index 0000000..ff3ebdf
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintContext.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PrintContext extends Object
+{
+    protected PrintContext(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintDuplex.java b/src/bindings/org/gnome/gtk/PrintDuplex.java
new file mode 100644
index 0000000..f8fca3e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintDuplex.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintDuplex extends Constant
+{
+    private PrintDuplex(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintError.java b/src/bindings/org/gnome/gtk/PrintError.java
new file mode 100644
index 0000000..22eb595
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintError extends Constant
+{
+    private PrintError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintOperation.java b/src/bindings/org/gnome/gtk/PrintOperation.java
new file mode 100644
index 0000000..114cfe1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintOperation.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PrintOperation extends Object implements PrintOperationPreview
+{
+    protected PrintOperation(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintOperationAction.java b/src/bindings/org/gnome/gtk/PrintOperationAction.java
new file mode 100644
index 0000000..a2eb178
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintOperationAction.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintOperationAction extends Constant
+{
+    private PrintOperationAction(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintOperationPreview.java b/src/bindings/org/gnome/gtk/PrintOperationPreview.java
new file mode 100644
index 0000000..26ccec3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintOperationPreview.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface PrintOperationPreview
+{
+}
diff --git a/src/bindings/org/gnome/gtk/PrintOperationResult.java b/src/bindings/org/gnome/gtk/PrintOperationResult.java
new file mode 100644
index 0000000..716f70e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintOperationResult.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintOperationResult extends Constant
+{
+    private PrintOperationResult(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintPages.java b/src/bindings/org/gnome/gtk/PrintPages.java
new file mode 100644
index 0000000..2a3537a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintPages.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintPages extends Constant
+{
+    private PrintPages(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintQuality.java b/src/bindings/org/gnome/gtk/PrintQuality.java
new file mode 100644
index 0000000..276a9d4
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintQuality.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintQuality extends Constant
+{
+    private PrintQuality(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintSettings.java b/src/bindings/org/gnome/gtk/PrintSettings.java
new file mode 100644
index 0000000..5d56d12
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintSettings.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PrintSettings extends Object
+{
+    protected PrintSettings(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrintStatus.java b/src/bindings/org/gnome/gtk/PrintStatus.java
new file mode 100644
index 0000000..1a7e763
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrintStatus.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintStatus extends Constant
+{
+    private PrintStatus(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/PrivateFlags.java b/src/bindings/org/gnome/gtk/PrivateFlags.java
new file mode 100644
index 0000000..b1e171f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/PrivateFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrivateFlags extends Constant
+{
+    private PrivateFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ProgressBar.java b/src/bindings/org/gnome/gtk/ProgressBar.java
new file mode 100644
index 0000000..c55f63a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ProgressBar.java
@@ -0,0 +1,203 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Widget that displays the progress of a task as a visual bar. This is
+ * principally used to give feedback to a user that things are actually
+ * happening when some computationally intensive or long running task is
+ * taking place. You can use a ProgressBar in two ways. Usually you know what
+ * fraction of a task is complete and that is what you want to display as a
+ * steadily increasing bar. On the other hand, if the total duration of the
+ * task is unknown or unpredictable, you can still indicate progress is being
+ * made by having the bar "pulse" back and forth.
+ * 
+ * <p>
+ * Note that like most things in GTK, most of the code that actually updates
+ * the ProgressBar will not run until control is returned to the main loop.
+ * Keep that in mind if you're wondering why the bar hasn't "updated".
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @author Bruno Dusausoy
+ * @since 4.0.3
+ */
+public class ProgressBar extends Widget implements Orientable
+{
+
+    protected ProgressBar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Instantiate a new ProgressBar.
+     * 
+     * @since 4.0.3
+     */
+    public ProgressBar() {
+        super(GtkProgressBar.createProgressBar());
+    }
+
+    /**
+     * Cause text to appear superimposed on the ProgressBar itself.
+     * 
+     * @param text
+     *            Use <code>null</code> if you want to clear any text there.
+     * 
+     * @since 4.0.3
+     */
+    public void setText(String text) {
+        GtkProgressBar.setText(this, text);
+    }
+
+    /**
+     * Getting the text superimposed on the ProgressBar itself.
+     * 
+     * @since 4.0.10
+     */
+    public String getText() {
+        return GtkProgressBar.getText(this);
+    }
+
+    /**
+     * Sets whether the progressbar will show text superimposed over the bar.
+     * To make a progress bar that is styled and sized suitably for containing
+     * text you should call the {@link setText(String)} method with an empty
+     * String.
+     * 
+     * @since 4.1.2
+     */
+    public void setShowText(boolean value) {
+        GtkProgressBar.setShowText(this, value);
+    }
+
+    /**
+     * Tells whether or not the progress bar is able to show text.
+     * 
+     * @since 4.1.2
+     */
+    public boolean showsText() {
+        return GtkProgressBar.getShowText(this);
+    }
+
+    /**
+     * Set the fraction of the ProgressBar that shows as completed or
+     * "filled-in".
+     * 
+     * @param fraction
+     *            a value between 0.0 (not started) and 1.0 (fully complete)
+     * @throws IllegalArgumentException
+     *             If fraction is greater than 1.0 or less than 0.0
+     * @since 4.0.3
+     */
+    public void setFraction(double fraction) {
+        if ((fraction < 0.0) || (fraction > 1.0)) {
+            throw new IllegalArgumentException("fraction must be between 0.0 and 1.0, inclusive.");
+        }
+        GtkProgressBar.setFraction(this, fraction);
+    }
+
+    /**
+     * Causes the ProgressBar to enter "activity mode", used to
+     * indicate that the application is making progress but in a way that
+     * can't be strictly quantized.
+     * 
+     * <p>
+     * An example of this is web: most URLs addressable via
+     * <code>http://</code> are files of known size, and so when downloading
+     * them, a web browser can report exactly what percentage has been
+     * downloaded relative to the file size that was psssed in the initial
+     * HTTP header. Dynamic web pages, on the other hand (ie, your average PHP
+     * or JSP script), do not have a known size at the time the HTTP headers
+     * are sent, and so the web browser doesn't know ahead of time how many
+     * bytes are on the way. In this scenario, all the application can do is
+     * "pulse" the ProgressBar back and forth to indicate that traffic is
+     * continuing to arrive but that the percentage complete is not known, and
+     * that is what this method is for.
+     * 
+     * <p>
+     * Each time this method is invoked, the a little block inside the
+     * ProgressBar is moved a small amount. You should therefore call this
+     * method fairly frequently (ie with reasonably small time intervals) to
+     * cause the effect of the block moving back and forward along the
+     * ProgressBar.
+     * 
+     * @since 4.0.7
+     */
+    public void pulse() {
+        GtkProgressBar.pulse(this);
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+
+    /**
+     * Set the progress bar pulse step. That means the amount of progress to
+     * perform each time {@link ProgressBar#pulse() pulse()}; is called.
+     * 
+     * @param fraction
+     *            a value between 0.0 and 1.0
+     * @throws IllegalArgumentException
+     *             If fraction is greater than 1.0 or less than 0.0
+     * @since 4.0.10
+     */
+    public void setPulseStep(double fraction) {
+        if ((fraction < 0.0) || (fraction > 1.0)) {
+            throw new IllegalArgumentException("fraction must be between 0.0 and 1.0, inclusive.");
+        }
+        GtkProgressBar.setPulseStep(this, fraction);
+    }
+
+    /**
+     * Get the current progress bar pulse step
+     * 
+     * @since 4.0.10
+     */
+    public double getPulseStep() {
+        return GtkProgressBar.getPulseStep(this);
+    }
+
+    /**
+     * Get the current progress bar fraction
+     * 
+     * @since 4.0.10
+     */
+    public double getFraction() {
+        return GtkProgressBar.getFraction(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ProgressBarOrientation.java b/src/bindings/org/gnome/gtk/ProgressBarOrientation.java
new file mode 100644
index 0000000..c825f0a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ProgressBarOrientation.java
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants that specify the direction a ProgressBar is to progress. The
+ * default you'll be accustomed to seeing is {@link #LEFT_TO_RIGHT
+ * LEFT_TO_RIGHT}.
+ * 
+ * @since 4.0.10
+ * @author Miloud Bel
+ */
+public final class ProgressBarOrientation extends Constant
+{
+    /**
+     * Perform progress from left to right
+     */
+    public static final ProgressBarOrientation LEFT_TO_RIGHT = new ProgressBarOrientation(
+            GtkProgressBarOrientation.LEFT_TO_RIGHT, "LEFT_TO_RIGHT");
+
+    /**
+     * Perform progress from right to left
+     */
+    public static final ProgressBarOrientation RIGHT_TO_LEFT = new ProgressBarOrientation(
+            GtkProgressBarOrientation.RIGHT_TO_LEFT, "RIGHT_TO_LEFT");
+
+    /**
+     * Perform progress from top to bottom
+     */
+    public static final ProgressBarOrientation TOP_TO_BOTTOM = new ProgressBarOrientation(
+            GtkProgressBarOrientation.TOP_TO_BOTTOM, "TOP_TO_BOTTOM");
+
+    /**
+     * Perform progress from bottom to top
+     */
+    public static final ProgressBarOrientation BOTTOM_TO_TOP = new ProgressBarOrientation(
+            GtkProgressBarOrientation.BOTTOM_TO_TOP, "BOTTOM_TO_TOP");
+
+    private ProgressBarOrientation(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/QuestionMessageDialog.java b/src/bindings/org/gnome/gtk/QuestionMessageDialog.java
new file mode 100644
index 0000000..2aa98a7
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/QuestionMessageDialog.java
@@ -0,0 +1,85 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Dialog properly preconfigured to ask a yes or no question of the user.
+ * 
+ * <p>
+ * This is a modal MessageDialog of type {@link MessageType#QUESTION QUESTION}
+ * with an "Yes" and a "No" Button.
+ * 
+ * <p>
+ * You would typically use this in conjunction with <code>run()</code> as
+ * follows:
+ * 
+ * <pre>
+ * final Window main;
+ * final Dialog question;
+ * final ResponseType response;
+ * 
+ * main = new Window();
+ * ...
+ * question = new QuestionMessageDialog(main, "File exists!", "Do you really want to overwrite it?");
+ * response = question.run();
+ * 
+ * question.hide();
+ * if (response == ResponseType.YES) {
+ *     // save file
+ * } else {
+ *     // cancel and return to application
+ * }
+ * </pre>
+ * 
+ * which will result in something like:
+ * 
+ * <p>
+ * <img src="QuestionMessageDialog.png">
+ * 
+ * <p>
+ * (depending on your theme, icon set, window manager preferences, of course).
+ * Notable here are the "question mark" icon and that the "No" Button has
+ * focus by default.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class QuestionMessageDialog extends MessageDialog
+{
+    public QuestionMessageDialog(Window parent, String primary, String secondary) {
+        super(parent, true, MessageType.QUESTION, ButtonsType.YES_NO, primary);
+        if (secondary != null) {
+            this.setSecondaryText(secondary);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RadioAction.java b/src/bindings/org/gnome/gtk/RadioAction.java
new file mode 100644
index 0000000..41a7877
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RadioAction.java
@@ -0,0 +1,177 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A <code>RadioAction</code> is an equivalent of a {@link Action} but used in
+ * general to create {@link RadioMenuItem}. It has an "active" state
+ * which indicates whether the action has been checked or not.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.15
+ */
+public class RadioAction extends ToggleAction
+{
+    /*
+     * Reference keeps our group mechanism in scope, and powers getGroup()
+     */
+    private RadioGroup enclosingGroup;
+
+    protected RadioAction(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new RadioAction, and connect a handler to its
+     * <code>RadioAction.Toggled</code> signal.
+     * 
+     * @param name
+     *            A unique name for the RadioAction.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the RadioAction. Also
+     *            localized.
+     * @param stock
+     *            The stock icon to display in proxy Widgets.
+     * @since 4.0.15
+     */
+    /*
+     * FIXME describe the implications of different choices for name.
+     */
+    public RadioAction(RadioGroup group, String name, String label, String tooltip, Stock stock) {
+        this(GtkRadioAction.createRadioAction(name, label, tooltip, stock.getStockId(), 0));
+        setGroup(group);
+    }
+
+    /**
+     * Create a new RadioAction from a Stock item. The message and tooltip
+     * will be supplied by GTK automatically.
+     * 
+     * @since 4.0.15
+     */
+    public RadioAction(RadioGroup group, String name, Stock stock) {
+        this(GtkRadioAction.createRadioAction(name, null, null, stock.getStockId(), 0));
+        setGroup(group);
+    }
+
+    /**
+     * Create a new RadioAction based on a Stock item, and connect a handler
+     * to its <code>RadioAction.Toggled</code> signal. Complements the
+     * {@link #RadioAction(RadioGroup, String, Stock) <init>(RadioGroup,
+     * String, Stock)} constructor.
+     * 
+     * @since 4.0.15
+     */
+    public RadioAction(RadioGroup group, String name, Stock stock, RadioAction.Toggled handler) {
+        this(GtkRadioAction.createRadioAction(name, null, null, stock.getStockId(), 0));
+        setGroup(group);
+        connect(handler);
+    }
+
+    /**
+     * Create a new RadioAction, and connect a handler to its
+     * <code>RadioAction.Toggled</code> signal.
+     * 
+     * @param name
+     *            A unique name for the RadioAction.
+     * @param label
+     *            The label that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param handler
+     *            A handler to connect to the <code>RadioAction.Toggled</code>
+     *            signal. Usually will will start from here the operation
+     *            related to the Action.
+     * @since 4.0.15
+     */
+    public RadioAction(RadioGroup group, String name, String label, RadioAction.Toggled handler) {
+        this(GtkRadioAction.createRadioAction(name, label, null, null, 0));
+        setGroup(group);
+        connect(handler);
+    }
+
+    /**
+     * Create a new RadioAction.
+     * 
+     * @param name
+     *            A unique name for the RadioAction.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @since 4.0.15
+     */
+    public RadioAction(RadioGroup group, String name, String label) {
+        this(GtkRadioAction.createRadioAction(name, label, null, null, 0));
+        setGroup(group);
+    }
+
+    /*
+     * This private method is used into the constructor. Like all other
+     * RadioThings, the current way to manage a group sucks. So, again we made
+     * our own magic.
+     */
+    private void setGroup(RadioGroup group) {
+        final RadioAction first;
+
+        first = (RadioAction) group.getMember();
+
+        /*
+         * Add the action to our group
+         */
+        group.setMember(this);
+        enclosingGroup = group;
+
+        /*
+         * This is the first the first action
+         */
+        if (first == null) {
+            GtkRadioAction.setGroup(this, null);
+        } else {
+            /*
+             * We use the last action of our group
+             */
+            setPropertyObject("group", first);
+        }
+    }
+
+    /**
+     * Get the RadioActionGroup that encloses this RadioAction and the others
+     * that belonging to the same mutual exclusion group.
+     * 
+     * @since 4.0.15
+     */
+    public RadioGroup getGroup() {
+        return enclosingGroup;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RadioButton.java b/src/bindings/org/gnome/gtk/RadioButton.java
new file mode 100644
index 0000000..eb1270d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RadioButton.java
@@ -0,0 +1,151 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A special kind of CheckButton used to select from a mutually exclusive set
+ * of options. <img src="RadioButton.png" class="snapshot">
+ * 
+ * <p>
+ * A RadioButton is somewhat similar to a CheckButton, but it is shown as an
+ * empty circle (rather than an empty square) and the selected Button in the
+ * group us shown with a dot inside (rather than a check mark).
+ * 
+ * <p>
+ * However, while a CheckButton can be used alone to choose between two
+ * states, a RadioButton is used together in a group of other (related)
+ * RadioButtons to offer a choice of one of those Buttons. Only a single
+ * Button in a group can the active at any one time.
+ * 
+ * <p>
+ * To create a group of RadioButtons, you first create a {@link RadioGroup}
+ * and then construct the RadioButtons passing them that group object.
+ * 
+ * <pre>
+ * RadioGroup group;
+ * RadioButton opt1, opt2, opt3;
+ * 
+ * group = new RadioGroup();
+ * 
+ * opt1 = new RadioButton(group, "Option _1");
+ * opt2 = new RadioButton(group, "Option _2");
+ * opt3 = new RadioButton(group, "Option _3");
+ * </pre>
+ * 
+ * You can get the active option at any time with RadioButtonGroup's
+ * {@link RadioGroup#getActive() getActive()} method. And while you can still
+ * connect a handler to the ToggleButton's
+ * {@link org.gnome.gtk.ToggleButton.TOGGLED TOGGLED} signal, the
+ * {@link org.gnome.gtk.RadioGroup.GroupToggled GROUP_TOGGLED} signal is
+ * provided as a convenience.
+ * 
+ * <p>
+ * You should generally place related RadioButtons together, better if
+ * disposed vertically, as this makes them easier to scan visually - in other
+ * words, pack them into a {@link VBox}. It is also frequently a good idea to
+ * place a descriptive Label at the top of the Container holding the
+ * RadioButtons. A {@link Frame} is a possible way to fit both requirements,
+ * as you can use it to place the RadioButtons altogether with a Label at the
+ * top:
+ * 
+ * <pre>
+ * Frame option;
+ * VBox buttons;
+ * 
+ * // Create a Frame with a descriptive Label and without outline...
+ * option = new Frame("Option:");
+ * option.setBorderWidth(3);
+ * option.setShadowType(ShadowType.NONE);
+ * 
+ * // ... and with a VBox to layout the RadioButtons
+ * buttons = new VBox(false, 2);
+ * option.add(buttons);
+ * 
+ * buttons.add(opt1);
+ * buttons.add(opt2);
+ * buttons.add(opt3);
+ * </pre>
+ * 
+ * <p>
+ * In your applications you will usually use RadioButtons you have two or more
+ * mutually exclusive values for an option. Note that if such values are
+ * equivalent to the concept of enable/disable a given option,
+ * {@link CheckButton} or {@link ToggleButton} are probably a better
+ * alternative. In the same way, if you have too many possible values, you
+ * should consider using a {@link ComboBox} instead, or even think about the
+ * possibility of simplifying your user interface.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class RadioButton extends CheckButton
+{
+    /*
+     * Reference keeps our group mechanism in scope, and powers getGroup()
+     */
+    private RadioGroup enclosingGroup;
+
+    protected RadioButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new RadioButton with the given label. It will be placed in its
+     * own group, you submit it later to the constructors of other Buttons
+     * that should be in the same group.
+     * 
+     * @param label
+     *            The label that will be placed near the RadioButton. If the
+     *            text contains an underscore (<code>_<code>) it will be taken 
+     *            to be the mnemonic for the Widget.
+     * @since 4.0.7
+     */
+    public RadioButton(RadioGroup group, String label) {
+        super(GtkRadioButton.createRadioButtonWithMnemonicFromWidget((RadioButton) group.getMember(),
+                label));
+        group.setMember(this);
+        enclosingGroup = group;
+    }
+
+    /**
+     * Get the RadioGroup that encloses this RadioButton and the others that
+     * belonging to the same mutual exclusion group.
+     * 
+     * @since 4.0.7
+     */
+    public RadioGroup getGroup() {
+        return enclosingGroup;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RadioGroup.java b/src/bindings/org/gnome/gtk/RadioGroup.java
new file mode 100644
index 0000000..431e5b5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RadioGroup.java
@@ -0,0 +1,253 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * This class was originally RadioButtonGroup and specifically for instances
+ * of RadioButton only, it is now extended to everything that displays
+ * "radio" behaviour.
+ */
+
+import org.gnome.glib.Object;
+
+/**
+ * A group of RadioActions or Radio widgets sharing the mutually exclusive
+ * relationship that only one of the group member can be selected at a time.
+ * 
+ * <p>
+ * A group can contain <b>only one</b> type of object. It must be
+ * {@link RadioAction}, {@link RadioButton}, {@link RadioMenuItem} or
+ * {@link RadioToolButton}.
+ * 
+ * @author Andrew Cowie
+ * @author Mario Torre
+ * @author Guillaume Mazoyer
+ * @since 4.0.15
+ */
+/*
+ * This acts as a wrapper to allow us to avoid the complexity of the GSList
+ * used as GtkRadioThing's group property and the fact that its constructors
+ * are polluted with C API sugar.
+ */
+public class RadioGroup
+{
+    Object member;
+
+    public RadioGroup() {
+        member = null;
+    }
+
+    void setMember(Object object) {
+        if ((object instanceof RadioAction) || (object instanceof RadioButton)
+                || (object instanceof RadioMenuItem) || (object instanceof RadioToolButton)) {
+            member = object;
+        } else {
+            throw new IllegalArgumentException("object not a RadioThing");
+        }
+
+    }
+
+    Object getMember() {
+        return member;
+    }
+
+    private void checkState() {
+        if (member == null) {
+            throw new IllegalStateException(
+                    "Can't use a RadioGroup until you've added one or more Radio widgets or RadioActions to it");
+        }
+    }
+
+    /**
+     * Signal that is emitted each time the active action or widget of the
+     * group is changed.
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.0.15
+     */
+    public interface GroupToggled
+    {
+        /**
+         * Called when user changes the active action or widget in a group.
+         * 
+         * @param source
+         *            The action or widget that is now active.
+         */
+        public void onGroupToggled(Object source);
+    }
+
+    /**
+     * Hook up a handler to the <code>RadioGroup.GroupToggled</code> signal.
+     * 
+     * @since 4.0.15
+     */
+    public void connect(RadioGroup.GroupToggled handler) {
+        if (member instanceof RadioAction) {
+            ToggleActionHandler toggleHandler = new ToggleActionHandler(handler);
+            RadioAction[] group = GtkRadioAction.getGroup((RadioAction) member);
+
+            for (RadioAction action : group) {
+                action.connect(toggleHandler);
+            }
+        } else if (member instanceof RadioButton) {
+            ToggleButtonHandler toggleHandler = new ToggleButtonHandler(handler);
+            RadioButton[] group = GtkRadioButton.getGroup((RadioButton) member);
+
+            for (RadioButton button : group) {
+                button.connect(toggleHandler);
+            }
+        } else if (member instanceof RadioMenuItem) {
+            ToggleMenuItemHandler toggleHandler = new ToggleMenuItemHandler(handler);
+            RadioMenuItem[] group = GtkRadioMenuItem.getGroup((RadioMenuItem) member);
+
+            for (RadioMenuItem item : group) {
+                item.connect(toggleHandler);
+            }
+        }
+    }
+
+    /*
+     * Custom handler needed to implement RadioGroup.GroupToggled custom
+     * signal for RadioAction.
+     */
+    private static final class ToggleActionHandler implements ToggleAction.Toggled
+    {
+        private final RadioGroup.GroupToggled handler;
+
+        private ToggleActionHandler(RadioGroup.GroupToggled handler) {
+            this.handler = handler;
+        }
+
+        public void onToggled(ToggleAction source) {
+            if (source.getActive()) {
+                handler.onGroupToggled(source);
+            }
+        }
+    }
+
+    /*
+     * Custom handler needed to implement RadioGroup.GroupToggled custom
+     * signal for RadioButton.
+     */
+    private static final class ToggleButtonHandler implements ToggleButton.Toggled
+    {
+        private final RadioGroup.GroupToggled handler;
+
+        private ToggleButtonHandler(RadioGroup.GroupToggled handler) {
+            this.handler = handler;
+        }
+
+        public void onToggled(ToggleButton source) {
+            if (source.getActive()) {
+                handler.onGroupToggled(source);
+            }
+        }
+    }
+
+    /*
+     * Custom handler needed to implement RadioGroup.GroupToggled custom
+     * signal for CheckMenuItem.
+     */
+    private static final class ToggleMenuItemHandler implements CheckMenuItem.Toggled
+    {
+        private final RadioGroup.GroupToggled handler;
+
+        private ToggleMenuItemHandler(RadioGroup.GroupToggled handler) {
+            this.handler = handler;
+        }
+
+        public void onToggled(CheckMenuItem source) {
+            if (source.getActive()) {
+                handler.onGroupToggled(source);
+            }
+        }
+    }
+
+    /**
+     * Indicate which RadioAction or Radio widget in this RadioGroup is
+     * currently selected active.
+     * 
+     * <p>
+     * This will return <code>null</code> if no RadioAction or Radio widget is
+     * selected, but note that this is generally indicative of something wrong
+     * with the programming; generally a RadioGroup should always have at
+     * least one RadioAction or Radio widget selected.
+     * 
+     * @since 4.0.15
+     */
+    public Object getActive() {
+        Object[] group;
+        RadioAction action;
+        RadioButton button;
+        RadioMenuItem item;
+
+        checkState();
+
+        group = null;
+
+        if (member instanceof RadioAction) {
+            action = (RadioAction) member;
+            group = GtkRadioAction.getGroup(action);
+        } else if (member instanceof RadioButton) {
+            button = (RadioButton) member;
+            group = GtkRadioButton.getGroup(button);
+        } else if (member instanceof RadioMenuItem) {
+            item = (RadioMenuItem) member;
+            group = GtkRadioMenuItem.getGroup(item);
+        }
+
+        for (Object object : group) {
+            if (object instanceof RadioAction) {
+                action = (RadioAction) object;
+
+                if (action.getActive()) {
+                    return action;
+                }
+            } else if (object instanceof RadioButton) {
+                button = (RadioButton) object;
+
+                if (button.getActive()) {
+                    return button;
+                }
+            } else if (object instanceof RadioMenuItem) {
+                item = (RadioMenuItem) object;
+
+                if (item.getActive()) {
+                    return item;
+                }
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RadioMenuItem.java b/src/bindings/org/gnome/gtk/RadioMenuItem.java
new file mode 100644
index 0000000..62b3c2e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RadioMenuItem.java
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A special kind of CheckMenuItem used to select from a mutually exclusive
+ * set of options.
+ * 
+ * <p>
+ * A RadioMenuItem is somewhat similar to a CheckMenuItem, but it is shown as
+ * an empty circle (rather than an empty square) and the selected MenuItem in
+ * the group us shown with a dot inside (rather than a check mark).
+ * 
+ * <p>
+ * However, while a CheckMenuItem can be used alone to choose between two
+ * states, a RadioMenuItem is used together in a group of other (related)
+ * RadioMenuItems to offer a choice of one of those MenuItems. Only a single
+ * MenuItem in a group can the active at any one time.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.15
+ */
+public class RadioMenuItem extends CheckMenuItem
+{
+    /*
+     * Reference keeps our group mechanism in scope, and powers getGroup()
+     */
+    private RadioGroup enclosingGroup;
+
+    protected RadioMenuItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new RadioMenuItem with the given label. It will be placed in
+     * its own group, you submit it later to the constructors of other
+     * MenuItems that should be in the same group.
+     * 
+     * @param label
+     *            The label that will be placed near the RadioMenuItem. If the
+     *            text contains an underscore (<code>_</code>) it will be
+     *            taken to be the mnemonic for the Widget.
+     * @since 4.0.15
+     */
+    public RadioMenuItem(RadioGroup group, String label) {
+        super(createFirstOrNext(group, label));
+        group.setMember(this);
+        enclosingGroup = group;
+    }
+
+    private static long createFirstOrNext(RadioGroup group, String label) {
+        final RadioMenuItem first;
+
+        first = (RadioMenuItem) group.getMember();
+
+        if (first == null) {
+            return GtkRadioMenuItem.createRadioMenuItemWithMnemonic(null, label);
+        } else {
+            return GtkRadioMenuItem.createRadioMenuItemWithMnemonicFromWidget(first, label);
+        }
+    }
+
+    /**
+     * Get the RadioMenuItemGroup that encloses this RadioMenuItem and the
+     * others that belonging to the same mutual exclusion group.
+     * 
+     * @since 4.0.15
+     */
+    public RadioGroup getGroup() {
+        return enclosingGroup;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RadioToolButton.java b/src/bindings/org/gnome/gtk/RadioToolButton.java
new file mode 100644
index 0000000..2003c02
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RadioToolButton.java
@@ -0,0 +1,110 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A <code>RadioToolButton</code> is a {@link ToolItem} that contains a
+ * {@link RadioButton}. It is a part of a group of {@link ToggleButton
+ * ToggleButtons} where only one button can be active at a time.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.15
+ */
+public class RadioToolButton extends ToggleToolButton
+{
+    /*
+     * Reference keeps our group mechanism in scope, and powers getGroup()
+     */
+    private RadioGroup enclosingGroup;
+
+    protected RadioToolButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new RadioToolButton and add it to a RadioGroup.
+     * 
+     * @since 4.0.15
+     */
+    public RadioToolButton(RadioGroup group) {
+        super(createFirstOrNext(group));
+        group.setMember(this);
+        enclosingGroup = group;
+    }
+
+    /**
+     * Create a new RadioToolButton using a {@link Stock Stock item} and add
+     * it to a RadioGroup.
+     * 
+     * @since 4.0.15
+     */
+    public RadioToolButton(RadioGroup group, Stock stock) {
+        super(createFirstOrNext(group, stock));
+        group.setMember(this);
+        enclosingGroup = group;
+    }
+
+    private static long createFirstOrNext(RadioGroup group) {
+        final RadioToolButton first;
+
+        first = (RadioToolButton) group.getMember();
+
+        if (first == null) {
+            return GtkRadioToolButton.createRadioToolButton(null);
+        } else {
+            return GtkRadioToolButton.createRadioToolButtonFromWidget(first);
+        }
+    }
+
+    private static long createFirstOrNext(RadioGroup group, Stock stock) {
+        final RadioToolButton first;
+
+        first = (RadioToolButton) group.getMember();
+
+        if (first == null) {
+            return GtkRadioToolButton.createRadioToolButtonFromStock(null, stock.getStockId());
+        } else {
+            return GtkRadioToolButton.createRadioToolButtonWithStockFromWidget(first, stock.getStockId());
+        }
+    }
+
+    /**
+     * Get the RadioGroup that encloses this RadioToolButton and the others
+     * that belonging to the same mutual exclusion group.
+     * 
+     * @since 4.0.15
+     */
+    public RadioGroup getGroup() {
+        return enclosingGroup;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Range.java b/src/bindings/org/gnome/gtk/Range.java
new file mode 100644
index 0000000..bd0bcc0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Range.java
@@ -0,0 +1,128 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Base class for Widgets which present an adjustable quantity in some form of
+ * slider. The most obvious feature of this class is the ability to manage the
+ * "value" being shown by the Widget, but there are also facilities for
+ * exercising fine-grained control over the behaviour of the Widget when the
+ * user attempts to adjust the slider.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+/*
+ * TODO Add coverage of the step and increment controls, obviously. As I
+ * recall, the interactions of these with Adjustment are more than complex, so
+ * please test carefully and document your experiences well.
+ */
+public abstract class Range extends Widget implements Orientable
+{
+    protected Range(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get whether or not the rate scale of this Range is inverted; see
+     * {@link #setInverted(boolean) setInverted()}.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getInverted() {
+        return GtkRange.getInverted(this);
+    }
+
+    /**
+     * Inverts the way the value changes when moving the slider.
+     * 
+     * <p>
+     * Ranges normally move from lower to higher values as the slider moves
+     * from top to bottom or left to right. Inverted ranges have higher values
+     * at the top or on the right rather than on the bottom or left.
+     * 
+     * @since 4.0.12
+     */
+    public void setInverted(boolean setting) {
+        GtkRange.setInverted(this, setting);
+    }
+
+    /**
+     * Retrieve the value currently indicated by this Range instance.
+     * 
+     * @since 4.0.6
+     */
+    public double getValue() {
+        return GtkRange.getValue(this);
+    }
+
+    /**
+     * Change the value showingin the Range. As you would expect, the
+     * <code>Range.ValueChanged</code> signal will be emitted if the new value
+     * is different from the present setting.
+     * 
+     * @since 4.0.6
+     */
+    public void setValue(double value) {
+        GtkRange.setValue(this, value);
+    }
+
+    /**
+     * The value showing in the Range instance has changed.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface ValueChanged extends GtkRange.ValueChangedSignal
+    {
+        public void onValueChanged(Range source);
+    }
+
+    /**
+     * Connect a <code>Range.ValueChanged</code> handler to this Range
+     * instance.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Range.ValueChanged handler) {
+        GtkRange.connect(this, handler, false);
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RcFlags.java b/src/bindings/org/gnome/gtk/RcFlags.java
new file mode 100644
index 0000000..67d90af
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RcFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RcFlags extends Constant
+{
+    private RcFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RcStyle.java b/src/bindings/org/gnome/gtk/RcStyle.java
new file mode 100644
index 0000000..37c7695
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RcStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RcStyle extends Object
+{
+    protected RcStyle(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RcTokenType.java b/src/bindings/org/gnome/gtk/RcTokenType.java
new file mode 100644
index 0000000..cf1e836
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RcTokenType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RcTokenType extends Constant
+{
+    private RcTokenType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentAction.java b/src/bindings/org/gnome/gtk/RecentAction.java
new file mode 100644
index 0000000..588574d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentAction.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RecentAction extends Action
+{
+    protected RecentAction(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentChooser.java b/src/bindings/org/gnome/gtk/RecentChooser.java
new file mode 100644
index 0000000..80ffc73
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentChooser.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface RecentChooser
+{
+}
diff --git a/src/bindings/org/gnome/gtk/RecentChooserDialog.java b/src/bindings/org/gnome/gtk/RecentChooserDialog.java
new file mode 100644
index 0000000..ebac458
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentChooserDialog.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RecentChooserDialog extends Dialog implements RecentChooser
+{
+    protected RecentChooserDialog(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentChooserError.java b/src/bindings/org/gnome/gtk/RecentChooserError.java
new file mode 100644
index 0000000..c4a2eca
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentChooserError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RecentChooserError extends Constant
+{
+    private RecentChooserError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentChooserMenu.java b/src/bindings/org/gnome/gtk/RecentChooserMenu.java
new file mode 100644
index 0000000..e333265
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentChooserMenu.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RecentChooserMenu extends Menu implements RecentChooser
+{
+    protected RecentChooserMenu(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentChooserWidget.java b/src/bindings/org/gnome/gtk/RecentChooserWidget.java
new file mode 100644
index 0000000..95fae5c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentChooserWidget.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RecentChooserWidget extends VBox implements RecentChooser
+{
+    protected RecentChooserWidget(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentFilter.java b/src/bindings/org/gnome/gtk/RecentFilter.java
new file mode 100644
index 0000000..dfabf2e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentFilter.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RecentFilter extends Object
+{
+    protected RecentFilter(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentFilterFlags.java b/src/bindings/org/gnome/gtk/RecentFilterFlags.java
new file mode 100644
index 0000000..b3e0812
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentFilterFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RecentFilterFlags extends Flag
+{
+    private RecentFilterFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentInfo.java b/src/bindings/org/gnome/gtk/RecentInfo.java
new file mode 100644
index 0000000..c97c849
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentInfo.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RecentInfo extends Boxed
+{
+    protected RecentInfo(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentManager.java b/src/bindings/org/gnome/gtk/RecentManager.java
new file mode 100644
index 0000000..7443c83
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentManager.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class RecentManager extends Object
+{
+    protected RecentManager(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentManagerError.java b/src/bindings/org/gnome/gtk/RecentManagerError.java
new file mode 100644
index 0000000..4791ff9
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentManagerError.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RecentManagerError extends Constant
+{
+    private RecentManagerError(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RecentSortType.java b/src/bindings/org/gnome/gtk/RecentSortType.java
new file mode 100644
index 0000000..be620b8
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RecentSortType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RecentSortType extends Constant
+{
+    private RecentSortType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/RegionFlags.java b/src/bindings/org/gnome/gtk/RegionFlags.java
new file mode 100644
index 0000000..d5d0f4a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/RegionFlags.java
@@ -0,0 +1,80 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Describe a region within a widget.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class RegionFlags extends Constant
+{
+    protected RegionFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * This is a constant specific to the binding in order to make the return
+     * value of {@link StyleContext#hasRegion(StyleRegion)} consistent even if
+     * the context doesn't contain the given {@link StyleRegion}.
+     */
+    public static final RegionFlags NULL = new RegionFlags(-1, "NULL");
+
+    /**
+     * Region has an even number within a set.
+     */
+    public static final RegionFlags EVEN = new RegionFlags(GtkRegionFlags.EVEN, "EVEN");
+
+    /**
+     * Region has an odd number within a set.
+     */
+    public static final RegionFlags ODD = new RegionFlags(GtkRegionFlags.ODD, "ODD");
+
+    /**
+     * Region is the first one within a set.
+     */
+    public static final RegionFlags FIRST = new RegionFlags(GtkRegionFlags.FIRST, "FIRST");
+
+    /**
+     * Region is the last one within a set.
+     */
+    public static final RegionFlags LAST = new RegionFlags(GtkRegionFlags.LAST, "LAST");
+
+    /**
+     * Region is part of a sorted area.
+     */
+    public static final RegionFlags SORTED = new RegionFlags(GtkRegionFlags.SORTED, "SORTED");
+}
diff --git a/src/bindings/org/gnome/gtk/ReliefStyle.java b/src/bindings/org/gnome/gtk/ReliefStyle.java
new file mode 100644
index 0000000..ff12d3b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ReliefStyle.java
@@ -0,0 +1,76 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The relief to be drawn around a Button. Ordinarily when you think of a
+ * Button you think of something that can obviously be pressed, and the relief
+ * that GTK theme engines draw around Buttons emphasizes this accordingly. You
+ * can, however, change this behaviour with this class.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.1
+ */
+public final class ReliefStyle extends Constant
+{
+    private ReliefStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Draw normal relief around the Button. In other words, it looks like
+     * something you can press. This is the default.
+     */
+    public static final ReliefStyle NORMAL = new ReliefStyle(GtkReliefStyle.NORMAL, "NORMAL");
+
+    /**
+     * Only draw relief around the Button "half" the time.
+     */
+    /*
+     * TODO this means what, exactly? To be honest, I thought that
+     * GTK_RELIEF_HALF would exhibit the behaviour described for NONE below.
+     */
+    public static final ReliefStyle HALF = new ReliefStyle(GtkReliefStyle.HALF, "HALF");
+
+    /**
+     * Draw no relief around the Button at all. This is actually a misnomer:
+     * no relief is drawn except when the mouse hovers over it, at which point
+     * it suddenly decorates up like the Button it really is. This is terrific
+     * when you do not want a Button to attract attention, but want to give a
+     * hint that it actually <i>is</i> a Button when the user's mouse hovers
+     * over it and when the Button is activated.
+     */
+    public static final ReliefStyle NONE = new ReliefStyle(GtkReliefStyle.NONE, "NONE");
+}
diff --git a/src/bindings/org/gnome/gtk/Requisition.java b/src/bindings/org/gnome/gtk/Requisition.java
new file mode 100644
index 0000000..489fbba
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Requisition.java
@@ -0,0 +1,113 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * The size that will be (is being) requested by a Widget. You get the
+ * Requisition object for a given Widget by calling that its
+ * {@link Widget#getRequisition() getRequisition()} method.
+ * 
+ * <p>
+ * As a general principle across GTK programming, we encourage people to leave
+ * Widgets alone to work out their own needs. You will <i>not</i> be able to
+ * forecast the impact of a user's fonts, accessibility settings, and theme
+ * engine, not to mention the actual implementation of the Containers you are
+ * packing your Widget into. The great part is that you don't need to; the
+ * GNOME libraries are really good at Doing The Right Thing (tm) and you will
+ * do well by them.
+ * 
+ * <p>
+ * When an occasion does arise where you need to force one or both dimensions,
+ * you can either:
+ * 
+ * <ul>
+ * <li>directly influence the size of an individual Widget using
+ * {@link Widget#setSizeRequest(int, int) setSizeRequest()};
+ * <li>use a {@link SizeGroup} to influence a set of related Widgets to have a
+ * dimension in common; or
+ * <li>if all you're trying to do is add padding, call Container's
+ * {@link Container#setBorderWidth(int) setBorderWidth()}.
+ * </ul>
+ * 
+ * <p>
+ * GTK's box packing model works on a size-request/size-allocation process.
+ * Each Widget is asked by it's parent Container how much space it wants on
+ * the screen, in pixels. These <var>requests</var> are aggregated and in turn
+ * represented up the tree until the top-level Window is reached. The Window
+ * then negotiates with the window manager and with the X server, with the
+ * result being that the Window is <var>allocated</var>. The Containers start
+ * divvying up the allocation they were given amongst their children according
+ * to whatever algorithms and settings are in place. Eventually your Widget
+ * will be told how much space it has been given in it's {@link Allocation}
+ * object, and it will have to then carry on accordingly. The important point
+ * to note here is that requests are just that; a Widget must be able to cope
+ * with any size down to <code>1x1</code>. Ideally it will degrade gracefully,
+ * although that's not always easy.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class Requisition extends Boxed
+{
+    protected Requisition(long pointer) {
+        super(pointer);
+    }
+
+    Requisition() {
+        super(GtkRequisitionOverride.createRequisition());
+    }
+
+    protected void release() {
+        GtkRequisitionOverride.free(this);
+    }
+
+    /**
+     * The width that has been requested.
+     */
+    public int getWidth() {
+        return GtkRequisition.getWidth(this);
+    }
+
+    /**
+     * The height that has been requested.
+     */
+    public int getHeight() {
+        return GtkRequisition.getHeight(this);
+    }
+
+    public String toString() {
+        return this.getClass().getName() + ": " + getWidth() + "x" + getHeight();
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ResizeMode.java b/src/bindings/org/gnome/gtk/ResizeMode.java
new file mode 100644
index 0000000..2383f8b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ResizeMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class ResizeMode extends Constant
+{
+    private ResizeMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ResponseType.java b/src/bindings/org/gnome/gtk/ResponseType.java
new file mode 100644
index 0000000..2859740
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ResponseType.java
@@ -0,0 +1,208 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Predefined responses for a {@link Dialog Dialog}. Each ResponseType is
+ * usually associated with a preconfigured action Button in the Dialog, but
+ * can also come from other Widgets or user actions, such as closing the
+ * Window.
+ * 
+ * <p>
+ * If one of these responses constants fits your needs, it is recommended that
+ * you make use of it. This is partly for code clarity but mostly because
+ * there are a number of special behaviours within GTK which presume you're
+ * using the correct predefined constants. This is especially the case in
+ * FileChooserDialog.
+ * 
+ * <p>
+ * If your needs require it, however, you can define your own responses codes
+ * by extending this class. For example:
+ * 
+ * <pre>
+ * public class PowerResponseType extend ResponseType
+ * {
+ *     protected PowerResponseType(String nickname) {
+ *         super(nickname);
+ *     }
+ *     
+ *     public static final PowerResponseType SQUARED = new PowerResponseType("SQUARED");
+ *     
+ *     public static final PowerResponseType CUBED = new PowerResponseType("CUBED");
+ *     
+ *     public static final PowerResponseType FOURTH = new PowerResponseType("FOURTH");
+ * }
+ * </pre>
+ * 
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+/*
+ * This is an exception to the usual usage of enumerated Constants. First,
+ * although it is an enum, its values in Gtk+ doesn't grow incrementally from
+ * 0. They're all negative values, because positive values are reserved for
+ * user usage. Therefore we have hacked the .defs data to be (define-flags
+ * ...) to force the generated translation layer to reach to native for the
+ * ordinals. The other difference is that the developer can define their own
+ * codes to be associated with specific actions, and we provide the mechanism
+ * to support this.
+ */
+public class ResponseType extends Constant
+{
+    /*
+     * All the response codes predefined in GTK have negative ordinals.
+     * Positive values are reserved for custom usage. To ensure a developer
+     * doesn't give an already-used value, we use this field as a counter to
+     * supply response codes.
+     */
+    private static int response;
+
+    static {
+        response = 1;
+    }
+
+    private ResponseType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Constructor to let developer define their own ResponseTypes.
+     * 
+     * @param nickname
+     *            Used mainly for debugging purposes. The String supplied
+     *            should match the name of the constant as declared in your
+     *            ResponseType subclass.
+     */
+    /*
+     * An unique ordinal is assigned automatically
+     */
+    protected ResponseType(String nickname) {
+        super(response++, nickname);
+    }
+
+    /*
+     * It's not entirely necessary to have these here; we could just have
+     * Dialog call the static methods in GtkResponseTypeOverride directly, but
+     * the code seems a bit to have this as instance method here...
+     */
+    int getResponseId() {
+        return GtkResponseTypeOverride.numOf(this);
+    }
+
+    /*
+     * ... on the other hand, this is just clumsy, but it is at least
+     * consistent with getResponseId() and likewise a bit cleaner.
+     */
+    static ResponseType constantFor(int ordinal) {
+        return GtkResponseTypeOverride.enumFor(ordinal);
+    }
+
+    /**
+     * This corresponds to the programmatic hiding of the Dialog using the
+     * {@link Dialog#hide() hide()} method.
+     */
+    public static final ResponseType NONE = new ResponseType(GtkResponseType.NONE, "NONE");
+
+    /**
+     * Returned when the user close the Dialog window, for example, by
+     * clicking the [x] Button or press Alt+F4 key.
+     */
+    public static final ResponseType DELETE_EVENT = new ResponseType(GtkResponseType.DELETE_EVENT,
+            "DELETE_EVENT");
+
+    /**
+     * This response is usually associated with a Button whose action involves
+     * closing the Dialog and accept the action proposed.
+     * 
+     * <p>
+     * Typical usages of this response are: close an informative Dialog,
+     * accept changes made by user on a preferences Dialog, or start an action
+     * with the options shown in the Dialog.
+     * 
+     * <p>
+     * In your Dialogs you should put this kind of Button in the Dialog right
+     * corner.
+     */
+    public static final ResponseType OK = new ResponseType(GtkResponseType.OK, "OK");
+
+    /**
+     * Usually associated with a Button whose action is closing the Dialog,
+     * discarding any changes made on it by the user, or cancelling an action,
+     * either being executed or just before executing it.
+     * 
+     * <p>
+     * This Button is usually disposed at the left of the Ok Button.
+     */
+    public static final ResponseType CANCEL = new ResponseType(GtkResponseType.CANCEL, "CANCEL");
+
+    /**
+     * Used in a Button whose action is to close the Dialog.
+     * 
+     * <p>
+     * Provide this kind of Buttons only on informative Dialogs, where the
+     * user cannot do any change, or in Dialogs where the changes can be
+     * easily reverted later (such as some preferences Dialogs). If the
+     * changes the Dialog allow have a great impact of the application, or it
+     * starts some action, it is better to provide {@link #OK} and
+     * {@link #CANCEL} Buttons.
+     */
+    public static final ResponseType CLOSE = new ResponseType(GtkResponseType.CLOSE, "CLOSE");
+
+    /**
+     * Associated with a Button whose action is to accept the changes made by
+     * the user, but without closing the Dialog.
+     */
+    public static final ResponseType APPLY = new ResponseType(GtkResponseType.APPLY, "APPLY");
+
+    /**
+     * Associated with "Yes" Buttons, used in Dialogs that ask some question
+     * to the user.
+     */
+    public static final ResponseType YES = new ResponseType(GtkResponseType.YES, "YES");
+
+    /**
+     * Associated with "No" Buttons, used in Dialogs that ask some question to
+     * the user.
+     */
+    public static final ResponseType NO = new ResponseType(GtkResponseType.NO, "NO");
+
+    /**
+     * This response is associated with a help Button, whose Action is to open
+     * a contextual help about the Dialog and the settings it allow to change.
+     */
+    public static final ResponseType HELP = new ResponseType(GtkResponseType.HELP, "HELP");
+}
diff --git a/src/bindings/org/gnome/gtk/Scale.java b/src/bindings/org/gnome/gtk/Scale.java
new file mode 100644
index 0000000..f1f2855
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Scale.java
@@ -0,0 +1,111 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A slider control which allows the user to manipulate a numeric value. <img
+ * src="HScale.png" class="snapshot"> As with many other Widget hierarchies in
+ * GTK, there is a horizontal ({@link HScale}) and vertical ({@link VScale})
+ * implementation for you to choose from.
+ * 
+ * 
+ * <p>
+ * <img src="VScale.png" class="snapshot" style="clear: right;"> The default
+ * position for the value to be displayed is {@link PositionType#TOP TOP}
+ * which may not be quite what you want. Use
+ * {@link Scale#setValuePosition(PositionType) setValuePosition()} to change
+ * it.
+ * 
+ * <p>
+ * Otherwise, most of the useful methods (notably those relating to the value)
+ * are inherited from the parent class, {@link Range}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class Scale extends Range
+{
+    protected Scale(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a Scale of the given orientation and supplying an Adjustment.
+     * See also {@link HScale} and {@link VScale}.
+     * 
+     * @since 4.1.1
+     */
+    public Scale(Orientation orientation, Adjustment adjustment) {
+        super(GtkScale.createScale(orientation, adjustment));
+    }
+
+    /**
+     * Specify the number of decimal places that will be shown in the value.
+     * This also rounds the value so that when it is retrieved it will match
+     * what is displayed.
+     * 
+     * @since 4.0.6
+     */
+    public void setDigits(int places) {
+        GtkScale.setDigits(this, places);
+    }
+
+    /**
+     * Specify where the value will be drawn. {@link PositionType#TOP TOP} is
+     * the default.
+     * 
+     * @since 4.0.6
+     */
+    public void setValuePosition(PositionType position) {
+        GtkScale.setValuePos(this, position);
+    }
+
+    /**
+     * Specify if the text displaying the value will be shown. The default is
+     * <code>true</code>.
+     * 
+     * @since 4.0.17
+     */
+    public void setDrawValue(boolean draw) {
+        GtkScale.setDrawValue(this, false);
+    }
+
+    /**
+     * Is the Scale presently displaying text indicating its value?
+     * 
+     * @since 4.0.17
+     */
+    public boolean getDrawValue() {
+        return GtkScale.getDrawValue(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ScaleButton.java b/src/bindings/org/gnome/gtk/ScaleButton.java
new file mode 100644
index 0000000..1a315d5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ScaleButton.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ScaleButton extends Button
+{
+    protected ScaleButton(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ScrollStep.java b/src/bindings/org/gnome/gtk/ScrollStep.java
new file mode 100644
index 0000000..a5cb014
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ScrollStep.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * Constants used by the {@link TextView.MoveViewport}, which doesn't even
+ * seem to get hit. Do we even need these?
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * FIXME to make public, figure out when necessary and document to that
+ * effect. What is the difference between these?
+ */
+final class ScrollStep extends Constant
+{
+    private ScrollStep(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    static final ScrollStep STEPS = new ScrollStep(GtkScrollStep.STEPS, "STEPS");
+
+    static final ScrollStep PAGES = new ScrollStep(GtkScrollStep.PAGES, "PAGES");
+
+    static final ScrollStep ENDS = new ScrollStep(GtkScrollStep.ENDS, "ENDS");
+
+    static final ScrollStep HORIZONTAL_STEPS = new ScrollStep(GtkScrollStep.HORIZONTAL_STEPS,
+            "HORIZONTAL_STEPS");
+
+    static final ScrollStep HORIZONTAL_PAGES = new ScrollStep(GtkScrollStep.HORIZONTAL_PAGES,
+            "HORIZONTAL_PAGES");
+
+    static final ScrollStep HORIZONTAL_ENDS = new ScrollStep(GtkScrollStep.HORIZONTAL_ENDS,
+            "HORIZONTAL_ENDS");
+}
diff --git a/src/bindings/org/gnome/gtk/ScrollType.java b/src/bindings/org/gnome/gtk/ScrollType.java
new file mode 100644
index 0000000..cae0e19
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ScrollType.java
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * Constants used to describe various scrolling actions.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * FIXME make constants public if and when they are needed and documented
+ * accordingly.
+ */
+final class ScrollType extends Constant
+{
+    private ScrollType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    static final ScrollType STEP_BACKWARD = new ScrollType(GtkScrollType.STEP_BACKWARD, "STEP_BACKWARD");
+
+    static final ScrollType STEP_FORWARD = new ScrollType(GtkScrollType.STEP_FORWARD, "STEP_FORWARD");
+
+    static final ScrollType STEP_LEFT = new ScrollType(GtkScrollType.STEP_RIGHT, "STEP_LEFT");
+
+    static final ScrollType STEP_RIGHT = new ScrollType(GtkScrollType.STEP_RIGHT, "STEP_RIGHT");
+}
diff --git a/src/bindings/org/gnome/gtk/Scrollbar.java b/src/bindings/org/gnome/gtk/Scrollbar.java
new file mode 100644
index 0000000..52a75a8
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Scrollbar.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A scroll bar. This is largely an internal Widget used by GTK and theme
+ * engines for drawing; to actually manipulate a Scrollbar you instead want to
+ * get at the Adjsutment objects being used by the enclosing ScrolledWindow's
+ * {@link ScrolledWindow#getHAdjustment() getHAdjustment()} and
+ * {@link ScrolledWindow#getVAdjustment() getVAdjustment()} to then specify
+ * what positions are shown.
+ * 
+ * @since 4.0.8
+ * @see ScrolledWindow
+ */
+public class Scrollbar extends Range
+{
+    protected Scrollbar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a Scrollbar of the given orientation and supplying an
+     * Adjustment. See also the original Widgets {@link HScrollbar} and
+     * {@link VScrollBar}.
+     * 
+     * @since 4.1.1
+     */
+    public Scrollbar(Orientation orientation, Adjustment adjustment) {
+        super(GtkScrollbar.createScrollbar(orientation, adjustment));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ScrolledWindow.java b/src/bindings/org/gnome/gtk/ScrolledWindow.java
new file mode 100644
index 0000000..694187b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ScrolledWindow.java
@@ -0,0 +1,215 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Add scrollbars to a Widget. There are times when you have a Widget which is
+ * larger than the area you wish to constrain it to, and the usual way to deal
+ * with this is to enhance the Widget with scrollbars. ScrolledWindow is a Bin
+ * which enables you to control the scrollbars added in such cases.
+ * 
+ * <p>
+ * Some Widgets have built in support for scrolling; in such cases you add
+ * them directly with the usual {@link Container#add(Widget) add()} method;
+ * however, if other Widgets need to be enhanced to support scrolling; in such
+ * cases you must nest it inside a Viewport; use
+ * {@link #addWithViewport(Widget) addWithViewport()} as a quick way to
+ * achieve this.
+ * 
+ * <p>
+ * <i>This is very poorly named. It is <b>not</b> a subclass of Window; it
+ * refers instead to a viewport scrolling around on an underlying canvas.</i>
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * TODO document the relationship between the subordinate Adjustments and
+ * Scrollbars.
+ */
+public class ScrolledWindow extends Bin
+{
+    protected ScrolledWindow(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a ScrolledWindow. This will automatically create default
+     * Adjustments for managing the horizontal and vertical ScrollBars.
+     * 
+     * @since 4.0.3
+     */
+    public ScrolledWindow() {
+        // call createScrolledWindow and let it create the adjustments
+        super(GtkScrolledWindow.createScrolledWindow(null, null));
+    }
+
+    /**
+     * Construct a ScrolledWindow with the specified Adjustments
+     */
+    /*
+     * FIXME This doesn't work, at least not the way I expect it to. In fact,
+     * every time I've tried it the other ScrolledWindow whose Adjustments I
+     * borrow breaks. If someome can figure out the proper use of this, and
+     * document it, we can make this public.
+     */
+    ScrolledWindow(Adjustment hadjustment, Adjustment vadjustment) {
+        super(GtkScrolledWindow.createScrolledWindow(hadjustment, vadjustment));
+    }
+
+    /**
+     * Set the scrollbar policy for the horizontal and vertical scrollbars.
+     * 
+     * @since 4.0.3
+     */
+    public void setPolicy(PolicyType hscrollbarPolicy, PolicyType vscrollbarPolicy) {
+        GtkScrolledWindow.setPolicy(this, hscrollbarPolicy, vscrollbarPolicy);
+    }
+
+    public void add(Widget child) {
+        if (!((child instanceof TextView) || (child instanceof TreeView) || (child instanceof Layout) || (child instanceof Viewport))) {
+            throw new IllegalArgumentException(
+                    "You can't directly add() a Widget that doesn't have scrolling support built in.\n"
+                            + "Use ScrolledWindow's addWithViewport() instead, or create your own Viewport.");
+        }
+        GtkContainer.add(this, child);
+    }
+
+    /**
+     * Create a new Viewport and embeds the child Widget in it before adding
+     * it to the ScrolledWindow. This is a convenience function; you could
+     * always create the Viewport yourself if you really wanted. Note that
+     * this method is only for Widgets which do not support scrolling directly
+     * themselves; use {@link Container#add(Widget) add()} directly for those
+     * Widgets that do.
+     * 
+     * <p>
+     * As a convienience, calling this method will set the ShadowType of the
+     * created Viewport to <code>NONE</code>, meaning that if you do want a
+     * decoration, you can achieve it in a single place here with a call to
+     * ScrolledWindow's {@link #setShadowType(ShadowType) setShadowType()}.
+     * 
+     * @since 4.0.15
+     */
+    public void addWithViewport(Widget child) {
+        final Viewport port;
+
+        if ((child instanceof TextView) || (child instanceof TreeView) || (child instanceof Layout)) {
+            // any others?
+            throw new IllegalArgumentException(
+                    "You must not addWithViewport() a Widget that already has scrolling support built in. Use Container's add() instead.");
+        }
+        GtkScrolledWindow.addWithViewport(this, child);
+
+        port = (Viewport) GtkBin.getChild(this);
+        port.setShadowType(ShadowType.NONE);
+    }
+
+    /**
+     * Get the Scrollbar Widget that is being used to draw the horizontal
+     * scroll bar on the bottom edge of this ScrolledWindow.
+     * 
+     * @since 4.0.8
+     */
+    public Scrollbar getHScrollbar() {
+        return (Scrollbar) GtkScrolledWindow.getHscrollbar(this);
+    }
+
+    /**
+     * Get the Scrollbar Widget that is being used to draw the vertical scroll
+     * bar on the right hand side of this ScrolledWindow.
+     * 
+     * @since 4.0.8
+     */
+    public Scrollbar getVScrollbar() {
+        return (Scrollbar) GtkScrolledWindow.getVscrollbar(this);
+    }
+
+    /**
+     * Get the Adjustment that is being used to drive the horizontal position
+     * of the scroll bar on the bottom edge of this ScrolledWindow.
+     * 
+     * @since 4.0.8
+     */
+    public Adjustment getHAdjustment() {
+        return GtkScrolledWindow.getHadjustment(this);
+    }
+
+    /**
+     * Get the Adjustment that is being used to drive the vertical position of
+     * the scroll bar on the right hand side of this ScrolledWindow.
+     * 
+     * @since 4.0.8
+     */
+    public Adjustment getVAdjustment() {
+        return GtkScrolledWindow.getVadjustment(this);
+    }
+
+    /**
+     * Set the type of decoration you want around the child Widget in the
+     * ScrolledWindow. You probably don't need this, since the default is
+     * {@link ShadowType#NONE NONE}.
+     * 
+     * @since 4.0.15
+     */
+    public void setShadowType(ShadowType type) {
+        GtkScrolledWindow.setShadowType(this, type);
+    }
+
+    /**
+     * Get the decoration currently set for this ScrolledWindow.
+     * 
+     * @since 4.0.15
+     */
+    public ShadowType getShadowType() {
+        return GtkScrolledWindow.getShadowType(this);
+    }
+
+    /**
+     * Get the amount of spacing being drawn between the Viewport and the
+     * Scrollbars.
+     * 
+     * <p>
+     * This is the <var>scrollbar-spacing</var> style property.
+     * 
+     * @since 4.0.17
+     */
+    /*
+     * This is a prototype of exercising the ability to access style
+     * properties.
+     */
+    public int getScrollbarSpacing() {
+        return super.getStylePropertyInteger("scrollbar-spacing");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SelectionData.java b/src/bindings/org/gnome/gtk/SelectionData.java
new file mode 100644
index 0000000..99d30f9
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SelectionData.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SelectionData extends Boxed
+{
+    protected SelectionData(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SelectionMode.java b/src/bindings/org/gnome/gtk/SelectionMode.java
new file mode 100644
index 0000000..cc5b1b1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SelectionMode.java
@@ -0,0 +1,84 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * What kinds of selections are possible on a TreeView? These are used by
+ * {@link TreeSelection#setMode(SelectionMode) setMode()} on TreeSelection,
+ * which in turn you get by calling TreeView's {@link TreeView#getSelection()
+ * getSelection()}.
+ * 
+ * <p>
+ * The default is {@link #SINGLE SINGLE}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+public final class SelectionMode extends Constant
+{
+    private SelectionMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Rows may <b>not</b> be selected.
+     */
+    public static final SelectionMode NONE = new SelectionMode(GtkSelectionMode.NONE, "NONE");
+
+    /**
+     * One element may be selected; zero selected rows is also permitted. This
+     * it the default.
+     */
+    public static final SelectionMode SINGLE = new SelectionMode(GtkSelectionMode.SINGLE, "SINGLE");
+
+    /**
+     * Normally exactly one row will be selected; the user cannot deselect
+     * this row without selecting another. This is not all encompassing,
+     * however, as no row selected is possible as an initial state and also
+     * during interactive searches.
+     */
+    public static final SelectionMode BROWSE = new SelectionMode(GtkSelectionMode.BROWSE, "BROWSE");
+
+    /**
+     * Multiple rows may be selected. The behaviour is the same as with
+     * multiple selections elsewhere in the GNOME desktop (file browsing,
+     * etc). Mouse clicks toggle the selected row to the location of the
+     * click. The <code>Shift</code> key will cause the selection to go from
+     * the focus to the click location, and the <code>Ctrl</code> key will
+     * enlarge the selection by adding the clicked row to the other rows
+     * already selected.
+     */
+    public static final SelectionMode MULTIPLE = new SelectionMode(GtkSelectionMode.MULTIPLE, "MULTIPLE");
+}
diff --git a/src/bindings/org/gnome/gtk/SensitivityType.java b/src/bindings/org/gnome/gtk/SensitivityType.java
new file mode 100644
index 0000000..d50226d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SensitivityType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SensitivityType extends Constant
+{
+    private SensitivityType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Separator.java b/src/bindings/org/gnome/gtk/Separator.java
new file mode 100644
index 0000000..4bc9441
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Separator.java
@@ -0,0 +1,65 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Abstract superclass for {@link HSeparator} and {@link VSeparator}.
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public class Separator extends Widget implements Orientable
+{
+    protected Separator(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new Separator of the given orientation. You can also use
+     * the original Widgets {@link HSeparator} and {@link VSeparator}.
+     * 
+     * @since 4.1.1
+     */
+    public Separator(Orientation orientation) {
+        super(GtkSeparator.createSeparator(orientation));
+    }
+
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SeparatorMenuItem.java b/src/bindings/org/gnome/gtk/SeparatorMenuItem.java
new file mode 100644
index 0000000..8adff8e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SeparatorMenuItem.java
@@ -0,0 +1,63 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A separator between groups of related MenuItems.
+ * 
+ * <p>
+ * A SeparatorMenuItem is a special type of MenuItem that is shown to the user
+ * as a horizontal line. Its unique usage is to visually group together
+ * related MenuItem's within a Menu.
+ * 
+ * <p>
+ * These are added to a Menu in the same way as any other MenuItem. You
+ * usually will want to add it between two different sets of related
+ * MenuItems; it's considered bad form to led or end a Menu with a separator.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+public class SeparatorMenuItem extends MenuItem
+{
+    protected SeparatorMenuItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new SeparatorMenuItem.
+     */
+    public SeparatorMenuItem() {
+        super(GtkSeparatorMenuItem.createSeparatorMenuItem());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SeparatorToolItem.java b/src/bindings/org/gnome/gtk/SeparatorToolItem.java
new file mode 100644
index 0000000..8ce79c1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SeparatorToolItem.java
@@ -0,0 +1,82 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A separator between groups of related ToolItems in a Toolbar.
+ * 
+ * <p>
+ * A SeparatorToolItem usually appears as a vertical line, and is used to
+ * create a visual distinction between logically related items in a Toolbar.
+ * 
+ * <p>
+ * Somewhat unusually, a SeparatorToolItem can be used to force align other
+ * ToolItems at the right of the Toolbar by adding one with
+ * {@link #setDraw(boolean) setDraw(false)} and {@link #setExpand(boolean)
+ * setExpand(true)} between the two "sides".
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class SeparatorToolItem extends ToolItem
+{
+    protected SeparatorToolItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new SeparatorToolItem.
+     */
+    public SeparatorToolItem() {
+        super(GtkSeparatorToolItem.createSeparatorToolItem());
+    }
+
+    /**
+     * Set whether the separator will display a vertical line.
+     * SeparatorToolItems have the curious property that you can tell them not
+     * to present themselves in an obtrusive manner while still carrying out
+     * their spacing function.
+     */
+    public void setDraw(boolean draw) {
+        GtkSeparatorToolItem.setDraw(this, draw);
+    }
+
+    /**
+     * Is the separator being displayed as a vertical line, or is it just
+     * blank?
+     */
+    public boolean getDraw() {
+        return GtkSeparatorToolItem.getDraw(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Settings.java b/src/bindings/org/gnome/gtk/Settings.java
new file mode 100644
index 0000000..f854915
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Settings.java
@@ -0,0 +1,179 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * Global settings for a GTK application. Get this object by calling the
+ * factory function {@link Gtk#getSettings() Gtk.getSettings()}.
+ * 
+ * <pre>
+ * settings = Gtk.getSettings();
+ * settings.setButtonImages(true);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+/*
+ * The functions to get the GtkSettings objects aren't here for a couple
+ * reasons. One is aesthetic; we've concentrated other functions on the
+ * package class rather than having them as local static methods. The other
+ * reason is completion space; there are property getters on this class, and
+ * getDefault() just doesn't make sense alongside them.
+ */
+public class Settings extends Object
+{
+    protected Settings(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Set whether Buttons should have images (ie stock icons) showing on them
+     * by default.
+     * 
+     * <pre>
+     * settings.setButtonImages(true);
+     * </pre>
+     * 
+     * <p>
+     * <i>The default was</i> <code>true</code> <i>before GNOME 2.28, but it
+     * seems to have been changed as a result of changing the default value of
+     * GConf key</i> <code>/desktop/gnome/interface/buttons_have_icons</code>
+     * <i>. This allows you to return that setting to normal for your
+     * application.</i>
+     * 
+     * <p>
+     * <i>The underlying GtkSetting is the "<var>gtk-button-images</var>"
+     * property.</i>
+     * 
+     * @since 4.0.14
+     */
+    public void setButtonImages(boolean setting) {
+        this.setPropertyBoolean("gtk-button-images", setting);
+    }
+
+    /**
+     * Are images (icons) being shown on Buttons by default?
+     * 
+     * @since 4.0.14
+     */
+    public boolean getButtonImages() {
+        return this.getPropertyBoolean("gtk-button-images");
+    }
+
+    /**
+     * Set whether MenuItems should have images (notably stock icons) showing
+     * on them by default.
+     * 
+     * <pre>
+     * settings.setMenuImages(true);
+     * </pre>
+     * 
+     * <p>
+     * <i>Somewhat amazingly, GtkSettings properties are dynamic at runtime;
+     * this property does not even exist until the underlying GtkImageMenuItem
+     * class has initialized and installed the required property. So if wish
+     * to call this you need to do so after you've built some menus.</i>
+     * </p>
+     * 
+     * <p>
+     * <i>The underlying GtkSetting is the "<var>gtk-menu-images</var>"
+     * property.</i>
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * The function that needs to have run appears to be
+     * gtk_image_menu_item_class_init() in gtk/gtkimagemenuitem.c
+     */
+    public void setMenuImages(boolean setting) {
+        this.setPropertyBoolean("gtk-menu-images", setting);
+    }
+
+    /**
+     * Are images (icons) being shown in menus by default?
+     * 
+     * @since 4.0.14
+     */
+    public boolean getMenuImages() {
+        return this.getPropertyBoolean("gtk-menu-images");
+    }
+
+    /**
+     * Should the context menus of TextViews and Entries have a menu item
+     * offering to let you change the InputMethod?
+     * 
+     * <p>
+     * Normally they do, so <code>true</code> is the default.
+     * 
+     * @since 4.0.14
+     */
+    public void setShowInputMethodMenu(boolean setting) {
+        this.setPropertyBoolean("gtk-show-input-method-menu", setting);
+    }
+
+    /**
+     * Do Entry and TextView popup context menus have a menu item allowing you
+     * to change the InputMethod?
+     * 
+     * @since 4.0.14
+     */
+    public boolean getShowInputMethodMenu() {
+        return this.getPropertyBoolean("gtk-show-input-method-menu");
+    }
+
+    /**
+     * Should the context menus of TextViews and Entries have a menu item
+     * offering to let you input unusual Unicode control sequences?
+     * 
+     * <p>
+     * By default they do, so you can expect this to be <code>true</code>.
+     * 
+     * @since 4.0.14
+     */
+    public void setShowUnicodeMenu(boolean setting) {
+        this.setPropertyBoolean("gtk-show-unicode-menu", setting);
+    }
+
+    /**
+     * Are Entry and TextView popup context menus showing a menu item allowing
+     * you to enter Unicode control characters?
+     * 
+     * @since 4.0.14
+     */
+    public boolean getShowUnicodeMenu() {
+        return this.getPropertyBoolean("gtk-show-unicode-menu");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ShadowType.java b/src/bindings/org/gnome/gtk/ShadowType.java
new file mode 100644
index 0000000..c79027a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ShadowType.java
@@ -0,0 +1,76 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Appearance of the outline shown in some Widgets such as {@link Frame} and
+ * {@link Arrow}.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public final class ShadowType extends Constant
+{
+    private ShadowType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The Widget is shown without outline.
+     */
+    public static final ShadowType NONE = new ShadowType(GtkShadowType.NONE, "NONE");
+
+    /**
+     * The outline is bevelled inwards. That causes the visual effect that the
+     * Widget is sunken on the screen.
+     */
+    public static final ShadowType IN = new ShadowType(GtkShadowType.IN, "IN");
+
+    /**
+     * The outline is bevelled outwards. That causes the visual effect that
+     * the Widget is raised on the screen.
+     */
+    public static final ShadowType OUT = new ShadowType(GtkShadowType.OUT, "OUT");
+
+    /**
+     * The outline has a sunken 3D appearance.
+     */
+    public static final ShadowType ETCHED_IN = new ShadowType(GtkShadowType.ETCHED_IN, "ETCHED_IN");
+
+    /**
+     * The outline has a raised 3D appearance.
+     */
+    public static final ShadowType ETCHED_OUT = new ShadowType(GtkShadowType.ETCHED_OUT, "ETCHED_OUT");
+}
diff --git a/src/bindings/org/gnome/gtk/SignalRunType.java b/src/bindings/org/gnome/gtk/SignalRunType.java
new file mode 100644
index 0000000..c61c365
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SignalRunType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SignalRunType extends Constant
+{
+    private SignalRunType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SimpleInputMethod.java b/src/bindings/org/gnome/gtk/SimpleInputMethod.java
new file mode 100644
index 0000000..c219886
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SimpleInputMethod.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+/**
+ * The basis of the default input method in GTK.
+ * 
+ * <p>
+ * By all accounts you do <b>not</b> want to use this. Instead, call the
+ * constructor of {@link MulticontextInputMethod}. If ther is no input method
+ * set, then GTK's default fallback is to use a simple context.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.14
+ */
+public class SimpleInputMethod extends InputMethod
+{
+    protected SimpleInputMethod(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct an InputMethod using the GTK's default "simple" backend.
+     * 
+     * @since 4.0.14
+     */
+    public SimpleInputMethod() {
+        super(GtkIMContextSimple.createSimpleInputMethod());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SizeGroup.java b/src/bindings/org/gnome/gtk/SizeGroup.java
new file mode 100644
index 0000000..fcf863b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SizeGroup.java
@@ -0,0 +1,103 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * Cause a group of Widgets to have the same size request in either the
+ * horizontal dimension, the vertical dimension, or both. A SizeGroup is
+ * somewhat like a Container, although it is a helper class for Widgets and
+ * not itself a Widget. When you create a SizeGroup, you specify the mode
+ * indicating the way you want it to act upon the Widgets placed into it, and
+ * then add Widgets. All the Widgets "in" the SizeGroup will then all have
+ * have their width request in common ({@link SizeGroupMode#HORIZONTAL
+ * HORIZONTAL}) or their height request in common (
+ * {@link SizeGroupMode#VERTICAL VERTICAL}), or, in somewhat rarer
+ * circumstances, have both their width and height requests in common
+ * {@link SizeGroupMode#BOTH BOTH}). The size requested will be that of the
+ * Widget in the group that is the largest in that dimension.
+ * 
+ * <p>
+ * When doing data entry across a large number of fields, it is a GNOME
+ * usability standard that the Entry boxes be common width and aligned
+ * vertically. While there are certainly cases where you have a good reason
+ * for doing otherwise, if you are filling in a form then using a SizeGroup
+ * can help you create a nice uniform appearance.
+ * 
+ * <p>
+ * SizeGroups can be fantastically useful to create the "table" effect but
+ * across an uneven series of HBoxes nested in VBoxes with but with other
+ * things in between.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class SizeGroup extends Object
+{
+    protected SizeGroup(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Instantiate a new SizeGroup, constraining per the <code>mode</code>
+     * parameter.
+     * 
+     * @since 4.0.6
+     */
+    public SizeGroup(SizeGroupMode mode) {
+        super(GtkSizeGroup.createSizeGroup(mode));
+    }
+
+    /**
+     * Specify a Widget to be constrained as a member of this SizeGroup.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * This, and remove(), have been adjusted from exact API mapping to GTK in
+     * order to be parallel to the Container API style.
+     */
+    public void add(Widget widget) {
+        GtkSizeGroup.addWidget(this, widget);
+    }
+
+    /**
+     * Remove a Widget that was previously added to the SizeGroup.
+     * 
+     * @since 4.0.6
+     */
+    public void remove(Widget widget) {
+        GtkSizeGroup.removeWidget(this, widget);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SizeGroupMode.java b/src/bindings/org/gnome/gtk/SizeGroupMode.java
new file mode 100644
index 0000000..9e8a25d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SizeGroupMode.java
@@ -0,0 +1,72 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants indicating how a given SizeGroup is to operate.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class SizeGroupMode extends Constant
+{
+    private SizeGroupMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The SizeGroup will (no longer have) an effect.
+     */
+    public static final SizeGroupMode NONE = new SizeGroupMode(GtkSizeGroupMode.NONE, "NONE");
+
+    /**
+     * All the Widgets in this SizeGroup will share the width requested by the
+     * widest Widget in the group.
+     */
+    public static final SizeGroupMode HORIZONTAL = new SizeGroupMode(GtkSizeGroupMode.HORIZONTAL,
+            "HORIZONTAL");
+
+    /**
+     * All the Widgets in this SizeGroup will share the height requested by
+     * the tallest Widget in the group.
+     */
+    public static final SizeGroupMode VERTICAL = new SizeGroupMode(GtkSizeGroupMode.VERTICAL, "VERTICAL");
+
+    /**
+     * Widgets in this SizeGroup will have the same size request (both width
+     * and height) as the largest Widget in the group.
+     */
+    public static final SizeGroupMode BOTH = new SizeGroupMode(GtkSizeGroupMode.BOTH, "BOTH");
+}
diff --git a/src/bindings/org/gnome/gtk/SizeRequestMode.java b/src/bindings/org/gnome/gtk/SizeRequestMode.java
new file mode 100644
index 0000000..06cf0ec
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SizeRequestMode.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public final class SizeRequestMode extends Constant
+{
+    private SizeRequestMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    public static final SizeRequestMode WIDTH_FOR_HEIGHT = new SizeRequestMode(
+            GtkSizeRequestMode.WIDTH_FOR_HEIGHT, "WIDTH_FOR_HEIGHT");
+
+    public static final SizeRequestMode HEIGHT_FOR_WIDTH = new SizeRequestMode(
+            GtkSizeRequestMode.HEIGHT_FOR_WIDTH, "HEIGHT_FOR_WIDTH");
+}
diff --git a/src/bindings/org/gnome/gtk/Socket.java b/src/bindings/org/gnome/gtk/Socket.java
new file mode 100644
index 0000000..6ba611c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Socket.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Socket extends Container
+{
+    protected Socket(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SortType.java b/src/bindings/org/gnome/gtk/SortType.java
new file mode 100644
index 0000000..45c17f7
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SortType.java
@@ -0,0 +1,73 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants describing what sort ordering you want to be in effect. This is
+ * used by TreeSortables such as {@link TreeModelSort}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public final class SortType extends Constant
+{
+    private SortType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Sort in ascending order. This means:
+     * <ul>
+     * <li><code>0</code>, <code>1</code>, <code>2</code>, ..., <i>n</i> and</li>
+     * <li><code>A</code>, <code>B</code>, <code>C</code>, ..., <code>X</code>, <code>Y</code>, <code>Z</code>
+     * </ul>
+     * where <code>0</code> or <code>A</code> or whatever will be at the top
+     * of your list.
+     */
+    public static SortType ASCENDING = new SortType(GtkSortType.ASCENDING, "ASCENDING");
+
+    /**
+     * Sort in descending order. This means:
+     * <ul>
+     * <li><i>n</i>, <i>n</i><code>-1</code>, <i>n</i><code>-2</code>, ...,
+     * <code>2</code>, <code>1</code>, <code>0</code> and</li>
+     * <li><code>Z</code>, <code>Y</code>, <code>X</code>, ... <code>C</code>,
+     * <code>B</code>, <code>A</code></li>
+     * </ul>
+     * where <i>n</i> or <code>Z</code> or whatever will be at the top of your
+     * list.
+     */
+    public static SortType DESCENDING = new SortType(GtkSortType.DESCENDING, "DESCENDING");
+}
diff --git a/src/bindings/org/gnome/gtk/Spell.java b/src/bindings/org/gnome/gtk/Spell.java
new file mode 100644
index 0000000..ba4ed6a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Spell.java
@@ -0,0 +1,124 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * Helper class which manages spell checking in TextViews. Convert a TextView
+ * to one that is doing spelling by calling TextView's
+ * {@link TextView#attachSpell() attachSpell()}. <img class="snapshot"
+ * src="TextView-Spelling.png">
+ * 
+ * <p>
+ * <i>Augmenting a TextView to provide spell checking is provided by the
+ * GtkSpell library, which in turn leverages Enchant to connect to a spell
+ * checking backend.</i>
+ * 
+ * <p>
+ * <i>If GtkSpell doesn't meet your needs, then you may try using the
+ * underlying checking API directly. We have coverage of it starting at</i>
+ * {@link org.freedesktop.enchant.Enchant Enchant}.
+ * 
+ * 
+ * 
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ * @since 4.0.12
+ * @deprecated This is temporarily disabled pending the release of a GTK 3
+ *             compatible version of GtkSpell
+ */
+public final class Spell extends Boxed
+{
+    protected Spell(long pointer) {
+        super(pointer);
+    }
+
+    /*
+     * Perhaps we should expose this as a utility method on TextView?
+     */
+    Spell(TextView view, String lang) {
+        super(createSpell(view, lang));
+    }
+
+    private static long createSpell(TextView view, String lang) {
+        throw new UnsupportedOperationException("GtkSpell support not yet available");
+    }
+
+    /*
+     * DANGER WARNING DANGER The detach() function is how you free a GtkSpell,
+     * so normally it would be here. It seems, however, that the current
+     * implementation in the GtkSpell library's gtkspell.c has a signal
+     * handler connected to the GtkTextView 'destroy' signal calling its
+     * internal gtkspell_free() function. If we call gtkspell_detach() it
+     * results in a segmentation fault.
+     */
+    protected void release() {
+        // GtkSpell.detach(this);
+    }
+
+    /**
+     * Change the language that spellings are being checked against.
+     * 
+     * <p>
+     * The default language selected when you call TextView's
+     * {@link TextView#attachSpell() attachSpell()} is based on the
+     * <code>LANG</code> environment variable, so normally you don't need to
+     * call this.
+     * 
+     * <p>
+     * Otherwise, you can attach with the other
+     * {@link TextView#attachSpell(String) attachSpell()} method, specifying a
+     * language there.
+     * 
+     * <p>
+     * <i>Interestingly, if for some strange reason that environment variable
+     * is not set, the language selection will fall back to English. But as it
+     * is essentially impossible to log into a GNOME system without</i>
+     * <code>LANG</code> <i>being set, you shouldn't ever encounter this.</i>
+     * 
+     * @since 4.0.12
+     */
+    public void setLanguage(String lang) {
+        throw new UnsupportedOperationException("GtkSpell support not yet available");
+    }
+
+    /**
+     * Re-run the spell checker over the entire text.
+     * 
+     * @since 4.0.12
+     */
+    public void recheckAll() {
+        throw new UnsupportedOperationException("GtkSpell support not yet available");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SpinButton.java b/src/bindings/org/gnome/gtk/SpinButton.java
new file mode 100644
index 0000000..3380d2c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SpinButton.java
@@ -0,0 +1,155 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A SpinButton is a little text entry used as input for numeric values in a
+ * given range. It incorporates two little arrow Buttons that user can click
+ * to increment or decrement the value by a given amount.
+ * 
+ * <p>
+ * It is used to let the user introduce the value of a numeric property. This
+ * is specially useful when the range of allowed values is unlimited (well, in
+ * practise limited by <code>Double.MAX_VALUE</code>!) or only limited at one
+ * end. Otherwise, a control like {@link Scale} may be a better alternative.
+ * 
+ * <p>
+ * It is also a good idea to add near the SpinButton a Label indicating the
+ * units of measure of the property it refers to.
+ * 
+ * <p>
+ * The user can modify the SpinButton either introducing a numeric value in
+ * the required range in the text entry, or by clicking the arrow Buttons. The
+ * keyboard can also be used, with both the <b><code>Up</code></b> and <b>
+ * <code>Down</code></b>, or with the <b><code>PageUp</code></b> or <b>
+ * <code>PageDown</code></b> keys. These last decrement or increment the value
+ * of the entry by a greater amount (usually ten times the value of the arrow
+ * Button step).
+ * 
+ * <p>
+ * The programmer can get the value introduced by the user with the
+ * {@link #getValue() getValue()} method. While this method returns a
+ * <code>double</code>, by default the SpinButton only allows to introduce
+ * integer values. You can use the {@link #setDigits(int) setDigits()} method
+ * to change this behaviour.
+ * 
+ * @author Vreixo Formoso
+ * @version 4.0.7
+ */
+public class SpinButton extends Entry
+{
+    protected SpinButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new SpinButton.
+     * 
+     * @param min
+     *            The minimum value allowed.
+     * @param max
+     *            The maximum value allowed.
+     * @param step
+     *            The amount to increment/decrement when one of the arrow
+     *            Buttons are clicked, or when the user press the <b>
+     *            <code>Up</code></b> or <b><code>Down</code></b> keys.
+     * @since 4.0.7
+     */
+    public SpinButton(double min, double max, double step) {
+        super(GtkSpinButton.createSpinButtonWithRange(min, max, step));
+    }
+
+    /**
+     * Set the number of decimal digits to allow in the entry. This affects to
+     * both the precision of the value displayed and the number of decimal
+     * digits the user can introduce in the text entry. You should always give
+     * enough digits to represent the <code>step</code> you have chosen,
+     * otherwise you will get an undesired behaviour.
+     * 
+     * @since 4.0.7
+     */
+    /*
+     * According Gtk+ documentation, only up to 20 digits is allowed. However,
+     * my tests shown that this limit does not actually exist. At the end, we
+     * are limited by the precision of a double!
+     */
+    public void setDigits(int digits) {
+        GtkSpinButton.setDigits(this, digits);
+    }
+
+    /**
+     * Get the current numeric value of the SpinButton.
+     * 
+     * @since 4.0.7
+     */
+    public double getValue() {
+        return GtkSpinButton.getValue(this);
+    }
+
+    /**
+     * Set the value displayed in the text entry. If the given value can't be
+     * represented with the selected decimal digits (see
+     * {@link #setDigits(int) setDigits()}), the next time user increments or
+     * decrements its values the additional digits will be lost, so take care
+     * about this.
+     * 
+     * @since 4.0.7
+     */
+    public void setValue(double value) {
+        GtkSpinButton.setValue(this, value);
+    }
+
+    /**
+     * Signal emitted when the value of the SpinButton changes, either by
+     * clicking the arrow buttons, by pressing the specified keys, by input a
+     * new value on the text entry, or by setting it programmatically with
+     * {@link SpinButton#setValue(double) setValue()} method.
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.7
+     */
+    public interface ValueChanged extends GtkSpinButton.ValueChangedSignal
+    {
+        public void onValueChanged(SpinButton source);
+    }
+
+    /**
+     * Hook up a handler for the <code>SpinButton.ValueChanged</code> signal.
+     * 
+     * @since 4.0.7
+     */
+    public void connect(SpinButton.ValueChanged handler) {
+        GtkSpinButton.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SpinButtonUpdatePolicy.java b/src/bindings/org/gnome/gtk/SpinButtonUpdatePolicy.java
new file mode 100644
index 0000000..143a14c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SpinButtonUpdatePolicy.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SpinButtonUpdatePolicy extends Constant
+{
+    private SpinButtonUpdatePolicy(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/SpinType.java b/src/bindings/org/gnome/gtk/SpinType.java
new file mode 100644
index 0000000..4aef9d5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/SpinType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class SpinType extends Constant
+{
+    private SpinType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Spinner.java b/src/bindings/org/gnome/gtk/Spinner.java
new file mode 100644
index 0000000..9f3b93d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Spinner.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Spinner is a widget that displays an icon-size animation. It is generally
+ * used as an alternative to a {@link ProgressBar} to display indefinite
+ * activity.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.17
+ */
+public class Spinner extends DrawingArea
+{
+    protected Spinner(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Spinner which is not yet started.
+     * 
+     * @since 4.0.17
+     */
+    public Spinner() {
+        super(GtkSpinner.createSpinner());
+    }
+
+    /**
+     * Start the animation of the Spinner.
+     * 
+     * @since 4.0.17
+     */
+    public void start() {
+        GtkSpinner.start(this);
+    }
+
+    /**
+     * Stop the animation of the Spinner.
+     * 
+     * @since 4.0.17
+     */
+    public void stop() {
+        GtkSpinner.stop(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/StateFlags.java b/src/bindings/org/gnome/gtk/StateFlags.java
new file mode 100644
index 0000000..429c247
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/StateFlags.java
@@ -0,0 +1,91 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * The current state of a Widget with respect to drawing and theming. Within
+ * GTK this is used for sub-elements making up a Widget, and different
+ * elements may be in different states. In practise, you only use this for
+ * rare occasions when you need to override the defaults for example
+ * background colour of a Widget. As this will conflict with the Style
+ * settings of the users theme and end up creating inconsistencies in visual
+ * appearance on the Desktop, methods using StateType should only be used with
+ * deliberate care.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.20
+ */
+/*
+ * This is a GTK 3 class, we've included it here to aide porting.
+ */
+// cloned from StateType
+public final class StateFlags extends Flag
+{
+    private StateFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The ordinary state of a Widget
+     */
+    public static final StateFlags NORMAL = new StateFlags(GtkStateFlags.NORMAL, "NORMAL");
+
+    /**
+     * A Widget that is currently active. The definition of this will vary
+     * from Widget to Widget, but a Button, for example, is active while it is
+     * depressed.
+     */
+    public static final StateFlags ACTIVE = new StateFlags(GtkStateFlags.ACTIVE, "ACTIVE");
+
+    /**
+     * The mouse pointer is currently hovering over the Widget, and the Widget
+     * will be responding to mouse clicks.
+     */
+    public static final StateFlags PRELIGHT = new StateFlags(GtkStateFlags.PRELIGHT, "PRELIGHT");
+
+    /**
+     * The element is selected. The canonical example is a row in a TreeView
+     * which has been selected; most themes show this by doing a form of
+     * reverse video, swapping foreground and background colours, etc.
+     */
+    public static final StateFlags SELECTED = new StateFlags(GtkStateFlags.SELECTED, "SELECTED");
+
+    /**
+     * The Widget is not responding to events. See
+     * {@link Window#setSensitive(boolean) setSensitive()} on Window for more
+     * information about this state.
+     */
+    public static final StateFlags INSENSITIVE = new StateFlags(GtkStateFlags.INSENSITIVE, "INSENSITIVE");
+}
diff --git a/src/bindings/org/gnome/gtk/StatusIcon.java b/src/bindings/org/gnome/gtk/StatusIcon.java
new file mode 100644
index 0000000..a5cebf9
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/StatusIcon.java
@@ -0,0 +1,356 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * An icon that is displayed in the notification area.
+ * 
+ * <p>
+ * A StatusIcon is an element that can be added to a notification area. It can
+ * be used to display information about user events that may occur (events in
+ * the sense of "something interesting", not as in GTK event signal). Examples
+ * of user events may be a new email notification, or an incoming instant
+ * message, or a completed file transfer. StatusIcons can be used to display
+ * information of an activity that is occurring in the background, such as a
+ * print job or a file copy activity. A third way of using the StatusIcon
+ * capability is to monitor an existing resource; two existing examples are
+ * laptop battery charge state from <code>gnome-power-manager</code> and the
+ * state of a wireless network connection from NetworkManager's
+ * <code>nm-applet</code> program.
+ * 
+ * <p>
+ * Using a StatusIcon in the notification area is generally less annoying than
+ * popping up a {@link org.gnome.gtk.Dialog}, but they are also less likely to
+ * catch user attention. Thus a StatusIcon can be used to inform the user of
+ * an important event, but not necessarily an urgent event.
+ * 
+ * <p>
+ * A StatusIcon can also have an associated tooltip, not to be confused with
+ * {@link org.gnome.gtk.Tooltip}. This tooltip appears in a balloon at the
+ * StatusIcon itself and can be used to convey additional information.
+ * 
+ * <p>
+ * <b>Do not use as a substitute for writing an applet!</b>. StatusIcons are
+ * frequently abused and/or over used. Only add one to your application if it
+ * conveys critical status information to the user. If it has a more
+ * utilitarian and full-time purpose, it should really be in an applet. In
+ * fact, the power and network examples above are both borderline. The battery
+ * state in particular should probably be an applet and may well move back to
+ * being one; the major argument to make it an applet is to give the user
+ * control over where the battery status is positioned on the panel; the
+ * counter argument is that in the new power management program, the battery
+ * charge state display is transitory and (by default) not shown when not
+ * charging. As you can see, it's a complex issue.
+ * 
+ * <p>
+ * It's essential to keep in mind that the Notification Area is itself a panel
+ * applet; if one isn't running the image displayed by the StatusIcon may not
+ * visible to the user. This is another reason to consider writing an
+ * applet... or just go all the way and write a proper daemon program. See the
+ * GNOME Human Interface Guidelines for more detailed information and
+ * policies.
+ * 
+ * <p>
+ * <i>As it happens, StatusIcon does not derive from Widget for historical
+ * reasons related to the inability of some other platforms to adhere to the
+ * FreeDesktop standards properly.</i>
+ * 
+ * 
+ * @author Nat Pryce
+ * @author Srichand Pendyala
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class StatusIcon extends org.gnome.glib.Object
+{
+    protected StatusIcon(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create an empty StatusIcon.
+     */
+    public StatusIcon() {
+        super(GtkStatusIcon.createStatusIcon());
+    }
+
+    /**
+     * Create a StatusIcon that shows the specified Pixbuf.
+     */
+    public StatusIcon(Pixbuf pixbuf) {
+        super(GtkStatusIcon.createStatusIconFromPixbuf(pixbuf));
+    }
+
+    /**
+     * Create a StatusIcon that displays an image file.
+     * 
+     * @param filename
+     *            The path of an image file.
+     */
+    /*
+     * TODO Both createStatusIconFromFile() and createStatusIconFromIconName()
+     * take a String as a parameter, so we can't expose both in a constructor.
+     * What can be a better option?
+     */
+    public StatusIcon(String filename) {
+        super(GtkStatusIcon.createStatusIconFromFile(filename));
+    }
+
+    /**
+     * Create a StatusIcon that shows as its image a given stock item.
+     */
+    public StatusIcon(Stock stock) {
+        super(GtkStatusIcon.createStatusIconFromStock(stock.getStockId()));
+    }
+
+    /**
+     * Make this StatusIcon display the supplied Pixbuf.
+     */
+    public void setFromPixbuf(Pixbuf pixbuf) {
+        GtkStatusIcon.setFromPixbuf(this, pixbuf);
+    }
+
+    /**
+     * Make this StatusIcon display the image in file <code>filename</code>.
+     * 
+     * @param filename
+     *            the name of an icon file.
+     */
+    public void setFromFile(String filename) {
+        GtkStatusIcon.setFromFile(this, filename);
+    }
+
+    /**
+     * Makes this StatusIcon display a stock icon as its image.
+     */
+    public void setFromStock(Stock stock) {
+        GtkStatusIcon.setFromStock(this, stock.getStockId());
+    }
+
+    /**
+     * Makes this StatusIcon display the named icon from the current icon
+     * theme.
+     */
+    public void setFromIconName(String name) {
+        GtkStatusIcon.setFromIconName(this, name);
+    }
+
+    /**
+     * Gets the type of representation being used by the StatusIcon to store
+     * image data. If the StatusIcon has no image data, the return value will
+     * be {@link ImageType#EMPTY EMPTY}.
+     */
+    public ImageType getStorageType() {
+        return GtkStatusIcon.getStorageType(this);
+    }
+
+    /**
+     * Returns the {@link Pixbuf} being displayed by the gtk.StatusIcon. The
+     * storage type of the StatusIcon must be {@link ImageType#EMPTY EMPTY} or
+     * {@link ImageType#PIXBUF PIXBUF}.
+     * 
+     * @return the {@link Pixbuf} being displayed by the StatusIcon or
+     *         <code>null</code> if the StatusIcon is empty.
+     * @see #getStorageType()
+     */
+    public Pixbuf getPixbuf() {
+        return GtkStatusIcon.getPixbuf(this);
+    }
+
+    /**
+     * Returns the id of the stock icon being displayed by the StatusIcon. The
+     * StorageType of the StatusIcon must be {@link ImageType#EMPTY EMPTY} or
+     * {@link ImageType#STOCK STOCK}; use {@link #getStorageType()
+     * getStorageType()} to find out which it is.
+     * 
+     * @return the Stock representing of the stock icon being displayed by the
+     *         StatusIcon or <code>null</code> if the StatusIcon is empty.
+     */
+    public Stock getStock() {
+        String stockId = GtkStatusIcon.getStock(this);
+        return Stock.instanceFor(stockId);
+    }
+
+    /**
+     * Set the text of the Tooltip for the StatusIcon.
+     * 
+     * @param text
+     *            a value of <code>null</code> will remove the tooltip if
+     *            there is one presently set.
+     * @since 4.0.16
+     */
+    public void setTooltipText(String text) {
+        GtkStatusIcon.setTooltipText(this, text);
+    }
+
+    /**
+     * Reports if the StatusIcon is visible. Note that being visible does not
+     * guarantee that the user can actually see the Status, there must also be
+     * a Notification Area applet running to display it; see
+     * {@link #isEmbedded() isEmbedded()}
+     * 
+     * @return <code>true</code> if the StatusIcon is visible,
+     *         <code>false</code> otherwise.
+     */
+    public boolean getVisible() {
+        return GtkStatusIcon.getVisible(this);
+    }
+
+    /**
+     * Shows or hides the StatusIcon. This is equivalent to the more familiar
+     * {@link Widget#hide() hide()} functionality you'll be used to with
+     * Widgets.
+     * 
+     * @param visible
+     *            <code>true</code> to show the StatusIcon, <code>false</code>
+     *            to hide it.
+     */
+    /*
+     * FIXME is that second sentence true?
+     */
+    public void setVisible(boolean visible) {
+        GtkStatusIcon.setVisible(this, visible);
+    }
+
+    /**
+     * Gets the size available for the image, in pixels. Stock icons adapt
+     * their size automatically if the size of the notification area changes.
+     * For other storage types, the {@link StatusIcon.SizeChanged} signal can
+     * be used to react to size changes.
+     */
+    public int getSize() {
+        return GtkStatusIcon.getSize(this);
+    }
+
+    /**
+     * Reports if the StatusIcon is embedded in a notification area. This
+     * being <code>true</code> implies that the Notification Area applet is
+     * running and added to one of the user's panels on the desktop.
+     * 
+     * <p>
+     * <i>Sometimes users forget to do that, or remove their Notification Area
+     * applet by accident and don't know how to get it back. On the panel,
+     * just</i> <b>Right Click > Add to Panel...</b><i> and select</i>
+     * <b>Notification Area</b>.
+     */
+    public boolean isEmbedded() {
+        return GtkStatusIcon.isEmbedded(this);
+    }
+
+    /**
+     * The signal emitted when the user activates the StatusIcon. In general
+     * this happens when the user left-clicks on this StatusIcon's image in
+     * the notification area.
+     */
+    /*
+     * FIXME any other ways?
+     */
+    public interface Activate extends GtkStatusIcon.ActivateSignal
+    {
+        /**
+         * The signal emitted when the user activates the StatusIcon.
+         * 
+         * @param source
+         *            the StatusIcon that was activated.
+         */
+        void onActivate(StatusIcon source);
+    }
+
+    /**
+     * Hook up a <code>StatusIcon.Activate</code> handler
+     * 
+     * @since 4.0.4
+     */
+    public void connect(StatusIcon.Activate handler) {
+        GtkStatusIcon.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when the user brings up the context menu of the
+     * StatusIcon.
+     */
+    public interface PopupMenu extends GtkStatusIcon.PopupMenuSignal
+    {
+        /**
+         * The signal emitted when the user right-clicks on the StatusIcon.
+         * You're almost certain to want to be bringing up a context menu in
+         * that case, so see Menu's {@link Menu#popup(StatusIcon) popup()} for
+         * details of how to do it.
+         * 
+         * <p>
+         * The two additional parameters in the handler prototype are
+         * described below, but we disregard them and they may be removed in a
+         * future version of java-gnome.
+         * 
+         * @param button
+         *            the button that was pressed, or 0 if the signal is not
+         *            emitted in response to a button press event.
+         * @param activateTime
+         *            the timestamp of the event that triggered the signal
+         *            emission.
+         */
+        /*
+         * FIXME activateTime is an int?!? If it's not long seconds since
+         * epoch, what does it mean?
+         */
+        void onPopupMenu(StatusIcon source, int button, int activateTime);
+    }
+
+    public void connect(StatusIcon.PopupMenu handler) {
+        GtkStatusIcon.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when the size available for the StatusIcon's image
+     * changes. This happens if the panel the Notification Area applet is
+     * running in gets resized.
+     */
+    public interface SizeChanged extends GtkStatusIcon.SizeChangedSignal
+    {
+        /**
+         * Signal emitted when the size available for the image changes.
+         * 
+         * @param source
+         *            the object which received the signal.
+         * @param size
+         *            the new size, in pixels.
+         */
+        boolean onSizeChanged(StatusIcon source, int size);
+    }
+
+    public void connect(StatusIcon.SizeChanged handler) {
+        GtkStatusIcon.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Statusbar.java b/src/bindings/org/gnome/gtk/Statusbar.java
new file mode 100644
index 0000000..8a08799
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Statusbar.java
@@ -0,0 +1,158 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * The space at the bottom of an application Window where status messages are
+ * displayed. <img src="Statusbar.png" class="snapshot">
+ * 
+ * <p>
+ * A Statusbar should generally be present at the bottom of a GNOME
+ * application's main Window by being the first Widget to be packed with
+ * respect to the end of the VBox used to vertically layout such a Window:
+ * 
+ * <pre>
+ * status = new Statusbar();
+ * vbox.packEnd(status, false, false, 0);
+ * window.add(vbox);
+ * </pre>
+ * 
+ * in fact, this is so much a convention that a Statusbar should be present
+ * regardless of whether or not you plan to have messages to display. Make
+ * sure you pack it into the top level VBox with <var>expand</var> and
+ * <var>fill</var> set to <code>false</code> as shown. Statusbars somewhat by
+ * definition should stay narrow; they shouldn't grow thicker if the user
+ * resizes vertically.
+ * 
+ * <p>
+ * The text in the Statusbar is set with {@link #setMessage(String)
+ * setMessage()}. Most applications leave the Statusbar empty as a default
+ * state, but if you wish to inform the user of things being in a normal
+ * state, you can certainly do so:
+ * 
+ * <pre>
+ * status.setMessage("Ready");
+ * </pre>
+ * 
+ * or similar words appropriate to your program.
+ * 
+ * <p>
+ * Statusbars are excellent for providing hints to the user about what the
+ * user can do next (see <b><code>Inkscape</code></b> as a terrific example),
+ * or to update the user with what the application is up to when processing.
+ * Keep in mind, however, that this is considered only an assistance; people
+ * don't necessarily look to the Statusbar when wondering what is going on
+ * (and further, many applications allow the user to turn the Statusbar off
+ * entirely). If you need to provide urgent information to the user then use a
+ * Dialog.
+ * 
+ * <p>
+ * As a Box subclass, you can pack other Widgets into the Statusbar. This is a
+ * great place for a ProgressBar if you have a long running worker thread that
+ * needs to report its percentage completion. Widgets so added will be packed
+ * after the Label that is (obviously) internally present to display the
+ * status messages. If it is a small Window you may want to constrain the size
+ * of the ProgressBar lest it blot out the message:
+ * 
+ * <pre>
+ * status = new Statusbar();
+ * bar = new ProgressBar();
+ * bar.setSizeRequest(30, -1);
+ * status.packEnd(bar, false, false, 0);
+ * </pre>
+ * 
+ * then later:
+ * 
+ * <pre>
+ * status.setMessage("Sending all your files to the CIA...");
+ * bar.setFraction(0.35);
+ * </pre>
+ * 
+ * <p>
+ * A visible Statusbar usually drawn with a grip in the bottom right corner
+ * which most users will recognized as a stylized visual indication that the
+ * Window can be resized. If necessary, it can be suppressed by calling
+ * {@link #setHasResizeGrip(boolean) setHasResizeGrip(false)}.
+ * 
+ * <p>
+ * <i>The underlying API in <code>GtkStatusbar</code> is ridiculously
+ * complicated for absolutely no good reason. We have therefore compressed its
+ * hideous stack-based mechanism into the simple single-message interface
+ * presented here.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+/*
+ * Not only is the whole context thing excessive, it turns out it is
+ * unnecessary. Per gtkstatusbar.h, there is a default context, id 0, which
+ * can be used as a global default.
+ */
+public class Statusbar extends HBox
+{
+    protected Statusbar(long pointer) {
+        super(pointer);
+        GtkStatusbar.push(this, 0, "");
+    }
+
+    /**
+     * Construct a new Statusbar. The initial message is empty (you don't need
+     * to explicitly set it to be so).
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * Strictly speaking, adding an empty status message isn't necessary, but
+     * it makes the logic for our setMessage() method a bit sounder.
+     */
+    public Statusbar() {
+        super(GtkStatusbar.createStatusbar());
+        GtkStatusbar.push(this, 0, "");
+    }
+
+    /**
+     * Set the message showing in the Statusbar. You can call this frequently
+     * with whatever indication you wish to display to the user; the last
+     * message will be discarded.
+     * 
+     * <p>
+     * If you want to clear the message, simply pass the empty string,
+     * <code>""</code>.
+     * 
+     * @since 4.0.6
+     */
+    public void setMessage(String text) {
+        GtkStatusbar.pop(this, 0);
+        GtkStatusbar.push(this, 0, text);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Stock.java b/src/bindings/org/gnome/gtk/Stock.java
new file mode 100644
index 0000000..7cfe1a0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Stock.java
@@ -0,0 +1,362 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.util.HashMap;
+
+/**
+ * Identifiers for the different standard UI elements used to create
+ * consistent user interfaces across GNOME applications. Stock items represent
+ * commonly-used Menu or Toolbar items such as "Open" and "Quit". A stock item
+ * defines properties used when creating new Buttons, MenuItems, etc including
+ * the localized user-visible Label, the icon used to identify it the control,
+ * and the default keyboard accelerator that triggers it.
+ * 
+ * <p>
+ * GTK comes with a fairly large pre-built set of stock items. You should use
+ * them in your programs whenever possible thus ensuring your application will
+ * have a look and feel consistent with other GNOME applications. This also
+ * aids in discoverability by helping the user identify what a Button does or
+ * how to execute a common operation in your application.
+ * 
+ * <p>
+ * Each stock item is identified by a Stock constant that you can pass to
+ * constructors of different widgets, such as Buttons. When your application
+ * does a common task represented by one of the constants in this class, you
+ * should use it to identify that task in your Menus and Buttons.
+ * 
+ * <p>
+ * Please note that this is <i>not</i> a place to get creative. Well known
+ * stock icons have a defined behaviour which users can rightfully expect to
+ * be consistent. Using these images in non-standard ways will result in a
+ * severe usability impact and will cause people to ridicule your program.
+ * 
+ * <p>
+ * <i>In GTK, stock-ids are just plain <code>gchar*</code> strings. We
+ * implement these constants here for commodity and type-safety.</i>
+ * 
+ * <p>
+ * <dl>
+ * <dt><b>WARNING</b>
+ * <dd>TODO This class may have to be refactored when [if] we introduce
+ * coverage of StockItem.</dd>
+ * </dl>
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+/*
+ * FIXME by exception, this has been merged with incomplete documentation.
+ * It's a huge class, so we'll let people build it up over time. If you know
+ * something about the usage of one of these stock items (for example, see
+ * Stock.CLOSE), please contribute!
+ */
+public class Stock
+{
+    /**
+     * The GTK side string constant used to identify this Stock[Item].
+     */
+    private final String stockId;
+
+    private static final HashMap<String, Stock> knownStocks;
+
+    static {
+        knownStocks = new HashMap<String, Stock>(100, 0.999999f);
+    }
+
+    /**
+     * Construct a new Stock constant from a given string. This is provided so
+     * that if we missed an ID that you desperately need, you can subclass and
+     * create it. Ideally, though, we'd appreciate it if you'd point out what
+     * it is about that stock-id that you needed, and if appropriate submit a
+     * patch adding it to this class instead.
+     */
+    protected Stock(String stockId) {
+        this.stockId = stockId;
+        knownStocks.put(stockId, this);
+    }
+
+    /**
+     * Get the stock-id String expected by GTK representing this stock item.
+     */
+    /*
+     * Interesting design question. For the moment, keep this with restricted
+     * visibility on the basis of "we don't expose internals!". If we find
+     * ourselves with problems out-of-package, then we can reconsider.
+     */
+    protected String getStockId() {
+        return stockId;
+    }
+
+    /**
+     * Look up a Stock object for the supplied String id as used in the
+     * underlying library. Returns <code>null</code> if not found.
+     */
+    static Stock instanceFor(String stockId) {
+        return knownStocks.get(stockId);
+    }
+
+    /**
+     * Usually used to identify an Action that shows version, copyright, and
+     * authorship information about the application.
+     */
+    public static final Stock ABOUT = new Stock("gtk-about");
+
+    public static final Stock ADD = new Stock("gtk-add");
+
+    public static final Stock APPLY = new Stock("gtk-apply");
+
+    public static final Stock BOLD = new Stock("gtk-bold");
+
+    public static final Stock CANCEL = new Stock("gtk-cancel");
+
+    public static final Stock CDROM = new Stock("gtk-cdrom");
+
+    public static final Stock CLEAR = new Stock("gtk-clear");
+
+    /**
+     * Close the current Window or the current document. While meaning of this
+     * does vary a bit between applications depending on their purpose, the
+     * one thing close does <b>not</b> mean is to <i>quit</i> the application
+     * (unless the program's behaviour is to terminate when the last document
+     * is closed - that's ok). For outright exiting a program, see
+     * {@link #QUIT QUIT}.
+     * 
+     * <p>
+     * <img src="file:///usr/share/icons/gnome/22x22/actions/gtk-close.png">
+     */
+    /*
+     * FIXME Ok, that IMG is pretty crazy to have there, but why not? Of
+     * course, we need to have a canonical path that would actually work for
+     * everyone, and that's a tricky proposition [while last I checked most
+     * the distros left this sort of thing alone. Probably can't trust Debian,
+     * though]. A better idea would be to source an image from somewhere in
+     * http://library.gnome.org/devel/...
+     */
+    public static final Stock CLOSE = new Stock("gtk-close");
+
+    public static final Stock COLOR_PICKER = new Stock("gtk-color-picker");
+
+    public static final Stock CONVERT = new Stock("gtk-convert");
+
+    public static final Stock CONNECT = new Stock("gtk-connect");
+
+    public static final Stock COPY = new Stock("gtk-copy");
+
+    public static final Stock CUT = new Stock("gtk-cut");
+
+    public static final Stock DELETE = new Stock("gtk-delete");
+
+    public static final Stock DIALOG_AUTHENTICATION = new Stock("gtk-dialog-authentication");
+
+    public static final Stock DIALOG_ERROR = new Stock("gtk-dialog-error");
+
+    public static final Stock DIALOG_INFO = new Stock("gtk-dialog-info");
+
+    public static final Stock DIALOG_QUESTION = new Stock("gtk-dialog-question");
+
+    public static final Stock DIALOG_WARNING = new Stock("gtk-dialog-warning");
+
+    public static final Stock DIRECTORY = new Stock("gtk-directory");
+
+    public static final Stock DISCONNECT = new Stock("gtk-disconnect");
+
+    public static final Stock DND = new Stock("gtk-dnd");
+
+    public static final Stock DND_MULTIPLE = new Stock("gtk-dnd-multiple");
+
+    public static final Stock EDIT = new Stock("gtk-edit");
+
+    public static final Stock EXECUTE = new Stock("gtk-execute");
+
+    public static final Stock FILE = new Stock("gtk-file");
+
+    public static final Stock FIND = new Stock("gtk-find");
+
+    public static final Stock FIND_AND_REPLACE = new Stock("gtk-find-and-replace");
+
+    public static final Stock FLOPPY = new Stock("gtk-floppy");
+
+    public static final Stock FULLSCREEN = new Stock("gtk-fullscreen");
+
+    public static final Stock GOTO_BOTTOM = new Stock("gtk-goto-bottom");
+
+    public static final Stock GOTO_FIRST = new Stock("gtk-goto-first");
+
+    public static final Stock GOTO_LAST = new Stock("gtk-goto-last");
+
+    public static final Stock GOTO_TOP = new Stock("gtk-goto-top");
+
+    public static final Stock GO_BACK = new Stock("gtk-go-back");
+
+    public static final Stock GO_DOWN = new Stock("gtk-go-down");
+
+    public static final Stock GO_FORWARD = new Stock("gtk-go-forward");
+
+    public static final Stock GO_UP = new Stock("gtk-go-up");
+
+    public static final Stock HARDDISK = new Stock("gtk-harddisk");
+
+    public static final Stock HELP = new Stock("gtk-help");
+
+    public static final Stock HOME = new Stock("gtk-home");
+
+    public static final Stock INDENT = new Stock("gtk-indent");
+
+    public static final Stock INDEX = new Stock("gtk-index");
+
+    public static final Stock INFO = new Stock("gtk-info");
+
+    public static final Stock ITALIC = new Stock("gtk-italic");
+
+    public static final Stock JUMP_TO = new Stock("gtk-jump-to");
+
+    public static final Stock JUSTIFY_CENTER = new Stock("gtk-justify-center");
+
+    public static final Stock JUSTIFY_FILL = new Stock("gtk-justify-fill");
+
+    public static final Stock JUSTIFY_LEFT = new Stock("gtk-justify-left");
+
+    public static final Stock JUSTIFY_RIGHT = new Stock("gtk-justify-right");
+
+    public static final Stock LEAVE_FULLSCREEN = new Stock("gtk-leave-fullscreen");
+
+    public static final Stock MEDIA_FORWARD = new Stock("gtk-media-forward");
+
+    public static final Stock MEDIA_NEXT = new Stock("gtk-media-next");
+
+    public static final Stock MEDIA_PAUSE = new Stock("gtk-media-pause");
+
+    public static final Stock MEDIA_PLAY = new Stock("gtk-media-play");
+
+    public static final Stock MEDIA_PREVIOUS = new Stock("gtk-media-previous");
+
+    public static final Stock MEDIA_RECORD = new Stock("gtk-media-record");
+
+    public static final Stock MEDIA_REWIND = new Stock("gtk-media-rewind");
+
+    public static final Stock MEDIA_STOP = new Stock("gtk-media-stop");
+
+    public static final Stock MISSING_IMAGE = new Stock("gtk-missing-image");
+
+    public static final Stock NETWORK = new Stock("gtk-network");
+
+    public static final Stock NEW = new Stock("gtk-new");
+
+    public static final Stock NO = new Stock("gtk-no");
+
+    public static final Stock OK = new Stock("gtk-ok");
+
+    public static final Stock OPEN = new Stock("gtk-open");
+
+    public static final Stock ORIENTATION_LANDSCAPE = new Stock("gtk-orientation-landscape");
+
+    public static final Stock ORIENTATION_PORTRAIT = new Stock("gtk-orientation-portrait");
+
+    public static final Stock ORIENTATION_REVERSE_LANDSCAPE = new Stock(
+            "gtk-orientation-reverse-landscape");
+
+    public static final Stock ORIENTATION_REVERSE_PORTRAIT = new Stock(
+            "gtk-orientation-reverse-portrait");
+
+    public static final Stock PASTE = new Stock("gtk-paste");
+
+    public static final Stock PREFERENCES = new Stock("gtk-preferences");
+
+    public static final Stock PRINT = new Stock("gtk-print");
+
+    public static final Stock PRINT_PREVIEW = new Stock("gtk-print-preview");
+
+    public static final Stock PROPERTIES = new Stock("gtk-properties");
+
+    /**
+     * Terminate the application. If you just want to close a single document
+     * Window, then use {@link #CLOSE CLOSE}.
+     * 
+     * <p>
+     * <img src="file:///usr/share/icons/gnome/22x22/actions/gtk-quit.png">
+     * 
+     * <p>
+     * <i>There's no</i> <code>EXIT</code><i>, in case you were wondering.
+     * </i>
+     */
+    public static final Stock QUIT = new Stock("gtk-quit");
+
+    public static final Stock REDO = new Stock("gtk-redo");
+
+    public static final Stock REFRESH = new Stock("gtk-refresh");
+
+    public static final Stock REMOVE = new Stock("gtk-remove");
+
+    public static final Stock REVERT_TO_SAVED = new Stock("gtk-revert-to-saved");
+
+    public static final Stock SAVE = new Stock("gtk-save");
+
+    public static final Stock SAVE_AS = new Stock("gtk-save-as");
+
+    public static final Stock SELECT_ALL = new Stock("gtk-select-all");
+
+    public static final Stock SELECT_COLOR = new Stock("gtk-select-color");
+
+    public static final Stock SELECT_FONT = new Stock("gtk-select-font");
+
+    public static final Stock SORT_ASCENDING = new Stock("gtk-sort-ascending");
+
+    public static final Stock SORT_DESCENDING = new Stock("gtk-sort-descending");
+
+    public static final Stock SPELL_CHECK = new Stock("gtk-spell-check");
+
+    public static final Stock STOP = new Stock("gtk-stop");
+
+    public static final Stock STRIKETHROUGH = new Stock("gtk-strikethrough");
+
+    public static final Stock UNDELETE = new Stock("gtk-undelete");
+
+    public static final Stock UNDERLINE = new Stock("gtk-underline");
+
+    public static final Stock UNDO = new Stock("gtk-undo");
+
+    public static final Stock UNINDENT = new Stock("gtk-unindent");
+
+    public static final Stock YES = new Stock("gtk-yes");
+
+    public static final Stock ZOOM_100 = new Stock("gtk-zoom-100");
+
+    public static final Stock ZOOM_FIT = new Stock("gtk-zoom-fit");
+
+    public static final Stock ZOOM_IN = new Stock("gtk-zoom-in");
+
+    public static final Stock ZOOM_OUT = new Stock("gtk-zoom-out");
+}
diff --git a/src/bindings/org/gnome/gtk/Style.java b/src/bindings/org/gnome/gtk/Style.java
new file mode 100644
index 0000000..e9075a9
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Style.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Styles. These constants represent styles values used by the various widgets
+ * of the GTK library.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public class Style
+{
+    /**
+     * The name used to identify the value of the property.
+     */
+    final String name;
+
+    /**
+     * Construct a new Style constant from a given string.
+     * 
+     * <p>
+     * This is provided so that if we missed a name that you desperately need
+     * a style that we have missed.
+     * 
+     * <p>
+     * <i>If you find yourself doing this, we'd appreciate it if you'd point
+     * out what it is about that name that you needed, and if appropriate
+     * submit a patch adding it to one of the Style subclasses instead.</i>
+     * 
+     * @since 4.1.2
+     */
+    protected Style(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Returns the name associated to the Style constant.
+     * 
+     * @since 4.1.2
+     */
+    String getStyleName() {
+        return name;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/StyleClass.java b/src/bindings/org/gnome/gtk/StyleClass.java
new file mode 100644
index 0000000..5e3a6ab
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/StyleClass.java
@@ -0,0 +1,257 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Styles that help to manipulate the class value of the {@link StyleContext}
+ * of a widget inside GTK.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class StyleClass extends Style
+{
+    protected StyleClass(String name) {
+        super(name);
+    }
+
+    /**
+     * A CSS class to match the window background.
+     */
+    public static final StyleClass BACKGROUND = new StyleClass("background");
+
+    /**
+     * A CSS class to match buttons.
+     */
+    public static final StyleClass BUTTON = new StyleClass("button");
+
+    /**
+     * A CSS class to match calendars.
+     */
+    public static final StyleClass CALENDAR = new StyleClass("calendar");
+
+    /**
+     * A CSS class to match content rendered in cell views.
+     */
+    public static final StyleClass CELL = new StyleClass("cell");
+
+    /**
+     * A CSS class to match check boxes.
+     */
+    public static final StyleClass CHECK = new StyleClass("check");
+
+    /**
+     * A CSS class to match the default widget.
+     */
+    public static final StyleClass DEFAULT = new StyleClass("default");
+
+    /**
+     * A CSS class to match text entries.
+     */
+    public static final StyleClass ENTRY = new StyleClass("entry");
+
+    /**
+     * A CSS class to match a header element.
+     */
+    public static final StyleClass HEADER = new StyleClass("header");
+
+    /**
+     * A CSS class to match popup menus.
+     */
+    public static final StyleClass MENU = new StyleClass("menu");
+
+    /**
+     * A CSS class to match radio buttons.
+     */
+    public static final StyleClass RADIO = new StyleClass("radio");
+
+    /**
+     * A CSS class to match the rubberband selection rectangle.
+     */
+    public static final StyleClass RUBBERBAND = new StyleClass("rubberband");
+
+    /**
+     * A CSS class to match scrollbars.
+     */
+    public static final StyleClass SCROLLBAR = new StyleClass("scrollbar");
+
+    /**
+     * A CSS class to match sliders.
+     */
+    public static final StyleClass SLIDER = new StyleClass("slider");
+
+    /**
+     * A CSS class to match tooltip windows.
+     */
+    public static final StyleClass TOOLTIP = new StyleClass("tooltip");
+
+    /**
+     * A CSS class to match troughs, as in scrollbars and progressbars.
+     */
+    public static final StyleClass TROUGH = new StyleClass("trough");
+
+    /**
+     * A CSS class to match an accelerator.
+     */
+    public static final StyleClass ACCELERATOR = new StyleClass("accelerator");
+
+    /**
+     * A widget class defining a dock area.
+     */
+    public static final StyleClass DOCK = new StyleClass("dock");
+
+    /**
+     * A widget class defining a resize grip.
+     */
+    public static final StyleClass GRIP = new StyleClass("grip");
+
+    /**
+     * A CSS class to menubars.
+     */
+    public static final StyleClass MENUBAR = new StyleClass("menubar");
+
+    /**
+     * A CSS class to match menu items.
+     */
+    public static final StyleClass MENUITEM = new StyleClass("menuitem");
+
+    /**
+     * A widget class defining a resize grip.
+     */
+    public static final StyleClass PROGRESSBAR = new StyleClass("progressbar");
+
+    /**
+     * A widget class defining a spinner.
+     */
+    public static final StyleClass SPINNER = new StyleClass("spinner");
+
+    /**
+     * A CSS class to match toolbars.
+     */
+    public static final StyleClass TOOLBAR = new StyleClass("toolbar");
+
+    /**
+     * A CSS class to match primary toolbars.
+     */
+    public static final StyleClass PRIMARY_TOOLBAR = new StyleClass("primary-toolbar");
+
+    /**
+     * A CSS class for a pane separator.
+     */
+    public static final StyleClass PANE_SEPARATOR = new StyleClass("pane-separator");
+
+    /**
+     * A CSS class for a separator.
+     */
+    public static final StyleClass SEPARATOR = new StyleClass("separator");
+
+    /**
+     * A CSS class for a drag-and-drop indicator.
+     */
+    public static final StyleClass DND = new StyleClass("dnd");
+
+    /**
+     * A widget class for an area displaying an error message, such as those
+     * in infobars.
+     */
+    public static final StyleClass ERROR = new StyleClass("error");
+
+    /**
+     * A widget class defining an expander, such as those in treeviews.
+     */
+    public static final StyleClass EXPANDER = new StyleClass("expander");
+
+    /**
+     * A CSS class defining a frame delimiting content.
+     */
+    public static final StyleClass FRAME = new StyleClass("frame");
+
+    /**
+     * A CSS class defining a highlighted area, such as headings in
+     * assistants.
+     */
+    public static final StyleClass HIGHLIGHT = new StyleClass("highlight");
+
+    /**
+     * A widget class for an area displaying an informational message, such as
+     * those in infobars.
+     */
+    public static final StyleClass INFO = new StyleClass("info");
+
+    /**
+     * A widget class defining marks in a widget, such as in scales.
+     */
+    public static final StyleClass MARK = new StyleClass("mark");
+
+    /**
+     * A widget class defining a notebook.
+     */
+    public static final StyleClass NOTEBOOK = new StyleClass("notebook");
+
+    /**
+     * A widget class for an area displaying a question to the user, such as
+     * those in infobars.
+     */
+    public static final StyleClass QUESTION = new StyleClass("question");
+
+    /**
+     * A CSS class to match scale widgets.
+     */
+    public static final StyleClass SCALE = new StyleClass("scale");
+
+    /**
+     * A widget class defining an spinbutton.
+     */
+    public static final StyleClass SPINBUTTON = new StyleClass("spinbutton");
+
+    /**
+     * A widget class defining a view, such as iconviews or treeviews.
+     */
+    public static final StyleClass VIEW = new StyleClass("view");
+
+    /**
+     * A widget class for an area displaying a warning message, such as those
+     * in infobars.
+     */
+    public static final StyleClass WARNING = new StyleClass("warning");
+
+    /**
+     * A widget class for horizontally layered widgets.
+     */
+    public static final StyleClass HORIZONTAL = new StyleClass("horizontal");
+
+    /**
+     * A widget class for vertically layered widgets.
+     */
+    public static final StyleClass VERTICAL = new StyleClass("vertical");
+}
diff --git a/src/bindings/org/gnome/gtk/StyleContext.java b/src/bindings/org/gnome/gtk/StyleContext.java
new file mode 100644
index 0000000..3bb302f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/StyleContext.java
@@ -0,0 +1,226 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Screen;
+import org.gnome.glib.Object;
+
+/**
+ * Object that contains the styling information affecting a widget. The
+ * StyleContext associated to a widget can be retrieved by using the Widget
+ * {@link Widget#getStyleContext() getStyleContext()} method.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public class StyleContext extends Object
+{
+    protected StyleContext(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Returns the {@link Screen} to which this StyleContext is attached.
+     * 
+     * @since 4.1.2
+     */
+    public Screen getScreen() {
+        return GtkStyleContext.getScreen(this);
+    }
+
+    /**
+     * Sets the {@link Screen} to which this StyleContext has to be attached.
+     * 
+     * @since 4.1.2
+     */
+    public void setScreen(Screen screen) {
+        GtkStyleContext.setScreen(this, screen);
+    }
+
+    /**
+     * Returns the {@link StateFlags} used when rendering.
+     * 
+     * @since 4.1.2
+     */
+    public StateFlags getState() {
+        return GtkStyleContext.getState(this);
+    }
+
+    /**
+     * Sets the {@link StateFlags} to be used when rendering.
+     * 
+     * @since 4.1.2
+     */
+    public void setState(StateFlags flags) {
+        GtkStyleContext.setState(this, flags);
+    }
+
+    /**
+     * Restores StyleContext state to a previous saved stage. The saved state
+     * is created when calling {@link #save()}.
+     * 
+     * @since 4.1.2
+     */
+    public void restore() {
+        GtkStyleContext.restore(this);
+    }
+
+    /**
+     * Saves the StyleContext state, so all modifications done through
+     * {@link #addClass(StyleClass)}, {@link #removeClass(StyleClass)},
+     * {@link #addRegion(StyleRegion, RegionFlags)}, or
+     * {@link #removeRegion(StyleRegion)} can be reverted in one go through
+     * {@link #restore()}.
+     * 
+     * @since 4.1.2
+     */
+    public void save() {
+        GtkStyleContext.save(this);
+    }
+
+    /**
+     * Adds a {@link StyleClass} to StyleContext so render functions will make
+     * use of this new class for styling.
+     * 
+     * @since 4.1.2
+     */
+    public void addClass(StyleClass value) {
+        GtkStyleContext.addClass(this, value.getStyleName());
+    }
+
+    /**
+     * Removes a {@link StyleClass} from the StyleContext.
+     * 
+     * @since 4.1.2
+     */
+    public void removeClass(StyleClass value) {
+        GtkStyleContext.removeClass(this, value.getStyleName());
+    }
+
+    /**
+     * Returns <code>true</code> if StyleContext currently has defined the
+     * given {@link StyleClass}.
+     * 
+     * @since 4.1.2
+     */
+    public boolean hasClass(StyleClass value) {
+        return GtkStyleContext.hasClass(this, value.getStyleName());
+    }
+
+    /**
+     * Returns a string array that list the classes used by this context.
+     * 
+     * @since 4.1.2
+     */
+    public String[] listClasses() {
+        return GtkStyleContextOverride.getClasses(this);
+    }
+
+    /**
+     * Adds a {@link StyleRegion} to StyleContext, so render functions will
+     * make use of this new region for styling.
+     * 
+     * @since 4.1.2
+     */
+    public void addRegion(StyleRegion region, RegionFlags flags) {
+        GtkStyleContext.addRegion(this, region.getStyleName(), flags);
+    }
+
+    /**
+     * Removes a {@link StyleRegion} from the StyleContext.
+     * 
+     * @since 4.1.2
+     */
+    public void removeRegion(StyleRegion region) {
+        GtkStyleContext.removeRegion(this, region.getStyleName());
+    }
+
+    /**
+     * Returns a non-<code>null</code> value if StyleContext currently has
+     * defined the given {@link StyleRegion}. The returned value corresponds
+     * to the {@link RegionFlags}.
+     * 
+     * @since 4.1.2
+     */
+    public RegionFlags hasRegion(StyleRegion region) {
+        return GtkStyleContextOverride.hasRegion(this, region.getStyleName());
+    }
+
+    /**
+     * Returns a string array that list the regions used by this context.
+     * 
+     * @since 4.1.2
+     */
+    public String[] listRegions() {
+        return GtkStyleContextOverride.getRegions(this);
+    }
+
+    /**
+     * Return the sides where rendered elements connect visually with others.
+     * 
+     * @since 4.1.2
+     */
+    public JunctionSides getJunctionSides() {
+        return GtkStyleContext.getJunctionSides(this);
+    }
+
+    /**
+     * Sets the sides where rendered elements will visually connect with other
+     * visual elements. Container widgets are expected to do all this work by
+     * themselves so calling this method manually shouldn't be necessary.
+     * 
+     * @since 4.1.2
+     */
+    public void setJunctionSides(JunctionSides sides) {
+        GtkStyleContext.setJunctionSides(this, sides);
+    }
+
+    /**
+     * Returns the widget direction used for rendering.
+     * 
+     * @since 4.1.2
+     */
+    public TextDirection getDirection() {
+        return GtkStyleContext.getDirection(this);
+    }
+
+    /**
+     * Sets the reading direction of a rendered widget. You generally do not
+     * have to call this method but it can be useful for test purposes.
+     * 
+     * @since 4.1.2
+     */
+    public void setDirection(TextDirection direction) {
+        GtkStyleContext.setDirection(this, direction);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/StyleProperty.java b/src/bindings/org/gnome/gtk/StyleProperty.java
new file mode 100644
index 0000000..c22145e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/StyleProperty.java
@@ -0,0 +1,103 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Styles that help to manipulate the property value of the
+ * {@link StyleContext} of a widget inside GTK.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class StyleProperty extends Style
+{
+    protected StyleProperty(String name) {
+        super(name);
+    }
+
+    /**
+     * A property holding the background color of rendered elements.
+     */
+    public static final StyleProperty BACKGROUND_COLOR = new StyleProperty("background-color");
+
+    /**
+     * A property holding the foreground color of rendered elements.
+     */
+    public static final StyleProperty COLOR = new StyleProperty("color");
+
+    /**
+     * A property holding the font properties used when rendering text as a
+     * PangoFontDescription.
+     */
+    public static final StyleProperty FONT = new StyleProperty("font");
+
+    /**
+     * A property holding the rendered element's margin as a GtkBorder. The
+     * margin is defined as the spacing between the border of the element and
+     * its surrounding elements.
+     */
+    public static final StyleProperty MARGIN = new StyleProperty("margin");
+
+    /**
+     * A property holding the rendered element's padding as a GtkBorder. The
+     * padding is defined as the spacing between the inner part of the element
+     * border and its child.
+     */
+    public static final StyleProperty PADDING = new StyleProperty("padding");
+
+    /**
+     * A property holding the rendered element's border width in pixels as a
+     * GtkBorder.
+     */
+    public static final StyleProperty BORDER_WIDTH = new StyleProperty("border-width");
+
+    /**
+     * A property holding the rendered element's border radius in pixels.
+     */
+    public static final StyleProperty BORDER_RADIUS = new StyleProperty("border-radius");
+
+    /**
+     * A property holding the element's border style..
+     */
+    public static final StyleProperty BORDER_STYLE = new StyleProperty("border-style");
+
+    /**
+     * A property holding the element's border color.
+     */
+    public static final StyleProperty BORDER_COLOR = new StyleProperty("border-color");
+
+    /**
+     * A property holding the element's background.
+     */
+    public static final StyleProperty BACKGROUND_IMAGE = new StyleProperty("background-image");
+}
diff --git a/src/bindings/org/gnome/gtk/StyleRegion.java b/src/bindings/org/gnome/gtk/StyleRegion.java
new file mode 100644
index 0000000..0fabc6e
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/StyleRegion.java
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Styles that help to manipulate the region value of the {@link StyleContext}
+ * of a widget inside GTK.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class StyleRegion extends Style
+{
+    protected StyleRegion(String name) {
+        super(name);
+    }
+
+    /**
+     * A widget region name to define a {@link TreeView} column.
+     */
+    public static final StyleRegion COLUMN = new StyleRegion("column");
+
+    /**
+     * A widget region name to define a {@link TreeView} column header.
+     */
+    public static final StyleRegion COLUMN_HEADER = new StyleRegion("column-header");
+
+    /**
+     * A widget region name to define a {@link TreeView} row.
+     */
+    public static final StyleRegion ROW = new StyleRegion("row");
+
+    /**
+     * A widget region name to define a {@link Notebook} tab.
+     */
+    public static final StyleRegion TAB = new StyleRegion("tab");
+}
diff --git a/src/bindings/org/gnome/gtk/Switch.java b/src/bindings/org/gnome/gtk/Switch.java
new file mode 100644
index 0000000..865af47
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Switch.java
@@ -0,0 +1,116 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Switch is a widget that has two states: on or off. The user can control
+ * which state should be active by clicking the empty area, or by dragging the
+ * handle. <img src="Switch.png" class="snapshot" />
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public class Switch extends Widget
+{
+    protected Switch(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Switch widget.
+     * 
+     * @since 4.1.2
+     */
+    public Switch() {
+        this(GtkSwitch.createSwitch());
+    }
+
+    /**
+     * Returns the current state of the Switch.
+     * 
+     * @since 4.1.2
+     */
+    public boolean isActive() {
+        return GtkSwitch.getActive(this);
+    }
+
+    /**
+     * Sets the state of the Switch.
+     * 
+     * @since 4.1.2
+     */
+    public void setActive(boolean value) {
+        GtkSwitch.setActive(this, value);
+    }
+
+    /**
+     * The callback invoked when the Switch is activated.
+     * 
+     * Generally, when you will receive the callback, you will probably want
+     * to check the <code>active</code> property with the Switch
+     * {@link Switch#isActive() isActive()} method:
+     * 
+     * <pre>
+     * final Switch switcher;
+     * 
+     * ...
+     * 
+     * switcher.connect(new Switch.NotifyActivated() {
+     *     public void onNotifyActivated(Switch source) {
+     *         if (source.isActive()) {
+     *             System.out.printl("WiFi is on.");
+     *         } else {
+     *             System.out.printl("WiFi is off.");
+     *         }
+     *     }
+     * });
+     * </pre>
+     * 
+     * @since 4.1.2
+     */
+    public interface NotifyActivated extends GtkSwitch.NotifyActivatedSignal
+    {
+        public void onNotifyActivated(Switch source);
+    }
+
+    /**
+     * Hookup the <code>Switch.NotifyActivated</code> signal that will be
+     * emitted when the Switch will be activated.
+     * 
+     * @since 4.1.2
+     */
+    public void connect(Switch.NotifyActivated handler) {
+        GtkSwitchOverride.setActivatedSignal(this);
+        GtkSwitch.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Table.java b/src/bindings/org/gnome/gtk/Table.java
new file mode 100644
index 0000000..25ed9e2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Table.java
@@ -0,0 +1,194 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Container which arranges child Widgets in particular rows and columns.
+ * 
+ * <p>
+ * Table is <b>not</b> a spreadsheet Widget! For that you would need to have
+ * (say) a sea of Entry Widgets that were all hooked up to behave the same
+ * (notably to pass focus between them appropriately) and which were
+ * individually constrained to each be the same size (at least by default),
+ * etc. By contrast, Table is for laying out Widgets in a grid but where each
+ * child can happily request the size it needs.
+ * 
+ * <p>
+ * To be honest, this Widget is a pain in the ass to use because you have to
+ * manually keep track of which <code>row,column</code> edges a Widget is to
+ * be constrained by. In most cases you can achieve the same alignment effects
+ * with far greater flexibility by using HBoxes nested in VBoxes and
+ * controlling the size allocations via {@link SizeGroup}s.
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @since 4.0.6
+ */
+/*
+ * TODO the documentation in this class still needs a lot of work.
+ */
+public class Table extends Container
+{
+    protected Table(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new Table. The Container will be configured to lay out
+     * <code>n</code> rows of <code>n</code> columns of child Widgets.
+     * 
+     * @param homogeneous
+     *            If <code>true</code>, all cells are sized to that requested
+     *            by the largest Widget in the Table.
+     * @since 4.0.6
+     */
+    public Table(int rows, int columns, boolean homogeneous) {
+        super(GtkTable.createTable(rows, columns, homogeneous));
+    }
+
+    /**
+     * Add a child Widget to this Table. This is a convenience method where
+     * the more esoteric parameters of the full
+     * {@link #attach(Widget, int, int, int, int, AttachOptions, AttachOptions, int, int)
+     * attach()} are given appropriate default values.
+     * 
+     * <p>
+     * Each of the parameters refer to the column or row to which the Widget
+     * being added will be anchored. To put a Widget at the fourth column from
+     * the left, second row down, you would do:
+     * 
+     * <pre>
+     * table.attach(child, 3, 4, 1, 2);
+     * </pre>
+     * 
+     * As alluded to in the class description, this is quite finicky and worse
+     * is error prone.
+     * 
+     * @since 4.0.6
+     */
+    public void attach(Widget child, int leftAttach, int rightAttach, int topAttach, int bottomAttach) {
+        GtkTable.attachDefaults(this, child, leftAttach, rightAttach, topAttach, bottomAttach);
+    }
+
+    /**
+     * Like {@link #attach(Widget, int, int, int, int) attach()} but has finer
+     * layout control for the Widget being added, mostly achieved using the
+     * {@link AttachOptions}.
+     * 
+     * <p>
+     * To define that a Widget shall grow on the x-axis, but keep the size on
+     * the y-axis you would do:
+     * 
+     * <pre>
+     * table.attach(child, 3, 4, 1, 2, AttachOptions.EXPAND, AttachOptions.SHRINK, 0, 0);
+     * </pre>
+     * 
+     * <p>
+     * A common problem is that you have Widgets of different sizes (e.g.
+     * labels in a column). If a widget is smaller than the required space
+     * additional padding is added to the sides, so finally the smaller Widget
+     * is centered compared to the larger Widget. To avoid this you a) need to
+     * encapsulate the Widget in an {@link Alignment} Container and b) need to
+     * attach it here using <code>AttachOptions.FILL</code>, so that instead
+     * of additional space being added to the sides, the
+     * <code>Alignment</code> Container may decide how to distribute it.
+     * 
+     * <p>
+     * The following example left-aligns the child Widget within its cell,
+     * while it is vertically centered:
+     * 
+     * <pre>
+     * final Alignment aligned;
+     * 
+     * aligned = new Alignment(Alignment.LEFT, Alignment.CENTER, 1.0f, 1.0f, child);
+     * table.attach(aligned, 3, 4, 1, 2, AttachOptions.FILL, AttachOptions.FILL, 0, 0);
+     * </pre>
+     * 
+     * @since 4.0.9
+     */
+    public void attach(Widget child, int leftAttach, int rightAttach, int topAttach, int bottomAttach,
+            AttachOptions xoptions, AttachOptions yoptions, int xpadding, int ypadding) {
+        GtkTable.attach(this, child, leftAttach, rightAttach, topAttach, bottomAttach, xoptions,
+                yoptions, xpadding, ypadding);
+    }
+
+    /**
+     * Change the number of rows and columns in the Table.
+     * 
+     * @since 4.0.6
+     */
+    public void resize(int rows, int columns) {
+        GtkTable.resize(this, rows, columns);
+    }
+
+    /**
+     * Set the (extra) spacing to be between <code>column</code> and the one
+     * adjacent to it.
+     * 
+     * @since 4.0.6
+     */
+    public void setColumnSpacing(int column, int spacing) {
+        GtkTable.setColSpacing(this, column, spacing);
+    }
+
+    /**
+     * Set the (extra) spacing to be between <code>row</code> and the one
+     * following it.
+     * 
+     * @since 4.0.6
+     */
+    public void setRowSpacing(int row, int spacing) {
+        GtkTable.setRowSpacing(this, row, spacing);
+    }
+
+    /**
+     * Set the (extra) spacing between all columns. Overwrites previous
+     * settings or those made by the two argument form of
+     * {@link #setColumnSpacing(int,int) setColumnSpacing()}.
+     * 
+     * @since 4.0.8
+     */
+    public void setColumnSpacing(int spacing) {
+        GtkTable.setColSpacings(this, spacing);
+    }
+
+    /**
+     * Set the (extra) spacing between all rows. Overwrites previous settings
+     * or those made by {@link #setRowSpacing(int,int)}.
+     * 
+     * @since 4.0.8
+     */
+    public void setRowSpacing(int spacing) {
+        GtkTable.setRowSpacings(this, spacing);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TargetFlags.java b/src/bindings/org/gnome/gtk/TargetFlags.java
new file mode 100644
index 0000000..816e9fc
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TargetFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TargetFlags extends Constant
+{
+    private TargetFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TearoffMenuItem.java b/src/bindings/org/gnome/gtk/TearoffMenuItem.java
new file mode 100644
index 0000000..6ee07b6
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TearoffMenuItem.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class TearoffMenuItem extends MenuItem
+{
+    protected TearoffMenuItem(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Test.java b/src/bindings/org/gnome/gtk/Test.java
new file mode 100644
index 0000000..5c4a382
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Test.java
@@ -0,0 +1,113 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+import org.gnome.gdk.MouseButton;
+
+/**
+ * Support for testing GTK programs.
+ * 
+ * <p>
+ * These functions mess with things pretty heavily; for one thing the mouse
+ * will be warped to a position somewhere within the Widget. Needless to say ,
+ * the average user doesn't view it very kindly to have their pointer woosh
+ * off to another part of the screen. You therefore need to be using this
+ * where the display is actually some sort of virtual server, say Xvfb, and
+ * not with a live display.
+ * 
+ * <p>
+ * Using <code>sendKey()</code> and <code>sendClick()</code> will inevitably
+ * cause actions to occur that are not compatible with simultaneous human user
+ * driven input. Obviously these are here to allow you to attempt to simulate
+ * user actions, but if you need to click a button programmatically in a
+ * normal application, call Button's <code>emitClicked()</code>.
+ * 
+ * <p>
+ * <i>This is not a JUnit TestCase; using that, or any other test framework,
+ * is your problem.</i>
+ * 
+ * @author Andrew Cowie
+ * @since <span style="color: red">unstable</span>
+ */
+/*
+ * It was very tempting to make these methods on Widget. Alas.
+ */
+public final class Test
+{
+    private Test() {}
+
+    /**
+     * Send a keystroke to a Widget.
+     * 
+     * <p>
+     * This should result in <code>Widget.KeyPressEvent</code> and
+     * <code>Widget.KeyReleaseEvent</code> being emitted.
+     * 
+     * <p>
+     * The Widget needs to be in a Window that is <code>show()</code>n on
+     * screen for the X server's event system to work and for the keystroke to
+     * go anywhere. Which makes sense; you can't type in a minimized Window.
+     * 
+     * @since <span style="color: red">unstable</span>
+     * @throws IllegalStateException
+     *             If sending the keystroke fails.
+     */
+    public static void sendKey(Widget widget, Keyval keyval, ModifierType modifiers) {
+        final boolean result;
+
+        result = GtkTest.widgetSendKey(widget, keyval, modifiers);
+
+        if (!result) {
+            throw new IllegalStateException();
+        }
+    }
+
+    /**
+     * Send a mouse button click to a Widget.
+     * 
+     * @since <span style="color: red">unstable</span>
+     * @throws IllegalStateException
+     *             If sending the button click fails.
+     */
+    public static void sendClick(Widget widget, MouseButton button, ModifierType modifiers) {
+        final boolean result;
+
+        result = GtkTest.widgetClick(widget, button, modifiers);
+
+        if (!result) {
+            throw new IllegalStateException();
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextAppearance.java b/src/bindings/org/gnome/gtk/TextAppearance.java
new file mode 100644
index 0000000..9a1641c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextAppearance.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextAppearance extends Boxed
+{
+    protected TextAppearance(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextAttributes.java b/src/bindings/org/gnome/gtk/TextAttributes.java
new file mode 100644
index 0000000..0af6079
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextAttributes.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextAttributes extends Boxed
+{
+    protected TextAttributes(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextBuffer.java b/src/bindings/org/gnome/gtk/TextBuffer.java
new file mode 100644
index 0000000..38aa405
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextBuffer.java
@@ -0,0 +1,1234 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.util.Collection;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.Object;
+
+/**
+ * A TextBuffer is a powerful mechanism for storing and manipulating text. It
+ * exists primarily to be the model that backs the view of one or more
+ * paragraphs as presented by the {@link TextView} Widget. Together, these
+ * make for a powerful text display and text editing capability, but it does
+ * come at the cost of considerable come complexity.
+ * 
+ * <h2>Usage</h2>
+ * 
+ * Creating a TextBuffer is straight forward, as is placing text in it:
+ * 
+ * <pre>
+ * TextBuffer buffer;
+ * 
+ * buffer = new TextBuffer();
+ * buffer.setText("Hello world!");
+ * </pre>
+ * 
+ * Of course, you rarely just want to write an entire body of text in one go.
+ * To insert text in a more piecemeal fashion we use one of the
+ * <code>insert()</code> family of methods, but before we can do so, we need
+ * to indicate <i>where</i> we want to insert that text. This is the role of
+ * {@link TextIter} class.
+ * 
+ * <pre>
+ * TextIter pointer;
+ * 
+ * pointer = buffer.getIterStart();
+ * buffer.insert(pointer, "This is the beginning");
+ * </pre>
+ * 
+ * Note that TextIters are not persistent; as soon as any change is made to
+ * the TextBuffer all TextIters are invalidated and you'll need to acquire new
+ * ones. If you need a stable reference to a particular position in the text,
+ * create a TextMark with {@link #createMark(TextIter, boolean) createMark()}.
+ * 
+ * <p>
+ * As you might expect, a TextBuffer has a notion of a cursor which indicates
+ * the (user's) current insertion point. You can get the TextMark representing
+ * the cursor, and can use it to insert text or otherwise manipulate a
+ * position by converting it to a valid TextIter:
+ * 
+ * <pre>
+ * TextMark cursor;
+ * 
+ * cursor = buffer.getInsert();
+ * ...
+ * pointer = cursor.getIter();
+ * buffer.insert(pointer, "This text was inserted at the cursor");
+ * </pre>
+ * 
+ * The <code>insertAtCursor()</code> method is a shortcut for this.
+ * 
+ * <p>
+ * There are an incredibly wide range of methods available on the TextIter
+ * class for manipulating the position into the TextBuffer that it represents
+ * and for finding out more information about the nature of the text at that
+ * point. TextIter's {@link TextIter#forwardLine() forwardLine()} is one
+ * example; you could use it to count the non-empty lines in a TextBuffer:
+ * 
+ * <pre>
+ * int paragraphs;
+ * ...
+ * 
+ * pointer = buffer.getIterStart();
+ * paragraphs = 0;
+ * 
+ * while (pointer.forwardLine()) {
+ *     if (pointer.startsWord()) {
+ *         paragraphs++;
+ *     }
+ * }
+ * </pre>
+ * 
+ * Although trivial, this raises a pitfall you need to be aware of: lines of
+ * text in a TextBuffer are <i>not</i> the same as wrapped visible lines in a
+ * TextView. Lines in a TextBuffer are a sequences of characters separated by
+ * newlines (you don't need a <code>'\n'</code> at the end of the TextBuffer;
+ * the end is an implicit line termination). When presented in a TextView with
+ * word wrapping enabled, however, each of these lines may take up more than
+ * one line on the screen. The term paragraph is used there; see
+ * {@link TextIter#forwardDisplayLine(TextView) forwardDisplayLine()} to move
+ * a TextIter to the next displayed line within a paragraph as shown on screen
+ * in a TextView.
+ * 
+ * <p>
+ * Finally, formatting and other properties can be set on ranges of text. See
+ * {@link TextTag}. While these are mostly about visual presentation, they are
+ * nevertheless set by applying TextTags to text in the TextBuffer via the
+ * {@link #applyTag(TextTag, TextIter, TextIter) applyTag()} and
+ * {@link #insert(TextIter, String, TextTag) insert()} methods here.
+ * 
+ * <p>
+ * <i>These APIs can be somewhat frustrating to use as the methods you need
+ * (relative to the order you need them in) tend to be scattered around
+ * between TextView, TextBuffer, and TextIter. It was tempting to try and
+ * normalize these to a common interface, but in the end we deferred to being
+ * faithful to the placement of methods in the underlying library's classes.
+ * We have done our best to cross reference our documentation to help you find
+ * the "next" logical element when you need it, but if you find yourself
+ * struggling to find something and think this documentation could benefit
+ * from another such pointer, please feel free to suggest it.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @since 4.0.9
+ */
+/*
+ * Judging by the GTK documentation, almost everything in this class works
+ * through the default signal handlers. Thus if we expose any signals we must
+ * a) make sure that the documentation of the corresponding methods here
+ * mentions that behaviour could change, b) warn people in the signal's
+ * documentation that they could massively screw things up, and c) write test
+ * coverage to guard against this sort of thing. Based on all that, I'm not
+ * going to be in a rush to see any of those internal signals exposed in our
+ * public API.
+ */
+public class TextBuffer extends Object
+{
+    /**
+     * This constant is used to identify cells in the TextBuffer that are not
+     * actually characters - in other words, Widgets and Pixbufs. The
+     * placeholder is Unicode value <code>0xFFFC</code>, the "Object
+     * Replacement Character" from the Special block. You might see it as
+     *  in other contexts.
+     * 
+     * @since 4.0.9
+     */
+    public static final char OBJECT_REPLACEMENT_CHARACTER = 0xFFFC;
+
+    private static TextTagTable defaultTable;
+
+    /**
+     * We maintain a single default TextTagTable to facilitate no-arg
+     * convenience constructors for TextTag and TextBuffer. Get (and
+     * initialize if necessary) this table.
+     */
+    /*
+     * synchronized?
+     */
+    protected static TextTagTable getDefaultTable() {
+        if (defaultTable == null) {
+            defaultTable = new TextTagTable();
+        }
+        return defaultTable;
+    }
+
+    private final boolean usingDefaultTable;
+
+    protected TextBuffer(long pointer) {
+        this(pointer, false);
+    }
+
+    protected TextBuffer(long pointer, boolean usingDefaultTable) {
+        super(pointer);
+        this.usingDefaultTable = usingDefaultTable;
+    }
+
+    /**
+     * Create a new TextBuffer.
+     * 
+     * <p>
+     * This will use the default built-in TextTagTable (shared by all
+     * TextBuffers constructed with this call) which in turn will be populated
+     * with tags created using the no-arg {@link TextTag#TextTag() TextTag}
+     * constructor. This is a convenience; if you need to segregate TextTags
+     * used by different TextBuffers then just use the other TextBuffer
+     * constructor.
+     * 
+     * @since 4.0.9
+     */
+    public TextBuffer() {
+        this(GtkTextBuffer.createTextBuffer(getDefaultTable()), true);
+    }
+
+    /**
+     * Create a new TextBuffer. Uses (or reuses) the supplied TextTagTable;
+     * you can add more TextTags to it later.
+     * 
+     * @since 4.0.9
+     */
+    public TextBuffer(TextTagTable tags) {
+        this(GtkTextBuffer.createTextBuffer(tags), false);
+    }
+
+    /**
+     * Replace the entire current contents of the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public void setText(String text) {
+        GtkTextBuffer.setText(this, text, -1);
+    }
+
+    /**
+     * Returns the text in the range <code>start</code> .. <code>finish</code>
+     * . Excludes undisplayed text (text marked with tags that set the
+     * <var>invisibility</var> attribute) if <code>includeHidden</code> is
+     * <code>false</code>. Does not include characters representing embedded
+     * images, so indexes into the returned string do not correspond to
+     * indexes into the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public String getText(TextIter start, TextIter finish, boolean includeHidden) {
+        return GtkTextBuffer.getText(this, start, finish, includeHidden);
+    }
+
+    /**
+     * Returns the text in the range <code>start</code> .. <code>finish</code>
+     * with the {@link #OBJECT_REPLACEMENT_CHARACTER} marking any positions
+     * that are actually anchors for Widgets or Images.
+     * 
+     * <p>
+     * Compare to {@link #getText(TextIter, TextIter, boolean) getText()},
+     * which skips over those meta positions.
+     * 
+     * @since 4.0.17
+     */
+    public String getSlice(TextIter start, TextIter finish, boolean includeHidden) {
+        return GtkTextBuffer.getSlice(this, start, finish, includeHidden);
+    }
+
+    /**
+     * Returns the text in the TextBuffer in its entirety. This is merely a
+     * convenience function that calls
+     * {@link #getText(TextIter, TextIter, boolean)} from buffer start to end
+     * with <code>includeHidden</code> being <code>true</code>.
+     * 
+     * @since 4.0.9
+     */
+    public String getText() {
+        return getText(getIterStart(), getIterEnd(), true);
+    }
+
+    /**
+     * Marks the content as changed. This is primarily used to <i>unset</i>
+     * this property, making it <code>false</code>. See {@link #getModified()
+     * getModified()} for details.
+     * 
+     * @since 4.0.9
+     */
+    public void setModified(boolean modified) {
+        GtkTextBuffer.setModified(this, modified);
+    }
+
+    /**
+     * Find out if the TextBuffer's content has changed. This is actually
+     * defined as "has the TextBuffer changed since the last call to
+     * {@link #setModified(boolean) setModified(false)}"; operations which
+     * change the TextBuffer will toggle this property, and you can of course
+     * manually set it with {@link #setModified(boolean) setModified(true)}.
+     * 
+     * <p>
+     * This can be used to record whether a file being edited has been
+     * modified and is not yet saved to disk (although most applications would
+     * probably track that state more robustly, this can at least feed
+     * information into that process).
+     * 
+     * @since 4.0.9
+     */
+    public boolean getModified() {
+        return GtkTextBuffer.getModified(this);
+    }
+
+    /**
+     * Returns a pointer to the beginning of the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public TextIter getIterStart() {
+        final TextIter iter;
+
+        iter = new TextIter(this);
+
+        GtkTextBuffer.getStartIter(this, iter);
+
+        return iter;
+    }
+
+    /**
+     * Returns a pointer to the end of the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * The naming of this method is inverted so as to correspond with the
+     * naming pattern established in TreeModel.
+     */
+    public TextIter getIterEnd() {
+        final TextIter iter;
+
+        iter = new TextIter(this);
+
+        GtkTextBuffer.getEndIter(this, iter);
+
+        return iter;
+    }
+
+    /**
+     * Create a new TextMark at the position of the supplied TextIter.
+     * 
+     * <p>
+     * The <code>gravity</code> parameter is interesting. It specifies whether
+     * you want the TextMark to have left-gravity. If {@link TextMark#LEFT
+     * LEFT} (<code>true</code>), then the TextMark will remain pointing to
+     * the same location if text is inserted at this point. If
+     * {@link TextMark#RIGHT RIGHT} (<code>false</code>), then as text is
+     * inserted at this point the TextMark will move to the right. The
+     * standard behaviour of the blinking cursor we all stare at all day long
+     * following us as we type is an example of right-gravity.
+     */
+    public TextMark createMark(TextIter where, boolean gravity) {
+        return GtkTextBuffer.createMark(this, null, where, gravity);
+    }
+
+    void deleteMark(TextMark mark) {
+        GtkTextBuffer.deleteMark(this, mark);
+    }
+
+    /**
+     * Insert a text at a given position. All {@link TextIter} behind the
+     * position move accordingly, while marks keep their position.
+     * 
+     * @since 4.0.9
+     */
+    public void insert(TextIter position, String text) {
+        GtkTextBuffer.insert(this, position, text, -1);
+    }
+
+    /**
+     * Insert text as for {@link #insert(TextIter, String) insert()} but
+     * simultaneously apply the formatting described by <code>tag</code>. You
+     * can specify <code>null</code> TextTag if you actually want to skip
+     * applying formatting, but in that case you'd probably rather just use
+     * {@link #insert(TextIter, String) insert()}.
+     * 
+     * @since 4.0.9
+     */
+    public void insert(TextIter position, String text, TextTag tag) {
+        checkTag(tag);
+        GtkTextBuffer.insertWithTags(this, position, text, -1, tag);
+    }
+
+    /**
+     * Insert text at the given position, applying all of the tags specified.
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * This essentially duplicates the logic in GTK's
+     * gtk_text_buffer_insert_with_tags().
+     */
+    public void insert(TextIter position, String text, TextTag[] tags) {
+        TextIter start;
+        int original;
+
+        original = position.getOffset();
+
+        GtkTextBuffer.insert(this, position, text, -1);
+
+        if (tags == null) {
+            return;
+        }
+
+        start = position.copy();
+        start.setOffset(original);
+
+        for (TextTag tag : tags) {
+            if (tag == null) {
+                continue;
+            }
+            checkTag(tag);
+            GtkTextBuffer.applyTag(this, tag, start, position);
+        }
+    }
+
+    /**
+     * Insert text at the given position, applying all of the tags specified.
+     * 
+     * <p>
+     * <i> Having an overload taking a generic is somewhat unusual in
+     * java-gnome, but people maintain a (fairly rapidly changing) List or Set
+     * with the TextTags they are currently inserting so frequently that we
+     * wanted to support this use case efficiently.</i>
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * Not to mention that Collection to array conversion is one of the uglier
+     * idioms in Java. Yes, this is a copy of the code in other insert()
+     * method above; we want to save gratuitous unnecessary array creation.
+     */
+    public void insert(TextIter position, String text, Collection<TextTag> tags) {
+        final TextIter start;
+        final int original;
+
+        original = position.getOffset();
+
+        GtkTextBuffer.insert(this, position, text, -1);
+
+        if (tags == null) {
+            return;
+        }
+
+        start = position.copy();
+        start.setOffset(original);
+
+        for (TextTag tag : tags) {
+            if (tag == null) {
+                continue;
+            }
+            checkTag(tag);
+            GtkTextBuffer.applyTag(this, tag, start, position);
+        }
+    }
+
+    /**
+     * Insert the text at the current cursor position.
+     * 
+     * @since 4.0.9
+     */
+    public void insertAtCursor(String text) {
+        GtkTextBuffer.insertAtCursor(this, text, -1);
+    }
+
+    /**
+     * Like {@link #insert(TextIter, String) insert()}, but the insertion will
+     * not occur if <code>pos</code> points to a non-editable location in the
+     * buffer - meaning that it is enclosed in TextTags that mark the area
+     * non-editable.
+     * 
+     * <p>
+     * This method is conducted as a user action, so the
+     * <code>TextBuffer.BeginUserAction</code> and
+     * <code>TextBuffer.EndUserAction</code> signals will be raised before and
+     * after carrying out the insertion, respectively.
+     * 
+     * @param pos
+     *            Position to insert at.
+     * @param text
+     *            Text to insert.
+     * @param defaultEditability
+     *            How shall the area be handled, if there are no tags
+     *            affecting the <var>editable</var> property at the given
+     *            location. You probably want to use <code>true</code> unless
+     *            you used TextView's {@link TextView#setEditable(boolean)
+     *            setEditable()} to change the default setting in the display
+     *            Widget you're using.
+     * @since 4.0.9
+     */
+    public void insertInteractive(TextIter pos, String text, boolean defaultEditability) {
+        GtkTextBuffer.insertInteractive(this, pos, text, -1, defaultEditability);
+    }
+
+    /**
+     * Delete text like {@link #delete(TextIter, TextIter) delete()}, but only
+     * if the range given is editable.
+     * 
+     * <p>
+     * See {@link #insertInteractive(TextIter, String, boolean)
+     * insertInteractive()} for a discussion of the
+     * <code>defaultEditability</code> parameter.
+     * 
+     * <p>
+     * This method is conducted as a user action, so the
+     * <code>TextBuffer.BeginUserAction</code> and
+     * <code>TextBuffer.EndUserAction</code> signals will be raised before and
+     * after carrying out the deletion.
+     * 
+     * @since 4.0.13
+     */
+    public void deleteInteractive(TextIter start, TextIter finish, boolean defaultEditability) {
+        GtkTextBuffer.deleteInteractive(this, start, finish, defaultEditability);
+    }
+
+    /**
+     * Inserts an image at the cursor position.
+     * 
+     * @since 4.0.9
+     */
+    public void insert(TextIter position, Pixbuf image) {
+        GtkTextBuffer.insertPixbuf(this, position, image);
+    }
+
+    /**
+     * Insert a Widget into the TextBuffer.
+     * 
+     * <p>
+     * Since multiple TextViews can present information from a given
+     * TextBuffer, you need to specify <code>which</code> TextView you want
+     * the image to appear in.
+     * 
+     * <p>
+     * Don't forget to <code>show()</code> the Widget.
+     * 
+     * <p>
+     * <i>Widgets, of course, are neither text nor image data; they need to
+     * appear in a Container hierarchy. Thus adding a Widget is actually a
+     * function of TextView. All the other methods that conceptually insert
+     * things into a TextBuffer are here, however, so we include this as a
+     * convenience. This is just a wrapper around TextView's</i>
+     * {@link TextView#add(Widget, TextIter) add()}.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * FUTURE Can anyone think of a way to get rid of the need to specify the
+     * TextView?
+     */
+    public void insert(TextIter position, Widget child, TextView which) {
+        which.add(child, position);
+    }
+
+    /**
+     * Returns the current cursor position. Is also used at the start position
+     * of a selected text.
+     * 
+     * <p>
+     * You can call {@link #getIter(TextMark) getIter()} to convert the
+     * <var>insert</var> TextMark to an TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public TextMark getInsert() {
+        return GtkTextBuffer.getInsert(this);
+    }
+
+    /**
+     * Returns the end of the current selection. If you need the beginning of
+     * the selection use {@link #getInsert() getInsert()}.
+     * 
+     * <p>
+     * Under ordinary circumstances you could think the
+     * <var>selection-bound</var> TextMark as being the beginning of a
+     * selection, and the <var>insert</var> mark as the end, but if the user
+     * (or you, programmatically) has selected "backwards" then this TextMark
+     * will be further ahead in the TextBuffer than the insertion one.
+     * 
+     * <p>
+     * You can call {@link #getIter(TextMark) getIter()} to convert the
+     * TextMark to an TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public TextMark getSelectionBound() {
+        return GtkTextBuffer.getSelectionBound(this);
+    }
+
+    /**
+     * Returns whether or not the TextBuffer has a selection
+     * 
+     * @since 4.0.9
+     */
+    public boolean getHasSelection() {
+        return GtkTextBuffer.getHasSelection(this);
+    }
+
+    /**
+     * Converts a {@link TextMark TextMark} into a valid {@link TextIter
+     * TextIter} that you can use to point into the TextBuffer in its current
+     * state.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * This method is more compactly named so as to correspond with the naming
+     * pattern already established in TreeModel.
+     */
+    public TextIter getIter(TextMark mark) {
+        final TextIter iter;
+
+        iter = new TextIter(this);
+
+        GtkTextBuffer.getIterAtMark(this, iter, mark);
+
+        return iter;
+    }
+
+    /**
+     * Get a TextIter pointing at the position <code>offset</code> characters
+     * into the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public TextIter getIter(int offset) {
+        final TextIter iter;
+
+        iter = new TextIter(this);
+
+        GtkTextBuffer.getIterAtOffset(this, iter, offset);
+
+        return iter;
+    }
+
+    /*
+     * Validate that the TextTag being submitted for application is legal for
+     * use in this TextBuffer. FUTURE we could cache the table in the
+     * constructors if this becomes a hot spot.
+     */
+    private void checkTag(TextTag tag) {
+        if (tag == null) {
+            return;
+        }
+        if (usingDefaultTable) {
+            if (tag.table != getDefaultTable()) {
+                throw new IllegalArgumentException("\n"
+                        + "You cannot apply a TextTag created with the no-arg TextTag() constructor\n"
+                        + "to a TextBuffer not likewise constructed with the no-arg TextBuffer()\n"
+                        + "constructor.");
+            }
+        } else {
+            if (tag.table != GtkTextBuffer.getTagTable(this)) {
+                throw new IllegalArgumentException("\n"
+                        + "You can only apply a TextTag to a TextBuffer created with the same\n"
+                        + "TextTagTable.");
+            }
+        }
+    }
+
+    /**
+     * Apply the selected tag on the area in the TextBuffer between the start
+     * and finish positions.
+     * 
+     * @since 4.0.9
+     */
+    public void applyTag(TextTag tag, TextIter start, TextIter finish) {
+        checkTag(tag);
+        GtkTextBuffer.applyTag(this, tag, start, finish);
+    }
+
+    /**
+     * Apply an array of TextTags to the given range.
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * Convenience method. This doesn't need to be here, but it lends a
+     * certain elegance when used alongside the insert() overload
+     */
+    public void applyTag(TextTag[] tags, TextIter start, TextIter finish) {
+        if (tags == null) {
+            return;
+        }
+        for (TextTag tag : tags) {
+            if (tag == null) {
+                continue;
+            }
+            checkTag(tag);
+            GtkTextBuffer.applyTag(this, tag, start, finish);
+        }
+    }
+
+    /**
+     * Select a range of text. The <var>selection-bound</var> mark will be
+     * placed at <code>start</code>, and the <var>insert</var> mark will be
+     * placed at <code>end</code>.
+     * 
+     * <p>
+     * Note that this should be used in preference to manually manipulating
+     * the two marks with {@link #moveMark() moveMark()} calls; doing it that
+     * way results in transient selections appearing which are different than
+     * what you wish to see.
+     * 
+     * <p>
+     * See {@link #placeCursor(TextIter) placeCursor()} if you just want to
+     * move the two marks to the same location; and, assuming the TextBuffer
+     * is showing in a TextView, this will move the cursor.
+     * 
+     * <p>
+     * <i>The native GTK function has these arguments reversed but start and
+     * finish make more sense in consecutive order.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void selectRange(TextIter start, TextIter finish) {
+        GtkTextBuffer.selectRange(this, finish, start);
+    }
+
+    /**
+     * Remove the effect of the supplied <code>tag</code> from across the
+     * range between <code>start</code> and <code>end</code>. The order of the
+     * two TextIters doesn't actually matter; they are just bounds.
+     * 
+     * @since 4.0.9
+     */
+    public void removeTag(TextTag tag, TextIter start, TextIter finish) {
+        GtkTextBuffer.removeTag(this, tag, start, finish);
+    }
+
+    /**
+     * Remove all TextTags that may be present in a range.
+     * 
+     * <p>
+     * Beware that <b>all</b> tags between <code>start</code> and
+     * <code>end</code> will be nuked, not just ones set by the piece of code
+     * you happen to be working in. That should be obvious, but apparently
+     * people often make mistakes with this.
+     * 
+     * @since 4.0.10
+     */
+    public void removeAllTags(TextIter start, TextIter finish) {
+        GtkTextBuffer.removeAllTags(this, start, finish);
+    }
+
+    /**
+     * Create a new TextChildAnchor at <code>location</code>. Once you have an
+     * anchor for where you want the Widget, you use TextView's
+     * {@link TextView#add(Widget, TextChildAnchor) add()} to load a Widget
+     * into it.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * This is already a convenience method according to the GTK docs. Uh,
+     * "good". Thanks. Means we don't need another constructor in
+     * TextChildAnchor.
+     */
+    TextChildAnchor createChildAnchor(TextIter location) {
+        return GtkTextBuffer.createChildAnchor(this, location);
+    }
+
+    /**
+     * Move the cursor (ie, the <var>selection-bound</var> and
+     * <var>insert</var> marks) to the given location.
+     * 
+     * <p>
+     * This is more than just a convenience function; like
+     * {@link #selectRange(TextIter, TextIter) selectRange()} it carries out
+     * the move without intermediate state of part of the text being selected
+     * while the individual TextMarks are being moved.
+     * 
+     * <p>
+     * See also TextView's {@link TextView#placeCursorOnscreen()
+     * placeCursorOnscreen()} if you just want to force the cursor into the
+     * currently showing section of the text.
+     * 
+     * @since 4.0.9
+     */
+    public void placeCursor(TextIter location) {
+        GtkTextBuffer.placeCursor(this, location);
+    }
+
+    /**
+     * Returns the number of characters in this buffer.
+     * 
+     * @since 4.0.9
+     */
+    public int getCharCount() {
+        return GtkTextBuffer.getCharCount(this);
+    }
+
+    /**
+     * Returns the number of text lines in this buffer.
+     * 
+     * @since 4.0.9
+     */
+    public int getLineCount() {
+        return GtkTextBuffer.getLineCount(this);
+    }
+
+    /**
+     * The signal emitted when the contents of the TextBuffer have changed.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.9
+     */
+    public interface Changed extends GtkTextBuffer.ChangedSignal
+    {
+        public void onChanged(TextBuffer source);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.Changed</code> signals.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(TextBuffer.Changed handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when text is inserted into the TextBuffer.
+     * 
+     * <p>
+     * You must leave the TextIter <code>pointer</code> in a valid state; that
+     * is, if you do something in your signal handler that changes the
+     * TextBuffer, you must revalidate <code>pos</code> before returning.
+     * 
+     * <p>
+     * <i>The default handler for this signal is where the mechanism to
+     * actually insert text into the TextBuffer lives.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.9
+     */
+    /*
+     * FIXME How do you do that?
+     */
+    public interface InsertText
+    {
+        public void onInsertText(TextBuffer source, TextIter pointer, String text);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.InsertText</code> signals. This
+     * will be invoked before the default handler is run, that is, before the
+     * new text is actually inserted into the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(TextBuffer.InsertText handler) {
+        GtkTextBuffer.connect(this, new InsertTextHandler(handler), false);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.InsertText</code> signals that
+     * will be called <i>after</i> the default handler.
+     * 
+     * @since 4.0.9
+     */
+    public void connectAfter(TextBuffer.InsertText handler) {
+        GtkTextBuffer.connect(this, new InsertTextHandler(handler), true);
+    }
+
+    /*
+     * Trim off the length parameter which is unnecessary in Java.
+     */
+    private static class InsertTextHandler implements GtkTextBuffer.InsertTextSignal
+    {
+        private final InsertText handler;
+
+        private InsertTextHandler(InsertText handler) {
+            this.handler = handler;
+        }
+
+        public void onInsertText(TextBuffer source, TextIter pos, String text, int length) {
+            handler.onInsertText(source, pos, text);
+        }
+    }
+
+    /**
+     * Signal emitted when one or more characters are deleted.
+     * 
+     * <p>
+     * You can get a String representing the the removed characters by
+     * calling:
+     * 
+     * <pre>
+     * deleted = buffer.getText(start, finish, false);
+     * </pre>
+     * 
+     * <p>
+     * Note that in the case of a user action which attempts to delete text in
+     * a TextView that is not <var>editable</var> or within a range of
+     * characters affected by TextTags with the <var>editable</var> property
+     * set to <code>false</code> then the action will be inhibited and this
+     * signal will not be raised.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.9
+     */
+    /*
+     * TODO Can anyone explain how to stop a deletion from occurring in
+     * response to the value of the text between start and finish? The default
+     * handler will nuke the text.
+     */
+    public interface DeleteRange extends GtkTextBuffer.DeleteRangeSignal
+    {
+        public void onDeleteRange(TextBuffer source, TextIter start, TextIter finish);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.DeleteRange</code> signals on
+     * this TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(TextBuffer.DeleteRange handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * Delete text between <code>start</code> and <code>finish</code>. (The
+     * order of the two TextIters doesn't matter; this method will delete
+     * between the two regardless).
+     * 
+     * <p>
+     * The two TextIters passed to <code>delete()</code> will be reset so as
+     * to point to the location where the text was removed. This can be a
+     * useful feature; since it mutates the TextBuffer, calling this method
+     * will invalidate all other TextIters.
+     * 
+     * @since 4.0.9
+     */
+    public void delete(TextIter start, TextIter finish) {
+        GtkTextBuffer.delete(this, start, finish);
+    }
+
+    /**
+     * Manually move a TextMark to a new location.
+     * 
+     * <p>
+     * Note that if you're trying to move the "cursor", then you are much
+     * better off calling {@link #placeCursor(TextIter) placeCursor()} as that
+     * simultaneously moves both the <var>selection-bound</var> TextMark as
+     * well as the <var>insert</var> one.
+     * 
+     * @since 4.0.10
+     */
+    public void moveMark(TextMark mark, TextIter where) {
+        GtkTextBuffer.moveMark(this, mark, where);
+    }
+
+    /**
+     * Signal emitted when a TextMark is set (or moved) in this TextBuffer.
+     * 
+     * <p>
+     * This can be used as a way to react to the cursor moving. The cursor is,
+     * of course, represented by the <var>insert</var> TextMark, and so,
+     * doing:
+     * 
+     * <pre>
+     * insert = buffer.getInsert();
+     * 
+     * buffer.connect(new TextBuffer.MarkSet() {
+     *     public void onMarkSet(TextBuffer source, org.gnome.gtk.TextIter location, TextMark mark) {
+     *         if (mark == insert) {
+     *             // react!
+     *         }
+     *     }
+     * });
+     * </pre>
+     * 
+     * will allow you to react to the cursor moving.
+     * 
+     * <p>
+     * Somewhat counter-intuitively, however, inserting text does <i>not</i>
+     * "move" a TextMark; the <var>insert</var> TextMark will flow right
+     * according to its gravity as text is added. Using the arrow keys or
+     * mouse to move the cursor will, on the other hand, result in this signal
+     * being emitted.
+     * 
+     * <p>
+     * While an interesting example, doing this to track the cursor changing
+     * isn't actually a good idea. You get a <code>TextBuffer.MarkSet</code>
+     * callback for <i>every</i> TextMark being set (including ones used
+     * internally by GTK!) which means lots of activity that has nothing to do
+     * with you. Use {@link TextBuffer.NotifyCursorPosition} instead.
+     * 
+     * <p>
+     * <i>Using signal is very inefficient; why this is a signal on TextBuffer
+     * and not a signal coming (only) from individual TextMarks is
+     * mystery.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.10
+     */
+    public interface MarkSet extends GtkTextBuffer.MarkSetSignal
+    {
+        public void onMarkSet(TextBuffer source, TextIter location, TextMark mark);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.MarkSet</code> signals on this
+     * TextBuffer.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(TextBuffer.MarkSet handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when a TextTag is added to a range of text.
+     * 
+     * <p>
+     * If you're using this then you'll probably also need the complement of
+     * this signal, which is <code>TextBuffer.RemoveTag</code>.
+     * 
+     * <p>
+     * <i>The code to actually carry out the application of the tag is in the
+     * default handler, which will run after you return from yours.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.10
+     */
+    /*
+     * TODO Which raises some questions: do we need to expose this as a
+     * connectAfter()? Also, if a tag is already present does this signal get
+     * raised anyway? Finally, do we need emitApplyTag()?
+     */
+    public interface ApplyTag extends GtkTextBuffer.ApplyTagSignal
+    {
+        void onApplyTag(TextBuffer source, TextTag tag, TextIter start, TextIter finish);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.ApplyTag</code> signals on this
+     * TextBuffer.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(TextBuffer.ApplyTag handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when a TextTag is removed from a range of text.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.10
+     */
+    public interface RemoveTag extends GtkTextBuffer.RemoveTagSignal
+    {
+        void onRemoveTag(TextBuffer source, TextTag tag, TextIter start, TextIter finish);
+    }
+
+    /**
+     * Hook up a handler for <code>TextBuffer.RemoveTag</code> signals on this
+     * TextBuffer.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(TextBuffer.RemoveTag handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when the <var>cursor-position</var> property changes.
+     * This is a good way to find out that the cursor has moved.
+     * 
+     * 
+     * <pre>
+     * buffer.connect(new TextBuffer.NotifyCursorPosition()) {
+     *     public void onNotifyCursorPosition(TextBuffer source) {
+     *          final int offset;
+     *          
+     *          offset = buffer.getCursorPosition();
+     *     }
+     * });
+     * </pre>
+     * 
+     * If you've already got the <var>insert</var> TextMark, then you could
+     * instead do:
+     * 
+     * <pre>
+     * buffer.connect(new TextBuffer.NotifyCursorPosition()) {
+     *     public void onNotifyCursorPosition(TextBuffer source) {
+     *          final TextIter pointer;
+     *          final int offset;
+     *          
+     *          pointer = buffer.getIter(insertBound);
+     *          offset = buffer.getOffset();
+     *     }
+     * });
+     * </pre>
+     * 
+     * which amounts to the same thing.
+     * 
+     * <p>
+     * Using the <code>TextBuffer.NotifyCursorPosition</code> signal is much
+     * more efficient than hooking up to <code>TextBuffer.MarkSet</code>
+     * signals.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.10
+     */
+    public interface NotifyCursorPosition extends GtkTextBufferOverride.NotifyCursorPositionSignal
+    {
+        public void onNotifyCursorPosition(TextBuffer source);
+    }
+
+    /**
+     * Hook up a handler to receive
+     * <code>TextBuffer.NotifyCursorPosition</code> signals emitted when the
+     * <var>cursor-position</var> of this TextBuffer changes.
+     * 
+     * @since 4.0.10
+     */
+    public void connect(TextBuffer.NotifyCursorPosition handler) {
+        GtkTextBufferOverride.connect(this, handler, false);
+    }
+
+    /**
+     * Get the current value of the <var>cursor-position</var> property.
+     * 
+     * <p>
+     * This corresponds to the offset of the <var>insert</var> TextMark; if
+     * you already have a TextIter for that you call it's
+     * {@link TextIter#getOffset() getOffset()} instead.
+     * 
+     * @since 4.0.10
+     */
+    public int getCursorPosition() {
+        return getPropertyInteger("cursor-position");
+    }
+
+    /**
+     * Mark the beginning of a user initiated action. Calls to
+     * <code>beginUserAction()</code> can nest, but they need to be paired
+     * with calls to {@link #endUserAction() endUserAction()}. The outer-most
+     * call to this method will raise <code>TextBuffer.BeginUserAction</code>.
+     * Note that user input into a TextView that is handled by GTK's default
+     * <code>Widget.KeyPressEvent</code> handler will likewise begin a user
+     * action sequence.
+     * 
+     * @since 4.0.11
+     */
+    public void beginUserAction() {
+        GtkTextBuffer.beginUserAction(this);
+    }
+
+    /**
+     * Calls to <code>endUserAction()</code> close off the matching
+     * {@link #beginUserAction() beginUserAction()} call.
+     * <code>TextBuffer.EndUserAction</code> will only be emitted when the
+     * outer most user action is closed.
+     * 
+     * @since 4.0.11
+     */
+    public void endUserAction() {
+        GtkTextBuffer.endUserAction(this);
+    }
+
+    /**
+     * Signal emitted when a "user action" is initiated. This can be fired
+     * programmatically by calling TextBuffer's
+     * {@link TextBuffer#beginUserAction() beginUserAction()}, but is also
+     * raised by the default Input Method handler when the user types into a
+     * TextView.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.11
+     */
+    public interface BeginUserAction extends GtkTextBuffer.BeginUserActionSignal
+    {
+        public void onBeginUserAction(TextBuffer source);
+    }
+
+    /**
+     * Hookup a <code>TextBuffer.BeginUserAction</code> signal handler.
+     * 
+     * @since 4.0.11
+     */
+    public void connect(BeginUserAction handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when a "user action" stops. See TextBuffer's
+     * {@link TextBuffer#beginUserAction() beginUserAction()} for details.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.11
+     */
+    public interface EndUserAction extends GtkTextBuffer.EndUserActionSignal
+    {
+        public void onEndUserAction(TextBuffer source);
+    }
+
+    /**
+     * Hookup a <code>TextBuffer.EndUserAction</code> signal handler.
+     * 
+     * @since 4.0.11
+     */
+    public void connect(EndUserAction handler) {
+        GtkTextBuffer.connect(this, handler, false);
+    }
+
+    /**
+     * Tell a currently active <code>TextBuffer.InsertText</code> signal
+     * emission to stop.
+     * 
+     * <p>
+     * Calling this only makes sense within the scope of a normal handler of
+     * that signal; the effect is to prevent insertion by GTK's default
+     * handler.
+     * 
+     * @since 4.0.13
+     */
+    public void stopInsertText() {
+        GtkTextBufferOverride.stopInsertText(this);
+    }
+
+    /**
+     * Tell a currently active <code>TextBuffer.DeleteRange</code> signal
+     * emission to stop.
+     * 
+     * @since 4.0.13
+     */
+    public void stopDeleteRange() {
+        GtkTextBufferOverride.stopDeleteRange(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextBufferTargetInfo.java b/src/bindings/org/gnome/gtk/TextBufferTargetInfo.java
new file mode 100644
index 0000000..e544c23
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextBufferTargetInfo.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextBufferTargetInfo extends Constant
+{
+    private TextBufferTargetInfo(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextChildAnchor.java b/src/bindings/org/gnome/gtk/TextChildAnchor.java
new file mode 100644
index 0000000..a438d26
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextChildAnchor.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * The location of a Widget placed in a TextView so that it appears at a given
+ * position in the text.
+ * 
+ * @since 4.0.9
+ */
+class TextChildAnchor extends Object
+{
+    protected TextChildAnchor(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextDirection.java b/src/bindings/org/gnome/gtk/TextDirection.java
new file mode 100644
index 0000000..5ef8082
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextDirection.java
@@ -0,0 +1,63 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants used to describe the direction of the text inside a widget.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.1.2
+ */
+public final class TextDirection extends Constant
+{
+    private TextDirection(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No direction specified.
+     */
+    public static final TextDirection NONE = new TextDirection(GtkTextDirection.NONE, "NONE");
+
+    /**
+     * The text is written from left to right.
+     */
+    public static final TextDirection LEFT_TO_RIGHT = new TextDirection(GtkTextDirection.LTR, "LTR");
+
+    /**
+     * The text is written from right to left.
+     */
+    public static final TextDirection RIGHT_TO_LEFT = new TextDirection(GtkTextDirection.RTL, "RTL");
+}
diff --git a/src/bindings/org/gnome/gtk/TextIter.java b/src/bindings/org/gnome/gtk/TextIter.java
new file mode 100644
index 0000000..79a694d
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextIter.java
@@ -0,0 +1,736 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.Boxed;
+
+/**
+ * A TextIter defines a position inside a {@link TextBuffer} and allows you to
+ * manipulate it.
+ * 
+ * <p>
+ * TextIters are just used for immediate operations, and are invalidated any
+ * time when the TextBuffer's contents change. If you need to hold a reference
+ * to a specific position, convert this TextIter into a TextMark with
+ * TextBuffer's {@link TextBuffer#createMark(TextIter, boolean) createMark()}.
+ * 
+ * <h2>Navigation</h2>
+ * 
+ * <p>
+ * Quite a number of methods on TextIter allow you to move the location of the
+ * pointer in the TextBuffer, including {@link #forwardLine() forwardLine()},
+ * {@link #backwardChars(int) backwardChars()}, and many others. These are
+ * both imperative commands and a means of querying. The TreeIter will attempt
+ * to move as requested, while the boolean return value of the call will tell
+ * you <i>whether</i> the TreeIter changed location. This can be used to
+ * ascertain your position in a logical sense or to limit loops. Remeber,
+ * however, that (unless otherwise marked) any method which changes the
+ * TextBuffer invalidates the TextIters pointing into it.
+ * 
+ * @author Stefan Prelle
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public final class TextIter extends Boxed
+{
+    private TextBuffer buffer;
+
+    protected TextIter(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Allocate a blank TextIter structure. This is done by declaring one
+     * locally, copying it, and returning the pointer to the copy.
+     * 
+     * <p>
+     * <b>For use by bindings hackers only!</b>
+     */
+    TextIter(TextBuffer buffer) {
+        super(GtkTextIterOverride.createTextIter());
+
+        this.buffer = buffer;
+    }
+
+    void setBuffer(TextBuffer buffer) {
+        this.buffer = buffer;
+    }
+
+    TextBuffer getBuffer() {
+        if (buffer == null) {
+            throw new IllegalStateException(
+                    "\n"
+                            + "Sorry, this TextIter doesn't have its internal reference to its parent TextBuffer set");
+        }
+        return buffer;
+    }
+
+    protected void release() {
+        GtkTextIter.free(this);
+    }
+
+    /**
+     * Creates an independent copy of the iterator.
+     * 
+     * <p>
+     * <i>This is basically the same as a clone() on normal Java object would
+     * do, but in this case is passed on to the native GTK layer.</i>
+     * 
+     * @since 4.0.9
+     */
+    public TextIter copy() {
+        return GtkTextIter.copy(this);
+    }
+
+    /**
+     * Returns the number of characters into the TextBuffer that this TextIter
+     * is pointing. Offset counts are <code>0</code> origin.
+     * 
+     * 
+     * <p>
+     * If you have a given offset, you can use the TextBuffer
+     * {@link TextBuffer#getIter(int) getIter()} method taking an
+     * <code>int</code> to convert it into an TreeIter. If you want to move
+     * this TreeIter to a given offset, then call {@link #setOffset(int)
+     * setOffset()}.
+     * 
+     * @return A character offset from the start of the TextBuffer.
+     * @since 4.0.9
+     */
+    public int getOffset() {
+        return GtkTextIter.getOffset(this);
+    }
+
+    /**
+     * Change this TextIter so that it points to the given offset into the
+     * underlying TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public void setOffset(int offset) {
+        GtkTextIter.setOffset(this, offset);
+    }
+
+    /**
+     * Get the line number of the TextBuffer that this TextIter points at.
+     * Lines in a TextBuffer are numbered from <code>0</code>.
+     * 
+     * <p>
+     * Be aware that this is the count of <i>unwrapped</i> lines in the
+     * TextBuffer, where lines are split by newline characters. Most of the
+     * time TextViews are set to wrap lines and thus a single very long line
+     * will be presented visually as a paragraph (there is no definition of
+     * paragraph in TextBuffer terms). If you're wondering about where a
+     * position (the cursor, say) is down into a TextView widget, then see
+     * {@link #startsDisplayLine(TextView) startsDisplayLine()} and other
+     * related "<code>display</code>" methods.
+     * 
+     * @since 4.0.9
+     */
+    public int getLine() {
+        return GtkTextIter.getLine(this);
+    }
+
+    /**
+     * Move this TextIter to the start of the given line.
+     * 
+     * <p>
+     * If <code>num</code> is negative or larger than the number of lines in
+     * the TextBuffer, it moves the iterator to the start of the last line.
+     * Line numbers are <code>0</code> origin.
+     * 
+     * @since 4.0.9
+     */
+    public void setLine(int row) {
+        GtkTextIter.setLine(this, row);
+    }
+
+    /**
+     * Get the character offset of this TextIter, counting from the start of
+     * the line. The first character on the line has line offset
+     * <code>0</code>.
+     * 
+     * <p>
+     * <i> This is, in essence, a <code>getColumn()</code> method, but beware
+     * that the number of characters you are into a given line in a TextBuffer
+     * will only correspond to the column position on screen if the presenting
+     * TextView is not wrapping lines.</i>
+     * 
+     * @since 4.0.9
+     */
+    public int getLineOffset() {
+        return GtkTextIter.getLineOffset(this);
+    }
+
+    /**
+     * Move the iterator within the current TextBuffer line to the given
+     * character offset.
+     * 
+     * @since 4.0.9
+     */
+    public void setLineOffset(int column) {
+        GtkTextIter.setLineOffset(this, column);
+    }
+
+    /**
+     * Like {@link #getLineOffset()} but not counting those characters that
+     * are tagged "invisible".
+     * 
+     * @return Offset from start of line
+     * @since 4.0.9
+     */
+    public int getVisibleLineOffset() {
+        return GtkTextIter.getVisibleLineOffset(this);
+    }
+
+    /**
+     * Move this TextIter into the current line at the given offset, but
+     * skipping characters that have been marked
+     * {@link TextTag#setInvisible(boolean) invisible}.
+     * 
+     * <p>
+     * See {@link #setLineOffset(int) setLineOffset()} for the method that
+     * treats all characters normally.
+     * 
+     * @since 4.0.9
+     */
+    public void setVisibleLineOffset(int column) {
+        GtkTextIter.setVisibleLineOffset(this, column);
+    }
+
+    public String toString() {
+        StringBuffer buf = new StringBuffer("TextIter ");
+        buf.append(getOffset());
+        buf.append(" (");
+        buf.append(getLine());
+        buf.append(",");
+        buf.append(getLineOffset());
+        buf.append(")");
+        return buf.toString();
+    }
+
+    /**
+     * Get the character immediately following the position this TextIter is
+     * pointing at.
+     * 
+     * <p>
+     * TextBuffers work in characters, and so this method too returns a
+     * Unicode codepoint. Beware, of course if you are used to working with
+     * Java's 2-byte <code>char</code> type that you have to use
+     * StringBuffer's appendCodePoint(int) instead of append(char).
+     * 
+     * <p>
+     * An <code>int</code> value of
+     * {@link TextBuffer#OBJECT_REPLACEMENT_CHARACTER
+     * OBJECT_REPLACEMENT_CHARACTER} indicates a non-character element (an
+     * embedded Pixbuf or Widget). You'll get <code>0</code> (ie
+     * <code>'\0'</code>, not <code>'0'</code>) if this TextIter is already at
+     * the TextBuffer's end.
+     * 
+     * @since 4.0.13
+     */
+    public int getChar() {
+        return GtkTextIter.getChar(this);
+    }
+
+    /**
+     * Bump this TextIter forward to the start of the next line. As a special
+     * case, if you're already pointing at the last line of the TextBuffer,
+     * then you will be moved to the end of the line.
+     * 
+     * <p>
+     * Keep in mind that a line in the TextBuffer may well be wrapped when
+     * displayed onscreen in a TextView as the several lines comprising a
+     * paragraph; to move forward such a displayed line (ie <i>within</i> a
+     * paragraph) use {@link #forwardDisplayLine(TextView)
+     * forwardDisplayLine()}.
+     * 
+     * @since 4.0.9
+     */
+    public boolean forwardLine() {
+        return GtkTextIter.forwardLine(this);
+    }
+
+    /**
+     * Bump this TextIter backward to the start of the next line. As a special
+     * case, if you're already pointing at the first line of the TextBuffer,
+     * then you will be moved to the start of the line.
+     * 
+     * @since 4.0.9
+     */
+    public boolean backwardLine() {
+        return GtkTextIter.backwardLine(this);
+    }
+
+    /**
+     * Returns the text from the position defined by this TextIter to the
+     * position referenced by a given TextIter. Non-printable elements like
+     * Widgets and Pixbufs are not included in the returned string. If you
+     * need them use {@link #getSlice(TextIter)}.
+     * 
+     * @since 4.0.9
+     */
+    public String getText(TextIter end) {
+        return GtkTextIter.getText(this, end);
+    }
+
+    /**
+     * Returns the text from the position defined by this TextIter to the
+     * position referenced by a given TextIter, including non character
+     * elements like widgets or pixbufs.
+     * 
+     * @since 4.0.9
+     */
+    public String getSlice(TextIter end) {
+        return GtkTextIter.getSlice(this, end);
+    }
+
+    /**
+     * Like {@link #getSlice(TextIter)} but returns only those parts that are
+     * not flagged invisible.
+     * 
+     * @since 4.0.9
+     */
+    public String getVisibleSlice(TextIter end) {
+        return GtkTextIter.getVisibleSlice(this, end);
+    }
+
+    /**
+     * Like {@link #getText(TextIter)} but returns only those parts that are
+     * not flagged invisible.
+     * 
+     * @since 4.0.9
+     */
+    public String getVisibleText(TextIter end) {
+        return GtkTextIter.getVisibleText(this, end);
+    }
+
+    /**
+     * If the element at this position is an image
+     * 
+     * @return The {@link Pixbuf} object or <code>null</code> if there is no
+     *         image at the current position of this TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public Pixbuf getPixbuf() {
+        return GtkTextIter.getPixbuf(this);
+    }
+
+    /**
+     * Return the {@link TextMark}s that exists at the location the TextIter
+     * points to. If there are none present here then a zero length array will
+     * be returned.
+     * 
+     * <p>
+     * <i>GTK maintains a number of TextMarks internally in each TextBuffer
+     * for its own purposes (even over and above <var>selection-bound</var>
+     * and <var>insert</var>), proxies of which will get returned along with
+     * any TextMarks you've put there. So this method isn't quite as useful as
+     * one might like it to be.</i>
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * TODO wouldn't it be cool if we could filter the internal ones out and
+     * only return user created TextMarks?
+     */
+    public TextMark[] getMarks() {
+        return GtkTextIter.getMarks(this);
+    }
+
+    /**
+     * Return all the TextTags that are either turned on or off at this
+     * position.
+     * 
+     * @since 4.0.9
+     */
+    public TextTag[] getToggledTags(boolean state) {
+        return GtkTextIter.getToggledTags(this, state);
+    }
+
+    /**
+     * If there is a {@link TextChildAnchor} at the current position, return
+     * it. Otherwise return <code>null</code>.
+     * 
+     * @since 4.0.9
+     */
+    public TextChildAnchor getChildAnchor() {
+        return GtkTextIter.getChildAnchor(this);
+    }
+
+    /**
+     * Check whether a specific {@link TextTag} is started at exactly this
+     * point identified by the TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public boolean beginsTag(TextTag tag) {
+        return GtkTextIter.beginsTag(this, tag);
+    }
+
+    /**
+     * Check whether a specific {@link TextTag} is ended at exactly this point
+     * identified by the TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public boolean endsTag(TextTag tag) {
+        return GtkTextIter.endsTag(this, tag);
+    }
+
+    /**
+     * Check whether a specific {@link TextTag} is either started or ended at
+     * exactly this point identified by the TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public boolean togglesTag(TextTag tag) {
+        return GtkTextIter.togglesTag(this, tag);
+    }
+
+    /**
+     * Checks whether a specific {@link TextTag} is applied to the text at the
+     * current position. Or in other words if the current position is between
+     * start and end of the {@link TextTag}.
+     * 
+     * @since 4.0.9
+     */
+    public boolean hasTag(TextTag tag) {
+        return GtkTextIter.hasTag(this, tag);
+    }
+
+    /**
+     * Returns all TextTags that apply to the current position. If there are
+     * not any present here then a zero length array will be returned.
+     * 
+     * @since 4.0.9
+     */
+    public TextTag[] getTags() {
+        return GtkTextIter.getTags(this);
+    }
+
+    /**
+     * Check if text at the current position is editable. This is the case if
+     * the default editability is <code>true</code> or the TextIter is within
+     * or at the start of an editable block. If the TextIter is at the end of
+     * an editable block (which is also the star of a non-editable area), this
+     * method returns <code>false</code>.
+     * 
+     * @since 4.0.9
+     */
+    public boolean isEditable(boolean defaultEditability) {
+        return GtkTextIter.editable(this, defaultEditability);
+    }
+
+    /**
+     * Check if text inserted at the current position would be editable. This
+     * is the case if the TextIter is within the range of an editable block
+     * (including the start AND end position) or the default editability is
+     * <code>true</code>.
+     * 
+     * @since 4.0.9
+     */
+    public boolean canInsert(boolean defaultEditability) {
+        return GtkTextIter.canInsert(this, defaultEditability);
+    }
+
+    /**
+     * Returns if a word is beginning at the current position, which is the
+     * case when the TextIter points to the first letter of the word.
+     * 
+     * @since 4.0.9
+     */
+    public boolean startsWord() {
+        return GtkTextIter.startsWord(this);
+    }
+
+    /**
+     * Returns if the current position marks the end of a word. Usually this
+     * means that you are at the first whitespace or sentence ending sign
+     * behind a word.
+     * 
+     * @since 4.0.9
+     */
+    public boolean endsWord() {
+        return GtkTextIter.endsWord(this);
+    }
+
+    /**
+     * Check if the current position is inside a word, including the first or
+     * last letter.
+     * 
+     * @since 4.0.9
+     */
+    public boolean insideWord() {
+        return GtkTextIter.insideWord(this);
+    }
+
+    /**
+     * Check if the current position is at the start of a line.
+     * 
+     * @since 4.0.9
+     */
+    public boolean startsLine() {
+        return GtkTextIter.startsLine(this);
+    }
+
+    /**
+     * Check if the current position marks the end of a line.
+     * 
+     * @since 4.0.9
+     */
+    public boolean endsLine() {
+        return GtkTextIter.endsLine(this);
+    }
+
+    /**
+     * Returns <code>true</code> if the TextIter points to the first character
+     * of a sentence.
+     * 
+     * @since 4.0.9
+     */
+    public boolean startsSentence() {
+        return GtkTextIter.startsSentence(this);
+    }
+
+    /**
+     * Returns <code>true</code> if the TextIter points to the last sign that
+     * does not belong to the sentence - usually the first whitespace, since
+     * e.g. dots belong to a sentence.
+     * 
+     * @since 4.0.9
+     */
+    public boolean endsSentence() {
+        return GtkTextIter.endsSentence(this);
+    }
+
+    /**
+     * Checks whether or not the current position is inside a sentence.
+     * 
+     * @since 4.0.9
+     */
+    public boolean insideSentence() {
+        return GtkTextIter.insideSentence(this);
+    }
+
+    /**
+     * Returns if the TextIter is identical with the GUIs cursor position
+     * inside the TextView.
+     * 
+     * @since 4.0.9
+     */
+    public boolean isCursorPosition() {
+        return GtkTextIter.isCursorPosition(this);
+    }
+
+    /**
+     * Counts the characters in the current text line, including the newline
+     * if present. Non-printable objects like images count as one character.
+     * 
+     * @since 4.0.9
+     */
+    public int getCharsInLine() {
+        return GtkTextIter.getCharsInLine(this);
+    }
+
+    /**
+     * Checks if the TextIter points to the end of the buffer. This is the
+     * case if this TextIter has the same offset as the TextIter returned by
+     * {@link TextBuffer#getIterEnd()}
+     * 
+     * @since 4.0.9
+     */
+    public boolean isEnd() {
+        return GtkTextIter.isEnd(this);
+    }
+
+    /**
+     * Checks if the TextIter points to the start of the buffer. This is the
+     * case if this TextIter has the offset 0.
+     * 
+     * @since 4.0.9
+     */
+    public boolean isStart() {
+        return GtkTextIter.isStart(this);
+    }
+
+    /**
+     * Reduce the character offset by 1. If already at the first character,
+     * remain there.
+     * 
+     * @return <code>true</code>, if the offset was decreased or
+     *         <code>false</code> if the TextIter already pointed to the start
+     *         of the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public boolean backwardChar() {
+        return GtkTextIter.backwardChar(this);
+    }
+
+    /**
+     * Increase the character offset by 1. If already at the last character,
+     * remain there.
+     * 
+     * <p>
+     * The method returns <code>true</code>, if the offset was increased or
+     * <code>false</code> if the TextIter already pointed to the end of the
+     * TextBuffer <i>or one character before the end</i>.
+     * 
+     * <p>
+     * If iterating character by character over a TextBuffer, you probably
+     * want to use {@link #isEnd() isEnd()} and if not at the end call this
+     * (and ignore its return value).
+     * 
+     * @since 4.0.9
+     */
+    public boolean forwardChar() {
+        return GtkTextIter.forwardChar(this);
+    }
+
+    /**
+     * Reduce the character offset by <code>count</code>. If this would point
+     * to a negative offset, point to the start of the TextBuffer.
+     * 
+     * @return <code>true</code> if the position changed because of this call.
+     * 
+     * @since 4.0.9
+     */
+    public boolean backwardChars(int count) {
+        return GtkTextIter.backwardChars(this, count);
+    }
+
+    /**
+     * Increase the character offset by <code>count</code>. If this would
+     * point to a position behind the buffers end, point to the end of the
+     * TextBuffer.
+     * 
+     * @return <code>true</code> if the position changed because of this call.
+     * 
+     * @since 4.0.9
+     */
+    public boolean forwardChars(int count) {
+        return GtkTextIter.forwardChars(this, count);
+    }
+
+    /**
+     * Bump this TextIter backward multiple lines and to the start of the next
+     * line. As a special case, if you're already pointing at the first line
+     * of the TextBuffer, then you will be moved to the start of the line.
+     * 
+     * @since 4.0.9
+     */
+    public boolean backwardLines(int count) {
+        return GtkTextIter.backwardLines(this, count);
+    }
+
+    /**
+     * Bump this TextIter forward multiple lines and to the start of the next
+     * line. As a special case, if you're already pointing at the last line of
+     * the TextBuffer, then you will be moved to the end of the line.
+     * 
+     * @since 4.0.9
+     */
+    public boolean forwardLines(int count) {
+        return GtkTextIter.forwardLines(this, count);
+    }
+
+    /**
+     * Movie forward one <i>display</i> line within a paragraph as displayed
+     * in a TextView. A single line in a TextBuffer will be displayed as
+     * multiple lines (known to mere mortals as a "paragraph") in a TextView
+     * if word wrapping is enabled and something is acting to constrain the
+     * width of the TextView to less than the width of the lines.
+     * 
+     * <p>
+     * A given TextBuffer can be displayed by more than one TextView, so where
+     * the wrapping occurs is dependent on the width of that Widget, which is
+     * why you need to pass the view you are working in to this method.
+     * 
+     * <p>
+     * <i>In the native library this is a method on TextView; however, we have
+     * exposed it here so that it is in the same completion space as all the
+     * other</i> <code>forward...()</code> <i>methods available on
+     * TextIter.</i>
+     * 
+     * @return <code>true</code> if the location the TextIter points at was
+     *         changed; that is, if <code>pointer</code> is not yet at the end
+     *         of the underlying TextBuffer.
+     * @since 4.0.9
+     */
+    public boolean forwardDisplayLine(TextView view) {
+        return GtkTextView.forwardDisplayLine(view, this);
+    }
+
+    /**
+     * Move forward to the end of this <i>display</i> line.
+     * 
+     * @since 4.0.14
+     */
+    public boolean forwardDisplayLineEnd(TextView view) {
+        return GtkTextView.forwardDisplayLineEnd(view, this);
+    }
+
+    /**
+     * Move backward one <i>display</i> line within a paragraph as displayed
+     * in this TextView. This is the complement of
+     * {@link #forwardDisplayLine(TextView) forwardDisplayLine()}; see there
+     * for details.
+     * 
+     * @since 4.0.9
+     */
+    public boolean backwardDisplayLine(TextView view) {
+        return GtkTextView.backwardDisplayLine(view, this);
+    }
+
+    /**
+     * Move backward to the start of this <i>display</i> line.
+     * 
+     * @since 4.0.14
+     */
+    public boolean backwardDisplayLineStart(TextView view) {
+        return GtkTextView.backwardDisplayLineStart(view, this);
+    }
+
+    /**
+     * Does the position represented by this TextIter start a display line
+     * (within a paragraph) in the given TextView?
+     * 
+     * @since 4.0.9
+     */
+    public boolean startsDisplayLine(TextView view) {
+        return GtkTextView.startsDisplayLine(view, this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextMark.java b/src/bindings/org/gnome/gtk/TextMark.java
new file mode 100644
index 0000000..482ec91
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextMark.java
@@ -0,0 +1,124 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * A stable reference to a specific position within a TextBuffer.
+ * 
+ * <p>
+ * TextIters are transient pointers to positions within TextBuffers which are
+ * invalidated when their TextBuffer is modified, so you can't "save" them. If
+ * you need to preserve a position for later reuse, then get a TextMark by
+ * calling TextBuffer's {@link TextBuffer#createMark(TextIter, boolean)
+ * createMark()} on it.
+ * 
+ * <p>
+ * There are two "standard" TextMarks available in all TextBuffers, relating
+ * to the cursor and the current selection. See {@link TextBuffer#getInsert()
+ * getInsert()} and {@link TextBuffer#getSelectionBound() getSelectionBound()}.
+ * 
+ * <p>
+ * Instances of this class fill the same role for TextBuffers that
+ * {@link TreeRowReference} does in providing stability for rows pointed to
+ * transiently by TreeIters that come from TreeModels.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public class TextMark extends Object
+{
+    protected TextMark(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Left-gravity. This is a convenience constant that can be used when
+     * creating a TextMark with
+     * {@link TextBuffer#createMark(TextIter, boolean) createMark()}. The
+     * TextMark will stay fixed to the left if text is added there.
+     */
+    public static final boolean LEFT = true;
+
+    /**
+     * Right-gravity. Used when creating a TextMark via
+     * {@link TextBuffer#createMark(TextIter, boolean) createMark()}. The
+     * TextMark will move to the right if text is added there. The
+     * <var>insert</var> TextMark (your cursor) has right-gravity.
+     */
+    public static final boolean RIGHT = false;
+
+    /**
+     * Get the TextBuffer that this TextMark points into.
+     * 
+     * @since 4.0.9
+     */
+    public TextBuffer getBuffer() {
+        return GtkTextMark.getBuffer(this);
+    }
+
+    /**
+     * Get a currently valid TextIter indicating where in the TextBuffer this
+     * TextMark is pointing. This is a convenience method for the common case
+     * where you have a series of TextMarks but need to call various
+     * TextBuffer insertion or markup related methods, all of which take
+     * TextIter arguments.
+     * 
+     * <p>
+     * The usual caveats about changes invalidating iterators apply, but if
+     * you use these inline you will have no problems. For example, given
+     * TextMarks <code>start</code>, <code>end</code> and a TextTag of some
+     * sort, you could easily do:
+     * 
+     * <pre>
+     * buffer.applyTag(bold, start.getIter(), end.getIter());
+     * </pre>
+     * 
+     * which is very straight forward. If you are using the same position
+     * repeatedly, however, and not changing the TextBuffer, then it is far
+     * more efficient to convert the TextMark into a TextIter once and use
+     * that directly.
+     * 
+     * @since 4.0.9
+     */
+    public TextIter getIter() {
+        final TextIter pointer;
+        final TextBuffer buf;
+
+        buf = GtkTextMark.getBuffer(this);
+        pointer = buf.getIter(this);
+
+        return pointer;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextSearchFlags.java b/src/bindings/org/gnome/gtk/TextSearchFlags.java
new file mode 100644
index 0000000..1751783
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextSearchFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TextSearchFlags extends Constant
+{
+    private TextSearchFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextTag.java b/src/bindings/org/gnome/gtk/TextTag.java
new file mode 100644
index 0000000..13484e3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextTag.java
@@ -0,0 +1,608 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.lang.reflect.Field;
+
+import org.gnome.glib.Object;
+import org.gnome.pango.FontDescription;
+import org.gnome.pango.Scale;
+import org.gnome.pango.Style;
+import org.gnome.pango.Underline;
+import org.gnome.pango.Weight;
+
+import static org.gnome.gtk.TextBuffer.getDefaultTable;
+
+/**
+ * TextTags are used to apply markup and formatting for regions of text in a
+ * TextBuffer.
+ * 
+ * <p>
+ * All TextTags belong to a TextTagTable, and likewise all TextBuffers are
+ * constructed by specifying the TextTagTable that it will draw tags from.
+ * That said, if you don't mind sharing your TextTags between all TextBuffers
+ * in your application, then you can use the no-arg convenience constructors
+ * here and in TextBuffer. We will in all our examples.
+ * 
+ * <p>
+ * You can create a new and unique TextTag every time you go to apply
+ * formatting, but in general you'll want to reuse them and that will be more
+ * efficient. Given:
+ * 
+ * <pre>
+ * TextTag bold;
+ * TextBuffer buffer;
+ * TextIter start, end, pointer;
+ * ...
+ * </pre>
+ * 
+ * and assuming the TextBuffer was created with the no-arg constructor, create
+ * a TextTag and apply some formatting:
+ * 
+ * <pre>
+ * bold = new TextTag();
+ * bold.setWeight(Weight.BOLD);
+ * ...
+ * </pre>
+ * 
+ * As you will see, there are any number of properties and font
+ * characteristics that can be applied with a tag. See the setter methods on
+ * this class for all the current possibilities.
+ * 
+ * <p>
+ * Now, to make use of the tag, you'll call TextBuffer's
+ * {@link TextBuffer#applyTag(TextTag, TextIter, TextIter) applyTag()}. It
+ * needs a pair of TextIters to delineate the range you want to apply the
+ * TextTag to. You could, for example, react to the currently selected region:
+ * 
+ * <pre>
+ * start = buffer.getSelectionBound().getIter();
+ * end = buffer.getInsert().getIter();
+ * </pre>
+ * 
+ * And now apply your tag:
+ * 
+ * <pre>
+ * buffer.applyTag(bold, start, end);
+ * </pre>
+ * 
+ * As an alternative, you can apply a TextTag when
+ * {@link TextBuffer#insert(TextIter, String, TextTag) insert()}ing text:
+ * 
+ * <pre>
+ * buffer.insert(pointer, "Hello World", bold);
+ * </pre>
+ * 
+ * Either way, going forward, you've now got <code>bold</code> which you can
+ * apply on other regions of your TextBuffer.
+ * 
+ * <p>
+ * Finally, if you want to know what TextTags are applying at a given spot in
+ * a TextBuffer, then get a TextIter pointing there and use its
+ * {@link TextIter#getTags() getTags()} method.
+ * 
+ * <p>
+ * <i>All TextTags created in java-gnome are "anonymous"; the underlying
+ * library has a notion of named tags but we have no need of this and have not
+ * exposed it. In order to reuse a TextTag later just keep a reference to
+ * it.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+/*
+ * This class is interesting and unusual in that there are no direct setter
+ * functions; all the various properties are only exposed through the GObject
+ * GValue property setting mechanism.
+ */
+public class TextTag extends Object
+{
+    /**
+     * An internal reference to the TextTagTable that this TextTag was
+     * constructed with. This is used for validation by TextBuffer's
+     * checkTag() to protect against misuse of our no-arg conveniences.
+     */
+    final TextTagTable table;
+
+    protected TextTag(long pointer) {
+        super(pointer);
+        /*
+         * FIXME Does this ever actually get hit? If so, we're in trouble; how
+         * can we find out what table it is actually in? Probably means
+         * changing the logic in checkTag().
+         */
+        this.table = null;
+    }
+
+    /**
+     * Create a new TextTag and place it in the default TextTagTable. This
+     * will be usable by a TextBuffer created with the
+     * {@link TextBuffer#TextBuffer() no-arg} constructor.
+     * 
+     * @since 4.0.9
+     */
+    public TextTag() {
+        super(GtkTextTag.createTextTag(null));
+        this.table = getDefaultTable();
+        GtkTextTagTable.add(table, this);
+    }
+
+    /**
+     * Create a new TextTag and place it in the default TextTagTable. The
+     * supplied <code>name</code> has no particular effect but can be helpful
+     * for debugging. Otherwise just use TextTag {@link TextTag#TextTag()
+     * <init>()}.
+     * 
+     * @since 4.1.1
+     */
+    public TextTag(String name) {
+        super(GtkTextTag.createTextTag(name));
+        this.table = getDefaultTable();
+        GtkTextTagTable.add(table, this);
+    }
+
+    /**
+     * Create a new TextTag. You pass the TextTagTable that will enclose this
+     * TextTag as the argument to the constructor.
+     * 
+     * <p>
+     * <i>In native GTK you have to add TextTags to TextTagTables; we do this
+     * for you automatically.</i>
+     * 
+     * @since 4.0.9
+     */
+    public TextTag(TextTagTable table) {
+        super(GtkTextTag.createTextTag(null));
+        this.table = table;
+        GtkTextTagTable.add(table, this);
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public TextTag(TextTagTable table, String name) {
+        super(GtkTextTag.createTextTag(name));
+        this.table = table;
+        GtkTextTagTable.add(table, this);
+    }
+
+    /**
+     * Specify that you want the text scaled up or scaled down from the
+     * otherwise extant font size. The default is
+     * {@link org.gnome.pango.Scale#NORMAL NORMAL} (that is, a scaling factor
+     * of <code>1.0</code> which thereby has no effect).
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * Be aware in passing that this obscures the Scale in org.gnome.gtk
+     */
+    public void setScale(Scale scale) {
+        setPropertyDouble("scale", GtkTextTagOverride.valueOf(scale));
+    }
+
+    /**
+     * Specify the amount by which this paragraph is to be indented, in
+     * pixels. Interestingly, this <i>can</i> be negative, in which case you
+     * get a hanging indent. The default is <code>0</code>.
+     * 
+     * @since 4.0.9
+     */
+    public void setIndent(int pixels) {
+        setPropertyInteger("indent", pixels);
+    }
+
+    /**
+     * Specify the left margin, in pixels. The default is <code>0</code>.
+     * 
+     * @since 4.1.1
+     */
+    public void setMarginLeft(int pixels) {
+        if (pixels < 0) {
+            throw new IllegalArgumentException("Margin property must be positive");
+        }
+        setPropertyInteger("left-margin", pixels);
+    }
+
+    /**
+     * Specify the right margin, in pixels. The default is <code>0</code>.
+     * 
+     * @since 4.1.1
+     */
+    public void setMarginRight(int pixels) {
+        if (pixels < 0) {
+            throw new IllegalArgumentException("Margin property must be positive");
+        }
+        setPropertyInteger("right-margin", pixels);
+    }
+
+    /**
+     * Specify the font weight. The useful one is
+     * {@link org.gnome.pango.Weight#BOLD BOLD}; the default is
+     * {@link org.gnome.pango.Weight#NORMAL NORMAL}.
+     * 
+     * @since 4.0.9
+     */
+    public void setWeight(Weight weight) {
+        setPropertyInteger("weight", GtkTextTagOverride.valueOf(weight));
+    }
+
+    /**
+     * Specify the underling mode to be used for this text. Single underlining
+     * is {@link org.gnome.pango.Underline#SINGLE SINGLE}.
+     * {@link org.gnome.pango.Underline#NONE NONE} is the default, obviously.
+     * 
+     * @since 4.0.9
+     */
+    public void setUnderline(Underline underline) {
+        setPropertyEnum("underline", underline);
+    }
+
+    /**
+     * Specify that this text be rendered struck through.
+     * 
+     * @since 4.0.9
+     */
+    public void setStrikethrough(boolean setting) {
+        setPropertyBoolean("strikethrough", setting);
+    }
+
+    /**
+     * Specify the background colour via a String description.
+     * 
+     * <p>
+     * See {@link #setForeground(String) setForeground()} for discussion of
+     * allowable colour names.
+     * 
+     * <p>
+     * The default is no explicit setting.
+     * 
+     * @since 4.0.9
+     */
+    public void setBackground(String color) {
+        setPropertyString("background", color);
+    }
+
+    /**
+     * Specify the background colour to be used by the [rectangular] space
+     * behind the current paragraph as a whole? Contrast to
+     * {@link #setBackground(String) setBackground()} which sets the
+     * background colour of of just the text itself.
+     * 
+     * @since 4.1.1
+     */
+    public void setParagraphBackground(String color) {
+        setPropertyString("paragraph-background", color);
+    }
+
+    /**
+     * Specify the foreground colour by name.
+     * 
+     * <p>
+     * Colours can be specified either:
+     * 
+     * <ul>
+     * <li>as hex, in the form <code>"#<i>rrggbb</i>"</code> where
+     * <code><i>rr</i></code>, <code><i>gg</i></code>, and
+     * <code><i>bb</i></code> are two hexadecimal characters expressing a
+     * values between <code>0x00</code> and <code>0xFF</code> for red, green,
+     * and blue respectively; or
+     * <li>as a symbolic name, such as <code>"blue"</code> and
+     * <code>"medium sea green"</code>, depending on what constants have been
+     * built into your X server. You can likely see a list at
+     * <code>/usr/share/X11/rgb.txt</code>. Obviously these are unreliable
+     * between different systems, but they are undeniably easy to use.
+     * </ul>
+     * 
+     * <p>
+     * The default is no explicit setting.
+     * 
+     * @since 4.0.9
+     */
+    public void setForeground(String colour) {
+        setPropertyString("foreground", colour);
+    }
+
+    /**
+     * Set whether the region of text covered by this TextTag is editable by
+     * the user.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * FIXME The default is true what happens if a TextView is
+     * setEditable(false)? Needs a test case.
+     */
+    public void setEditable(boolean setting) {
+        setPropertyBoolean("editable", setting);
+    }
+
+    /**
+     * Specify the font <i>style</i> to be used (
+     * {@link org.gnome.pango.Style#NORMAL NORMAL},
+     * {@link org.gnome.pango.Style#OBLIQUE OBLIQUE} and
+     * {@link org.gnome.pango.Style#ITALIC ITALIC}s).
+     * 
+     * @since 4.0.9
+     */
+    public void setStyle(Style style) {
+        setPropertyInteger("style", GtkTextTagOverride.valueOf(style));
+    }
+
+    /**
+     * Specify the font family to be used. This is a family name like
+     * "Bitstream Vera" or "DejaVu" or "Liberation".
+     * 
+     * <p>
+     * In general, it is better to use the standard aliases "Serif", "Sans",
+     * and "Monospaced" than naming a family by hand as this lets the user
+     * assign their own meanings to those terms via the Fonts tab in <b>
+     * <code>gnome-appearance-properties</code></b>.
+     * 
+     * <p>
+     * Note that you need to specify this early; if you set this after setting
+     * other propertes on the TextTag, it may reset them.
+     * 
+     * @since 4.0.10
+     */
+    public void setFamily(String font) {
+        setPropertyString("font", font);
+    }
+
+    /**
+     * Hide the text formatted with this TextTag.
+     * 
+     * <p>
+     * FIXME what happens when you insert at a point that is marked invisible?
+     * Backspace into it? What is the interaction with the <var>editable</var>
+     * property and <code>insertInteractive()</code>?
+     * 
+     * <p>
+     * <i>GTK further notes there are problems with invisible text and
+     * programmatic navigation of TextBuffers.</i>
+     * 
+     * @since <span style="color: red">Unstable</span>
+     */
+    /*
+     * FIXME The signature is correct, but the implications for the developer
+     * of employing this are not, and that needs fixing. We've exposed it so
+     * that people can play with it and maybe infer some of the answers to
+     * these questions.
+     */
+    public void setInvisible(boolean setting) {
+        setPropertyBoolean("invisible", setting);
+    }
+
+    public String toString() {
+        final String name;
+        final StringBuilder str;
+        final Style style;
+        final Weight weight;
+
+        str = new StringBuilder(super.toString());
+
+        name = getPropertyString("name");
+        if ((name != null) && (name.length() > 0)) {
+            str.append(' ');
+            str.append('\"');
+            str.append(name);
+            str.append('\"');
+        }
+
+        if (getPropertyBoolean("style-set")) {
+            style = (Style) getPropertyEnum("style");
+            if (style != Style.NORMAL) {
+                str.append("\n\tstyle: " + style);
+            }
+        }
+        if (getPropertyBoolean("underline-set")) {
+            str.append("\n\tunderline: " + getPropertyEnum("underline"));
+        }
+        /*
+         * weight always seems to be set. What's up with that?
+         */
+        if (getPropertyBoolean("weight-set")) {
+            weight = GtkTextTagOverride.weightFor(getPropertyInteger("weight"));
+            if (weight != Weight.NORMAL) {
+                str.append("\n\tweight: " + weight);
+            }
+        }
+
+        if (getPropertyBoolean("pixels-above-lines-set")) {
+            str.append("\n\tpadding above paragraph: " + getPropertyInteger("pixels-above-lines"));
+        }
+        if (getPropertyBoolean("pixels-below-lines-set")) {
+            str.append("\n\tpadding below paragraph: " + getPropertyInteger("pixels-below-lines"));
+        }
+        if (getPropertyBoolean("left-margin-set")) {
+            str.append("\n\tmargin left:  " + getPropertyInteger("left-margin"));
+        }
+        if (getPropertyBoolean("right-margin-set")) {
+            str.append("\n\tmargin right: " + getPropertyInteger("right-margin"));
+        }
+
+        return str.toString();
+    }
+
+    /**
+     * Set the font size, in points.
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * Using "size-points" instead of "size" allowed us to keep Pango.SCALE
+     * default instead of public. There is no huge imperative to keep it that
+     * way.
+     */
+    public void setSize(double size) {
+        setPropertyDouble("size-points", size);
+    }
+
+    /**
+     * Pass a FontDescription specifying the metrics and characteristics of
+     * the font you wish to be active when this TextTag is applied.
+     * 
+     * @since 4.0.10
+     */
+    public void setFontDescription(FontDescription desc) {
+        setPropertyBoxed("font-desc", desc);
+    }
+
+    /**
+     * Pass a string that describes the font you wish to use. This is
+     * essentially a convenience wrapper around creating a FontDescription
+     * with FontDescription's {@link FontDescription#FontDescription(String)
+     * <init>(String)} constructor; see there for details of the syntax
+     * allowed.
+     * 
+     * @since 4.0.10
+     */
+    public void setFont(String str) {
+        setPropertyString("font", str);
+    }
+
+    /*
+     * This is allows us to keep the Pango.SCALE constant restricted
+     * visibility while still having the actual value only in one place.
+     */
+
+    private static final double SCALE;
+
+    static {
+        final Class<?> cls;
+        final Field field;
+
+        try {
+            cls = Class.forName("org.gnome.pango.Pango");
+
+            field = cls.getDeclaredField("SCALE");
+            field.setAccessible(true);
+
+            SCALE = field.getDouble(cls);
+        } catch (Exception e) {
+            throw new Error(e);
+        }
+    }
+
+    /**
+     * Indicate that a span of characters is to be positioned at other than
+     * the baseline. This is typically used to create superscripts and
+     * subscripts, although you want to be careful because you are likely also
+     * changing font sizes when doing so.
+     * 
+     * <p>
+     * The measurement is in points. A negative number will take you below the
+     * baseline.
+     * 
+     * <p>
+     * Be aware that whenever non-uniform sizing is used on a line, the
+     * TextView will render that line as higher than the other lines in a
+     * document. This can often be an unwanted (but hard to trivially avoid)
+     * side-effect.
+     * 
+     * <p>
+     * See also {@link org.gnome.pango.RiseAttribute RiseAttribute} which is
+     * the underlying mechanism which powers this in Pango.
+     * 
+     * @since 4.0.14
+     */
+    public void setRise(double rise) {
+        setPropertyDouble("rise", (int) (rise * SCALE));
+    }
+
+    /**
+     * Set the padding that will be put below each paragraph of text. See
+     * TextView's {@link TextView#setPaddingBelowParagraph(int)
+     * setPaddingBelowParagraph()}.
+     * 
+     * @since 4.1.1
+     */
+    public void setPaddingBelowParagraph(int pixels) {
+        setPropertyInteger("pixels-below-lines", pixels);
+    }
+
+    /**
+     * Set the padding that will be put above each paragraph of text. See
+     * TextView's {@link TextView#setPaddingAboveParagraph(int)
+     * setPaddingAboveParagraph()}.
+     * 
+     * @since 4.1.1
+     */
+    public void setPaddingAboveParagraph(int pixels) {
+        setPropertyInteger("pixels-above-lines", pixels);
+    }
+
+    /**
+     * Set the padding that will be put between each line in a paragraph if
+     * wrapping is turned on. See TextView's
+     * {@link TextView#setPaddingInsideParagraph(int)
+     * setPaddingInsideParagraph()}.
+     * 
+     * @since 4.1.1
+     */
+    public void setPaddingInsideParagraph(int pixels) {
+        setPropertyInteger("pixels-inside-wrap", pixels);
+    }
+
+    /**
+     * Set the wrapping to be applied within this section of text.
+     * 
+     * @since 4.1.1
+     */
+    public void setWrapMode(WrapMode mode) {
+        setPropertyEnum("wrap-mode", mode);
+    }
+
+    /**
+     * Does the background colouring specified by
+     * {@link #setBackground(String) setBackground()} fills the entire line
+     * height or only the height of the tagged characters.
+     * 
+     * @since 4.1.1
+     */
+    public void setBackgroundFullHeight(boolean setting) {
+        super.setPropertyBoolean("background-full-height", setting);
+    }
+
+    /**
+     * Adopt the given justification for a given passage of text.
+     * 
+     * @since 4.1.1
+     */
+    /*
+     * As with TextView, match Label's setJustify() name.
+     */
+    public void setJustify(Justification setting) {
+        super.setPropertyEnum("justification", setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextTagTable.java b/src/bindings/org/gnome/gtk/TextTagTable.java
new file mode 100644
index 0000000..b9576f3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextTagTable.java
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * A set of TextTags that can be used by one or more TextBuffers.
+ * 
+ * <p>
+ * Creating a TextTag automatically adds it to the TextTagTable passed when
+ * the TextTag is constructed.
+ * 
+ * <p>
+ * You certainly only need one of these per TextBuffer, and as most people
+ * want to reuse the same set of TextTags across all the TextBuffers in a
+ * given program, they typically end up only having one TextTagTable across
+ * the entire application.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public class TextTagTable extends Object
+{
+    protected TextTagTable(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Instantiate a new table for collecting TextTags.
+     * 
+     * @since 4.0.9
+     */
+    public TextTagTable() {
+        super(GtkTextTagTable.createTextTagTable());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextView.java b/src/bindings/org/gnome/gtk/TextView.java
new file mode 100644
index 0000000..e9172c2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextView.java
@@ -0,0 +1,1091 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Rectangle;
+import org.gnome.pango.FontDescription;
+
+/**
+ * A multi-line text display Widget. <img class="snapshot" src="TextView.png">
+ * 
+ * GTK leverages the powerful text rendering capability provided by the Pango
+ * library. This is used throughout the toolkit, but nowhere more so that when
+ * displaying multiple lines of text in a single Widget. TextView is the view
+ * part of GTK's model-view-controller pattern text display Widget, with a
+ * {@link TextBuffer} supplying the underlying data model.
+ * 
+ * <p>
+ * TextView can be used for passive display of multiple lines of text by
+ * disabling the <var>editable</var> property. Usually, however, a text canvas
+ * is used for entering or editing text and the TextView/TextBuffer APIs
+ * combine to provide a powerful editing capability.
+ * 
+ * <h2>Usage</h2>
+ * 
+ * Having instantiated a TextBuffer to store and programmatically manipulate
+ * the text, you create a TextView as follows:
+ * 
+ * <pre>
+ * TextBuffer buffer;
+ * TextView view;
+ * ScrolledWindow scroll;
+ * ...
+ * 
+ * view = new TextView(buffer);
+ * </pre>
+ * 
+ * Most people want the text to wrap. This is enabled by setting a WrapMode
+ * but something must act to restrain the horizontal width of the TextView
+ * Widget as it will size-request as much space as would be needed to render a
+ * single line. Likewise, wrapping is usually combined with scrolling, and
+ * this can be set up in a fairly straight forward fashion:
+ * 
+ * <pre>
+ * view.setWrapMode(WrapMode.WORD);
+ * 
+ * scroll = new ScrolledWindow();
+ * scroll.setPolicy(PolicyType.NEVER, PolicyType.ALWAYS);
+ * scroll.add(view);
+ * ...
+ * 
+ * window.setDefaultSize(300, 700);
+ * </pre>
+ * 
+ * then packing the ScrolledWindow into a parent Container hierarchy. In
+ * example shown here the call to <code>setDefaultSize()</code> on the
+ * toplevel would constrain the overall Window size, forcing a narrow
+ * size-allocation on the TextView.
+ * 
+ * <p>
+ * As with TextBuffer, TextIters are the mechanism used to point to locations
+ * within the displayed text. There are numerous methods here on TextView
+ * which manipulate the displayed view (for example
+ * {@link #scrollTo(TextIter) scrollTo()}) many of which take a TextIter as an
+ * indicator of position. Don't be confused that the TextIters are somehow
+ * different depending on their source; they <i>always</i> refer to a position
+ * in a TextBuffer but are often translated to also identify a screen position
+ * in the TextView. You will often find yourself getting a TextIter from the
+ * TextBuffer (perhaps in response to a <code>TextBuffer.Changed</code> or
+ * <code>TextBuffer.InsertText</code> emission) and then switching over to
+ * here and calling TextView methods - and then going back to TextBuffer again
+ * a moment later.
+ * 
+ * <h2>Appearance</h2>
+ * 
+ * <p>
+ * {@link TextTag}s are what are use to cause ranges of text within a TextView
+ * to appear with various formatting (bold, italics, colour, etc) over and
+ * above being displayed as normal text. You apply such tags to the TextBuffer
+ * either when <code>insert()</code>ing or with <code>applyTag()</code>. See
+ * TextTag for details and examples.
+ * 
+ * <p>
+ * Incidentally, if you need to change the font of the text being rendered in
+ * this TextView by default use Widget's {@link #modifyFont(FontDescription)
+ * modifyFont()}, for example:
+ * 
+ * <pre>
+ * desc = new FontDescription("Monospace, 12");
+ * view.modifyFont(desc);
+ * </pre>
+ * 
+ * see FontDescription for all the gory details. As usual, we recommend that
+ * you do <i>not</i> do this without good cause, instead leaving the
+ * application font to be what the user has selected the system Appearance
+ * Preferences font settings dialog provided by GNOME.
+ * 
+ * <a name="height"></a>
+ * <h2>Line height calculations</h2>
+ * 
+ * <p>
+ * Working out the heights for each line of text in the TextView and doing
+ * related positioning can, at times, be computationally intensive. So GTK
+ * does this in a background idle task.
+ * 
+ * <p>
+ * Ordinarily you don't have to worry about this, but methods like
+ * {@link #getLineY(TextIter) getLineY()} will not report correct information
+ * until this has happened. If you are doing drawing based on the co-ordinates
+ * of a given line in the <code>TEXT</code> Window of the TextView, it is easy
+ * to be trapped by this: you hook up to the <code>TextBuffer.Changed</code>
+ * thinking that you can use this as an indication of when the TextView has
+ * changed, but unfortunately this turns out not to be the case.
+ * <code>TextBuffer.Changed</code> is indeed emitted, but the information
+ * returned by <code>getLineY()</code> will not have been updated until after
+ * the current signal handlers finish and the high-priority idle task can run.
+ * 
+ * <p>
+ * Studying the internal implementation of this logic in GTK, it turns out
+ * that the bulk of the work to do validation of the line height calculations
+ * and text placement happens in code paths triggered off of
+ * <code>Adjustment.ValueChanged</code> (which is emitted, for example, when
+ * scrolling occurs). Thus there does seem to be a way to trick the TreeView
+ * into getting on with the revalidation early, and that is to emit
+ * <code>Adjustment.ValueChanged</code> yourself. So, given the usual
+ * TextView/TextBuffer fields and an Adjustment:
+ * 
+ * <pre>
+ * ...
+ * final TextView view;
+ * final TextBuffer buffer;
+ * final ScrolledWindow scroll;
+ * final Adjustment vadj;
+ * ...
+ * </pre>
+ * 
+ * and assuming <code>view</code> has been packed into <code>scroll</code>,
+ * etc, you can get the Adjustment and use <i>it</i> changing as the trigger
+ * to do your redrawing logic:
+ * 
+ * <pre>
+ * vadj = scroll.getVAdjustment();
+ * vadj.connect(new Adjustment.ValueChanged() {
+ *     public void onValueChanged(Adjustment source) {
+ *         // now the line heights will be correct
+ *         doSomethingWith(view.getLineY());
+ *     }
+ * });
+ * </pre>
+ * 
+ * That works for when real scrolling happens, but if you need to precipitate
+ * matters, use Adjustment's <code>emitValueChanged()</code> to fire the
+ * <code>Adjustment.ValueChanged</code> signal:
+ * 
+ * <pre>
+ * buffer.connect(new TextBuffer.Changed() {
+ *     public void onChanged(TextBuffer source) {
+ *         vadj.emitValueChanged();
+ *     }
+ * });
+ * 
+ * window.connect(new Window.ConfigureEvent() {
+ *     public boolean onConfigureEvent(Widget source, EventConfigure event) {
+ *         vadj.emitValueChanged();
+ *         return false;
+ *     }
+ * });
+ * </pre>
+ * 
+ * and so on.
+ * 
+ * <p>
+ * A possible alternative to the above workaround is to iterate the main loop;
+ * See {@link Gtk#mainIterationDo(boolean) Gtk.mainIterationDo()}.
+ * 
+ * <p>
+ * <i>Obviously "internal to GTK" implies that we are second guessing the
+ * implementation details. This workaround is not based on documented public
+ * behaviour, and unfortunately is not guaranteed to be stable. So as we say
+ * in Open Source, Your Mileage May Vary. Perhaps GTK will improve this aspect
+ * of the library in the future.</i>
+ * 
+ * <a name="spelling"></a>
+ * <h2>Spellchecking</h2>
+ * 
+ * <img class="snapshot" src="TextView-Spelling.png"> You can add
+ * spellchecking capability to the TextView with a single line of code.
+ * 
+ * <pre>
+ * view.attachSpell()
+ * </pre>
+ * 
+ * The given code will determine the spellchecker language based on
+ * <code>LANG</code> environment variable and fall back to English if it
+ * can't.
+ * 
+ * @author Stefan Prelle
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ * @since 4.0.9
+ */
+public class TextView extends Container
+{
+    private Spell spell;
+
+    protected TextView(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create an empty TextView without (yet) having an associated TextBuffer.
+     * Use {@link #setBuffer(TextBuffer) setBuffer()} to indicate later which
+     * TextBuffer to use.
+     * 
+     * @since 4.0.9
+     */
+    public TextView() {
+        super(GtkTextView.createTextView());
+    }
+
+    /**
+     * Create a TextView and display the contents of the TextBuffer.
+     * 
+     * @since 4.0.9
+     */
+    public TextView(TextBuffer buffer) {
+        super(GtkTextView.createTextViewWithBuffer(buffer));
+    }
+
+    /**
+     * Get the TextBuffer currently underlying this TextView.
+     * 
+     * @since 4.0.9
+     */
+    public TextBuffer getBuffer() {
+        return GtkTextView.getBuffer(this);
+    }
+
+    /**
+     * Set or replace the TextBuffer that is currently being displayed by this
+     * TextView.
+     * 
+     * @since 4.0.9
+     */
+    public void setBuffer(TextBuffer buffer) {
+        GtkTextView.setBuffer(this, buffer);
+    }
+
+    /**
+     * Set the line wrapping for the view.
+     * 
+     * @since 4.0.9
+     */
+    public void setWrapMode(WrapMode mode) {
+        GtkTextView.setWrapMode(this, mode);
+    }
+
+    /**
+     * Get the line wrapping for the view.
+     * 
+     * @since 4.0.9
+     */
+    public WrapMode getWrapMode() {
+        return GtkTextView.getWrapMode(this);
+    }
+
+    /**
+     * Set whether the normal state of this TextView is to allow editing or
+     * not. The default for the <var>editability</var> property is
+     * <code>true</code>.
+     * 
+     * <p>
+     * Regardless of the default setting here, you can override this for
+     * specific regions of text with by applying TextTags with
+     * {@link TextTag#setEditable(boolean) setEditable()} set.
+     * 
+     * @since 4.0.9
+     */
+    public void setEditable(boolean editable) {
+        GtkTextView.setEditable(this, editable);
+    }
+
+    /**
+     * Get whether the default editability of the TextView. Tags in the buffer
+     * may override this setting for some ranges of text.
+     * 
+     * @since 4.0.9
+     */
+    public boolean getEditable() {
+        return GtkTextView.getEditable(this);
+    }
+
+    /**
+     * Allows you to activate or deactivate the visible cursor. Usually used
+     * to hide the cursor when displaying text that is non-editable. The
+     * default is <code>true</code>, indicating the cursor will be shown.
+     * 
+     * @since 4.0.9
+     */
+    public void setCursorVisible(boolean visible) {
+        GtkTextView.setCursorVisible(this, visible);
+    }
+
+    /**
+     * Returns whether the cursor is currently visible or not.
+     * 
+     * @since 4.0.9
+     */
+    public boolean getCursorVisible() {
+        return GtkTextView.getCursorVisible(this);
+    }
+
+    /**
+     * Load a Widget into the TextView at the given position.
+     * 
+     * <p>
+     * A very impressive feature of TextViews is that you can embed Widgets
+     * into them! You supply the <code>position</code> where you want the
+     * Widget to be anchored, and the Widget will appear in the display amidst
+     * the rest of your text. Don't forget to <code>show()</code> the Widget
+     * you're adding or it won't appear.
+     * 
+     * <p>
+     * There is an {@link TextBuffer#insert(TextIter, Widget, TextView)
+     * insert()} method available on TextBuffer which wraps this; you may find
+     * it more convenient.
+     * 
+     * <p>
+     * <i>The underlying library is somewhat convoluted about this due to the
+     * fact that more than one TextView can be displaying a given TextBuffer,
+     * but a Widget can only appear in one parent Container. GTK uses an
+     * intermediate called TextChildAnchor to bridge between TextView and
+     * TextBuffer; we take care of handling that for you.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void add(Widget child, TextIter position) {
+        final TextBuffer buffer;
+        final TextChildAnchor anchor;
+
+        /*
+         * TextChildAnchors are just an intermediate to bridge between
+         * TextView and TextBuffer. There doesn't seem to be a reason to
+         * expose them when we can just join them here. So, first create an
+         * anchor:
+         */
+
+        buffer = getBuffer();
+        anchor = buffer.createChildAnchor(position);
+
+        /*
+         * Now use the anchor to add the Widget:
+         */
+
+        GtkTextView.addChildAtAnchor(this, child, anchor);
+    }
+
+    /**
+     * Set the size (width for LEFT and RIGHT and height for TOP and BOTTOM)
+     * of the specified side panels. You only need this if using the optional
+     * side panels, and obscure, advanced, and not wholly functional feature;
+     * see {@link TextWindowType}. If you're reading this and wanting to set
+     * the padding around the TextView, you probably want
+     * {@link #setBorderWidth(int) setBorderWidth()}, a method inherited from
+     * Container.
+     * 
+     * @since 4.0.9
+     */
+    public void setBorderWindowSize(TextWindowType which, int size) {
+        GtkTextView.setBorderWindowSize(this, which, size);
+    }
+
+    /**
+     * Place a child Widget into one of the optional side panels around a
+     * TextView. This is an advanced feature; see {@link TextWindowType} for a
+     * full discussion.
+     * 
+     * <p>
+     * The Widget <code>child</code> will be placed at the coordinates
+     * <code>x</code>,<code>y</code> in the [org.gnome.gdk] Window specified
+     * by which. You can get that Window by calling TextView's variant of
+     * {@link #getWindow(TextWindowType) getWindow()}.
+     * 
+     * <p>
+     * This cannot be used unless <code>which</code> has been initialized to
+     * have a non-zero size with
+     * {@link #setBorderWindowSize(TextWindowType, int) setBorderWindowSize()}.
+     * 
+     * <p>
+     * <b>WARNING</b><br>
+     * <i style="color:red">This feature seems somewhat poorly implemented in
+     * the underlying library. While we have fully exposed it, testing showed
+     * it to be rather difficult to use reliably. Sorry we can't do better for
+     * you.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void add(Widget child, TextWindowType which, int x, int y) {
+        final int width;
+
+        width = GtkTextView.getBorderWindowSize(this, which);
+
+        if (width < 1) {
+            throw new IllegalStateException("Optional border panels must have non-zero size.");
+        }
+
+        GtkTextView.addChildInWindow(this, child, which, x, y);
+    }
+
+    /**
+     * @deprecated Despite TextView inherheriting from Container, add(Widget)
+     *             doesn't work. Use TextView's add(Widget,TextIter) instead.
+     */
+    /*
+     * This is marked deprecated just to keep it out of the API documentation.
+     */
+    public void add(Widget child) {
+        throw new UnsupportedOperationException("Use add(Widget,TextIter) instead");
+    }
+
+    /**
+     * Change the co-ordinates of a child Widget in one of the optional side
+     * panels. <code>x</code>,<code>y</code> are specified in <i>window
+     * co-ordinates</i>.
+     * 
+     * @since 4.0.9
+     */
+    public void moveChild(Widget child, int x, int y) {
+        GtkTextView.moveChild(this, child, x, y);
+    }
+
+    /**
+     * Convert <code>X</code> from <var>buffer co-ordinates</var> to
+     * <var>window co-ordinates</var>. See
+     * {@link #convertBufferToWindowCoordsY(TextWindowType, int)
+     * convertBufferToWindowCoordsY()} for a detailed discussion.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * In this method and the corresponding Y co-ordinate version we just pass
+     * 0 for the unused axis because we're ignoring the result for that axis
+     * anyway. This seems sane based on inspection of the code paths in GTK's
+     * gtk/gtktextview.c
+     */
+    public int convertBufferToWindowCoordsX(TextWindowType which, int X) {
+        int[] x;
+
+        x = new int[1];
+
+        GtkTextView.bufferToWindowCoords(this, which, X, 0, x, null);
+
+        return x[0];
+    }
+
+    /**
+     * The canvas that is used to present the text in a TextView has an origin
+     * at <code>0</code>,<code>0</code> that is at the top left corner. and
+     * extends for as many pixels as would be necessary to present the entire
+     * TextBuffer if it were shown on an arbitrarily large screen without
+     * scrolling.
+     * 
+     * <p>
+     * In most cases, the text shown will require an area larger than the
+     * viewport provided by the primary area of the TextView. Even without
+     * scrollbars (which can be added by putting the TextView into a
+     * ScrolledWindow), the viewport showing the text will slide when the
+     * cursor is moved down from the start position and into the body of text.
+     * Thus you can be at a position in <var>buffer co-ordinates</var> that is
+     * far "greater" than the size of the [org.gnome.gdk] Window that displays
+     * it.
+     * 
+     * <p>
+     * Numerous methods, notably {@link #getLineY(TextIter) getLineY()},
+     * return a value in <var>buffer co-ordinates</var>. If you need to
+     * determine what position this represents on screen, you need to convert
+     * to <var>window co-ordinates</var> which are relative to the top left
+     * corner of the [org.gnome.gdk] Window being used to present the text on
+     * screen. This method will carry out that conversion for the vertical
+     * axis. See {@link #convertBufferToWindowCoordsX(TextWindowType, int)
+     * convertBufferToWindowCoordsX()} for the corresponding horizontal
+     * conversion.
+     * 
+     * @since 4.0.9
+     */
+    public int convertBufferToWindowCoordsY(TextWindowType which, int Y) {
+        int[] y;
+
+        y = new int[1];
+
+        GtkTextView.bufferToWindowCoords(this, which, 0, Y, null, y);
+
+        return y[0];
+    }
+
+    /**
+     * Convert a horizontal position from <var>window co-ordinates</var> (the
+     * on screen position) to <var>buffer co-ordinates</var> (the pixel
+     * distance into the canvas used to describe the entire text being
+     * displayed). See
+     * {@link #convertBufferToWindowCoordsY(TextWindowType, int)
+     * convertBufferToWindowCoordsY()} for a detailed discussion.
+     * 
+     * @since 4.0.9
+     */
+    public int convertWindowToBufferCoordsX(TextWindowType which, int x) {
+        int[] X;
+
+        X = new int[1];
+
+        GtkTextView.windowToBufferCoords(this, which, 0, x, null, X);
+
+        return X[0];
+    }
+
+    /**
+     * Convert a vertical position from <var>window co-ordinates</var> to
+     * <var>buffer co-ordinates</var>. See
+     * {@link #convertBufferToWindowCoordsY(TextWindowType, int)
+     * convertBufferToWindowCoordsY()} for a detailed discussion.
+     * 
+     * @since 4.0.9
+     */
+    public int convertWindowToBufferCoordsY(TextWindowType which, int y) {
+        int[] Y;
+
+        Y = new int[1];
+
+        GtkTextView.windowToBufferCoords(this, which, 0, y, null, Y);
+
+        return Y[0];
+    }
+
+    /**
+     * Get the Rectangle describing what portion of the text canvas the
+     * viewport is currently showing. This is (only) relevant when scrollbars
+     * are employed.
+     * 
+     * <p>
+     * If you consider the text being displayed as a canvas of a fixed size,
+     * but have turned on scrolling and only have a limited portion of that
+     * canvas displayed due to the Widget being sized smaller than that
+     * canvas, then the <code>x</code>,<code>y</code> co-ordinates returned in
+     * the Rectangle represent the current <i>offset</i> into that canvas that
+     * the viewport is showing.
+     * 
+     * <p>
+     * If, for example, you only have vertical scrolling enabled,
+     * 
+     * <pre>
+     * view.setWrapMode(WORD);
+     * scroll = new ScrolledWindow();
+     * scroll.setPolicy(NEVER, ALWAYS);
+     * scroll.add(view);
+     * </pre>
+     * 
+     * then you can expect <code>getVisibleRectangle()</code> to always return
+     * Rectangles with an {@link Rectangle#getX() x} offset value of
+     * <code>0</code> - the viewport is never scrolled horizontally into the
+     * text canvas.
+     * 
+     * <p>
+     * The <code>width</code> and <code>height</code> will, more or less,
+     * correspond to the size of the area of text actually being displayed in
+     * the TextView.
+     * 
+     * <p>
+     * See {@link #getLocation(TextIter) getLocation()} if you need a
+     * Rectangle enclosing a given TextIter.
+     * 
+     * @since 4.0.9
+     */
+    public Rectangle getVisibleRectangle() {
+        final Rectangle visible;
+
+        visible = new Rectangle(0, 0, 0, 0);
+
+        GtkTextView.getVisibleRect(this, visible);
+
+        return visible;
+    }
+
+    /**
+     * Get a Rectangle enclosing the screen position of the given TreeIter.
+     * This will be in <var>buffer co-ordinates</var>.
+     * 
+     * <p>
+     * This is very useful in a <code>TextBuffer.NotifyCursorPosition</code>
+     * if you need to figure out <i>where</i> the cursor is so as to handle
+     * presentation of some external control accordingly.
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * We will not name this getIterLocation() because all the other methods
+     * in the getIter... completion space are methods that return a TreeIter
+     * based on some argument.
+     */
+    public Rectangle getLocation(TextIter pointer) {
+        final Rectangle location;
+
+        location = new Rectangle(0, 0, 0, 0);
+
+        GtkTextView.getIterLocation(this, pointer, location);
+
+        return location;
+    }
+
+    /**
+     * Get the underlying resource corresponding with one of the sub elements
+     * of this TextView. See {@link TextWindowType} for a detailed discussion.
+     * 
+     * @since 4.0.9
+     */
+    public org.gnome.gdk.Window getWindow(TextWindowType which) {
+        return GtkTextView.getWindow(this, which);
+    }
+
+    /**
+     * Get a TextIter corresponding to a given location in the canvas that is
+     * displayed by the TextView. <code>X</code>,<code>Y</code> are in
+     * <var>buffer co-ordinates</var>; if you have a position into the
+     * [org.gnome.gdk] Window then use
+     * {@link #convertWindowToBufferCoordsY(TextWindowType, int)
+     * convertWindowToBufferCoordsY()} to convert.
+     * 
+     * @since 4.0.9
+     */
+    public TextIter getIterAtLocation(int X, int Y) {
+        final TextIter result;
+
+        result = new TextIter(getBuffer());
+
+        GtkTextView.getIterAtLocation(this, result, X, Y);
+
+        return result;
+    }
+
+    /**
+     * Get the y co-ordinate of the line holding the supplied position. The
+     * value is in <var>buffer co-ordinates</var>, and refers to the top of
+     * the line. If you need to know how high the line is, call
+     * {@link #getLineRange(TextIter) getLineRange()}.
+     * 
+     * <p>
+     * <b>WARNING</b><br>
+     * The co-ordinates of the start of each line height are cached are not
+     * immediately updated when the underlying TextBuffer changes; see the
+     * comment titled "<a href="#height">Line Height Calculations</a>" in the
+     * documentation for this class for discussion of when you can safely use
+     * this method.
+     * 
+     * @since 4.0.9
+     */
+    public int getLineY(TextIter position) {
+        int[] y;
+
+        y = new int[1];
+
+        GtkTextView.getLineYrange(this, position, y, null);
+
+        return y[0];
+    }
+
+    /**
+     * This is the compliment of {@link #getLineY(TextIter) getLineY()},
+     * giving you the corresponding line height that drops from the top
+     * specified by that method.
+     * 
+     * <p>
+     * <b>WARNING</b><br>
+     * Line height values are cached by are not immediately refreshed when the
+     * underlying TextBuffer changes; see the comment titled "<a
+     * href="#height">Line Height Calculations</a>" in the documentation for
+     * this class for discussion of when you can safely use this method.
+     * 
+     * @since 4.0.9
+     */
+    public int getLineRange(TextIter position) {
+        int[] range;
+
+        range = new int[1];
+
+        GtkTextView.getLineYrange(this, position, null, range);
+
+        return range[0];
+    }
+
+    /**
+     * Move the cursor (ie, the <var>insert</var> TextMark in the current
+     * source TextBuffer) so that is is showing somewhere in the section of
+     * text currently displayed in the viewport.
+     * 
+     * @since 4.0.9
+     */
+    public void placeCursorOnscreen() {
+        GtkTextView.placeCursorOnscreen(this);
+    }
+
+    /**
+     * Scroll the viewport so that <code>pointer</code> is visible. This will
+     * get the location specified onto the screen with as little scroll
+     * movement as possible. If you need finer grained control, use one of the
+     * other <code>scrollTo()</code> variants. variant.
+     * 
+     * @since 4.0.9
+     */
+    public void scrollTo(TextIter pointer) {
+        scrollTo(pointer, 0.0, 0.0, 0.0);
+    }
+
+    /**
+     * Scroll the viewport so that <code>pointer</code> is visible, attempting
+     * to fine tune the result of the scrolling. See the
+     * {@link #scrollTo(TextMark, double, double, double) scrollTo()} method
+     * taking a TextMark and the same parameters for a detailed discussion of
+     * their use.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * WARNING! The real gtk_tree_view_scroll_to_iter() function is known to
+     * be broken. See GTK bugs #102862, #311728 and perhaps many others. This
+     * implementation therefore skips calling that function and follows the
+     * suggestions of the bugs above. Obviously when GTK is fixed this
+     * behaviour should be reverted to calling the real function.
+     */
+    public void scrollTo(TextIter pointer, double withinMargin, double xalign, double yalign) {
+        TextBuffer buffer;
+        TextMark mark;
+
+        buffer = getBuffer();
+        mark = buffer.createMark(pointer, true);
+
+        scrollTo(mark, withinMargin, xalign, yalign);
+
+        buffer.deleteMark(mark);
+    }
+
+    /**
+     * Scroll the viewport so that <code>mark</code> is visible. This will
+     * have the effect of doing the minimum necessary scrolling to get the
+     * location specified by the TextMark onto the screen.
+     * 
+     * <p>
+     * See also the full {@link #scrollTo(TextMark, double, double, double)
+     * scrollTo()} which takes additional parameters which may allow you to
+     * fine tune the result of the scrolling.
+     * 
+     * @since 4.0.9
+     */
+    public void scrollTo(TextMark mark) {
+        GtkTextView.scrollToMark(this, mark, 0.0, false, 0.0, 0.0);
+    }
+
+    /**
+     * Scroll the viewport so that <code>mark</code> is visible.
+     * 
+     * <p>
+     * The GTK documentation states that the <i>the effective screen will be
+     * reduced by</i> <code>withinMargin</code>. The acceptable range is
+     * <code>0.0</code> to <code>0.5</code>. TODO It would be cool if someone
+     * could figure out what that actually means; the allowed range is clearly
+     * not a multiplier, so what is it?
+     * 
+     * <p>
+     * The alignment parameters have the same meaning as elsewhere in GTK:
+     * <code>0.0</code> for top|right, <code>1.0</code> for bottom|left.
+     * 
+     * <p>
+     * If you don't need to mess with margins or alignment, then just use the
+     * single arg {@link #scrollTo(TextMark) scrollTo()} method.
+     * 
+     * <p>
+     * <b>WARNING</b><br>
+     * <i>It turns out that much of TextView's processing is done in idle
+     * callbacks. In particular, this method only works correctly if the
+     * heights of each line have been computed and cached. Since doing so can
+     * be computationally expensive, it happens some time after text is
+     * actually inserted and thus may not be available yet. In theory the
+     * scrolling will be queued up, but you may notice odd effects.</i>
+     * 
+     * <p>
+     * This problem can crop up if you have newly populated a large amount of
+     * text into a TextView and want to force the viewport and cursor to be at
+     * the end of the text. One possible workaround: after doing the large
+     * <code>insertAtCursor()</code>, you might try the following:
+     * 
+     * <pre>
+     * start = buffer.getIterStart();
+     * buffer.placeCursor(start);
+     * </pre>
+     * 
+     * before calling
+     * 
+     * <pre>
+     * end = buffer.getIterEnd();
+     * view.scrollTo(end);
+     * </pre>
+     * 
+     * this may have the effect of causing the heights to be calculated.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * The oddities and "workaround" suggested are based on the currently weak
+     * scrolling behaviour in GtkTextView. If and when that gets cleaned up,
+     * then remove this nonsense from the documentation here.
+     */
+    public void scrollTo(TextMark mark, double withinMargin, double xalign, double yalign) {
+        if ((withinMargin < 0) || (withinMargin > 0.5)) {
+            throw new IllegalArgumentException("withinMargin must be between 0.0 and 0.5");
+        }
+        if ((xalign < 0.0) || (xalign > 1.0)) {
+            throw new IllegalArgumentException("xalign must be between 0.0 and 1.0");
+        }
+        if ((yalign < 0.0) || (yalign > 1.0)) {
+            throw new IllegalArgumentException("yalign must be between 0.0 and 1.0");
+        }
+
+        GtkTextView.scrollToMark(this, mark, withinMargin, true, xalign, yalign);
+    }
+
+    /**
+     * Signal emitted by GTK allowing you to populate MenuItems into the popup
+     * context menu displayed by a TextView (typically in response to the user
+     * right-clicking).
+     * 
+     * <p>
+     * The signal has a parameter of type Menu and populating the popup menu
+     * is done by adding items to it with Menu's <code>append()</code>, etc.
+     * After constructing your menu one <i>must</i> call
+     * <code>showAll()</code> on the Menu or your newly added MenuItems will
+     * <i>not</i> appear in the popup menu.
+     * 
+     * <p>
+     * An example:
+     * 
+     * <pre>
+     * TextView t;
+     * 
+     * t.connect(new TextView.PopulatePopup() {
+     *     public void onPopulatePopup(TextView source, Menu menu) {
+     *         menu.append(new ImageMenuItem(Stock.SAVE, new MenuItem.Activate() {
+     *             public void onActivate(MenuItem source) {
+     *                 doStuff();
+     *             }
+     *         }));
+     *         menu.showAll();
+     *     }
+     * });
+     * </pre>
+     * 
+     * @author Kenneth Prugh
+     * @since 4.0.9
+     */
+    public interface PopulatePopup extends GtkTextView.PopulatePopupSignal
+    {
+        /**
+         * Add MenuItems you wish to see in the TreeView's context menu to
+         * <code>menu</code>.
+         */
+        public void onPopulatePopup(TextView source, Menu menu);
+    }
+
+    /**
+     * Hook up a handler to receive <code>TextView.PopulatePopup</code>
+     * signals on this TextView. This will be emitted each time the user
+     * right-clicks or presses the <b><code>Menu</code></b> key, and allows
+     * you to populate the popup menu according to the current circumstances -
+     * in other words, making it a context menu.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(TextView.PopulatePopup handler) {
+        GtkTextView.connect(this, handler, false);
+    }
+
+    /**
+     * Set the padding that will be put below each paragraph of text in the
+     * TextView. The default is <code>0</code>, ie for it just to continue
+     * with normal line spacing as specified by the current font metrics.
+     * 
+     * <p>
+     * See also {@link #setPaddingAboveParagraph(int)
+     * setPaddingAboveParagraph()} and {@link #setPaddingInsideParagraph(int)
+     * setPaddingInsideParagraph()}.
+     * 
+     * <p>
+     * <i>This sets the <var>pixels-below-lines</var> property in GTK.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void setPaddingBelowParagraph(int pixels) {
+        GtkTextView.setPixelsBelowLines(this, pixels);
+    }
+
+    /**
+     * Set the padding that will be put above each paragraph of text in the
+     * TextView. The default is <code>0</code>; if you change this then the
+     * first line will be offset from the top edge of the TextView.
+     * 
+     * <p>
+     * See also {@link #setPaddingBelowParagraph(int)
+     * setPaddingBelowParagraph()} and {@link #setPaddingInsideParagraph(int)
+     * setPaddingInsideParagraph()}.
+     * 
+     * <p>
+     * <i>This sets the <var>pixels-above-lines</var> property in GTK.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void setPaddingAboveParagraph(int pixels) {
+        GtkTextView.setPixelsAboveLines(this, pixels);
+    }
+
+    /**
+     * Set the padding that will be put between each line in a paragraph if
+     * wrapping is turned on. Wrapping happens as a result of enabling
+     * {@link #setWrapMode(WrapMode) setWrapMode()} along with something
+     * acting to restrict the width allocated to the TextView (for example, by
+     * placing it in a ScrolledWindow). When wrapping occurs, then a single
+     * line of text in a TextBuffer will become a paragraph of multiple lines
+     * in the TextView displaying it.
+     * 
+     * <p>
+     * The default is <code>0</code>, ie to leave the line spacing alone. If
+     * nothing is causing lines to wrap then this setting will have no effect.
+     * 
+     * <p>
+     * See also {@link #setPaddingAboveParagraph(int)
+     * setPaddingAboveParagraph()} and {@link #setPaddingBelowParagraph(int)
+     * setPaddingBelowParagraph()} for the spacing before and after each
+     * paragraph (wrapped or not).
+     * 
+     * <p>
+     * <i>This sets the <var>pixels-inside-wrap</var> property in GTK.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void setPaddingInsideParagraph(int pixels) {
+        GtkTextView.setPixelsInsideWrap(this, pixels);
+    }
+
+    /**
+     * Set the behaviour when the <b><code>Tab</code></b> key is pressed. The
+     * default is <code>true</code>, that a <code>'\t'</code> character will
+     * be inserted into the underlying TextBuffer. If you would rather that
+     * <b><code>Tab</code></b> causes the focus to change to the next Widget
+     * rather than inserting a tab, then set this to <code>false</code>.
+     * 
+     * @since 4.0.9
+     */
+    public void setAcceptsTab(boolean setting) {
+        GtkTextView.setAcceptsTab(this, setting);
+    }
+
+    /**
+     * Set the padding to appear on the left side of the text. The default is
+     * <code>0</code>.
+     * 
+     * <p>
+     * <i>This sets the <var>left-margin</var> property in GTK.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void setMarginLeft(int pixels) {
+        if (pixels < 0) {
+            throw new IllegalArgumentException("Margin must be >= 0 pixels");
+        }
+        GtkTextView.setLeftMargin(this, pixels);
+    }
+
+    /**
+     * Set the padding to appear on the right side of the text. The default is
+     * <code>0</code>.
+     * 
+     * <p>
+     * <i>This sets the <var>right-margin</var> property in GTK.</i>
+     * 
+     * @since 4.0.9
+     */
+    public void setMarginRight(int pixels) {
+        if (pixels < 0) {
+            throw new IllegalArgumentException("Margin must be >= 0 pixels");
+        }
+        GtkTextView.setRightMargin(this, pixels);
+    }
+
+    /**
+     * Create and attach a {@link Spell} object to the view to add
+     * spellchecking capability.
+     * 
+     * <p>
+     * The language is chosen based on the value of <code>LANG</code>
+     * environment variable.
+     * 
+     * @since 4.0.12
+     */
+    public void attachSpell() {
+        if (spell == null) {
+            spell = new Spell(this, null);
+        } else {
+            throw new IllegalStateException("Sorry, you've already attached a Spell to this TextView");
+        }
+    }
+
+    /**
+     * Create and attach a {@link Spell} object to the view to add
+     * spellchecking capability in the given language.
+     * 
+     * <p>
+     * You're probably just as well to call {@link #attachSpell()
+     * attachSpell()} and accept the default.
+     * 
+     * @since 4.0.12
+     */
+    public void attachSpell(String lang) {
+        if (spell == null) {
+            spell = new Spell(this, lang);
+        } else {
+            throw new IllegalStateException("Sorry, you've already attached a Spell to this TextView");
+        }
+    }
+
+    /**
+     * Get the Spell helper object attached to the view.
+     * 
+     * <p>
+     * Reasons you might need to use this are if you have to programatically
+     * change the language being used to spell check against with Spell's
+     * {@link Spell#setLanguage(String) setLanguage()}, or to force the
+     * checker to run again with its {@link Spell#recheckAll() recheckAll()}.
+     * You probably won't ever need either.
+     * 
+     * <p>
+     * Obviously there isn't much point in asking for the Spell helper object
+     * if you haven't called {@link #attachSpell() attachSpell()} to create
+     * one yet.
+     * 
+     * @since 4.0.12
+     */
+    public Spell getSpell() {
+        if (spell == null) {
+            throw new IllegalStateException("You haven't attached a Spell to this TextView yet.");
+        }
+        return spell;
+    }
+
+    /**
+     * Tell this TextView to adopt the given justification. This is probably
+     * what you think of as "alignment".
+     * 
+     * @since 4.0.14
+     */
+    /*
+     * Method name adjusted to match Label's setJustify().
+     */
+    public void setJustify(Justification setting) {
+        GtkTextView.setJustification(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TextWindowType.java b/src/bindings/org/gnome/gtk/TextWindowType.java
new file mode 100644
index 0000000..0e73688
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TextWindowType.java
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Each TextView is actually composed from a number of underlying
+ * [org.gnome.gdk] Windows. In addition to the core one where the text entry
+ * happens, there are a number of optional Windows which can be used as side
+ * panels. This class specifies constants identifying these underlying
+ * resources.
+ * 
+ * <p>
+ * The {@link #TEXT TEXT} Window is where most of the work happens; use
+ * Textview's {@link TextView#getWindow(TextWindowType) getWindow(TEXT)}
+ * rather than Widget's <code>getWindow()</code> and can be used if you need
+ * to work out relative positioning.
+ * 
+ * <p>
+ * On the other hand there are border windows, specified by <code>LEFT</code>,
+ * <code>TOP</code>, etc. <b>These border Windows are an obscure, advanced,
+ * and not wholly functional feature of GTK.</b> The accompanying illustration
+ * is a TextView with each border window specified to a width of 50 pixels and
+ * a Label placed at <i>window co-ordinates</i> <code>0</code>,<code>0</code>
+ * in each one. <img class="snapshot" src="TextView-BorderWindows.png">
+ * 
+ * Code to create this snapshot consisted of a series of calls like:
+ * 
+ * <pre>
+ * left = new Label("LEFT");
+ * view.setBorderWindowSize(TextWindowType.LEFT, 50);
+ * view.add(left, TextWindowType.LEFT, 0, 0);
+ * </pre>
+ * 
+ * one for each side. Note the positions and relative sizes of the scrollbars
+ * added by the ScrolledWindow into which the TextView was placed. As you can
+ * see, only the left border window one makes very much sense, as it could be
+ * used for things like breakpoint annotations in a programming editor.
+ * 
+ * <p>
+ * <b>WARNING</b><br>
+ * <i style="color:red">By all accounts, this feature is still evolving in
+ * GTK; it is entirely possible that it was not completely implemented in the
+ * first place, and in any case the interface for using it seems ... unsteady.
+ * We have included this in java-gnome largely because we had already gone to
+ * all the work of exposing it only to discover that it is exceedingly hard to
+ * use and somewhat buggy. Hopefully GTK will improve, but if you use this,
+ * expect the behaviour to be somewhat unpredictable.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public final class TextWindowType extends Constant
+{
+    private TextWindowType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * The optional border Window on the left hand side of a TextView. This is
+     * the interesting one, as you can use it to place annotations relating to
+     * the line of text being shown in the TextView beside it. Tying this to
+     * scrolling (if enabled) is <b>very</b> tricky, though. See FIXME for an
+     * example.
+     * 
+     * @since 4.0.9
+     */
+    public static TextWindowType LEFT = new TextWindowType(GtkTextWindowType.LEFT, "LEFT");
+
+    /**
+     * The optional border Window on the left hand side of a TextView.
+     * 
+     * @since 4.0.9
+     */
+    public static TextWindowType RIGHT = new TextWindowType(GtkTextWindowType.RIGHT, "RIGHT");
+
+    /**
+     * The optional border Window above a TextView.
+     * 
+     * @since 4.0.9
+     */
+    public static TextWindowType TOP = new TextWindowType(GtkTextWindowType.TOP, "TOP");
+
+    /**
+     * The optional border Window below a TextView.
+     * 
+     * @since 4.0.9
+     */
+    public static TextWindowType BOTTOM = new TextWindowType(GtkTextWindowType.BOTTOM, "BOTTOM");
+
+    /**
+     * The main part of the TextView which displays the text to the user. This
+     * is, quite likely, the only Window you will need to get at.
+     * 
+     * @since 4.0.9
+     */
+    public static TextWindowType TEXT = new TextWindowType(GtkTextWindowType.TEXT, "TEXT");
+
+    /*
+     * Do we need PRIVATE or WIDGET?
+     */
+}
diff --git a/src/bindings/org/gnome/gtk/ToggleAction.java b/src/bindings/org/gnome/gtk/ToggleAction.java
new file mode 100644
index 0000000..399bc85
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToggleAction.java
@@ -0,0 +1,224 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A <code>ToggleAction</code> is an equivalent of a {@link Action} but used
+ * in general to create {@link CheckMenuItem}. It has an "active"
+ * state which indicates whether the action has been checked or not.
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.15
+ */
+public class ToggleAction extends Action
+{
+    protected ToggleAction(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new ToggleAction, and connect a handler to its
+     * <code>ToggleAction.Toggled</code> signal.
+     * 
+     * @param name
+     *            A unique name for the ToggleAction.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the ToggleAction. Also
+     *            localized.
+     * @param stock
+     *            The stock icon to display in proxy Widgets.
+     * @param handler
+     *            A handler to connect to the
+     *            <code>ToggleAction.Toggled</code> signal. Typically this
+     *            will be used to actually start the operation related to this
+     *            ToggleAction.
+     * @since 4.0.15
+     */
+    /*
+     * FIXME describe the implications of different choices for name.
+     */
+    public ToggleAction(String name, String label, String tooltip, Stock stock,
+            ToggleAction.Toggled handler) {
+        super(GtkToggleAction.createToggleAction(name, label, tooltip, stock.getStockId()));
+        connect(handler);
+    }
+
+    /**
+     * Create a new ToggleAction.
+     * 
+     * @param name
+     *            A unique name for the ToggleAction.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param tooltip
+     *            A Tooltip or little help message for the ToggleAction. Also
+     *            localized.
+     * @param stock
+     *            The Stock icon to display in proxy Widgets.
+     * @since 4.0.15
+     */
+    public ToggleAction(String name, String label, String tooltip, Stock stock) {
+        super(GtkToggleAction.createToggleAction(name, label, tooltip, stock.getStockId()));
+    }
+
+    /**
+     * Create a new ToggleAction from a Stock item. The message and tooltip
+     * will be supplied by GTK automatically.
+     * 
+     * @since 4.0.15
+     */
+    public ToggleAction(String name, Stock stock) {
+        super(GtkToggleAction.createToggleAction(name, null, null, stock.getStockId()));
+    }
+
+    /**
+     * Create a new ToggleAction based on a Stock item, and connect a handler
+     * to its <code>ToggleAction.Toggled</code> signal. Complements the
+     * {@link #ToggleAction(String, Stock) <init>(String, Stock)}
+     * constructor.
+     * 
+     * @since 4.0.15
+     */
+    public ToggleAction(String name, Stock stock, ToggleAction.Toggled handler) {
+        super(GtkToggleAction.createToggleAction(name, null, null, stock.getStockId()));
+        connect(handler);
+    }
+
+    /**
+     * Create a new ToggleAction, and connect a handler to its
+     * <code>ToggleAction.Toggled</code> signal.
+     * 
+     * @param name
+     *            A unique name for the ToggleAction.
+     * @param label
+     *            The label that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @param handler
+     *            A handler to connect to the
+     *            <code>ToggleAction.Toggled</code> signal. Usually will will
+     *            start from here the operation related to the Action.
+     * @since 4.0.15
+     */
+    public ToggleAction(String name, String label, ToggleAction.Toggled handler) {
+        super(GtkToggleAction.createToggleAction(name, label, null, null));
+        connect(handler);
+    }
+
+    /**
+     * Create a new ToggleAction.
+     * 
+     * @param name
+     *            A unique name for the ToggleAction.
+     * @param label
+     *            The text that will be displayed in the proxy Widgets. You
+     *            usually will want to localize it to the user language.
+     * @since 4.0.15
+     */
+    public ToggleAction(String name, String label) {
+        super(GtkToggleAction.createToggleAction(name, label, null, null));
+    }
+
+    /**
+     * Emit the <code>ToggleAction.Toggled</code> signal.
+     * 
+     * @since 4.0.19
+     */
+    public void emitToggled() {
+        GtkToggleAction.toggled(this);
+    }
+
+    /**
+     * Set the checked state of the <code>ToggleAction</code>.
+     * 
+     * @since 4.0.15
+     */
+    public void setActive(boolean setting) {
+        GtkToggleAction.setActive(this, setting);
+    }
+
+    /**
+     * Return the checked state of the <code>ToggleAction</code>.
+     * 
+     * @since 4.0.15
+     */
+    public boolean getActive() {
+        return GtkToggleAction.getActive(this);
+    }
+
+    /**
+     * Set whether the action may have proxies like a {@link RadioAction}.
+     * 
+     * @since 4.0.15
+     */
+    public void setDrawAsRadio(boolean setting) {
+        GtkToggleAction.setDrawAsRadio(this, setting);
+    }
+
+    /**
+     * Return whether the action may have proxies like a {@link RadioAction}.
+     * 
+     * @since 4.0.15
+     */
+    public boolean getDrawAsRadio() {
+        return GtkToggleAction.getDrawAsRadio(this);
+    }
+
+    /**
+     * Signal emitted when the <code>ToggleAction</code> is toggled
+     * 
+     * <p>
+     * A <code>ToggleAction</code> is activated when the user clicks a
+     * ToolButton proxy, when (s)he activates an associated MenuItem or when
+     * {@link ToggleAction#toggled() toggled()} is called.
+     * 
+     * @author Guillaume Mazoyer
+     * @since 4.0.15
+     */
+    public interface Toggled extends GtkToggleAction.ToggledSignal
+    {
+        public void onToggled(ToggleAction source);
+    }
+
+    /**
+     * Connect a handler to the <code>ToggleAction.Toggled</code> signal.
+     * 
+     * @since 4.0.15
+     */
+    public void connect(ToggleAction.Toggled handler) {
+        GtkToggleAction.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToggleButton.java b/src/bindings/org/gnome/gtk/ToggleButton.java
new file mode 100644
index 0000000..9a8c8d0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToggleButton.java
@@ -0,0 +1,110 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A ToggleButton is a Button which retains its state.
+ * 
+ * @author Sebastian Mancke
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public class ToggleButton extends Button
+{
+    protected ToggleButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Constructs a new ToggleButton
+     * 
+     * @since 4.0.3
+     */
+    public ToggleButton() {
+        super(GtkToggleButton.createToggleButton());
+    }
+
+    /**
+     * Constructs a new ToggleButton with a label.
+     * 
+     * <p>
+     * The label may contain underscores (<code>_<code>) to indicate
+     * the mnemonic for the Button.
+     * 
+     * @since 4.0.3
+     */
+    public ToggleButton(String label) {
+        super(GtkToggleButton.createToggleButtonWithMnemonic(label));
+    }
+
+    /**
+     * Set the state of the ToggleButon.
+     * 
+     * @param active
+     *            The new state of the ToggleButton
+     * @since 4.0.3
+     */
+    public void setActive(boolean active) {
+        GtkToggleButton.setActive(this, active);
+    }
+
+    /**
+     * Returns the current state of the ToggleButton
+     * 
+     * @return returns <code>true</code> if the ToggleButton is pressed,
+     *         <code>false</code> otherwise.
+     * @since 4.0.3
+     */
+    public boolean getActive() {
+        return GtkToggleButton.getActive(this);
+    }
+
+    /**
+     * Signal indicating the Button has changed state.
+     * 
+     * @since 4.0.3
+     */
+    public interface Toggled extends GtkToggleButton.ToggledSignal
+    {
+        public void onToggled(ToggleButton source);
+    }
+
+    /**
+     * Hook up a <code>ToggleButton.Toggled</code> signal handler.
+     * 
+     * @since 4.0.3
+     */
+    public void connect(ToggleButton.Toggled handler) {
+        GtkToggleButton.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToggleToolButton.java b/src/bindings/org/gnome/gtk/ToggleToolButton.java
new file mode 100644
index 0000000..7919d83
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToggleToolButton.java
@@ -0,0 +1,125 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A ToggleToolButton is a ToolButton that retains its state.
+ * 
+ * <p>
+ * The usual usage of such kind of ToolButtons is to let users enable or
+ * disable an application feature.
+ * 
+ * <p>
+ * You can check the current state of the ToggleToolButton using the
+ * {@link #getActive()} method. Additionally you can connect to the
+ * {@link ToggleToolButton.TOGGLED TOGGLED} signal to respond to changes in
+ * the <var>active</var> state.
+ * 
+ * <p>
+ * Beware that ToogleToolButtons have sometimes fared poorly in usability
+ * tests. The problem is that they are an exception: most ToolItems are
+ * ToolButtons, and most of them you just press and something immediately
+ * happens. Since there is no visual distinction between a ToolButton and an
+ * inactive ToggleToolButton, users don't expect that this particular ToolItem
+ * is going to behave differently and maintain its state. It's not a huge
+ * problem (ie, if the user is paying attention they'll soon find out that the
+ * button is a toggle), but it's something that usually takes a few iterations
+ * before the user learns. Something to keep in mind.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class ToggleToolButton extends ToolButton
+{
+    protected ToggleToolButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new ToggleToolButton.
+     * 
+     * @since 4.0.4
+     */
+    public ToggleToolButton() {
+        super(GtkToggleToolButton.createToggleToolButton());
+    }
+
+    /**
+     * Create a new ToggleToolButton based on one of the stock items.
+     * 
+     * @since 4.0.4
+     */
+    public ToggleToolButton(Stock stock) {
+        super(GtkToggleToolButton.createToggleToolButtonFromStock(stock.getStockId()));
+    }
+
+    /**
+     * Set whether this ToggleToolButton is active, that is, whether it
+     * appears pressed or not. Calling this will emit a <code>TOGGLED</code>
+     * signal.
+     * 
+     * @since 4.0.4
+     */
+    public void setActive(boolean isActive) {
+        GtkToggleToolButton.setActive(this, isActive);
+    }
+
+    /**
+     * Is the ToggleToolButton currently activated on?
+     * 
+     * @since 4.0.4
+     */
+    public boolean getActive() {
+        return GtkToggleToolButton.getActive(this);
+    }
+
+    /**
+     * Signal indicating the ToggleToolButton state has changed.
+     * 
+     * @since 4.0.4
+     */
+    public interface Toggled extends GtkToggleToolButton.ToggledSignal
+    {
+        public void onToggled(ToggleToolButton source);
+    }
+
+    /**
+     * Connect a handler to the <code>ToggleToolButton.Toggled</code> signal.
+     * 
+     * @since 4.0.4
+     */
+    public void connect(ToggleToolButton.Toggled handler) {
+        GtkToggleToolButton.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolButton.java b/src/bindings/org/gnome/gtk/ToolButton.java
new file mode 100644
index 0000000..d6d4d77
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolButton.java
@@ -0,0 +1,175 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A ToolButton is a ToolItem that displays as a graphical Button.
+ * 
+ * <p>
+ * This is the item you will want to add in most cases to your application
+ * Toolbar(s). It is a acts a like a normal Button, but its appearance is
+ * designed to look better on a Toolbar.
+ * 
+ * <p>
+ * A ToolButton has an image or icon and a Label. The user Toolbar preferences
+ * determine whether the Label is actually shown on screen. Even if you
+ * disable the Label in your desktop preferences, you should provide a valid
+ * Label to your application ToolButtons, as other users will have them
+ * showing and your program will look a bit silly without textual labels.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+public class ToolButton extends ToolItem
+{
+    protected ToolButton(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new ToolButton using the given icon and Label.
+     * 
+     * @param iconWidget
+     *            The Widget to be used as the icon for the ToolButton.
+     *            Usually you will want to use a Widget that displays a
+     *            graphic, such as {@link Image}.
+     * @param label
+     *            The Label for the ToolButton.
+     */
+    public ToolButton(Widget iconWidget, String label) {
+        super(GtkToolButton.createToolButton(iconWidget, label));
+    }
+
+    /**
+     * Creates a new stock ToolButton. Both the Label and icon will be set
+     * properly from the stock item. By using a system stock item, the newly
+     * created ToolButton with use the same Label and Image as other GNOME
+     * applications. To ensure consistent look and feel between applications,
+     * it is highly recommended that you use provided stock item based
+     * ToolButtons whenever possible.
+     * 
+     * @param stock
+     *            The Stock that will determine the Label and icon on the
+     *            ToolButton.
+     */
+    public ToolButton(Stock stock) {
+        super(GtkToolButton.createToolButtonFromStock(stock.getStockId()));
+    }
+
+    /**
+     * Set the Label of the Button.
+     * 
+     * <p>
+     * Note that any value of the Label set by this method won't be actually
+     * displayed if you have set a Widget Label using
+     * {@link #setLabelWidget(Widget) setLabelWidget()}
+     * 
+     * @param label
+     *            The String to be used as Label, or <code>null</code>.
+     */
+    /*
+     * FIXME null labels not yet supported; see 'null-ok' branch.
+     */
+    public void setLabel(String label) {
+        GtkToolButton.setLabel(this, label);
+    }
+
+    /**
+     * Get the text Label previously set with {@link #setLabel(String)
+     * setLabel()}.
+     * 
+     * @return The Label or <code>null</code> if not Label has been set. Note
+     *         that a <code>null</code> return value doesn't mean that the
+     *         ToolButton doesn't have a Label, as it can have a Widget Label
+     *         or a Label taken from a stock item.
+     */
+    public String getLabel() {
+        return GtkToolButton.getLabel(this);
+    }
+
+    /**
+     * Set the Widget to be used as the "label" for this ToolButton.
+     * 
+     * <p>
+     * Please check {@link #setLabel(String) setLabel()} before using this,
+     * because in most cases that is what you want.
+     * 
+     * <p>
+     * Usually ToolButtons have either a text Label set with
+     * <code>setLabel()</code>, or text automatically determined by a stock
+     * item. However, in some cases you will want to provide another kind of
+     * Widget as the label, and this method is how.
+     * 
+     * @param labelWidget
+     *            A Widget to be used as a Label, or <code>null</code> to not
+     *            use the Widget Label (in this case, the text Label will be
+     *            used. If the text Label is also <code>null</code>, the
+     *            default stock item label is used. In this later case, if
+     *            this ToolButton has no stock item, then no Label will be
+     *            used at all). Note that if you <i>do</i> pass a non-
+     *            <code>null</code> Widget here, this argument will be used as
+     *            the label despite the text in the normal Label or one
+     *            generated as a result of using a stock item.
+     */
+    public void setLabelWidget(Widget labelWidget) {
+        GtkToolButton.setLabelWidget(this, labelWidget);
+    }
+
+    /**
+     * Get the Widget used as "label", if any.
+     * 
+     * @return The Widget used as label, or <code>null</code> if this
+     *         ToolButton doesn't have a Widget overriding its label.
+     * 
+     * @see #setLabelWidget(Widget)
+     */
+    public Widget getLabelWidget() {
+        return GtkToolButton.getLabelWidget(this);
+    }
+
+    /**
+     * Signal generated when a user presses and releases a ToolButton, causing
+     * it to activate.
+     */
+    public interface Clicked extends GtkToolButton.ClickedSignal
+    {
+        public void onClicked(ToolButton source);
+    }
+
+    /**
+     * Connect a handler to the <code>ToolButton.Clicked</code> signal.
+     */
+    public void connect(ToolButton.Clicked handler) {
+        GtkToolButton.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolItem.java b/src/bindings/org/gnome/gtk/ToolItem.java
new file mode 100644
index 0000000..03bbb43
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolItem.java
@@ -0,0 +1,100 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * ToolItems are the items that can be added to a {@link Toolbar}.
+ * 
+ * <p>
+ * Usually you will prefer to use a subtype of this class, such as
+ * {@link ToolButton}, in your Toolbars. However, if you want to add another
+ * kind of Widget, you have to create a new ToolItem and {@link #add(Widget)
+ * add()} the desired Widget to it.
+ * 
+ * @see Toolbar
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+public class ToolItem extends Bin implements Activatable
+{
+    protected ToolItem(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new ToolItem.
+     */
+    public ToolItem() {
+        super(GtkToolItem.createToolItem());
+    }
+
+    /**
+     * Set whether this ToolItem will be expanded when there is available
+     * space on the Toolbar.
+     */
+    public void setExpand(boolean expand) {
+        GtkToolItem.setExpand(this, expand);
+    }
+
+    /**
+     * Get if this ToolItem will be [is] expanded in the presence of extra
+     * available space on the Toolbar.
+     */
+    public boolean getExpand() {
+        return GtkToolItem.getExpand(this);
+    }
+
+    public void setRelatedAction(Action action) {
+        GtkActivatable.setRelatedAction(this, action);
+    }
+
+    public Action getRelatedAction() {
+        return GtkActivatable.getRelatedAction(this);
+    }
+
+    /**
+     * Indicate that this ToolItem is to be considered to have
+     * "priority text". When the ToolbarStyle is
+     * {@link ToolbarStyle#BOTH_HORIZ BOTH_HORIZ} (which is the default in
+     * GNOME these days) only ToolItems with this property set will have their
+     * labels showing. For example, browsers often have the label "Back" but
+     * not "Forward" or "Up" marked important and thus showing.
+     * 
+     * @since 4.0.19
+     */
+    public void setIsImportant(boolean setting) {
+        GtkToolItem.setIsImportant(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolItemGroup.java b/src/bindings/org/gnome/gtk/ToolItemGroup.java
new file mode 100644
index 0000000..d553f95
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolItemGroup.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ToolItemGroup extends Container
+{
+    protected ToolItemGroup(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolPalette.java b/src/bindings/org/gnome/gtk/ToolPalette.java
new file mode 100644
index 0000000..768f140
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolPalette.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ToolPalette extends Container
+{
+    protected ToolPalette(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolPaletteDragTargets.java b/src/bindings/org/gnome/gtk/ToolPaletteDragTargets.java
new file mode 100644
index 0000000..dcd09d1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolPaletteDragTargets.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class ToolPaletteDragTargets extends Constant
+{
+    protected ToolPaletteDragTargets(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Toolbar.java b/src/bindings/org/gnome/gtk/Toolbar.java
new file mode 100644
index 0000000..65301f5
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Toolbar.java
@@ -0,0 +1,147 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007-2009 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Toolbar is a broad horizontal bar with several controls (usually largish
+ * graphical buttons) intended to provide a fast and convenient access to
+ * operations commonly used in an application.
+ * 
+ * <p>
+ * In most cases, you will want to add some {@link ToolButton}s to the
+ * Toolbar, but you can also add other elements as well by creating a
+ * {@link ToolItem} and adding your own customized elements to it.
+ * 
+ * <p>
+ * You can also group related items together by using a
+ * {@link SeparatorToolItem} to the Toolbar to create a separation between
+ * them. Don't overdo that, however - too many separators result in a
+ * cluttered appearance.
+ * 
+ * <p>
+ * Note that the actual on screen appearance of the Toolbar is governed by the
+ * user's theme and how they have configured Toolbars to appear. The choices
+ * of "<var>Text below Icons</var>" (the usual default), "<var>Text beside
+ * Icons</var>", "<var>Icons only</var>", and "<var>Text only</var>" are
+ * available from the GNOME panel menu at <b>System <code>></code> Menus
+ * & Toolbars</b> which runs the <code>gnome-ui-properties</code> program.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.4
+ */
+public class Toolbar extends Container implements Orientable
+{
+    protected Toolbar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new, empty, Toolbar.
+     */
+    public Toolbar() {
+        super(GtkToolbar.createToolbar());
+    }
+
+    public void add(Widget w) {
+        if (!(w instanceof ToolItem)) {
+            throw new IllegalArgumentException("You can only add ToolItems to a Toolbar");
+        }
+        GtkToolbar.insert(this, (ToolItem) w, -1);
+    }
+
+    /**
+     * Insert a ToolItem in the Toolbar at a given position.
+     * 
+     * @param item
+     *            The new item to add to the Toolbar.
+     * @param pos
+     *            The position where the new item will be inserted. You can
+     *            use <code>0</code> to prepend the item at the beginning of
+     *            the Toolbar, or a negative value to append the item at the
+     *            end.
+     */
+    public void insert(ToolItem item, int pos) {
+        GtkToolbar.insert(this, item, pos);
+    }
+
+    /**
+     * Sets the orientation of the Toolbar on screen.
+     * 
+     * <p>
+     * Horizontal Toolbars are commonly used. Usually you shouldn't use a
+     * vertical Toolbar it is more difficult to search for the user to find a
+     * specific control. When your application has several Toolbars, however,
+     * a vertical orientation can become useful as a technique to make a
+     * better usage of the available screen real estate.
+     * 
+     * @since 4.1.1
+     */
+    public void setOrientation(Orientation orientation) {
+        GtkOrientable.setOrientation(this, orientation);
+    }
+
+    public Orientation getOrientation() {
+        return GtkOrientable.getOrientation(this);
+    }
+
+    /**
+     * Set the appearance of a Toolbar.
+     * 
+     * <p>
+     * Toolbars buttons can be customized to display either an icon, a text
+     * label, or both. As explained above, in the documentation for this
+     * class, the appearance of Toolbars is configured by the user as a
+     * desktop setting. This method will override those settings, so in most
+     * cases <b>you should not use this method</b>, and just let the user
+     * choose the appearance (s)he prefers.
+     * 
+     * <p>
+     * However, some really complex applications might need several Toolbars
+     * and many buttons on each one, so configuring a compact Toolbar style
+     * can help to save screen space. In such cases this method may be useful,
+     * but the general advice is to use this with care, and avoid overriding
+     * of user settings unless you have a strong reason.
+     * 
+     * <p>
+     * Finally, note that if you choose for example an <code>ICONS</code> only
+     * appearance, and a given ToolButton has no icon, its Label will be shown
+     * instead, so GTK engine will do its best to keep Toolbar usable.
+     * 
+     * @since 4.0.12
+     */
+    public void setStyle(ToolbarStyle style) {
+        GtkToolbar.setStyle(this, style);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolbarSpaceStyle.java b/src/bindings/org/gnome/gtk/ToolbarSpaceStyle.java
new file mode 100644
index 0000000..4aea69b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolbarSpaceStyle.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class ToolbarSpaceStyle extends Constant
+{
+    private ToolbarSpaceStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/ToolbarStyle.java b/src/bindings/org/gnome/gtk/ToolbarStyle.java
new file mode 100644
index 0000000..69a6f05
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/ToolbarStyle.java
@@ -0,0 +1,73 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants that can be used to customize the look-and-feel of a Toolbar, by
+ * calling its {@link Toolbar#setStyle(ToolbarStyle) setStyle()} method.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.12
+ */
+public final class ToolbarStyle extends Constant
+{
+    private ToolbarStyle(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Toolbar buttons will only display an icon.
+     */
+    public static ToolbarStyle ICONS = new ToolbarStyle(GtkToolbarStyle.ICONS, "ICONS");
+
+    /**
+     * Toolbar buttons will only display a text label.
+     */
+    public static ToolbarStyle TEXT = new ToolbarStyle(GtkToolbarStyle.TEXT, "TEXT");
+
+    /**
+     * Toolbar buttons will display both an icon and text label. The text will
+     * appear below the icon.
+     */
+    public static ToolbarStyle BOTH = new ToolbarStyle(GtkToolbarStyle.BOTH, "BOTH");
+
+    /**
+     * Toolbar buttons will display both an icon and text label. The text will
+     * appear alongside the icon. This has been the default in GNOME since
+     * about 2009.
+     */
+    public static ToolbarStyle BOTH_HORIZ = new ToolbarStyle(GtkToolbarStyle.BOTH_HORIZ, "BOTH_HORIZ");
+}
diff --git a/src/bindings/org/gnome/gtk/Tooltip.java b/src/bindings/org/gnome/gtk/Tooltip.java
new file mode 100644
index 0000000..f951041
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Tooltip.java
@@ -0,0 +1,146 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.Object;
+
+/**
+ * Displaying a tooltip when a user hovers the mouse over the widget or when
+ * the widget receives notification the cursor is at it when in keyboard mode.
+ * 
+ * <p>
+ * By default you can set text to show as a tooltip by using
+ * {@link Widget#setTooltipText(java.lang.String) } and
+ * {@link Widget#setTooltipMarkup(java.lang.String) } . However that is for
+ * basic text and only text. If you want more then that you can hookup your
+ * own tooltip query handler which in turn will provide an object of this
+ * class for you to use.
+ * 
+ * <p>
+ * In order to get an object of this class you first have to connect a
+ * queryTooltip Handler.
+ * 
+ * <pre>
+ * // any widget will do
+ * widget = new Button();
+ * widget.connect(new Widget.queryTooltip() {
+ *     @Override
+ *     public boolean onQueryTooltip(Widget source, int x, int y, boolean keyboardMode, Tooltip tooltip) {
+ *         // setup your tooltip.
+ *     }
+ * });
+ * </pre>
+ * 
+ * <p>
+ * Inside the method you can create your tooltip. You also receive the X and Y
+ * values at which you can determine whether to show the tooltip or not. Which
+ * is needed for example a TreeView which has a method to help you with. See
+ * {@link TreeView#hasTooltipContext(int, int, boolean) } for more information
+ * on how a TreeView handles tooltips.
+ * 
+ * <p>
+ * KeyboardMode indicates that the application is run by only the keyboard and
+ * no mouse.
+ * 
+ * <p>
+ * When you want to show your tooltip return true, otherwise false.
+ * 
+ * <p>
+ * There are two modes of displaying your tooltip contents. The first is the
+ * basic Icon and String. You can set this up in anyway you want. Please do
+ * note that both are on the same line and that the icon will always be on the
+ * left.
+ * 
+ * <p>
+ * If you want something more fancy or display more information you set any
+ * widget to show. Suggested is a container of course. Where you have full
+ * freedom to place all your tooltip contents.
+ * 
+ * @author Sarah Leibbrand
+ * @since 4.1.3
+ */
+public class Tooltip extends Object
+{
+    protected Tooltip(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * The text to display in the tooltip.
+     * 
+     * @since 4.1.3
+     */
+    public void setText(String text) {
+        GtkTooltip.setText(this, text);
+    }
+
+    /**
+     * The text in pango markup to display in the tooltip.
+     * 
+     * @since 4.1.3
+     */
+    public void setMarkup(String markup) {
+        GtkTooltip.setMarkup(this, markup);
+    }
+
+    /**
+     * The icon to display in your tooltip.
+     * 
+     * @since 4.1.3
+     */
+    public void setIcon(Pixbuf icon) {
+        GtkTooltip.setIcon(this, icon);
+    }
+
+    /**
+     * The stock icon with the requested size to display in the tooltip.
+     * 
+     * @since 4.1.3
+     */
+    public void setStockIcon(Stock stock, IconSize size) {
+        GtkTooltip.setIcon(this, stock.getStockId(), size);
+    }
+
+    /**
+     * The widget to display in the tooltip.
+     * 
+     * This can be any widget but containers such as {@link Grid} are
+     * recommended.
+     * 
+     * @since 4.1.3
+     */
+    public void setCustomWidget(Widget widget) {
+        GtkTooltip.setCustom(this, widget);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeDragDest.java b/src/bindings/org/gnome/gtk/TreeDragDest.java
new file mode 100644
index 0000000..ae086bc
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeDragDest.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface TreeDragDest
+{
+}
diff --git a/src/bindings/org/gnome/gtk/TreeDragSource.java b/src/bindings/org/gnome/gtk/TreeDragSource.java
new file mode 100644
index 0000000..0927c9b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeDragSource.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface TreeDragSource
+{
+}
diff --git a/src/bindings/org/gnome/gtk/TreeIter.java b/src/bindings/org/gnome/gtk/TreeIter.java
new file mode 100644
index 0000000..e730a07
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeIter.java
@@ -0,0 +1,149 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * A temporary pointer to a row in a TreeModel. TreeIters are used to indicate
+ * a row in a TreeModel, either the "current" row if you are iterating over
+ * the data, or as an indication of which row a given event occurred on.
+ * 
+ * <p>
+ * To obtain a new TreeIter, use one of the following:
+ * <ul>
+ * <li>ListStore's {@link ListStore#appendRow() appendRow()} (to add a new
+ * record to the end of the data set in the model);
+ * <li>TreeModel's {@link TreeModel#getIterFirst() getIterFirst()} (to start
+ * iterating through the rows in the model); or
+ * <li>TreeSelection's {@link TreeSelection#getSelected() getSelected()}
+ * (allowing you to identify the selected row and subsequently read data from
+ * it, usually with TreeModel's
+ * {@link TreeModel#getValue(TreeIter, DataColumnReference) getValue()}.
+ * </ul>
+ * 
+ * <p>
+ * Like other iterators in Java, a TreeIter becomes invalid the moment the
+ * underlying model changes. If you need a persistent pointer to a particular
+ * row, create a {@link TreeRowReference TreeRowReference}.
+ * 
+ * <p>
+ * <i>Note that although one use case for TreeIter is to iterate through all
+ * the rows in a model, more often they are used to point to a single row (the
+ * one you are presently adding data to, or the one that was selected by the
+ * user); these aren't <code>java.util.Iterator</code>s.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ */
+public final class TreeIter extends Boxed
+{
+    private TreeModel model;
+
+    /*
+     * Standard no-arg constructor. In general, our TreeIters are instantiated
+     * by us, and so the model is set. If this constructor is used (ie by a
+     * signal handler delegate), then, you will need to call setModel() as
+     * well.
+     */
+    protected TreeIter(long pointer) {
+        super(pointer);
+
+        model = null;
+    }
+
+    /**
+     * Allocate a blank TreeIter structure. This is done by declaring one
+     * locally, copying it, and returning the pointer to the copy.
+     * 
+     * <p>
+     * <b>For use by bindings hackers only!</b>
+     */
+    TreeIter(TreeModel model) {
+        super(GtkTreeIterOverride.createTreeIter());
+
+        this.model = model;
+    }
+
+    void setModel(TreeModel model) {
+        this.model = model;
+    }
+
+    TreeModel getModel() {
+        if (model == null) {
+            throw new IllegalStateException(
+                    "\nSorry, this TreeIter doesn't have its internal reference to its parent TreeModel set");
+        }
+        return model;
+    }
+
+    protected void release() {
+        model = null;
+        GtkTreeIter.free(this);
+    }
+
+    /**
+     * Change this TreeIter to point to the row following the current one. In
+     * a ListStore, this is simply the next row in the model, and what you use
+     * in conjunction with {@link TreeModel#getIterFirst() getIterFirst()} to
+     * iterate through the entire model. In a TreeStore, however, it will
+     * return the next row <i>at this level</i>.
+     * 
+     * <p>
+     * This will return <code>true</code> if it was able to change this
+     * TreeIter to the next row.
+     * 
+     * <p>
+     * Be aware that when this returns <code>false</code> the TreeIter is no
+     * longer valid.
+     * 
+     * @since 4.0.5
+     */
+    public boolean iterNext() {
+        if (model == null) {
+            return false;
+        }
+        return GtkTreeModel.iterNext(model, this);
+    }
+
+    /**
+     * Create a copy of this TreeIter.
+     * 
+     * @since 4.0.14
+     */
+    public TreeIter copy() {
+        return GtkTreeIter.copy(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeModel.java b/src/bindings/org/gnome/gtk/TreeModel.java
new file mode 100644
index 0000000..667ef77
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeModel.java
@@ -0,0 +1,561 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.icons.Helper;
+import org.freedesktop.icons.Icon;
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * The data use as the model backing a {@link TreeView}. TreeModel comes in
+ * two flavours which actually store data: {@link ListStore}, for a list of
+ * rows, and {@link TreeStore}, for data which has a hierarchical relationship
+ * between the rows.
+ * 
+ * <p>
+ * TreeModels are tabular, and as such have "columns", each of which is
+ * strongly typed, and which are represented in java-gnome by the
+ * {@link DataColumn DataColumn} classes.
+ * 
+ * <p>
+ * While the "columns" (and their types) must be declared when instantiating a
+ * TreeModel, the "rows" in a TreeModel are dynamic; it grows as you add data
+ * to the model. An instance of {@link TreeIter TreeIter} points to an
+ * individual row in a TreeModel; these are used both when adding new rows and
+ * when dealing with identifying which row has been selected in a TreeView. Be
+ * warned that TreeIters are <i>very</i> transient and are only valid so long
+ * as you haven't changed the structure of the model (ie, by adding another
+ * row, sorting it, filtering it, etc) so when populating a TreeModel we tend
+ * to do so one complete row at a time.
+ * 
+ * <h2>Populating TreeModels</h2>
+ * 
+ * <p>
+ * You add data to a TreeModel by first calling <code>appendRow()</code> which
+ * returns a TreeIter pointing to the new row, and then using the
+ * <code>setValue()</code> method appropriate to the data type of each column
+ * [<code>setValue()</code> has an overload for each concrete DataColumn type,
+ * so if you've declared the columns as fully derived DataColumnString or
+ * DataColumnInteger or whatever (as recommended), the following will Just
+ * Work]:
+ * 
+ * <pre>
+ * final DataColumnString column;
+ * final ListStore model;
+ * TreeIter row;
+ * 
+ * row = model.appendRow();
+ * model.setValue(row, column, "King George V");
+ * </pre>
+ * 
+ * You'll note that in this example we called the TreeIter <code>row</code>
+ * and the DataColumn <code>column</code>; doing so made the first two
+ * arguments of each of the <code>setValue()</code> methods make sense: you
+ * are setting a <var>value</var> in the ListStore or TreeStore at the
+ * co-ordinates <var>row</var>, <var>column</var>. In practise, of course, you
+ * have many DataColumns,
+ * 
+ * <pre>
+ * final DataColumnString monarchNameColumn;
+ * final DataColumnInteger coronatedYearColumn;
+ * final DataColumnPixbuf portraitColumn;
+ * final DataColumnReference monarchObjectColumn;
+ * final ListStore model;
+ * TreeIter row;
+ * Pixbuf portrait;
+ * ...
+ * 
+ * row = model.appendRow();
+ * model.setValue(row, monarchNameColumn, "King George V");
+ * model.setValue(row, coronatedYearColumn, 1910);
+ * model.setValue(row, portraitColumn, portrait);
+ * </pre>
+ * 
+ * There is a special kind of DataColumn for storing references to Java
+ * objects, DataColumnReference. This is used so that you can find your way
+ * back to the domain object model that your data came from in the first
+ * place. Indeed, the above code would probably have been done as follows:
+ * 
+ * <pre>
+ * Monarch george;
+ * ...
+ * 
+ * row = model.appendRow();
+ * model.setValue(row, monarchNameColumn, george.getFormalName());
+ * model.setValue(row, coronatedYearColumn, george.getCoronationYear());
+ * model.setValue(row, portraitColumn, george.getPortrait());
+ * model.setValue(row, monarchObjectColumn, george);
+ * </pre>
+ * 
+ * (assuming we created our model with such a DataColumnReference in the first
+ * place). The key part is the last line, where we store [a reference to] the
+ * object itself in the model.
+ * 
+ * <h2>Retrieving data</h2>
+ * 
+ * You can retrieve data from a TreeModel with the same <var>row</var>,
+ * <var>column</var> co-ordinates used when storing data:
+ * 
+ * <pre>
+ * String name;
+ * 
+ * name = model.getValue(row, column);
+ * </pre>
+ * 
+ * The <code>row</code> TreeIter in this case usually comes from a TreeView
+ * {@link TreeView.RowActivated} signal or a TreeSelection
+ * {@link TreeSelection.Changed} signal. You can also get a TreeIter for a
+ * specific row via <code>getIter()</code>. Less frequently you will want to
+ * iterate over all the rows in the model, which is possible as follows:
+ * 
+ * <pre>
+ * row = model.getIterFirst();
+ * do {
+ *     name = model.getValue(row, column);
+ *     // do something with name
+ * } while (row.iterNext());
+ * </pre>
+ * 
+ * Although we have illustrated getting a String out of the TreeModel here,
+ * you will normally only need to retrieve the Java object from your domain
+ * model from which the data in this row was derived and which it represents:
+ * 
+ * <pre>
+ * ruler = (Monarch) model.getValue(row, monarchObjectColumn);
+ * </pre>
+ * 
+ * once you have the Java object that has been "selected" by the user in your
+ * TreeView in hand, you can carry on from there with your application logic.
+ * 
+ * <p>
+ * As discussed in the documentation for DataColumn, TreeModels are only
+ * really meant as the backing store for a TreeView. By in large, you only use
+ * them as the means to drive what is being displayed by a TreeView; there's
+ * no reason to try and store a complex domain model in a GTK TreeModel. [By
+ * analogy, the String you pass to Label's <code>setLabel()</code> is merely
+ * setting the <var>label</var> property which is the "data store" backing the
+ * text displayed by the Label. You only push down what you want displayed;
+ * the rest of your data model stays in Java, of course. It's the same with
+ * TreeView]
+ * 
+ * @author Andrew Cowie
+ * @author Peter Miller
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ * 
+ */
+/*
+ * This is a departure from a strict mapping of the underlying library; in GTK
+ * TreeModel is an interface implemented by things like ListStore and
+ * TreeStore; by using it as an abstract superclass instead we can avoid
+ * duplicating the implementation of quite a lot of code.
+ */
+public abstract class TreeModel extends org.gnome.glib.Object
+{
+    protected TreeModel(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Used by the constructors. Convert from public DataColumn entities to
+     * the Class array we'll be passing into the translation layer, carrying
+     * out the crucial step of setting the column number ordinals along the
+     * way.
+     */
+    protected static final Class<?>[] typesToClassNames(DataColumn[] types) {
+        final Class<?>[] names;
+
+        if (types == null) {
+            throw new IllegalArgumentException("Array passed to TreeModel constructor must not be null");
+        }
+
+        if (types.length == 0) {
+            throw new IllegalArgumentException(
+                    "Must specify at least one column when constructing a TreeModel");
+        }
+
+        names = new Class[types.length];
+
+        for (int i = 0; i < types.length; i++) {
+            names[i] = types[i].getType();
+            types[i].setOrdinal(i);
+        }
+
+        return names;
+    }
+
+    /**
+     * The concrete TreeModels have their own setValue() methods that take a
+     * typed ListStore or TreeStore , so we concentrate the calls and delegate
+     * from here so they can call their specific translation method
+     * accordingly. Putting it here avoids recursive overload problems we ran
+     * into.
+     * 
+     * @param row
+     * @param column
+     * @param value
+     */
+    protected void dispatch(TreeIter row, DataColumn column, Value value) {
+        throw new UnsupportedOperationException(
+                "You need to implement setValue() for your TreeModel subclass");
+    }
+
+    /*
+     * Check that the given iter is valid for this model. Throw an
+     * IllegalArgumentException if it is not valid.
+     */
+    protected void checkIter(TreeIter iter) {
+        if (iter == null) {
+            throw new IllegalArgumentException("TreeIter can't be null");
+        }
+        if (this != iter.getModel()) {
+            throw new IllegalArgumentException("TreeIter not valid for this TreeModel");
+        }
+    }
+
+    /**
+     * Store a String in this TreeModel at the specified <code>row</code> and
+     * <code>column</code>.
+     */
+    public void setValue(TreeIter row, DataColumnString column, String value) {
+        checkIter(row);
+        dispatch(row, column, new Value(value));
+    }
+
+    /**
+     * Get the String stored in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     */
+    public String getValue(TreeIter row, DataColumnString column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return result.getString();
+    }
+
+    /**
+     * Get the <code>int</code> value stored in this TreeModel at the
+     * specified <code>row</code> and <code>column</code>.
+     */
+    public int getValue(TreeIter row, DataColumnInteger column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return result.getInteger();
+    }
+
+    /**
+     * Store an <code>int</code> in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     */
+    public void setValue(TreeIter row, DataColumnInteger column, int value) {
+        checkIter(row);
+        dispatch(row, column, new Value(value));
+    }
+
+    /**
+     * Get the <code>long</code> value stored in this TreeModel at the
+     * specified <code>row</code> and <code>column</code>.
+     */
+    public long getValue(TreeIter row, DataColumnLong column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return result.getLong();
+    }
+
+    /**
+     * Store an <code>int</code> in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     */
+    public void setValue(TreeIter row, DataColumnLong column, long value) {
+        checkIter(row);
+        dispatch(row, column, new Value(value));
+    }
+
+    /**
+     * Get the <code>boolean</code> value stored in this TreeModel at the
+     * specified <code>row</code> and <code>column</code>.
+     */
+    public boolean getValue(TreeIter row, DataColumnBoolean column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return result.getBoolean();
+    }
+
+    /**
+     * Store a <code>boolean</code> in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     */
+    public void setValue(TreeIter row, DataColumnBoolean column, boolean value) {
+        checkIter(row);
+        dispatch(row, column, new Value(value));
+    }
+
+    Pixbuf getValue(TreeIter row, DataColumnPixbuf column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return result.getPixbuf();
+    }
+
+    /**
+     * Store a {@link Stock Stock} constant in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     * 
+     * @since 4.0.7
+     */
+    public void setValue(TreeIter row, DataColumnStock column, Stock value) {
+        checkIter(row);
+        dispatch(row, column, new Value(value.getStockId()));
+    }
+
+    /**
+     * Store a named {@link org.freedesktop.icons.Icon Icon} constant in this
+     * TreeModel at the specified <code>row</code> and <code>column</code>.
+     * 
+     * @since 4.0.17
+     */
+    public void setValue(TreeIter row, DataColumnIcon column, Icon value) {
+        checkIter(row);
+        dispatch(row, column, new Value(Helper.getName(value)));
+    }
+
+    /**
+     * Get the Stock icon stored in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     * 
+     * @since 4.0.7
+     */
+    public Stock getValue(TreeIter row, DataColumnStock column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return Stock.instanceFor(result.getString());
+    }
+
+    /**
+     * Get the named Icon stored in this TreeModel at the specified
+     * <code>row</code> and <code>column</code>.
+     * 
+     * @since 4.0.7
+     */
+    public Icon getValue(TreeIter row, DataColumnIcon column) {
+        final Value result;
+
+        checkIter(row);
+
+        result = new Value();
+
+        GtkTreeModel.getValue(this, row, column.getOrdinal(), result);
+
+        return Helper.instanceFor(result.getString());
+    }
+
+    /**
+     * Get a reference to the Java object stored in this TreeModel at the
+     * specified <code>row</code> and <code>column</code>. You'll have to cast
+     * the return value to whatever type you put in there in the first place,
+     * obviously.
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T getValue(TreeIter row, DataColumnReference<T> column) {
+        checkIter(row);
+        return (T) GtkTreeModelOverride.getReference(this, row, column.getOrdinal());
+    }
+
+    /**
+     * Store a reference to a Java object in the TreeModel at the specified
+     * <code>row</code> and <code>column</code>. This is used so you can get
+     * <i>back</i> to your Java side domain object model in response to an
+     * event on the TreeView.
+     */
+    /*
+     * Calls a custom override as we manually manage a global reference to the
+     * passed object on the JNI side. This also avoids the ambiguity collision
+     * in the signatures of Value(org.gnome.glib.Object) and
+     * Value(java.lang.Object) that otherwise arose and prevented compilation.
+     */
+    public <T> void setValue(TreeIter row, DataColumnReference<T> column, T value) {
+        checkIter(row);
+        GtkTreeModelOverride.setReference(this, row, column.getOrdinal(), value);
+    }
+
+    /**
+     * Store a Pixbuf in this TreeModel at the specified <code>row</code> and
+     * <code>column</code>. This is used to provide the image data needed by a
+     * TreeViewColumn with a {@link CellRendererPixbuf CellRendererPixbuf} in
+     * it.
+     */
+    public void setValue(TreeIter row, DataColumnPixbuf column, Pixbuf value) {
+        checkIter(row);
+        dispatch(row, column, new Value(value));
+    }
+
+    /**
+     * Initialize a new iterator at the beginning of the model. Since you
+     * presumably want to iterate through the remaining rows, use the
+     * {@link TreeIter#iterNext() iterNext()} method you'll find on TreeIter
+     * as follows:
+     * 
+     * <pre>
+     * TreeIter row;
+     * 
+     * row = model.getIterFirst();
+     * do {
+     *     // do something with row
+     * } while (row.iterNext());
+     * </pre>
+     * 
+     * @return <code>null</code> if the model is presently empty.
+     */
+    public TreeIter getIterFirst() {
+        final TreeIter iter;
+
+        iter = new TreeIter(this);
+
+        if (GtkTreeModel.getIterFirst(this, iter)) {
+            return iter;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Convert a TreePath to a TreeIter appropriate for this TreeModel. See
+     * {@link TreePath TreePath} for a full explanation of how to specify
+     * paths into ListStores and TreeStores.
+     * 
+     * @return <code>null</code> if it can't figure out how to make the
+     *         conversion of the given TreePath into a TreeIter pointing into
+     *         this TreeModel.
+     */
+    public TreeIter getIter(TreePath path) {
+        final TreeIter iter;
+
+        iter = new TreeIter(this);
+
+        if (GtkTreeModel.getIter(this, iter, path)) {
+            return iter;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Get a TreePath corresponding to the row being pointed at by the given
+     * TreeIter.
+     * 
+     * <p>
+     * Remember that TreePaths, like TreeIters, are not stable across changes
+     * to the model; if you need to reliably point to a given row use
+     * {@link TreeRowReference} instead.
+     * 
+     * @since 4.0.6
+     */
+    public TreePath getPath(TreeIter row) {
+        checkIter(row);
+        return GtkTreeModel.getPath(this, row);
+    }
+
+    /**
+     * The signal emitted when a row in the model is changed.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface RowChanged extends GtkTreeModel.RowChangedSignal
+    {
+        /**
+         * The <code>path</code> and <code>row</code> arguments give you valid
+         * a TreePath and TreeIter respectively pointing at the row that
+         * changed. Be wary, though, that these are not going to be stable
+         * beyond the invocation of this callback; if one row has changed, you
+         * can bet others are changing too. Do what you need to do and leave
+         * the variables to be collected.
+         * 
+         * <p>
+         * For subtle implementation reasons, you can't iterate using the
+         * <code>row</code> TreeIter. If you need to cycle over the model, get
+         * a TreeIter pointing to the beginning of the model as follows:
+         * 
+         * <pre>
+         * row = source.getIterFirst();
+         * do {
+         *     // do whatever with each row
+         * } while (row.iterNext());
+         * </pre>
+         */
+        public void onRowChanged(TreeModel source, TreePath path, TreeIter row);
+    }
+
+    /**
+     * Hook up a handler for <code>TreeModel.RowChanged</code> signals.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(TreeModel.RowChanged handler) {
+        GtkTreeModel.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeModelFilter.java b/src/bindings/org/gnome/gtk/TreeModelFilter.java
new file mode 100644
index 0000000..d688a02
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeModelFilter.java
@@ -0,0 +1,291 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A TreeModel which can present a subset of its backing model as determined
+ * by a filter function. TreeModelFilter acts to wrap an underlying TreeModel.
+ * You store your data in this underlying model; the TreeModelFilter just adds
+ * the functionality to selectively determine which rows should be visible.
+ * 
+ * <p>
+ * Usage is straight forward. Given the following declarations:
+ * 
+ * <pre>
+ * final ListStore model;
+ * final TreeModelFilter filter;
+ * final DataColumnInteger elevation;
+ * ...
+ * </pre>
+ * 
+ * you initialize and populate your ListStore as usual. To add the filtering
+ * functionality, you wrap your ListStore in a TreeModelFilter:
+ * 
+ * <pre>
+ * filter = new TreeModelFilter(model, null);
+ * </pre>
+ * 
+ * then instruct the TreeModelFilter how to select the rows from the concrete
+ * TreeModel it is proxying to be included in the virtual model it presents
+ * via the {@link #setVisibleCallback(org.gnome.gtk.TreeModelFilter.Visible)
+ * setVisibleCallback()}. For instance, if you have a list of all mountains
+ * and only want to present peaks higher than 8000 meters, you might do:
+ * 
+ * <pre>
+ * filter.setVisibleCallback(new TreeModelFilter.Visible() {
+ *     public boolean onVisible(TreeModelFilter source, TreeModel base, TreeIter row) {
+ *         if (base.getValue(row, elevation) > 8000) {
+ *             return true;
+ *         } else {
+ *             return false;
+ *         }
+ *     }
+ * }
+ * </pre>
+ * 
+ * Assuming you are using this data to back a display Widget such as a
+ * TreeView, and you only want to present this filtered list of rows, then you
+ * use the TreeModelFilter, not the ListStore, as the model backing the
+ * TreeView:
+ * 
+ * <pre>
+ * view = new TreeView(filter);
+ * </pre>
+ * 
+ * <p>
+ * <b>Note:</b><br/>
+ * For some reason, TreeModelFilter does <b>not</b> implement TreeSortable. If
+ * you plan to sort the filtered model (ie via TreeViewColumn's
+ * {@link TreeViewColumn#setSortColumn(DataColumn) setSortColumn()}) make sure
+ * you wrap your TreeModelFilter in a {@link TreeModelSort} and add that to
+ * the TreeView instead:
+ * 
+ * <pre>
+ * store = new ListStore(...);
+ * filtered = new TreeModelFilter(store, null);
+ * sorted = new TreeModelSort(filtered);
+ * 
+ * view = new TreeView(sorted);
+ * 
+ * vertical = view.appendColumn();
+ * vertical.setSortColumn(...);
+ * </pre>
+ * 
+ * otherwise GTK will object vociferously.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class TreeModelFilter extends TreeModel implements TreeDragSource
+{
+    protected TreeModelFilter(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new TreeModelFilter.
+     * 
+     * @param base
+     *            The underlying model that you are filtering
+     * @param root
+     *            You can give a TreePath to be used as a virtual root so that
+     *            the TreeModelFilter only presents and operates on a
+     *            subsection of the base TreeModel. This is rarely necessary,
+     *            so specify <code>null</code>.
+     */
+    public TreeModelFilter(TreeModel base, TreePath root) {
+        super(GtkTreeModelFilter.createTreeModelFilter(base, root));
+    }
+
+    /**
+     * The callback invoked when a TreeModelFilter wants to ask if a given row
+     * in its child TreeModel should be considered visible in the
+     * TreeModelFilter.
+     * 
+     * <p>
+     * Typically when you receive this callback you will reach into the
+     * underlying model and query a column by which you will determine whether
+     * or not to include this row. This grants the opportunity to put some
+     * very complex logic into the <code>TextModelFilter.Visible</code>
+     * callback. We tend to prefer this approach, but if you're rather
+     * pre-calculate such states, then you can always add a DataColumnBoolean
+     * to the model and simply return the state of that column as the return
+     * value from this interface when it is invoked.
+     * 
+     * <p>
+     * <i>If you are researching the GTK API documentation, see
+     * <code>(*GtkTreeModelFilterVisibleFunc)</code>. Creating and invoking
+     * this "visible" signal is how java-gnome has implemented the function
+     * pointer expected by
+     * <code>gtk_tree_model_filter_set_visible_func()</code>.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    /*
+     * This is not a real GTK signal! This is a custom hack so we can get the
+     * callback using the existing Signal machinery. Note that there is no
+     * connect() method.
+     */
+    public interface Visible
+    {
+        /**
+         * Answer the question "is this row to be visible?" Return
+         * <code>true</code> for the row to be included in the model, or
+         * <code>false</code> for the row to be filtered out.
+         * 
+         * <p>
+         * <b>Warning!</b><br/>
+         * <code>row</code> is a valid TreeIter in <code>base</code>, not
+         * <code>source</code>. This makes sense if you consider that you will
+         * need to ask the underlying proxied TreeModel for information about
+         * a row; the only rows you can see in the <code>source</code>
+         * TreeModelFilter are, of course, the ones that have passed this
+         * test.
+         * 
+         * @since 4.0.6
+         */
+        public boolean onVisible(TreeModelFilter source, TreeModel base, TreeIter row);
+    }
+
+    private static class VisibleHandler implements GtkTreeModelFilter.VisibleSignal
+    {
+        private final Visible handler;
+
+        private VisibleHandler(Visible handler) {
+            this.handler = handler;
+        }
+
+        public boolean onVisible(TreeModelFilter source, TreeModel base, TreeIter row) {
+            row.setModel(base);
+            return handler.onVisible(source, base, row);
+        }
+    }
+
+    /**
+     * Hookup the <code>Visible</code> callback that will be used to determine
+     * whether rows from the underlying TreeModel are to be included in the
+     * set presented by this TreeModelFilter.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * From the developer's point of view this works like a signal handler,
+     * although the underlying function in GTK it actually requires a function
+     * pointer. Our implementation registers 'visible' as a custom signal
+     * which essentially has the same signature as
+     * (GtkTreeModelFilterVisibleFunc)</code>.
+     */
+    public void setVisibleCallback(TreeModelFilter.Visible handler) {
+        GtkTreeModelFilterOverride.setVisibleFunc(this);
+        GtkTreeModelFilter.connect(this, new VisibleHandler(handler), false);
+    }
+
+    /**
+     * Cause the TreeModelFilter to re-calculate whether rows are visible.
+     * This will cause your <code>Visible</code> callback to be hit for each
+     * row.
+     * 
+     * @since 4.0.6
+     */
+    public void refilter() {
+        GtkTreeModelFilter.refilter(this);
+    }
+
+    /**
+     * Convert a TreeIter valid in the underying TreeModel to one usable with
+     * this TreeModelFilter.
+     * 
+     * @return <code>null</code> if the row is not (currently) present in the
+     *         TreeModelFilter.
+     * 
+     * @since 4.0.9
+     */
+    public TreeIter convertIterBaseToFilter(TreeIter row) {
+        final TreeIter result;
+        final boolean valid;
+
+        result = new TreeIter(this);
+
+        valid = GtkTreeModelFilter.convertChildIterToIter(this, result, row);
+
+        if (valid) {
+            return result;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Convert a TreeIter valid in this TreeModelFilter into one usable with
+     * the underying TreeModel.
+     * 
+     * @since 4.0.9
+     */
+    public TreeIter convertIterFilterToBase(TreeIter row) {
+        final TreeModel base;
+        final TreeIter result;
+
+        base = GtkTreeModelFilter.getModel(this);
+        result = new TreeIter(base);
+
+        GtkTreeModelFilter.convertIterToChildIter(this, result, row);
+
+        return result;
+    }
+
+    /**
+     * Convert a TreePath representing a row in the underying TreeModel into
+     * the corresponding locator in this TreeModelFilter.
+     * 
+     * <p>
+     * If the row represented by <code>path</code> isn't (currently) present
+     * in the narrowed representation provided by this TreeModelFilter, then
+     * <code>null</code> is returned.
+     * 
+     * @since 4.0.9
+     */
+    public TreePath convertPathBaseToFilter(TreePath path) {
+        return GtkTreeModelFilter.convertChildPathToPath(this, path);
+    }
+
+    /**
+     * Convert a TreePath representing a row in this TreeModelFilter into one
+     * that points to the corresponding row in the underying TreeModel.
+     * 
+     * @since 4.0.9
+     */
+    public TreePath convertPathFilterToBase(TreePath path) {
+        return GtkTreeModelFilter.convertPathToChildPath(this, path);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeModelFlags.java b/src/bindings/org/gnome/gtk/TreeModelFlags.java
new file mode 100644
index 0000000..0ce76c0
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeModelFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TreeModelFlags extends Flag
+{
+    private TreeModelFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeModelSort.java b/src/bindings/org/gnome/gtk/TreeModelSort.java
new file mode 100644
index 0000000..1307f28
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeModelSort.java
@@ -0,0 +1,208 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Takes an existing model and creates a new model of it sorted as specified.
+ * The data is not copied, but the TreeModel that results from creating a
+ * TreeModelSort can be used independently. It listens to and reacts to the
+ * signals emitted by the underlying base TreeModel. The end result is that of
+ * allowing you to have two different TreeViews with their own sort of the
+ * same underlying data set. This is potentially useful if you have a common
+ * TreeModel backing a number of different presentations, although you should
+ * be cognisant that a point will be reached where it is more efficient to
+ * simply have separate models.
+ * 
+ * <p>
+ * A TreeIter pointing into this TreeModelSort is <b>not</b> valid in the
+ * underlying "child" TreeModel. If you need to change data in the base model,
+ * use {@link #convertIterToChildIter(TreeIter) convertIterToChildIter()}.
+ * 
+ * <p>
+ * You need to be careful to use the correct TreeModel for TreeIter pointers
+ * you receive in callbacks. The scenario that arises more often is this:
+ * 
+ * <pre>
+ * ListStore model;
+ * TreeModelSort sorted;
+ * TreeView view;
+ * TreeSelection selection;
+ * 
+ * // usual TreeModel setup
+ * model = new ListStore(...);
+ * 
+ * // then create the sorted one, and use it
+ * sorted = new TreeModelSort(model);
+ * view = new TreeView(sorted);
+ * ...
+ * 
+ * // then, later
+ * selection.connect(new TreeSelection.Changed() {
+ *     public void onChanged(TreeSelection source) {
+ *         final TreeIter row;
+ *         final String str;
+ * 
+ *         row = selection.getSelected();
+ *         if (row == null) {
+ *             return;
+ *         }
+ *         str = model.getValue(row, column);
+ *     }
+ * }
+ * </pre>
+ * 
+ * the problem that arises is that the retrieved TreeIter <i>is not valid</i>
+ * in <code>model</code>. It's a TreeIter in <code>sorted</code>. Your program
+ * will crash if you get this wrong. The fix is simple; change it to use the
+ * correct TreeModel:
+ * 
+ * <pre>
+ * ...
+ *         str = sorted.getValue(row, column);
+ * ...
+ * </pre>
+ * 
+ * and things will work fine.
+ * 
+ * <p>
+ * You don't normally have need of this class. Both ListStore and TreeStore
+ * implement TreeSortable already, and there are various sorting tools built
+ * into the view side of the TreeView/TreeModel MVC framework, notably
+ * TreeViewColumn's {@link TreeViewColumn#setSortColumn(DataColumn)
+ * setSortColumn()}. If, however, you are using a {@link TreeModelFilter}, you
+ * will need to wrap it in one of these to make sorting work normally again.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public class TreeModelSort extends TreeModel implements TreeDragSource, TreeSortable
+{
+    protected TreeModelSort(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new TreeModelSort, wrapping an existing model.
+     * 
+     * @since 4.0.6
+     */
+    public TreeModelSort(TreeModel base) {
+        super(GtkTreeModelSort.createTreeModelSortWithModel(base));
+    }
+
+    /**
+     * Convert a TreeIter pointing into this TreeModelSort into a TreeIter
+     * valid in the underlying base TreeModel that is being proxied.
+     * 
+     * <p>
+     * TODO <i>We need to test the limitations of this, as several people have
+     * actually been getting away with not worrying about converting at all,
+     * so clearly something isn't quite as expected.</i>
+     * 
+     * @since <span style="color:red;">Unstable</span>
+     */
+    public TreeIter convertIterToChildIter(TreeIter row) {
+        final TreeIter result;
+        final TreeModel child;
+
+        child = GtkTreeModelSort.getModel(this);
+        result = new TreeIter(child);
+
+        GtkTreeModelSort.convertIterToChildIter(this, result, row);
+
+        return result;
+    }
+
+    public void setSortColumn(DataColumn column, SortType ordering) {
+        GtkTreeSortable.setSortColumnId(this, column.getOrdinal(), ordering);
+    }
+
+    /**
+     * Given a TreeIter obtained from the underying TreeModel, return one that
+     * represents the same row but that will be valid in this TreeModelSort.
+     * 
+     * @since 4.0.9
+     */
+    public TreeIter convertIterBaseToSort(TreeIter row) {
+        final TreeIter result;
+
+        result = new TreeIter(this);
+
+        GtkTreeModelSort.convertChildIterToIter(this, result, row);
+
+        return result;
+    }
+
+    /**
+     * Given a TreeIter valid in this TreeModelSort, figure out the
+     * correspnding row in the underlying TreeModel and return a TreeIter that
+     * will be valid there.
+     * 
+     * @since 4.0.9
+     */
+    public TreeIter convertIterSortToBase(TreeIter row) {
+        final TreeModel base;
+        final TreeIter result;
+
+        base = GtkTreeModelSort.getModel(this);
+        result = new TreeIter(base);
+
+        GtkTreeModelSort.convertIterToChildIter(this, result, row);
+
+        return result;
+    }
+
+    /**
+     * Convert a TreePath identifying a row in the underying TreeModel into
+     * the corresponding locator in this TreeModelSort.
+     * 
+     * <p>
+     * If the row location specified by <code>path</code> isn't resolvable in
+     * the underlying TreeModel, <code>null</code> is returned.
+     * 
+     * @since 4.0.9
+     */
+    public TreePath convertPathBaseToSort(TreePath path) {
+        return GtkTreeModelSort.convertChildPathToPath(this, path);
+    }
+
+    /**
+     * Convert a TreePath identifying a row in this TreeModelSort into one
+     * that points to the corresponding row in the underying TreeModel.
+     * 
+     * @since 4.0.9
+     */
+    public TreePath convertPathSortToBase(TreePath path) {
+        return GtkTreeModelSort.convertPathToChildPath(this, path);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreePath.java b/src/bindings/org/gnome/gtk/TreePath.java
new file mode 100644
index 0000000..5006296
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreePath.java
@@ -0,0 +1,172 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.util.StringTokenizer;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * A logical but abstract representation of a row in a TreeModel. TreePaths
+ * can be expressed as Strings.
+ * 
+ * <p>
+ * Paths in ListStores are quite simple. They are a simple number,
+ * incrementing from zero, indicating the row number. For example,
+ * <code>TreePath("8")</code> is the ninth row in the model.
+ * 
+ * <p>
+ * Paths for TreeStores are more complex. They are of the form
+ * "first:second:third:..." where each of first, second, and third denote the
+ * number of steps in from the first at each level of the hierarchy. For
+ * example, <code>TreePath("2:4:0")</code> represents the first third level
+ * element in the fifth second level element in the third row.
+ * 
+ * <p>
+ * TreePaths are given to you as a row address in signals like
+ * {@link TreeView.RowActivated}. Usually you need the row expressed as a
+ * TreeIter (ie to get a value out of the row);to do that call the underlying
+ * TreeModel's {@link TreeModel#getIter(TreePath) getIter()} method.
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @since 4.0.5
+ */
+public final class TreePath extends Boxed
+{
+    protected TreePath(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create an empty TreePath object. <b>For use by bindings hackers
+     * only!</b>
+     */
+    TreePath() {
+        super(GtkTreePath.createTreePath());
+    }
+
+    /**
+     * Create a TreePath object from the String form. Note that TreePaths are
+     * abstract and independent of a particular model; if you want to look up
+     * a given path in a TreeModel use the resultant object with its
+     * {@link TreeModel#getIter(TreePath) getIter()} method.
+     * 
+     * @throws IllegalArgumentException
+     *             if the <code>path</code> fails to parse as a valid
+     *             TreePath.
+     */
+    public TreePath(String path) {
+        super(GtkTreePath.createTreePathFromString(path));
+    }
+
+    static long validationCheck(final long pointer) {
+        if (pointer == 0L) {
+            throw new IllegalArgumentException(
+                    "The supplied path string failed to parse as a valid TreePath");
+        }
+        return pointer;
+    }
+
+    protected void release() {
+        GtkTreePath.free(this);
+    }
+
+    /**
+     * Return <code>true</code> of this TreePath represents the same logical
+     * path as the <code>other</code> does.
+     */
+    public boolean equals(java.lang.Object other) {
+        if (!(other instanceof TreePath)) {
+            return false;
+        }
+        TreePath path = (TreePath) other;
+        if (GtkTreePath.compare(this, path) == 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Return the text form represented by this TreePath. For example, a
+     * TreePath pointing at the third row's second child row's fifth child row
+     * in a TreeStore would be "2:1:4"; the 16th row of a ListStore would be
+     * "15".
+     * 
+     * @since 4.0.6
+     */
+    public String toString() {
+        return GtkTreePath.toString(this);
+    }
+
+    /**
+     * Returns the depth of node identified by this TreePath within the tree.
+     * Or with other words, the number of elements in the TreePath.
+     * 
+     * @since 4.0.9
+     */
+    public int getDepth() {
+        return GtkTreePath.getDepth(this);
+    }
+
+    /**
+     * Returns the indices the path consists of as an array of integer. If for
+     * example the path would be "1:4:2" you would get {1,4,2}.
+     * 
+     * @return The indices of the nodes or <code>null</code> if nothing is
+     *         selected.
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * Calling GtkTreePath.getIndices() always returns a null for me, so I
+     * implemented this workaround. If someone willing to dig deeper in the
+     * native code finds out why, this code can be removed.
+     */
+    public int[] getIndices() {
+        final StringTokenizer tok;
+        final int[] ret;
+
+        try {
+            tok = new StringTokenizer(this.toString(), ":");
+            ret = new int[tok.countTokens()];
+            for (int i = 0; i < ret.length; i++) {
+                ret[i] = Integer.parseInt(tok.nextToken());
+            }
+            return ret;
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeRowReference.java b/src/bindings/org/gnome/gtk/TreeRowReference.java
new file mode 100644
index 0000000..60ec6a6
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeRowReference.java
@@ -0,0 +1,98 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * A stable reference to a specific row in a TreeModel. A TreeRowReference
+ * listens to all changes made to the model (be they insertions, deletions,
+ * sorting being applied, etc) and adjusts itself internally so that the same
+ * row is pointed at by the instance regardless.
+ * 
+ * <p>
+ * This class is primarily necessary because a TreeIter instance is no longer
+ * usable if the model changes. Neither are TreePaths for that matter; if you
+ * change the sorting order then the row pointed at by TreePath "2" will
+ * [likely] be different before and after the sort.
+ * 
+ * <p>
+ * Typical usage of this is from a TreeIter as follows:
+ * 
+ * <pre>
+ * TreeModel source;
+ * TreePath path;
+ * TreeIter row;
+ * TreeRowReference ref;
+ * ...
+ * 
+ * path = source.getPath(row);
+ * ref = new TreeRowReference(source, path);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ */
+public final class TreeRowReference extends Boxed
+{
+    protected TreeRowReference(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new TreeRowReference for the given TreePath into the given
+     * Model.
+     * 
+     * @since 4.0.6
+     */
+    public TreeRowReference(TreeModel model, TreePath path) {
+        super(GtkTreeRowReference.createTreeRowReference(model, path));
+    }
+
+    protected void release() {
+        GtkTreeRowReference.free(this);
+    }
+
+    /**
+     * Get a TreePath representing the row that this TreeRowReference is
+     * currently pointing at.
+     * 
+     * @return You'll get <code>null</code> back if the TreeRowReference is no
+     *         longer valid, which would happen if the row has been deleted.
+     * 
+     * @since 4.0.6
+     */
+    public TreePath getPath() {
+        return GtkTreeRowReference.getPath(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeSelection.java b/src/bindings/org/gnome/gtk/TreeSelection.java
new file mode 100644
index 0000000..6a00969
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeSelection.java
@@ -0,0 +1,259 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * Manipulate the selection state of a TreeView. Every TreeView has an
+ * accompanying TreeSelection object which is used to manage whether or not
+ * rows can be selected, and to return to the programmer the current state of
+ * which rows are selected, if any.
+ * 
+ * <p>
+ * TreeSelection can be used to programmatically select rows by either
+ * TreeIter or TreePath; see the <code>selectRow()</code> methods. For
+ * example, to select the first row you could do:
+ * 
+ * <pre>
+ * final TreeSelection selection;
+ * 
+ * selection = view.getSelection();
+ * selection.selectRow(new TreePath("0"));
+ * </pre>
+ * 
+ * <p>
+ * Using TreeSelection to determine the currently selected row is fairly
+ * straight forward:
+ * 
+ * <pre>
+ * selection.connect(new TreeSelection.Changed() {
+ *     public void onChanged(TreeSelection source) {
+ *         final TreeIter row;
+ * 
+ *         row = selection.getSelected();
+ * 
+ *         if (row != null) {
+ *             // do something!
+ *         }
+ *     }
+ * });
+ * </pre>
+ * 
+ * Unfortunately, the <code>TreeSelection.Changed</code> signal is not
+ * entirely deterministic; it is sometimes emitted more than once or for no
+ * change at all. You'll need to allow for this in your code.
+ * 
+ * <p>
+ * <i>Mostly this is an API helper; the underlying documentation notes that
+ * these could have all been methods on <code>GtkTreeView</code>.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ * @since 4.0.5
+ */
+public class TreeSelection extends Object
+{
+    protected TreeSelection(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the mode that is governing selection behaviour on this TreeView.
+     */
+    public SelectionMode getMode() {
+        return GtkTreeSelection.getMode(this);
+    }
+
+    /**
+     * Set what kinds of selections are allowed. The interesting constants
+     * you'll use most often are {@link SelectionMode#NONE NONE} and
+     * {@link SelectionMode#MULTIPLE MULTIPLE} since
+     * {@link SelectionMode#SINGLE SINGLE} is the default. See SelectionMode
+     * for the details of the behaviour implied by each option.
+     */
+    public void setMode(SelectionMode type) {
+        GtkTreeSelection.setMode(this, type);
+    }
+
+    /**
+     * Get the selected row from the TreeView. Note that this only works when
+     * the selection mode is {@link SelectionMode#SINGLE SINGLE} or
+     * {@link SelectionMode#BROWSE BROWSE}.
+     * 
+     * @return <code>null</code> if there is no currently selected row.
+     */
+    /*
+     * Second parameter to native call is an out-parameter that gets filled
+     * with a pointer to the GtkTreeModel. It's only for convenience, and is
+     * unnecessary for us. Looking at the GtkTreeSelection C code it ignores
+     * it if NULL. We'll skip it.
+     */
+    public TreeIter getSelected() {
+        final TreeModel model;
+        final TreeIter row;
+
+        model = getView().getModel();
+        row = new TreeIter(model);
+
+        if (GtkTreeSelection.getSelected(this, null, row)) {
+            return row;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Get the rows currently selected from the TreeView. This is specially
+     * useful when the selection mode is {@link SelectionMode#MULTIPLE
+     * MULTIPLE}. Otherwise {@link #getSelected() getSelected()} offers a more
+     * convenient way to obtain the selected row.
+     * 
+     * <p>
+     * You can use the TreeModel's {@link TreeModel#getIter(TreePath)
+     * getIter()} method to convert the returned TreePaths to the more
+     * convenient TreeIter:
+     * 
+     * <pre>
+     * TreePath[] rows;
+     * TreeSelection selection;
+     * TreeModel model;
+     * 
+     * rows = selection.getSelectedRows();
+     * for (int i = 0; i < rows.length; ++i) {
+     *     TreeIter row = model.getIter(rows[i]);
+     *     // do something with the row
+     * }
+     * </pre>
+     * 
+     * <p>
+     * Also remember that both TreeIter and TreePath are temporally objects no
+     * longer valid once you make any change to the model. Thus, if you plan
+     * to modify the model, you may want to convert the returned TreePaths to
+     * {@link TreeRowReference TreeRowReferences}.
+     * 
+     * @return An array with the selected rows. If no row is selected, the
+     *         arrays will be empty.
+     * @since 4.0.7
+     */
+    /*
+     * Second parameter to native call is an out-parameter that gets filled
+     * with a pointer to the GtkTreeModel. It's only for convenience, and is
+     * unnecessary for us.
+     */
+    public TreePath[] getSelectedRows() {
+        return GtkTreeSelection.getSelectedRows(this, null);
+    }
+
+    TreeView getView() {
+        return GtkTreeSelection.getTreeView(this);
+    }
+
+    /**
+     * Emitted when the selection state of the TreeView changes.
+     * 
+     * <p>
+     * Beware that this is considered a hint by GTK, so you sometimes get
+     * false positives or false negatives relative to how you are interpreting
+     * "change". You'll be calling {@link TreeSelection#getSelected()
+     * getSelected()} anyway, but it's a good idea to keep in mind that the
+     * state may not have changed in quite the way you think it might have.
+     * Have a look at the return from that method fairly closely to decide for
+     * yourself whether the selection has "changed" or not.
+     * 
+     * <p>
+     * <i>The nonsense about the <code>TreeSelection.Changed</code> signal is
+     * supposedly due to the fact that there are multiple actors in the
+     * TreeModel environment, and both internal actions within GTK and events
+     * due to window manager activity can result in the signal being emitted.
+     * What a load of crap; either the selection changed or it didn't. Sorry
+     * we can't do better for you.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.5
+     */
+    public interface Changed extends GtkTreeSelection.ChangedSignal
+    {
+        void onChanged(TreeSelection source);
+    }
+
+    /**
+     * Hook up a <code>TreeSelection.Changed</code> signal handler.
+     */
+    public void connect(TreeSelection.Changed handler) {
+        GtkTreeSelection.connect(this, handler, false);
+    }
+
+    /**
+     * Select a row in the TreeView. We offer two forms; this one which takes
+     * a TreePath and one which takes a TreeIter; see
+     * {@link #selectRow(TreeIter)} for the other. Use this one if you have
+     * want to express expressing the row you want selected in abstract,
+     * logical form.
+     */
+    public void selectRow(TreePath path) {
+        GtkTreeSelection.selectPath(this, path);
+    }
+
+    /**
+     * Select a row in the TreeView. We offer two forms; this one which takes
+     * a TreeIter corresponding to a row in the underlying model, and another
+     * which takes a TreePath; see {@link #selectRow(TreePath)}.
+     */
+    public void selectRow(TreeIter row) {
+        GtkTreeSelection.selectIter(this, row);
+    }
+
+    /**
+     * Unselect all the rows in the TreeView. Useful to ensure the initial
+     * state of the TreeView is that no rows are selected, however you may
+     * find you have to wait until after the Window is mapped.
+     */
+    public void unselectAll() {
+        GtkTreeSelection.unselectAll(this);
+    }
+
+    /**
+     * Return <code>true</code> if the currently selected row is pointed by
+     * <code>path</code>.
+     * 
+     * @since 4.0.15
+     */
+    public boolean isSelected(TreePath path) {
+        /*
+         * The name should be pathIsSelected but it looks prettier with the
+         * current name.
+         */
+        return GtkTreeSelection.pathIsSelected(this, path);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeSortable.java b/src/bindings/org/gnome/gtk/TreeSortable.java
new file mode 100644
index 0000000..28d7232
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeSortable.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public interface TreeSortable
+{
+
+    /**
+     * Specify the column from your (underlying) data model which will be used
+     * for sorting this TreeModelSort. Specify {@link SortType#ASCENDING
+     * ASCENDING} or {@link SortType#DESCENDING DESCENDING} order via the
+     * <code>ordering</code> parameter.
+     * 
+     * @since 4.0.7
+     */
+    public void setSortColumn(DataColumn column, SortType ordering);
+}
diff --git a/src/bindings/org/gnome/gtk/TreeStore.java b/src/bindings/org/gnome/gtk/TreeStore.java
new file mode 100644
index 0000000..9b7edb4
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeStore.java
@@ -0,0 +1,309 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A TreeModel that stores its data in a hierarchical tree. TreeStore is a
+ * concrete TreeModel subclass where rows can also have other rows that are
+ * children. This model is suitable for hierarchical data where each row has a
+ * parent and a list of children. If you just want to store a list of rows
+ * (ie, plain tabular data), {@link ListStore ListStore} is a more appropriate
+ * choice.
+ * 
+ * <p>
+ * Instantiating a TreeStore is done identically as with a ListStore, by
+ * specifying an array of {@link DataColumn}s. For example, given:
+ * 
+ * <pre>
+ * final TreeStore model;
+ * final DataColumnString place;
+ * ...
+ * </pre>
+ * 
+ * you would build a model as follows:
+ * 
+ * <pre>
+ * model = new TreeStore(new DataColumn[] {
+ *         place = new DataColumnString(),
+ *         ...
+ * });
+ * </pre>
+ * 
+ * The caveat described in ListStore applies here; don't declare your model as
+ * abstract type TreeModel; keep them as concrete type TreeStore so you can
+ * get to the TreeStore specific methods for adding rows and navigating the
+ * hierarchy. <img src="TreeStore.png" class="snapshot">
+ * 
+ * <p>
+ * To add a new row at the top level of the hierarchy, you just use
+ * {@link #appendRow() appendRow()} as you have seen with ListStore:
+ * 
+ * <pre>
+ * parent = model.appendRow();
+ * model.setValue(parent, place, "Europe");
+ * </pre>
+ * 
+ * If, however, you want to add a new row as a child of an existing row, you
+ * need to use the {@link #appendChild(TreeIter) appendChild()} method
+ * instead:
+ * 
+ * <pre>
+ * child = model.appendRow(parent);
+ * model.setValue(child, place, "London");
+ * child = model.appendRow(parent);
+ * model.setValue(child, place, "Paris");
+ * ...
+ * </pre>
+ * 
+ * passing the TreeIter representing the parent you wish to create a child
+ * under.
+ * 
+ * <p>
+ * You may also want to read the discussion at {@link TreePath} to understand
+ * how to address a particular row in a given TreeStore. You will also
+ * probably want to be aware of TreeView's
+ * {@link TreeView#expandRow(TreePath, boolean) expandRow()},
+ * {@link TreeView#expandAll() expandAll()}, and corresponding
+ * <code>collapse</code> methods.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.7
+ */
+public class TreeStore extends TreeModel implements TreeDragSource, TreeDragDest, TreeSortable
+{
+    protected TreeStore(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new TreeStore with the given column types. See
+     * {@link DataColumn DataColumn} for details. You must include at least
+     * one DataColumn in your <code>types</code> array (you can't have a
+     * TreeStore with no columns).
+     * 
+     * @since 4.0.7
+     */
+    public TreeStore(DataColumn[] types) {
+        super(GtkTreeModelOverride.createTreeStore(typesToClassNames(types)));
+    }
+
+    protected void dispatch(TreeIter row, DataColumn column, Value value) {
+        GtkTreeStore.setValue(this, row, column.getOrdinal(), value);
+    }
+
+    /**
+     * Append a new row after the last child of the given row. You'll need to
+     * fill in the various columns with one of the various
+     * {@link TreeModel#setValue(TreeIter, DataColumnString, String)
+     * setValue()} methods, of course.
+     * 
+     * <p>
+     * To add a top level row, use {@link #appendRow() appendRow()}.
+     * 
+     * @param parent
+     *            The row to which a new child will be added.
+     * @return A pointer to the newly created child row.
+     * @since 4.0.7
+     */
+    public TreeIter appendChild(TreeIter parent) {
+        final TreeIter child;
+
+        if (parent == null) {
+            throw new IllegalArgumentException("Use appendRow() to add a top level row");
+        }
+        checkIter(parent);
+
+        child = new TreeIter(this);
+
+        GtkTreeStore.append(this, child, parent);
+
+        return child;
+    }
+
+    /**
+     * Append a new row at the top level of this TreeStore. If what you want
+     * is to add a row as a child of an already existing row, you use
+     * {@link #appendChild(TreeIter) appendChild(parent)}.
+     * 
+     * @return A pointer to the newly created top level row.
+     * @since 4.0.7
+     */
+    public TreeIter appendRow() {
+        final TreeIter iter;
+
+        iter = new TreeIter(this);
+
+        GtkTreeStore.append(this, iter, null);
+
+        return iter;
+    }
+
+    /**
+     * Returns whether the given <code>row</code> has at least one child row.
+     * 
+     * <p>
+     * You can use {@link #iterChildren(TreeIter) iterChildren()} to get the
+     * actual children.
+     * 
+     * @return <code>true</code> if the specified row has one or more
+     *         children, <code>false</code> otherwise.
+     * @since 4.0.7
+     */
+    public boolean iterHasChild(TreeIter row) {
+        checkIter(row);
+        return GtkTreeModel.iterHasChild(this, row);
+    }
+
+    /**
+     * Get the children of the given <code>row</code>, if any.
+     * 
+     * <p>
+     * You can use the returned TreeIter to iterate on children rows as
+     * follows:
+     * 
+     * <pre>
+     * child = model.iterChildren(row);
+     * if (child == null) {
+     *     return;
+     * }
+     * 
+     * do {
+     *     // do something with child row
+     * } while (child.iterNext());
+     * </pre>
+     * 
+     * which works because iterating with a TreeIter will only iterate over
+     * the rows that are siblings, ie, are at the same level of the hierarchy.
+     * 
+     * @return A TreeIter pointing at the first child of this row, or
+     *         <code>null</code> if the row has no children.
+     * @since 4.0.7
+     */
+    public TreeIter iterChildren(TreeIter row) {
+        final TreeIter child;
+
+        checkIter(row);
+        child = new TreeIter(this);
+
+        if (GtkTreeModel.iterChildren(this, child, row)) {
+            return child;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Get the parent of the given <code>row</code>, assuming there is one.
+     * 
+     * @return The parent row, or <code>null</code> if this row has no parent.
+     * @since 4.0.7
+     */
+    public TreeIter iterParent(TreeIter row) {
+        final TreeIter parent;
+
+        checkIter(row);
+        parent = new TreeIter(this);
+
+        if (GtkTreeModel.iterParent(this, parent, row)) {
+            return parent;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Remove all elements from this TreeStore.
+     * 
+     * @since 4.0.7
+     */
+    public void clear() {
+        GtkTreeStore.clear(this);
+    }
+
+    public void setSortColumn(DataColumn column, SortType ordering) {
+        GtkTreeSortable.setSortColumnId(this, column.getOrdinal(), ordering);
+    }
+
+    /**
+     * Delete a row from the TreeStore. If there is another row after this
+     * <i>at this level</i> then <code>true</code> will be returned and the
+     * TreeIter will still be valid. Otherwise, <code>false</code> is returned
+     * and <code>row</code> is invalidated.
+     * 
+     * @since 4.0.7
+     */
+    public boolean removeRow(TreeIter row) {
+        return GtkTreeStore.remove(this, row);
+    }
+
+    /**
+     * Insert a new row in the TreeStore. The row will be placed as a child of
+     * <code>parent</code> at the <code>position</code> specified. If
+     * <code>parent</code> is <code>null</code> then the new row will be
+     * inserted at the top level of the TreeStore.
+     * 
+     * @since 4.0.7
+     */
+    public TreeIter insertRow(TreeIter parent, int position) {
+        final TreeIter iter;
+
+        if (position < 0) {
+            throw new IllegalArgumentException("position can't be negative");
+        }
+
+        iter = new TreeIter(this);
+
+        GtkTreeStore.insert(this, iter, parent, position);
+
+        return iter;
+    }
+
+    /**
+     * Insert a new row in the TreeStore. The empty row will be a child of
+     * <code>parent</code> and will be placed in front of the supplied
+     * <code>sibling</code>.
+     * 
+     * @since 4.0.7
+     */
+    public TreeIter insertRow(TreeIter parent, TreeIter sibling) {
+        final TreeIter iter;
+
+        iter = new TreeIter(this);
+
+        GtkTreeStore.insertBefore(this, iter, parent, sibling);
+
+        return iter;
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeView.java b/src/bindings/org/gnome/gtk/TreeView.java
new file mode 100644
index 0000000..ee03f33
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeView.java
@@ -0,0 +1,1096 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import java.util.Arrays;
+import java.util.List;
+import org.gnome.gdk.Rectangle;
+
+/**
+ * Display the data from a {@link TreeModel} in a tabular form. TreeViews are
+ * ubiquitous in most applications, being used to both output data in list
+ * form, as well as allowing the user to select one or more items from a list.
+ * TreeView is the view part of GTK's model-view-controller pattern list
+ * Widget, with one of the TreeModel subclasses supplying the underlying data
+ * model. <img src="TreeView.png" class="snapshot">
+ * 
+ * <p>
+ * The TreeView API is very powerful, but with that power comes considerable
+ * complexity. To build a working TreeModel backed TreeView you will need to
+ * follow the instructions presented in the documentation quite carefully. The
+ * remainder of this page discusses the presentation side of the API; see
+ * {@link DataColumn DataColumn} for a detailed overview of the contents side.
+ * 
+ * <p>
+ * A TreeView is composed of one or more vertical columns called
+ * {@link TreeViewColumn TreeViewColumn}s. Into these are packed
+ * {@link CellRenderer CellRenderer}s. A CellRenderer does the job of taking
+ * data from the underlying TreeModel and rendering it in the TreeViewColumn.
+ * There is a family of CellRenderers for different underlying data types, but
+ * you'll use CellRendererText almost exclusively.
+ * 
+ * <p>
+ * Let's assume we have a ListStore with a String DataColumn in it, ie
+ * 
+ * <pre>
+ * final ListStore model;
+ * final DataColumnString countryNameColumn;
+ * final TreeView view;
+ * final TreeSelection selection;
+ * TreeViewColumn vertical;
+ * CellRendererText text;
+ * 
+ * ...
+ * model = new ListStore(new DataColumn[] {
+ *     countryNameColumn,
+ *     ...
+ * }
+ * </pre>
+ * 
+ * Note that there is nothing that requires you to <i>populate</i> your model
+ * before building your TreeView. You can do that later - indeed, that might
+ * be the whole point of your application.
+ * 
+ * <p>
+ * You start creating your view by instantiating a TreeView and then using it
+ * to get TreeViewColumn instances:
+ * 
+ * <pre>
+ * view = new TreeView(model);
+ * vertical = view.appendColumn();
+ * vertical.setTitle("Country");
+ * </pre>
+ * 
+ * Now you construct a CellRenderer, specifying what TreeViewColumn it's going
+ * to be a part of, and then the most important part, specifying where its
+ * data is going to come from. This is the step that binds TreeView and
+ * TreeModel.
+ * 
+ * <pre>
+ * text = new CellRendererText(vertical);
+ * text.setText(countryNameColumn);
+ * </pre>
+ * 
+ * along with setting any other properties on the CellRenderer as necessary.
+ * And that's it! You will of course need to do this for each TreeViewColumn
+ * of information you wish to have showing in your TreeView. (We tend to find
+ * it easier if you reuse the TreeViewColumn and CellRenderer variable names;
+ * there is usually no real reason to keep a reference to them individually;
+ * otherwise you've got to come up with unique names for everything and that
+ * tends to make for ugly code).
+ * 
+ * <p>
+ * Dealing with the events generated on the TreeView is either straight
+ * forward or quite complicated, depending on what you are trying to
+ * accomplish. If you just need a callback when the user activates a row in
+ * the display, then the {@link TreeView.RowActivated} signal will do the
+ * trick fairly simply; see its documentation for an example. For anything
+ * else, you will need to use the {@link TreeSelection TreeSelection} helper
+ * class (every TreeView automatically has one). It has a
+ * {@link TreeSelection.Changed} signal which you hook up to which will tell
+ * you what row(s) are currently selected.
+ * 
+ * <pre>
+ * selection = view.getSelection();
+ * </pre>
+ * 
+ * <p>
+ * The design of the TreeView API is such that you can have more than one view
+ * for a given TreeModel, but we tend to only create TreeModels as the place
+ * to push the text that we wish displayed, so in general you'll have one
+ * TreeModel per TreeView.
+ * 
+ * <p>
+ * <i>We have departed a fair way from the method call sequence used in the
+ * underlying GTK library, in particular by assuming default behaviour and
+ * combining calls where possible. This is in an effort to make the TreeView
+ * API somewhat easier to learn, more appropriate in a Java context, and
+ * easier to use for the common cases which dominate its usage.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @author Vreixo Formoso
+ * @since 4.0.5
+ */
+public class TreeView extends Container
+{
+    protected TreeView(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new TreeView with an already established TreeModel as its
+     * data.
+     */
+    public TreeView(TreeModel store) {
+        super(GtkTreeView.createTreeViewWithModel(store));
+    }
+
+    /**
+     * Construct a new TreeView. If you use this constructor, you will need to
+     * call {@link #setModel(TreeModel) setModel()} before any data will be
+     * displayable!
+     */
+    public TreeView() {
+        super(GtkTreeView.createTreeView());
+    }
+
+    /**
+     * Set the TreeModel being used to source data for this TreeView. If a
+     * model has already been set, calling this will replace it.
+     * 
+     * @param store
+     *            a value of <code>null</code> will remove the data model
+     *            underlying this TreeView, leaving it unset for the present.
+     */
+    public void setModel(TreeModel store) {
+        GtkTreeView.setModel(this, store);
+    }
+
+    /**
+     * Get the TreeModel currently providing the data powering this TreeView
+     * Widget, or <code>null</code> if not yet set.
+     */
+    public TreeModel getModel() {
+        return GtkTreeView.getModel(this);
+    }
+
+    /**
+     * Create a new TreeViewColumn and add it to right-hand edge of this
+     * TreeView.
+     */
+    /*
+     * It is quite easy to screw up by creating a TreeViewColumn, configuring
+     * it and its CellRenderer, only to forget to add it to the TreeView. We
+     * get around this by making appendColumn() return a new TreeViewColumn.
+     * Nicely complements appendRow() returning a TreeIter in the TreeModels()
+     * too.
+     */
+    public TreeViewColumn appendColumn() {
+        final TreeViewColumn vertical;
+
+        vertical = new TreeViewColumn();
+
+        GtkTreeView.appendColumn(this, vertical);
+
+        return vertical;
+    }
+
+    /**
+     * Remove a tree view column from this TreeView.
+     */
+    public void removeColumn(TreeViewColumn column) {
+        GtkTreeView.removeColumn(this, column);
+    }
+
+    /**
+     * Set whether this TreeView has a header row at the top of the Widget
+     * showing the titles of each of the TreeViewColumns packed into it. The
+     * default is <code>true</code>, for headers to be visible.
+     */
+    public void setHeadersVisible(boolean setting) {
+        GtkTreeView.setHeadersVisible(this, setting);
+    }
+
+    /**
+     * Set whether the column titles in the header row can be clicked to
+     * change the sorting of the displayed data. While the default is
+     * <code>false</code> (since you frequently have the rows ordered the way
+     * they are for a reason and don't want to let the user be reordering the
+     * display and getting lost in the process), calling TreeViewColumn's
+     * {@link TreeViewColumn#setSortColumn(DataColumn) setSortColumn()} will
+     * make the headers clickable. Use this method after your column setup to
+     * turn it off [again].
+     */
+    public void setHeadersClickable(boolean setting) {
+        GtkTreeView.setHeadersClickable(this, setting);
+    }
+
+    /**
+     * Emitted when a row in the TreeView has been activated. Activation
+     * occurs when a row in the view is double-clicked, or when <b>
+     * <code>Space</code></b> or <b><code>Enter</code></b> are pressed while a
+     * row is selected.
+     * 
+     * <p>
+     * In general, you've got the TreeModel and especially its DataColumns
+     * visible, so to use <code>TreeView.RowActivated</code> you can just:
+     * 
+     * <pre>
+     * final TreeModel model;
+     * final DataColumnString column;
+     * 
+     * view.connect(new TreeView.RowActivated() {
+     *     public void onRowActivated(TreeView source, TreePath path, TreeViewColumn vertical) {
+     *         final TreeIter row;
+     * 
+     *         row = model.getIter(path);
+     * 
+     *         ... = model.getValue(row, column);
+     *     }
+     * });
+     * </pre>
+     * 
+     * Remember that TreeIters and TreePaths are not stable over changes to
+     * the model, so get on with using <code>path</code> right away.
+     * 
+     * <p>
+     * <code>TreeView.RowActivated</code> is perfectly sufficient for basic
+     * situations, but you may need to see TreeSelection's
+     * {@link TreeSelection.Changed} to for more complicated selection and
+     * activation expressions. In practise you'll use both.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.5
+     */
+    public interface RowActivated extends GtkTreeView.RowActivatedSignal
+    {
+        /**
+         * The useful parameter is usually <code>path</code> which can be
+         * converted into a TreeIter with your TreeModel's
+         * {@link TreeModel#getIter(TreePath) getIter()} allowing you to then
+         * lookup a particular value from the data model. You rarely need
+         * <code>vertical</code> but it can give you some indication in which
+         * column the click happened.
+         */
+        public void onRowActivated(TreeView source, TreePath path, TreeViewColumn vertical);
+    }
+
+    /**
+     * Hook up a <code>TreeView.RowActivated</code> handler.
+     */
+    public void connect(TreeView.RowActivated handler) {
+        GtkTreeView.connect(this, handler, false);
+    }
+
+    /**
+     * Cause a <code>TreeView.RowActivated</code> signal to be emitted for the
+     * given TreePath. The TreeViewColumn is optional; use <code>null</code>
+     * if you don't want to specify it.
+     * 
+     * @since 4.0.9
+     */
+    public void emitRowActivated(TreePath path, TreeViewColumn vertical) {
+        GtkTreeView.rowActivated(this, path, vertical);
+    }
+
+    /**
+     * Emitted when a row in the TreeView has been expanded, i.e. when its
+     * child nodes are shown. A row is expanded either by clicking in the
+     * little arrow near it, or by pressing the <code>+</code> key when a row
+     * is selected. Of course, a row can be only expanded when it has child
+     * rows, and so it can be only emitted when the TreeView is used with a
+     * hierarchical model such as {@link TreeStore}.
+     * 
+     * <p>
+     * In general, you've got the TreeModel and especially its DataColumns
+     * visible, so to use <code>TreeView.RowExpanded</code> you can just:
+     * 
+     * <pre>
+     * final TreeModel model;
+     * final DataColumnString column;
+     * 
+     * view.connect(new TreeView.RowExpanded() {
+     *     public void onRowExpanded(TreeView source, TreeIter iter, TreePath path) {
+     *         ... = model.getValue(iter, column);
+     *     }
+     * });
+     * </pre>
+     * 
+     * Remember that TreeIters and TreePaths are not stable over changes to
+     * the model, so get on with using <code>path</code> right away.
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.7
+     */
+    public interface RowExpanded
+    {
+        public void onRowExpanded(TreeView source, TreeIter iter, TreePath path);
+    }
+
+    /**
+     * Hook up a <code>TreeView.RowExpanded</code> handler.
+     * 
+     * @since 4.0.7
+     */
+    public void connect(TreeView.RowExpanded handler) {
+        GtkTreeView.connect(this, new RowExpandedHandler(handler), false);
+    }
+
+    /*
+     * This internal class is needed because the TreeIter passed to the
+     * handler does not have the model field properly set, so we need to set
+     * it before passing the TreeIter to the user.
+     */
+    private static class RowExpandedHandler implements GtkTreeView.RowExpandedSignal
+    {
+        private final TreeView.RowExpanded handler;
+
+        private RowExpandedHandler(TreeView.RowExpanded handler) {
+            super();
+            this.handler = handler;
+        }
+
+        public void onRowExpanded(TreeView source, TreeIter iter, TreePath path) {
+            iter.setModel(source.getModel());
+            handler.onRowExpanded(source, iter, path);
+        }
+    }
+
+    /**
+     * Check whether the given row is expanded, i.e. whether its children are
+     * shown.
+     * 
+     * @param path
+     *            The row we want to check.
+     * @return <code>true</code> if the row is expanded, <code>false</code> if
+     *         not.
+     * @since 4.0.7
+     */
+    public boolean rowExpanded(TreePath path) {
+        return GtkTreeView.rowExpanded(this, path);
+    }
+
+    /**
+     * Expand the given row, making its children visible to the user. This has
+     * no effect if the row has no child nodes. Of course, this is always the
+     * case if you use a ListStore model.
+     * 
+     * @param path
+     *            The row to expand.
+     * @param openAll
+     *            <code>true</code> to recursively expand all children,
+     *            <code>false</code> to expand only the given row.
+     * @return <code>true</code> if the path refers to a valid row, and it has
+     *         child nodes. <code>false</code> otherwise.
+     * @since 4.0.7
+     */
+    public boolean expandRow(TreePath path, boolean openAll) {
+        return GtkTreeView.expandRow(this, path, openAll);
+    }
+
+    /**
+     * Collapse the given row, thus hiding its children if the row was
+     * previously expanded.
+     * 
+     * @param path
+     *            The row to collapse.
+     * @since 4.0.7
+     */
+    public void collapseRow(TreePath path) {
+        GtkTreeView.collapseRow(this, path);
+    }
+
+    private TreeSelection selection;
+
+    /**
+     * Get the TreeSelection object corresponding to this TreeView. Every
+     * TreeView has a TreeSelection which is a utility instance allowing you
+     * to manipulate the state of the selected row(s) in the TreeView. This
+     * method gives you access to it.
+     */
+    public TreeSelection getSelection() {
+        if (selection == null) {
+            selection = GtkTreeView.getSelection(this);
+        }
+        return selection;
+    }
+
+    /**
+     * Set whether or not the built-in quick search capability will be enabled
+     * for this TreeView. If the user focuses the TreeView and starts typing
+     * characters a small popup Entry will appear and the characters entered
+     * will be used to interactively search through the list and will
+     * progressively select the row which is the closest match.
+     * 
+     * <p>
+     * Use {@link #setSearchColumn(DataColumn) setSearchColumn()} to indicate
+     * which data source in your TreeModel is actually what the interactive
+     * text search will seek through.
+     * 
+     * <p>
+     * The default is <code>true</code>, so this method is only called when
+     * you wish to disable type-ahead find.
+     */
+    public void setEnableSearch(boolean setting) {
+        GtkTreeView.setEnableSearch(this, setting);
+    }
+
+    /**
+     * Check if the built-in quick search capability is enabled for this
+     * TreeView. The default is <code>true</code>.
+     * 
+     * <p>
+     * Use {@link #setEnableSearch(boolean) setEnableSearch()} to disable or
+     * enable the search feature.
+     * 
+     * @return <code>true</code> if the quick search capability is enabled;
+     *         <code>false</code> otherwise.
+     */
+
+    public boolean getEnableSearch() {
+        return GtkTreeView.getEnableSearch(this);
+    }
+
+    /**
+     * Set the column in your TreeModel which will searched through if the
+     * user starts an interactive search. Ordinarily this can just be the
+     * DataColumnString of whichever column you want as the index, but if you
+     * have applied extensive formatting then you may need to supply an
+     * auxiliary column with the data in cleaner form (the use of
+     * DataColumnIntegers to provide sort order for verticals that are
+     * displaying formatting via
+     * {@link TreeViewColumn#setSortColumn(DataColumn) setSortColumn()} is
+     * analogous).
+     */
+    public void setSearchColumn(DataColumn column) {
+        GtkTreeView.setSearchColumn(this, column.getOrdinal());
+    }
+
+    /**
+     * Get the current Entry widget being used for the interactive search
+     * feature for this TreeView. If the built-in widget is being used for
+     * search, then <code>null</code> is returned.
+     */
+    public Entry getSearchEntry() {
+        return GtkTreeView.getSearchEntry(this);
+    }
+
+    /**
+     * Set an Entry to be used as an alternative to the default built-in popup
+     * used by the the interactive search. This is useful for occasions when
+     * you want to put the search Entry at some fixed location elsewhere in
+     * your UI.
+     * 
+     * <p>
+     * To reset the TreeView to use the built-in popup Entry, pass in
+     * <code>null</code>.
+     */
+    public void setSearchEntry(Entry entry) {
+        GtkTreeView.setSearchEntry(this, entry);
+    }
+
+    /**
+     * Set whether rubber banding is enabled in this TreeView.
+     * 
+     * <p>
+     * Rubber banding affects how selections work when the selection mode is
+     * set to {@link SelectionMode#MULTIPLE MULTIPLE}. When set to
+     * <code>true</code> then rubber banding will allow the user to select
+     * multiple rows with the mouse. Rubber banding is off by default.
+     */
+    public void setRubberBanding(boolean enable) {
+        GtkTreeView.setRubberBanding(this, enable);
+    }
+
+    /**
+     * Get the current status of the rubber banding property of the TreeView.
+     * See {@link #setRubberBanding(boolean) setRubberBanding()} for a
+     * detailed description of how rubber banding works.
+     */
+    public boolean getRubberBanding() {
+        return GtkTreeView.getRubberBanding(this);
+    }
+
+    /**
+     * Get the Adjustment currently being used for the horizontal aspect of
+     * this TreeView. If no horizontal adjustment is being used, then a
+     * <code>null</code> is returned. To set this value, see
+     * {@link #setHAdjustment(Adjustment) setHAdjustment()}.
+     */
+    public Adjustment getHAdjustment() {
+        return GtkTreeView.getHadjustment(this);
+    }
+
+    /**
+     * Set the Adjustment for the horizontal aspect of this TreeView. To fetch
+     * the current value of the horizontal adjustment aspect of this TreeView,
+     * use {@link #getHAdjustment() getHAdjustment()}.
+     */
+    public void setHAdjustment(Adjustment adjustment) {
+        GtkTreeView.setHadjustment(this, adjustment);
+    }
+
+    /**
+     * Get the Adjustment for the vertical aspect of this TreeView. If the
+     * vertical Adjustment has not been previously set, this value is
+     * <code>null</code>.
+     */
+    public Adjustment getVAdjustment() {
+        return GtkTreeView.getVadjustment(this);
+    }
+
+    /**
+     * Set the Adjustment for the vertical aspect of this TreeView. To fetch
+     * the current vertical adjustment aspect of this TreeView, see
+     * {@link #getVAdjustment() getVAdjustment()}.
+     */
+    public void setVAdjustment(Adjustment adjustment) {
+        GtkTreeView.setVadjustment(this, adjustment);
+    }
+
+    /**
+     * Set the fixed height mode for the TreeView. When set to true, all
+     * displayed rows in the TreeView are displayed with the same height. This
+     * can have the effect of speeding up the TreeView, although you will have
+     * to evaluate this in the specific circumstances particular to your
+     * application.
+     * 
+     * <p>
+     * To fetch the current height mode, see {@link #getFixedHeightMode()
+     * getFixedHeightMode()}.
+     * 
+     * @param enable
+     *            <code>true</code> if all rows in the TreeView are to be of
+     *            the same height; <code>false</code> otherwise. The default
+     *            is <code>false</code>.
+     */
+    public void setFixedHeightMode(boolean enable) {
+        GtkTreeView.setFixedHeightMode(this, enable);
+    }
+
+    /**
+     * Get the current fixed height mode for the TreeView. When set to true,
+     * all displayed rows in the TreeView are displayed with the same height.
+     * 
+     * <p>
+     * To set the current height mode, see
+     * {@link #setFixedHeightMode(boolean) setFixedHeightMode()}
+     * 
+     * @return <code>true</code> if all rows are to be of the same height;
+     *         <code>false</code> otherwise.
+     */
+    public boolean getFixedHeightMode() {
+        return GtkTreeView.getFixedHeightMode(this);
+    }
+
+    /**
+     * This signal is emitted when the user selects all the rows in the
+     * TreeView. This usually occurs, when the user presses the
+     * <code>Ctrl+A</code> key combination.
+     * 
+     * <p>
+     * This signal is particularly useful, when you wish to be able to offer
+     * the user an option to do some manipulation on the data, when all data
+     * is selected. For instance, upon selecting all the rows of the TreeView,
+     * in say, an email client, where each row represents an email, an option
+     * to mark all emails as read can be made to pop up.
+     * 
+     * <p>
+     * This signal should also be used with much care. The "Principle of Least
+     * Surprise" is rather easy to violate by misusing this signal.
+     * 
+     * @author Srichand Pendyala
+     * 
+     */
+    public interface SelectAll extends GtkTreeView.SelectAllSignal
+    {
+        public boolean onSelectAll(TreeView source);
+    }
+
+    /**
+     * Hook up a <code>TreeView.SelectAll</code> signal handler.
+     */
+    public void connect(TreeView.SelectAll handler) {
+        GtkTreeView.connect(this, handler, false);
+    }
+
+    /**
+     * Request that alternating colours be drawn in the background of the
+     * TreeView. You call this to let the theme engine know that the user
+     * would really be helped in comprehending the data you are presenting if
+     * the rows were drawn with alternating background colours so as to
+     * emphasize the difference between each line. Most themes honour this
+     * request.
+     * 
+     * <p>
+     * The default is <code>false</code>, not drawing alternating row colours.
+     */
+    public void setRulesHint(boolean setting) {
+        GtkTreeView.setRulesHint(this, setting);
+    }
+
+    /**
+     * Scroll the TreeView so that the cell specified by <code>path</code>,
+     * <code>vertical</code> is visible.
+     * 
+     * <p>
+     * Only one of <code>path</code> or <code>vertical</code> need to be
+     * specified if you only want to scroll in one dimension. If
+     * <code>path</code> is <code>null</code>, then it will only scroll
+     * horizontally; if no TreeViewColumn is specified in
+     * <code>vertical</code> (ie, likewise <code>null</code>), then only
+     * vertical scrolling will take place.
+     * 
+     * <p>
+     * This all assumes that you've placed the TreeView is within a
+     * ScrolledWindow to enable scrolling behaviour!
+     * 
+     * @param rowAlign
+     *            Determines where in the view the row specified by
+     *            <code>path</code> is placed, with <code>0.0f</code>
+     *            representing top, and <code>1.0f</code> representing bottom,
+     *            as usual. The constants in Alignment such as
+     *            {@link Alignment#CENTER CENTER} can be used.
+     * @param colAlign
+     *            Determines where in the view the column specified by
+     *            <code>vertical</code> will be placed; <code>0.0f</code> is
+     *            fully left, <code>1.0f</code> is fully right.
+     * @since 4.0.6
+     */
+    public void scrollToCell(TreePath path, TreeViewColumn vertical, float rowAlign, float colAlign) {
+        GtkTreeView.scrollToCell(this, path, vertical, true, rowAlign, colAlign);
+    }
+
+    /**
+     * Scroll the TreeView so that the cell specified by <code>path</code>,
+     * <code>vertical</code> is visible. This variant ignores alignment values
+     * and just scrolls the TreeView so that the cell specified is visible,
+     * closest to whichever edge it came in from, and doing nothing if the
+     * cell is already on screen.
+     * 
+     * <p>
+     * See the discussion about <code>path</code> or <code>vertical</code> in
+     * the other {@link #scrollToCell(TreePath, TreeViewColumn, float, float)
+     * scrollToCell()} method to learn how you can scroll in a single
+     * direction only if desired.
+     * 
+     * @since 4.0.6
+     */
+    public void scrollToCell(TreePath path, TreeViewColumn vertical) {
+        GtkTreeView.scrollToCell(this, path, vertical, false, 0.0f, 0.0f);
+    }
+
+    /**
+     * Set whether the TreeModel being shown by this TreeView can be reordered
+     * by dragging and dropping the rows. If this is turned on, no control is
+     * given over the ordering, so if you need to care about that you're
+     * probably going to need to manage drag and drop manually.
+     * 
+     * <p>
+     * The default is <code>false</code>.
+     * 
+     * <p>
+     * Incidentally, you can observe these changes by connecting to
+     * <code>TreeView.RowInserted</code> and <code>TreeView.RowDeleted</code>.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * TODO test that the signals mooted actually do get emitted when drag and
+     * drop re-ordering is done by the user when we get around to implementing
+     * them, and then turn those mentions in to links.
+     */
+    public void setReorderable(boolean setting) {
+        GtkTreeView.setReorderable(this, setting);
+    }
+
+    /**
+     * Expand all the rows in this TreeStore backed TreeView, making
+     * <i>all</i> children visible.
+     * 
+     * @since 4.0.7
+     */
+    public void expandAll() {
+        GtkTreeView.expandAll(this);
+    }
+
+    /**
+     * Collapse all the (child) rows in this TreeStore backed TreeView. Only
+     * top level rows will be visible.
+     * 
+     * @since 4.0.7
+     */
+    public void collapseAll() {
+        GtkTreeView.collapseAll(this);
+    }
+
+    /**
+     * Get all the TreeViewColumns for this TreeView.
+     * 
+     * @since 4.0.11
+     */
+    public TreeViewColumn[] getColumns() {
+        return GtkTreeView.getColumns(this);
+    }
+
+    /**
+     * Get the TreeViewColumn at the given position in the TreeView, with
+     * <code>0</code> being the left-most one.
+     * 
+     * <p>
+     * If they know they are going to need it later, most people just keep a
+     * reference to the TreeViewColumn around when they create it.
+     * 
+     * @since 4.0.8
+     */
+    public TreeViewColumn getColumn(int index) {
+        return GtkTreeView.getColumn(this, index);
+    }
+
+    /**
+     * Set the current keyboard focus to be at a specific path in the
+     * TreeView. This method selects the row at <code>path</code>, and as a
+     * result is often used to draw a user's attention to a particular place.
+     * 
+     * <p>
+     * If <code>vertical</code> is supplied, the specific TreeViewColumn
+     * indicated is selected. This is usually used in concert with setting
+     * <code>startEditing</code> to <code>true</code> which causes the
+     * TreeView to immediately start editing at the the specified row and
+     * column (assuming, of course, that that CellRenderer has been made
+     * mutable. See {@link CellRendererText#setEditable(boolean)
+     * setEditable()}).
+     * 
+     * @since 4.0.8
+     */
+    public void setCursor(TreePath path, TreeViewColumn vertical, boolean startEditing) {
+        GtkTreeView.setCursor(this, path, vertical, startEditing);
+    }
+
+    /**
+     * Get a TreePath indicating what row in the TreeView a given set of
+     * co-ordinates corresponds to.
+     * 
+     * <p>
+     * The position indicated by (<code>x</code>,<code>y</code>) is in
+     * <var>bin co-ordinates</var>. Usually you are working in the context of
+     * a handler hooked up to an Event and these values should be obtained
+     * from that Event.
+     * 
+     * <p>
+     * See also {@link #getColumnAtPos(int, int) getColumnAtPos()} for the
+     * complementary method to find out what vertical the co-ordinates
+     * correspond to.
+     * 
+     * <h2>Handling right-clicks</h2>
+     * 
+     * <p>
+     * It is common to create a context menu as a result of a right-click on a
+     * TreeView. Ordinarily, you would intercept the
+     * <code>Widget.ButtonPressEvent</code> signal and then prepare your Menu
+     * in the handler there, quite reasonably expecting that the row that you
+     * have right-clicked on would be selected. Unfortunately, if you hook up
+     * to that signal your code will run before the default handler and the
+     * <i>previously</i> selected row will still be selected while your
+     * handler runs. This is annoying. It is the default
+     * <code>Widget.ButtonPressEvent</code> handler which selects the new row,
+     * so you have to manually select it yourself before acting on the
+     * right-click. It is <code>getPathAtPos()</code> which gives you the
+     * ability to do so:
+     * 
+     * <pre>
+     * view.connect(new Widget.ButtonPressEvent() {
+     *     public boolean onButtonPressEvent(Widget source, EventButton event) {
+     *         final int x, y;
+     *         final TreePath path;
+     *         final TreeSelection selection;
+     * 
+     *         if (event.getButton() != MouseButton.RIGHT) {
+     *             return false;
+     *         }
+     * 
+     *         x = (int) event.getX();
+     *         y = (int) event.getY();
+     *         path = view.getPathAtPos(x, y);
+     * 
+     *         selection = view.getSelection();
+     *         selection.selectRow(path);
+     * 
+     *         // and now pop your context menu, doing
+     *         // something with the row as appropriate.
+     * 
+     *         return true;
+     *     }
+     * });
+     * </pre>
+     * 
+     * @return Will return <code>null</code> if the passed in co-ordinates do
+     *         not correspond to a row in the TreeView.
+     * @since 4.0.9
+     */
+    public TreePath getPathAtPos(int x, int y) {
+        final TreePath[] path;
+        final boolean result;
+
+        path = new TreePath[1];
+
+        result = GtkTreeView.getPathAtPos(this, x, y, path, null, null, null);
+
+        if (result) {
+            return path[0];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Figure out which TreeViewColumn a given event's co-ordinates correspond
+     * to. See {@link #getPathAtPos(int, int) getPathAtPos()} for a detailed
+     * discussion.
+     * 
+     * <p>
+     * <i>In native GTK, this is implemented as an out parameter on the same
+     * function that powers <code>getPathAtPos()</code>, but we've given it a
+     * more coherent name here.</i>
+     * 
+     * @since 4.0.9
+     */
+    /*
+     * This does not match the completion style we have elsewhere in
+     * java-gnome where we use the return to differentiate the various
+     * out-parameters. That is bad, but diverging from getPathAtPos() to
+     * getAtPosPath() seems very distasteful. This is the less used code path.
+     */
+    public TreeViewColumn getColumnAtPos(int x, int y) {
+        final TreeViewColumn[] column;
+        final boolean result;
+
+        column = new TreeViewColumn[1];
+
+        result = GtkTreeView.getPathAtPos(this, x, y, null, column, null, null);
+
+        if (result) {
+            return column[0];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Get a Rectangle describing the area used by the CellRenderer to draw
+     * the cell at the position described by the row <code>path</code> in the
+     * column <code>column</code>. The Rectangle will be in tree coordinates.
+     * 
+     * <p>
+     * If path points to a row not currently being displayed, the
+     * <code>y</code> and <code>height</code> attributes of the rectangle will
+     * be <code>0</code>.
+     * 
+     * <p>
+     * Note that taking the over a row's Rectangles widths, or over all rows'
+     * heights, would not cover the entire tree; there can be extra pixels of
+     * padding in between rows, etc.
+     * 
+     * <p>
+     * <i>This method is only works if the TreeView has already been
+     * realized.</i>
+     * 
+     * @since 4.0.17
+     */
+    public Rectangle getCellArea(TreePath path, TreeViewColumn column) {
+        final Rectangle rectangle;
+
+        rectangle = new Rectangle(0, 0, 0, 0);
+        GtkTreeView.getCellArea(this, path, column, rectangle);
+
+        return rectangle;
+    }
+
+    /**
+     * Check whether the area where the mouse is curently over is part of the
+     * TreeView and is valid for a possible tooltip.
+     * 
+     * This methods takes the x, y and keyboardMode values that are supplied
+     * from the {@link QueryTooltip#onQueryTooltip} method.
+     * 
+     * When this method returns false it is recommended to also return false
+     * in the QueryTooltip handler to not show the tooltip.
+     * 
+     * When this returns true you can use either or both
+     * {@link #getTreeIterFromTooltipContext(int, int, boolean, org.gnome.gtk.TreeModel)
+     * getTreeIterFromTooltipContext()} and
+     * {@link #getTreePathFromTooltipContext(int, int, boolean)
+     * getTreePathFromTooltipContext()} to retrieve content from your model
+     * and bind the tooltip to either the row or the cell with either of
+     * {@link #setTooltipRow(org.gnome.gtk.Tooltip, org.gnome.gtk.TreePath)
+     * setTooltipRow()} and
+     * {@link #setTooltipCell(org.gnome.gtk.Tooltip, org.gnome.gtk.TreePath, org.gnome.gtk.TreeViewColumn, org.gnome.gtk.CellRenderer)
+     * setTooltipCell()}.
+     * 
+     * @since 4.1.3
+     */
+    /*
+     * This methods calls the gtk_tree_view_get_tooltip_context method which
+     * has three out-parameters. However none of those are relevant for here
+     * when we just want to know whether a tooltip is possible.
+     * 
+     * This method has been split up for better control.
+     */
+    public boolean hasTooltipContext(int x, int y, boolean keyboardMode) {
+        int[] x1 = {
+            x
+        };
+        int[] y1 = {
+            y
+        };
+
+        return GtkTreeView.getTooltipContext(this, x1, y1, keyboardMode, null, null, null);
+    }
+
+    /**
+     * Retrieve the TreeIter from the row where the mouse is currently over
+     * for a possible tooltip or null if there isn't any row under the mouse.
+     * 
+     * The values for x, y and keyboardMode should all come straight from the
+     * supplied values from {@link QueryTooltip#onQueryTooltip
+     * onQueryTooltip()} method.
+     * 
+     * @since 4.1.3
+     */
+    /*
+     * This method clls the gtk_tree_view_get_tooltip_context method which has
+     * three out-parameters. However of those model is the most useless since
+     * we already need it for the TreeIter. TreeIter and TreePath are the most
+     * interesting since we need those for getting values from the model
+     * (iter) and setting the tooltip to the rows and/or cells (path).
+     * 
+     * This one will however return the iter. And thus has been named for
+     * that.
+     */
+    public TreeIter getTreeIterFromTooltipContext(int x, int y, boolean keyboardMode, TreeModel model) {
+        final TreeIter iter;
+        final boolean result;
+        final TreeModel[] _model = new TreeModel[] {
+            model
+        };
+        final int[] _x = {
+            x
+        };
+        final int[] _y = {
+            y
+        };
+
+        iter = new TreeIter(model);
+
+        result = GtkTreeView.getTooltipContext(this, _x, _y, keyboardMode, _model, null, iter);
+
+        if (result) {
+            return iter;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Retrieve the TreePath from the row where the mouse is currently over
+     * for a possible tooltip or null if there isn't any row under the mouse.
+     * 
+     * The values for x, y and keyboardMode should all come straight from the
+     * supplied values from {@link QueryTooltip#onQueryTooltip } method.
+     * 
+     * @since 4.1.3
+     */
+    /*
+     * Similar to the method above but instead of retrieving the TreeIter we
+     * retrieve the TreePath.
+     */
+    public TreePath getTreePathFromTooltipContext(int x, int y, boolean keyboardMode) {
+        final boolean result;
+        final TreePath[] _path;
+
+        _path = new TreePath[1];
+        _path[0] = new TreePath();
+
+        final int[] _x = {
+            x
+        };
+        final int[] _y = {
+            y
+        };
+
+        result = GtkTreeView.getTooltipContext(this, _x, _y, keyboardMode, null, _path, null);
+
+        if (result) {
+            return _path[0];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the tooltip for the entire row.
+     * 
+     * This will force that the tooltip will remain shown on the screen while
+     * the mouse remains over the row.
+     * 
+     * @since 4.1.3
+     */
+    public void setTooltipRow(Tooltip tooltip, TreePath path) {
+        GtkTreeView.setTooltipRow(this, tooltip, path);
+    }
+
+    /**
+     * Set the tooltip for the current cell.
+     * 
+     * This will force that the tooltip will remain shown on the screen while
+     * the mouse remains over the current cell.
+     * 
+     * @since 4.1.3
+     */
+    public void setTooltipCell(Tooltip tooltip, TreePath path, TreeViewColumn column, CellRenderer cell) {
+        GtkTreeView.setTooltipCell(this, tooltip, path, column, cell);
+    }
+
+/**
+     * Set a column with full pango markup text to be used for the tooltips for
+     * each row.
+     * 
+     * You can set a column with text to be shows as tooltips for each row. Any
+     * pango markup will be parsed so you have to escape any '<' that isn't
+     * part of the markup.
+     * 
+     * This is mostly a convenience method that will set the tooltip handler
+     * and then set the tooltip text, with markup, from the designated column
+     * for the row.
+     * 
+     * @since 4.1.3
+     */
+    public void setTooltipColumn(TreeViewColumn column) {
+        // since C works with ordinal from enums we have to work around this..
+        List<TreeViewColumn> columns = Arrays.asList(GtkTreeView.getColumns(this));
+        GtkTreeView.setTooltipColumn(this, columns.indexOf(column));
+    }
+
+    /**
+     * Get the TreeViewColumn that is being used to retrieve text for the
+     * toolrips for each row.
+     * 
+     * @since 4.1.3
+     */
+    public TreeViewColumn getTooltipColumn() {
+        // since C works with ordinal from enums we have to work around this..
+        List<TreeViewColumn> columns = Arrays.asList(GtkTreeView.getColumns(this));
+        return columns.get(GtkTreeView.getTooltipColumn(this));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeViewColumn.java b/src/bindings/org/gnome/gtk/TreeViewColumn.java
new file mode 100644
index 0000000..d51a76b
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeViewColumn.java
@@ -0,0 +1,328 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/**
+ * A vertical visible column as presented in a {@link TreeView TreeView}
+ * Widget. A TreeViewColumn's primary role is to connect one or more
+ * CellRenderers to a vertical position in the tabular layout of a TreeView
+ * and then to assign which attributes of that CellRenderer are powered by
+ * what rows from the data TreeModel that will underlie the TreeView.
+ * 
+ * <p>
+ * You get a TreeViewColumn by calling TreeView's
+ * {@link TreeView#appendColumn() appendColumn()}.
+ * 
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ * @since 4.0.5
+ */
+/*
+ * At considerable odds with the underlying library, we have moved the logic
+ * relating to packing CellRenderers and mapping attributes to TreeModel
+ * columns over to the CellRenderer classes.
+ */
+public class TreeViewColumn extends Object implements CellLayout
+{
+    protected TreeViewColumn(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a new TreeViewColumn. This doesn't need to be publicly
+     * visible; you create one by appending a column to a TreeView with
+     * appendColumn()
+     */
+    protected TreeViewColumn() {
+        super(GtkTreeViewColumn.createTreeViewColumn());
+    }
+
+    /**
+     * Set the title to be used for this TreeViewColumn in the TreeView's
+     * header row. In addition to being descriptive, this title is what you
+     * click to cause this column to be the one that is sorting the TreeView
+     * [assuming you've enabled the columns to be sortable by calling the
+     * enclosing TreeView's {@link TreeView#setHeadersClickable(boolean)
+     * setHeadersClickable(true)} and this TreeViewColumn's
+     * {@link TreeViewColumn#setSortColumn(DataColumn) setSortColumn()}, and
+     * that the titles are visible in the first place, ie the header row
+     * hasn't been turned off via TreeView's
+     * {@link TreeView#setHeadersVisible(boolean) setHeadersVisible(false)}].
+     */
+    public void setTitle(String title) {
+        GtkTreeViewColumn.setTitle(this, title);
+    }
+
+    /**
+     * Gets the title of this TreeViewColumn. Please see
+     * {@link #setTitle(String) setTitle()} for further information about
+     * TreeViewColumn titles.
+     * 
+     * @since 4.0.8
+     */
+    public String getTitle() {
+        return GtkTreeViewColumn.getTitle(this);
+    }
+
+    /**
+     * Sets the visibility of the TreeViewColumn.
+     */
+    public void setVisible(boolean visible) {
+        GtkTreeViewColumn.setVisible(this, visible);
+    }
+
+    /**
+     * Returns whether the TreeViewColumn is visible or not. If it is visible,
+     * then the TreeView will show the column.
+     * 
+     * @since 4.0.17
+     */
+    public boolean getVisible() {
+        return GtkTreeViewColumn.getVisible(this);
+    }
+
+    /**
+     * Sets the widget in the header to be widget. If widget is null, then the
+     * header button is set with a Label set to the title of tree_column.
+     * 
+     * @since 4.0.17
+     */
+    public void setWidget(Widget widget) {
+        GtkTreeViewColumn.setWidget(this, widget);
+    }
+
+    /**
+     * Returns the Widget in the button on the column header. If a custom
+     * widget has not been set then null is returned.
+     * 
+     * @since 4.0.17
+     */
+    public Widget getWidget() {
+        return GtkTreeViewColumn.getWidget(this);
+    }
+
+    /**
+     * Set whether the column header allows itself to be clicked. The default
+     * is <code>false</code>, not to be clickable, also meaning that header
+     * won't take the keyboard focus either. Since calling
+     * {@link #setSortColumn(DataColumn) setSortColumn()} will set
+     * <var>clickable</var> to <code>true</code>, so you only need this for
+     * the case where you assign a sort order to a column, but don't want
+     * users to be able to change the sorting column or its order.
+     */
+    public void setClickable(boolean setting) {
+        GtkTreeViewColumn.setClickable(this, setting);
+    }
+
+    /**
+     * Set the DataColumn that will be used to sort this TreeViewColumn should
+     * sorting be enabled.
+     * 
+     * <p>
+     * Calling this also makes the TreeViewColumn <var>clickable</var>, but it
+     * does not automatically engage the sorting (maybe you only want sorting
+     * to be optional and only active if the user clicks a header, certainly
+     * if you've set sort information for many columns you will have to
+     * indicate explicitly which one is to be active first, etc). Use
+     * {@link #emitClicked() emitClicked()} to activate this column as the one
+     * doing the sorting.
+     * 
+     * <p>
+     * <b>Warning:</b><br/>
+     * This only works if the TreeModel being presented by this TreeView is
+     * <var>sortable</var>, that is, if that model implements TreeSortable.
+     * Since almost everything in GTK does so, you ordinarily don't need to
+     * worry about this. The one that doesn't is TreeModelFilter, so if you're
+     * using a filtered model make sure you wrap it in a TreeModelSort before
+     * adding it to the TreeView.
+     */
+    public void setSortColumn(DataColumn column) {
+        GtkTreeViewColumn.setSortColumnId(this, column.getOrdinal());
+    }
+
+    /**
+     * Activate this column's sorting by sending a click the TreeViewColumn
+     * header. Causes <code>TreeViewColumn.Clicked</code> to fire, but more
+     * importantly this causes this vertical to become the active column
+     * dictating the ordering of the TreeView as a whole (assuming the
+     * vertical is {@link #setClickable(boolean) setClickable(true)} and
+     * assuming a DataColumn has been set with
+     * {@link #setSortColumn(DataColumn) setSortColumn()} to indicate the
+     * ordering).
+     * 
+     * @since 4.0.8
+     */
+    public void emitClicked() {
+        GtkTreeViewColumn.clicked(this);
+    }
+
+    /**
+     * Set whether this TreeViewColumn will share in additional space
+     * available to the parent TreeView. Like Widgets packed into Containers,
+     * ordinarily a TreeViewColumn will be allocated the space it needs but no
+     * more, and the TreeView will be the size of the sum of these requests.
+     * If the TreeView is allocated space over and above this, however, then
+     * this additional space will be given to those TreeViewColumns with this
+     * property set to <code>true</code>.
+     * 
+     * <p>
+     * The default for new TreeViewColumns is <code>false</code>. The last
+     * (right-most) column is treated specially, however. Extra space given to
+     * the TreeView as a whole will automatically go to the last vertical
+     * column (ie, ignoring this being set <code>false</code>) unless one or
+     * more other columns have had <var>expand</var> set to <code>true</code>.
+     */
+    public void setExpand(boolean setting) {
+        GtkTreeViewColumn.setExpand(this, setting);
+    }
+
+    /**
+     * Set the horizontal alignment of the title (or custom Widget) within the
+     * header of this TreeViewColumn.
+     * 
+     * @param xalign
+     *            As with elsewhere in GTK, a value between <code>0.0f</code>
+     *            for left and <code>1.0f</code> for right alignment. The
+     *            constants in {@link Alignment} may serve.
+     * @since 4.0.6
+     */
+    public void setAlignment(float xalign) {
+        if ((xalign < 0.0) || (xalign > 1.0)) {
+            throw new IllegalArgumentException("xalign must be between 0.0 and 1.0");
+        }
+        GtkTreeViewColumn.setAlignment(this, xalign);
+    }
+
+    /**
+     * Permit the user to change the order of the columns in a TreeView by
+     * clicking on one of the column headers and dragging it to a new
+     * position. This can be useful for wide tables where a great deal of
+     * information is being presented and the user might want to have a
+     * different subset visible.
+     * 
+     * <p>
+     * Most of the time, however, the order of presentation of the columns is
+     * an integral part of your UI and you don't want the user messing with
+     * it, which is why the default is <code>false</code>. More than that,
+     * people don't much care for horizontal scrolling; if you are presenting
+     * so much data that reordering the columns would be necessary, perhaps
+     * you should rethink the way you are presenting things.
+     * 
+     * @since 4.0.6
+     */
+    public void setReorderable(boolean setting) {
+        GtkTreeViewColumn.setReorderable(this, setting);
+    }
+
+    /**
+     * Permit the user to change the width of the columns in a TreeView by
+     * clicking on the boundary of a column header and dragging it. Setting
+     * this <code>true</code> will implicitly set
+     * {@link TreeViewColumnSizing#GROW_ONLY GROW_ONLY}. On the other hand
+     * setting {@link TreeViewColumnSizing#AUTOSIZE AUTOSIZE} will implicitly
+     * disable resizing.
+     * 
+     * @since 4.0.6
+     */
+    public void setResizable(boolean setting) {
+        GtkTreeViewColumn.setResizable(this, setting);
+    }
+
+    /**
+     * Set the mode constant that will be used to determine the width
+     * behaviour of TreeViewColumns when data is changed in the model causing
+     * a CellRenderer to need to redraw a cell. Note that this works in
+     * conjunction with other sizing methods ({@link #setResizable(boolean)
+     * setResizable()}, {@link #setMinWidth(int) setMinWidth()},
+     * {@link #setFixedWidth(int) setFixedWidth()}, etc and there are quite a
+     * number of permutations available as a result.
+     * 
+     * <p>
+     * {@link TreeViewColumnSizing#GROW_ONLY GROW_ONLY} is the default.
+     * 
+     * @since 4.0.6
+     */
+    public void setSizing(TreeViewColumnSizing type) {
+        GtkTreeViewColumn.setSizing(this, type);
+    }
+
+    /**
+     * Sets the minimal width this column can shrink to. Works in all
+     * {@link TreeViewColumnSizing} variants.
+     * 
+     * @param width
+     *            Column width in pixel
+     * 
+     * @since 4.0.8
+     */
+    public void setMinWidth(int width) {
+        GtkTreeViewColumn.setMinWidth(this, width);
+    }
+
+    /**
+     * If (and only if) operating with the {@link TreeViewColumnSizing#FIXED
+     * FIXED} TreeViewSizing mode, this defines the fixed column width in
+     * pixels. If {@link #setMinWidth(int)} setMinWidth} or
+     * {@link #setMaxWidth(int)} have been called and the fixed width is
+     * outside these bounds Min- or MaxWidth take precedence.
+     * 
+     * <p>
+     * The fixed width can be overridden by the user if
+     * {@link #setResizable(boolean) setResizable()} has been set to
+     * <code>true</code>.
+     * 
+     * @param width
+     *            Column width in pixels
+     * 
+     * @since 4.0.8
+     */
+    public void setFixedWidth(int width) {
+        GtkTreeViewColumn.setFixedWidth(this, width);
+    }
+
+    /**
+     * Sets the maximum width this column can grow. Works in all
+     * {@link TreeViewColumnSizing} variants. If not set, the column growth is
+     * not limited.
+     * 
+     * @param width
+     *            Column width in pixels
+     * 
+     * @since 4.0.8
+     */
+    public void setMaxWidth(int width) {
+        GtkTreeViewColumn.setMaxWidth(this, width);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeViewColumnSizing.java b/src/bindings/org/gnome/gtk/TreeViewColumnSizing.java
new file mode 100644
index 0000000..6e6eaa9
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeViewColumnSizing.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants controlling the [re]sizing behaviour of TreeViewColumns in a
+ * TreeView.
+ * 
+ * @since 4.0.6
+ */
+public final class TreeViewColumnSizing extends Constant
+{
+    private TreeViewColumnSizing(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Columns will (only) get bigger in reaction to changes in data in the
+     * model. If new data is set into the model which requires more space to
+     * render, the column will get wider. Otherwise things will be left alone.
+     * This is the default.
+     */
+    public static final TreeViewColumnSizing GROW_ONLY = new TreeViewColumnSizing(
+            GtkTreeViewColumnSizing.GROW_ONLY, "GROW_ONLY");
+
+    /**
+     * Columns will resize both larger and smaller to accomodate any changes
+     * to the model. This is "cool" but is horribly inefficient on large
+     * datasets, where the cascade of size allocations will cause your
+     * TreeView to become really choppy.
+     * 
+     * <p>
+     * Choosing this column sizing method will implicitly set
+     * {@link TreeViewColumn#setResizable(boolean) setResizeable()} to
+     * <code>false</code>.
+     */
+    public static final TreeViewColumnSizing AUTOSIZE = new TreeViewColumnSizing(
+            GtkTreeViewColumnSizing.AUTOSIZE, "AUTOSIZE");
+
+    /**
+     * The column will be a predetemined width. The number of pixels wide is
+     * set with TreeViewColumn's {@link TreeViewColumn#setFixedWidth(int)
+     * setFixedWidth()}.
+     */
+    public static final TreeViewColumnSizing FIXED = new TreeViewColumnSizing(
+            GtkTreeViewColumnSizing.FIXED, "FIXED");
+}
diff --git a/src/bindings/org/gnome/gtk/TreeViewDropPosition.java b/src/bindings/org/gnome/gtk/TreeViewDropPosition.java
new file mode 100644
index 0000000..e1e0b6c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeViewDropPosition.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TreeViewDropPosition extends Constant
+{
+    private TreeViewDropPosition(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeViewGridLines.java b/src/bindings/org/gnome/gtk/TreeViewGridLines.java
new file mode 100644
index 0000000..d11abc1
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeViewGridLines.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TreeViewGridLines extends Constant
+{
+    private TreeViewGridLines(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/TreeViewMode.java b/src/bindings/org/gnome/gtk/TreeViewMode.java
new file mode 100644
index 0000000..35983eb
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/TreeViewMode.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TreeViewMode extends Constant
+{
+    private TreeViewMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/UIManager.java b/src/bindings/org/gnome/gtk/UIManager.java
new file mode 100644
index 0000000..6393912
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/UIManager.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class UIManager extends Object
+{
+    protected UIManager(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/UIManagerItemType.java b/src/bindings/org/gnome/gtk/UIManagerItemType.java
new file mode 100644
index 0000000..b0b87ce
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/UIManagerItemType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class UIManagerItemType extends Constant
+{
+    private UIManagerItemType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Unit.java b/src/bindings/org/gnome/gtk/Unit.java
new file mode 100644
index 0000000..92c8a93
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Unit.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants describing different units which are be used when giving the
+ * dimensions of a piece of paper. Used when getting dimensions from a
+ * {@link PaperSize}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class Unit extends Constant
+{
+    private Unit(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Size in "points", which are defined as 1/72<sup>nd</sup> of an inch,
+     * which works out to about 0.35 millimetres.
+     */
+    public static final Unit POINTS = new Unit(GtkUnit.POINTS, "POINTS");
+
+    /**
+     * Size in millimetres, which are 1/10<sup>th</sup> of a centimetre and
+     * 1/1000<sup>th</sup> of a metre.
+     */
+    public static final Unit MM = new Unit(GtkUnit.MM, "MM");
+
+    /**
+     * Size in "inches", America's pre-industrial age measuring unit. Roughly
+     * corresponds to the size of your big toe (the fact that there are 12
+     * inches to a foot seems a bit strange given that most of us have only 10
+     * toes).
+     * 
+     * <p>
+     * Interestingly, a "two by four" is a common description for a wooden
+     * beam used in construction, stemming from their having originally had a
+     * cross-section of 2 by 4 inches. Successive generations of profiteering
+     * forestry companies and unscrupulous builders have, however, cut margins
+     * and shortchanged customers to the point where a modern "two by four"
+     * you can buy at a lumber yard is barely a miserable 0.79 by 1.57 inches
+     * in cross-section. This, amazingly enough, is exactly 2 by 4
+     * centimetres.
+     * 
+     * <p>
+     * <i>Reports of a conspiracy to force the Americans to switch to metric
+     * are, obviously, completely baseless.</i>
+     */
+    public static final Unit INCH = new Unit(GtkUnit.INCH, "INCH");
+
+    /*
+     * What good is this?
+     */
+    public static final Unit PIXEL = new Unit(GtkUnit.PIXEL, "PIXEL");
+}
diff --git a/src/bindings/org/gnome/gtk/VBox.java b/src/bindings/org/gnome/gtk/VBox.java
new file mode 100644
index 0000000..43df0d4
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/VBox.java
@@ -0,0 +1,73 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Container which holds a variable number of Widgets in a single vertical
+ * row. All the children of this VBox are allocated the same width - that of
+ * the widest Widget packed into the VBox.
+ * 
+ * <p>
+ * A VBox is almost always the first thing (and only thing, of course) added
+ * to a new Window; doing so gives you a natural mechanism to layout the
+ * contents of a Window in logical sequence from Menu through to Buttons and
+ * Statusbar.
+ * 
+ * <p>
+ * All the methods you need add widgets to VBoxes and to manipulate their
+ * characteristics are on parent class Box. See its
+ * {@link Box#packStart(Widget) packStart()} as a good first step.
+ * 
+ * @author Andrew Cowie
+ * @see HBox
+ * @since 4.0.1
+ */
+public class VBox extends Box
+{
+    protected VBox(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Creates a new VBox.
+     * 
+     * @param homogeneous
+     *            If <code>true</code>, all children will be given equal space
+     *            allotments.
+     * @param spacing
+     *            the number of pixels to place (by default) between children.
+     */
+    public VBox(boolean homogeneous, int spacing) {
+        super(GtkVBox.createVBox(homogeneous, spacing));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/VButtonBox.java b/src/bindings/org/gnome/gtk/VButtonBox.java
new file mode 100644
index 0000000..5953cb3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/VButtonBox.java
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * Lay Buttons out horizontally with consistent spacing properties. See
+ * {@link ButtonBox}.
+ * 
+ * @author Nat Pryce
+ * @since 4.0.4
+ */
+public class VButtonBox extends ButtonBox
+{
+    public VButtonBox() {
+        this(GtkVButtonBox.createVButtonBox());
+    }
+
+    protected VButtonBox(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/VPaned.java b/src/bindings/org/gnome/gtk/VPaned.java
new file mode 100644
index 0000000..6122336
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/VPaned.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A {@link Paned Paned} where the two children are disposed vertically, i.e.
+ * one at the top of the other.
+ * 
+ * @see Paned
+ * @see HPaned
+ * @author Vreixo Formoso
+ * @since 4.0.7
+ */
+public class VPaned extends Paned
+{
+    protected VPaned(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new VPaned.
+     */
+    public VPaned() {
+        super(GtkVPaned.createVPaned());
+    }
+
+    /**
+     * Create a new VPaned and set its children.
+     * 
+     * <p>
+     * Each child will be added with the correspondent <code>add()</code>
+     * function.
+     */
+    public VPaned(Widget child1, Widget child2) {
+        super(GtkVPaned.createVPaned());
+        add1(child1);
+        add2(child2);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/VScale.java b/src/bindings/org/gnome/gtk/VScale.java
new file mode 100644
index 0000000..7add560
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/VScale.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A sliding Widget allowing you to represent data vertically and offer the
+ * user the ability to manipulate it. <img src="VScale.png" class="snapshot"
+ * style="padding-right: 30px;">
+ * 
+ * <p>
+ * Other than orientation, there's nothing different about VScale, so see
+ * {@link HScale} for full discussion of the details of the constructors.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.6
+ * 
+ */
+public class VScale extends Scale
+{
+    protected VScale(long pointer) {
+        super(pointer);
+    }
+
+    public VScale(int min, int max, int step) {
+        super(GtkVScale.createVScaleWithRange(min, max, step));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/VScrollbar.java b/src/bindings/org/gnome/gtk/VScrollbar.java
new file mode 100644
index 0000000..345c759
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/VScrollbar.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A vertical Scrollbar. These are just constituent parts of ScrolledWindows;
+ * you rarely if ever will need to talk to this Widget directly, but if you
+ * need access to it call ScrolledWindow's
+ * {@link ScrolledWindow#getVScrollbar() getVScrollbar()}.
+ * 
+ * @since 4.0.8
+ */
+public class VScrollbar extends Scrollbar
+{
+    protected VScrollbar(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new VScrollbar. Ordinarily you pass in the Adjustment object
+     * you plan to control this Scrollbar with, but if you pass
+     * <code>null</code> one will be created.
+     * 
+     * @since 4.0.17
+     */
+    public VScrollbar(Adjustment adj) {
+        super(GtkVScrollbar.createVScrollbar(adj));
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/VSeparator.java b/src/bindings/org/gnome/gtk/VSeparator.java
new file mode 100644
index 0000000..77d527f
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/VSeparator.java
@@ -0,0 +1,56 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A vertical line used to create visual distinction between Widgets laid out
+ * horizontally.
+ * 
+ * @see HSeparator
+ * 
+ * @author Sebastian Mancke
+ * @since 4.0.3
+ */
+public class VSeparator extends Separator
+{
+    protected VSeparator(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Constructs a new VSeparator
+     */
+    public VSeparator() {
+        super(GtkVSeparator.createVSeparator());
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Value.java b/src/bindings/org/gnome/gtk/Value.java
new file mode 100644
index 0000000..c02b1ad
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Value.java
@@ -0,0 +1,134 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * Wrap real Value class so that we can keep the visibility of its methods
+ * restricted. See {@link org.gnome.glib.Value Value} for all the details.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.4
+ */
+/*
+ * This is cut and paste hell, so be careful. Make sure unit tests in
+ * org.gnome.gtk do not import org.gnome.glib.Value.
+ */
+class Value extends org.gnome.glib.Value
+{
+    protected Value(long pointer, boolean proxy) {
+        super(pointer, proxy);
+    }
+
+    Value() {
+        super();
+    }
+
+    Value(String value) {
+        super(value);
+    }
+
+    protected String getString() {
+        return super.getString();
+    }
+
+    Value(int value) {
+        super(value);
+    }
+
+    protected int getInteger() {
+        return super.getInteger();
+    }
+
+    Value(boolean value) {
+        super(value);
+    }
+
+    protected boolean getBoolean() {
+        return super.getBoolean();
+    }
+
+    Value(float value) {
+        super(value);
+    }
+
+    Value(double value) {
+        super(value);
+    }
+
+    Value(org.gnome.glib.Object obj) {
+        super(obj);
+    }
+
+    Value(Pixbuf pixbuf) {
+        super(pixbuf);
+    }
+
+    /*
+     * Used by GObject, not GtkObject!
+     */
+    protected org.gnome.glib.Object getObject() {
+        return super.getObject();
+    }
+
+    protected Pixbuf getPixbuf() {
+        return super.getPixbuf();
+    }
+
+    protected float getFloat() {
+        return super.getFloat();
+    }
+
+    protected double getDouble() {
+        return super.getDouble();
+    }
+
+    Value(long value) {
+        super(value);
+    }
+
+    protected long getLong() {
+        return super.getLong();
+    }
+
+    Value(Constant value) {
+        super(value);
+    }
+
+    protected Constant getEnum() {
+        return super.getEnum();
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Viewport.java b/src/bindings/org/gnome/gtk/Viewport.java
new file mode 100644
index 0000000..ccc1373
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Viewport.java
@@ -0,0 +1,111 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * An adapter that allows a large Widget to only have a limited view be
+ * presented. Specifically, Viewports are for scrolling. Generally you don't
+ * need to create one of these yourself; you can add your Widget to a
+ * ScrolledWindow in one step with
+ * {@link ScrolledWindow#addWithViewport(Widget) addWithViewport()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.8
+ */
+public class Viewport extends Bin
+{
+    protected Viewport(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Construct a Viewport, specifying the Adjustment objects used to control
+     * the panning. If you're adding your child Widget to a ScrolledWindow,
+     * use its {@link ScrolledWindow#addWithViewport(Widget)
+     * addWithViewport()} instead of constructing a Viewport manually.
+     * 
+     * @since 4.0.8
+     */
+    public Viewport(Adjustment hadjustment, Adjustment vadjustment) {
+        super(GtkViewport.createViewport(hadjustment, vadjustment));
+    }
+
+    /**
+     * Get the Adjustment that is being used to drive the horizontal extent of
+     * the region of the child Widget being shown.
+     * 
+     * @since 4.0.8
+     */
+    public Adjustment getHAdjustment() {
+        return GtkViewport.getHadjustment(this);
+    }
+
+    /**
+     * Get the Adjustment that is being used to drive the vertical extent of
+     * the region of the child Widget being shown.
+     * 
+     * @since 4.0.8
+     */
+    public Adjustment getVAdjustment() {
+        return GtkViewport.getVadjustment(this);
+    }
+
+    /**
+     * Set the type of decoration you want around the Viewport.
+     * 
+     * <p>
+     * The default value is {@link ShadowType#IN IN}. This is quite unheplful,
+     * since you're usually using these transparently care of ScrolledWindow's
+     * <code>addWithViewport()</code> and ScrolledWindow's <i>also</i> have a
+     * ShadowType setting. So, as a convenience, if you created this Viewport
+     * that way, it will set this Viewport's ShadowType to
+     * {@link ShadowType#NONE NONE} to hide it, and you can just use a single
+     * call to ScrolledWindow's
+     * {@link ScrolledWindow#setShadowType(ShadowType) setShadowType()} on the
+     * local variable of that type you'll already have.
+     * 
+     * @since 4.0.15
+     */
+    public void setShadowType(ShadowType type) {
+        GtkViewport.setShadowType(this, type);
+    }
+
+    /**
+     * Get the decorationc currently set for this Viewport.
+     * 
+     * @since 4.0.15
+     */
+    public ShadowType getShadowType() {
+        return GtkViewport.getShadowType(this);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/WarningMessageDialog.java b/src/bindings/org/gnome/gtk/WarningMessageDialog.java
new file mode 100644
index 0000000..6ce350a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/WarningMessageDialog.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+/**
+ * A Dialog preconfigured to present a cautionary message to the user and to
+ * request confirmation of an action.
+ * 
+ * <p>
+ * Be careful not to overdo it - a Dialog popping up to confirm every last
+ * action is a) really annoying and worse b) will desensitize the user to the
+ * message - they will just start ignoring the Dialog and thus probably miss
+ * the chance to avoid something <i>really</i> important.
+ * 
+ * <p>
+ * This is a modal MessageDialog of type {@link MessageType#WARNING WARNING}
+ * with an "Ok" Button for the user to confirm they want to proceed, and a
+ * "Cancel" Button for them to abort the operation.
+ * 
+ * <p>
+ * 
+ * <pre>
+ * final Window w;
+ * final Dialog d;
+ * final ResponseType result;
+ * 
+ * d = new WarningMessageDialog(w, "You are about set off the fire alarm",
+ *         "Is that what you really want to do?");
+ * result = d.run();
+ * 
+ * d.hide();
+ * if (result == ResponseType.OK) {
+ *     // do dangerous action
+ * }
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class WarningMessageDialog extends MessageDialog
+{
+    public WarningMessageDialog(Window parent, String primary, String secondary) {
+        super(parent, true, MessageType.WARNING, ButtonsType.OK_CANCEL, primary);
+        if (secondary != null) {
+            this.setSecondaryText(secondary);
+        }
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Widget.java b/src/bindings/org/gnome/gtk/Widget.java
new file mode 100644
index 0000000..9cd4a37
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Widget.java
@@ -0,0 +1,1854 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.cairo.Context;
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventButton;
+import org.gnome.gdk.EventCrossing;
+import org.gnome.gdk.EventFocus;
+import org.gnome.gdk.EventKey;
+import org.gnome.gdk.EventMask;
+import org.gnome.gdk.EventMotion;
+import org.gnome.gdk.EventScroll;
+import org.gnome.gdk.EventVisibility;
+import org.gnome.gdk.RGBA;
+import org.gnome.gdk.Rectangle;
+import org.gnome.gdk.VisibilityState;
+import org.gnome.pango.FontDescription;
+
+/**
+ * The base class of all GTK Widgets. Graphical user interface toolkits have
+ * long been built up from individual controls and presentation mechanisms
+ * that are nested together. These elements are collectively called Widgets.
+ * Quite a lot of Widgets contain other Widgets; those are called
+ * {@link Container Container}s.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.0
+ */
+public abstract class Widget extends org.gnome.glib.Object
+{
+    protected Widget(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the name of the Widget, if it has one.
+     * 
+     * <p>
+     * Widgets can be identified by a name. You will most likely use this
+     * method a lot if you are using Glade. Every widget there is identified
+     * by a name. It is suggested to use sensible names; see
+     * {@link org.gnome.glade.Glade Glade} for a discussion of the
+     * implications of different nomenaclatures if that's what you are using,
+     * but in any case once you've retrieved the Widget with
+     * {@link org.gnome.glade.XML#getWidget(String) getWidget()} you won't
+     * really need to know its name anymore.
+     * 
+     * @since 4.0.11
+     */
+    public String getName() {
+        return GtkWidget.getName(this);
+    }
+
+    /**
+     * Every Widget has a name as an optional identifier.
+     * 
+     * <p>
+     * If using Glade then these names are used to retrieve widgets from the
+     * XML file. You can use this method you set the name of a Widget after it
+     * is retrieved.
+     * 
+     * <p>
+     * If you are using Glade then you will most likely never need this
+     * method, as you will have them defined in Glade. And if you're not using
+     * Glade, then you probably won't need this method either, since you can
+     * refer to Widgets you create by reference.
+     * 
+     * @since 4.0.11
+     */
+    public void setName(String name) {
+        GtkWidget.setName(this, name);
+    }
+
+    /**
+     * Cause this Widget to be activated. This has the same effect as when the
+     * user presses the <code>Return</code> key while the Widget is in focus.
+     * Calling this method on a {@link ToggleButton} will toggle its state,
+     * for example. Whatever signals would normally result from the user
+     * activating this Widget by hand will be emitted.
+     * 
+     * <p>
+     * Note that this method only works if this Widget is
+     * <var>activatable</var>; not all are, making this more an optional
+     * characteristic that some, but not all Widgets share.
+     * 
+     * <p>
+     * The Widget must already be showing on the screen for this method to
+     * work (ie, you must invoke {@link #show()} before you can
+     * <code>activate()</code> it). Parent Containers must also have been
+     * shown.
+     * 
+     * @throws UnsupportedOperationException
+     *             if the Widget is not activatable.
+     * @since 4.0.5
+     */
+    public void activate() {
+        if (!GtkWidget.activate(this)) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    /**
+     * Cause this Widget to be mapped to the screen. Flags a widget to be
+     * displayed. Any widget that isn't shown will not appear on the screen.
+     * 
+     * <p>
+     * There are a bunch of quirks you need to be aware of:
+     * 
+     * <ul>
+     * <li>You have to show the Containers containing a Widget, in addition to
+     * the Widget itself, before it will appear on the display.
+     * <li>When a toplevel Container is shown (ie, your {@link Window Window}
+     * ), it is immediately realized and mapped, and any Widgets within it
+     * that are shown are then realized and mapped.
+     * <li>You can't get information about the actual size that has been
+     * allocated to a Widget until it gets mapped to the screen.
+     * </ul>
+     * 
+     * <p>
+     * If you want to show all the widgets in a container, it's actually much
+     * easier to just call {@link #showAll()} on the container, rather than
+     * calling show manually one each individual Widget you've added to it.
+     * 
+     * @since 4.0.0
+     */
+    public void show() {
+        GtkWidget.show(this);
+    }
+
+    /**
+     * Cause this Widget, and any Widgets it contains, to be mapped to the
+     * screen. You typically call this on a {@link Window Window} after you've
+     * finished all the work necessary to set it up.
+     * <p>
+     * Quite frequently you also want to cause a Window to appear on the
+     * screen as well (ie, not be buried under a whole bunch of other
+     * applications' Windows), so calling Window's {@link Window#present()
+     * present()} is usually next.
+     * 
+     * <p>
+     * <i>Don't be surprised if this takes a few hundred milliseconds.
+     * Realizing and mapping all the zillion elements that ultimately make up
+     * a Window is one of the most resource intensive operations that GTK,
+     * GDK, Pango, your X server, and your kernel have to churn through.
+     * Sometimes, you just gotta wait.</i>
+     * 
+     * @since 4.0.0
+     */
+    public void showAll() {
+        GtkWidget.showAll(this);
+    }
+
+    /**
+     * Hide the Widget, making it invisible to the user. This can be used to
+     * "deactivate" sections of your UI, pending some activity or action that
+     * will cause it to be returned to the Window. Note that hiding does not
+     * remove it from its parent Container - it just makes the Widget
+     * invisible for the time being.
+     * 
+     * <p>
+     * You can call {@link #show()} to make a hidden Widget visible [again].
+     * 
+     * @since 4.0.4
+     */
+    public void hide() {
+        GtkWidget.hide(this);
+    }
+
+    /**
+     * Request that an area of the Widget to be redrawn. This will eventually
+     * result in an <code>Widget.Draw</code> signal being sent to the Widget
+     * asking it to [re]render the area given by the passed in co-ordinates.
+     * 
+     * <p>
+     * You only ever need this if doing your own custom Widget drawing, and
+     * then only sometimes.
+     * 
+     * <p>
+     * The redraw will not happen immediately, but rather during the next
+     * iteration of the main loop. Also, note that several such requests may
+     * be combined into a single <code>Widget.Draw</code> signal by the X
+     * server and GDK.
+     * 
+     * <p>
+     * Be aware that this will invalidate both this Widget <i>and</i> all its
+     * children. If you wish to limit your redrawing, you will be better off
+     * with one of the
+     * {@link org.gnome.gdk.Window#invalidate(org.gnome.gdk.Rectangle, boolean)
+     * invalidate()} calls in the underlying native resource.
+     * 
+     * @since 4.0.10
+     */
+    public void queueDrawArea(int x, int y, int width, int height) {
+        GtkWidget.queueDrawArea(this, x, y, width, height);
+    }
+
+    /**
+     * Request that the entire Widget be redrawn. See
+     * {@link #queueDrawArea(int, int, int, int) queueDrawArea()} for full
+     * details, but you only ever need this if doing your own drawing.
+     * 
+     * @since 4.0.10
+     */
+    public void queueDraw() {
+        GtkWidget.queueDraw(this);
+    }
+
+    /**
+     * Signal emitted when the mouse enters the Widget.
+     * 
+     * @author Andrew Cowie
+     * @author Davyd Madeley
+     * @since 4.0.2
+     */
+    public interface EnterNotifyEvent extends GtkWidget.EnterNotifyEventSignal
+    {
+        /**
+         * @since 4.0.7
+         */
+        public boolean onEnterNotifyEvent(Widget source, EventCrossing event);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.EnterNotifyEvent</code>
+     * signals on this Widget.
+     * 
+     * @since 4.0.2
+     */
+    public void connect(Widget.EnterNotifyEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when the mouse pointer leaves the Widget.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.7
+     */
+    public interface LeaveNotifyEvent extends GtkWidget.LeaveNotifyEventSignal
+    {
+        boolean onLeaveNotifyEvent(Widget source, EventCrossing event);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.LeaveNotifyEvent</code>
+     * signals.
+     * 
+     * @since 4.0.7
+     */
+    public void connect(Widget.LeaveNotifyEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when the <i>keyboard</i> focus leaves this Widget. Focus
+     * is a concept that is shared evenly between the widget toolkit and the
+     * window manager - which often becomes apparent if you're wondering
+     * <i>why</i> you have lost focus or regained it.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.2
+     */
+    public interface FocusOutEvent extends GtkWidget.FocusOutEventSignal
+    {
+        public boolean onFocusOutEvent(Widget source, EventFocus event);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.FocusOutEvent</code> events
+     * on this Widget
+     * 
+     * @since 4.0.2
+     */
+    public void connect(Widget.FocusOutEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when focus enters this Widget. See
+     * {@link Widget.FocusOutEvent}.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface FocusInEvent extends GtkWidget.FocusInEventSignal
+    {
+        public boolean onFocusInEvent(Widget source, EventFocus event);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.FocusInEvent</code> signals.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Widget.FocusInEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when a portion or all of the Widget has been exposed
+     * and needs [re]drawing. This can happen when a Widget is first realized
+     * to the screen or when part of it has come back from being obscured (by
+     * another Window or because it was offscreen).
+     * 
+     * <p>
+     * GNOME uses the excellent <a href="http://www.cairographics.org/">Cairo
+     * 2D graphics library</a> to draw its user interfaces, which we make
+     * available in java-gnome in package <code>org.freedesktop.cairo</code>.
+     * 
+     * <p>
+     * Code that does drawing needs to be written a little differently than
+     * code which just builds Widgets up into user interfaces. While we are
+     * accustomed to doing setting up various Widgets and packing them into
+     * Windows in our constructors, the one thing you cannot easily do there
+     * is graphics drawing. In order to be able to construct the Context used
+     * for drawing operations, Cairo needs the details of the [org.gnome.gdk]
+     * Display, Screen and Window it will be drawing to, and these are not
+     * available until the Widget has been realized and mapped. The
+     * <code>Widget.Draw</code> signal is emitted exactly at this point, and
+     * so that's when we have the environment we need to do our drawing.
+     * 
+     * <p>
+     * To do drawing with Cairo you need a Context, and GTK 3 conveniently
+     * provides you with one all ready to go:
+     * 
+     * <pre>
+     * foo.connect(new Widget.Draw() {
+     *     public boolean onDraw(Widget source, Context cr) {
+     *        // start drawing
+     *     }
+     * }
+     * </pre>
+     * 
+     * GTK makes calls to Context's <code>save()</code> and
+     * <code>restore()</code> around the <code>Widget.Draw</code> signal so
+     * you don't worry about having to reset the Context to its initial state.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.20
+     */
+    public interface Draw extends GtkWidget.DrawSignal
+    {
+        public boolean onDraw(Widget source, Context cr);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.Draw</code> signals on this
+     * Widget.
+     * 
+     * @since 4.0.20
+     */
+    public void connect(Widget.Draw handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Handler interface for key press events. While ordinarily the user
+     * <i>pressing</i> a key is generally more interesting (in terms of "what
+     * key stroke did we get"), it should be noted that by the conventions of
+     * modern graphical user interfaces, them <i>releasing</i> a key is when a
+     * program should take action if action is called for. For example, if
+     * they press and hold the <b><code>Enter</code></b> key while the pointer
+     * is over a Button, but then move the mouse off of that Button,
+     * subsequently releasing won't cause that Button to activate).
+     * 
+     * <p>
+     * When hooking this up, you'll probably be wanting the key that was hit.
+     * That's accomplished with Call <code>event.getKeyval()</code> as in:
+     * 
+     * <pre>
+     * foo.connect(new Widget.KeyPressEvent() {
+     *     public boolean onKeyPressEvent(Widget source, EventKey event) {
+     *         final Keyval key;
+     *         final ModifierType mod;
+     * 
+     *         key = event.getKeyval();
+     *         mod = event.getState();
+     * 
+     *         if (key == Keyval.Up) {
+     *             // go up!
+     *         }
+     *         return false;
+     *     }
+     * });
+     * </pre>
+     * 
+     * but see {@link org.gnome.gdk.Keyval Keyval} for a long discussion of
+     * the interpretation and use of keystrokes. Also note that reacting to a
+     * key stroke does not imply intercepting it; returning <code>false</code>
+     * and letting the default handlers in GTK carry on with things is usually
+     * what you want to do.
+     * 
+     * <p>
+     * The release half of this is {@link Widget.KeyReleaseEvent} as you might
+     * expect.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.3
+     */
+    public interface KeyPressEvent extends GtkWidget.KeyPressEventSignal
+    {
+        /**
+         * As with other event signals, returning <code>false</code> means "I
+         * didn't [fully] handle this signal, so proceed with the next (ie,
+         * usually the default) handler" whereas if you return
+         * <code>true</code> you mean "I have handled this event, and wish to
+         * stop further emission of the signal".
+         */
+        public boolean onKeyPressEvent(Widget source, EventKey event);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.KeyPressEvent</code> signals
+     * on this Widget. For general typing this is the one you want, but for
+     * critical events (like pressing <b><code>Enter</code></b> to activate a
+     * Button that is going to delete things, you might want to postpone
+     * action until <code>Widget.KeyReleaseEvent</code>.
+     * 
+     * @since 4.0.3
+     */
+    public void connect(Widget.KeyPressEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Handler interface for key release events. Calling
+     * {@link EventKey#getKeyval() getKeyval()} on the <code>event</code>
+     * parameter gets you to the constant representing the key that was
+     * actually typed.
+     * 
+     * @since 4.0.3
+     */
+    public interface KeyReleaseEvent extends GtkWidget.KeyReleaseEventSignal
+    {
+        /**
+         * (See the comment at
+         * {@link Widget.KeyPressEvent#onKeyPressEvent(Widget, EventKey)
+         * Widget.KeyReleaseEvent} to understand the return value)
+         */
+        public boolean onKeyReleaseEvent(Widget source, EventKey event);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Widget.KeyReleaseEvent</code>
+     * signals on this Widget
+     * 
+     * @since 4.0.3
+     */
+    public void connect(Widget.KeyReleaseEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Signal emitted when the user turns the mouse wheel.
+     * 
+     * <p>
+     * In most cases you are not interested in this Signal. If you only want
+     * to provide a Scrolling surface for a big Widget, {@link ScrolledWindow}
+     * is what you are looking for.
+     * 
+     * <p>
+     * This event can be useful, however, when you want to have more control
+     * of the scroll operations, specially when implemented custom Widgets.
+     * 
+     * <p>
+     * For example, to implement a zoom operation when the user turns the
+     * mouse wheel while pressing the <code>Ctrl</code> key, as many drawing
+     * applications do:
+     * 
+     * <pre>
+     * MyCustomWidget w;
+     * 
+     * w.connect(new Widget.ScrollEvent() {
+     *     public boolean onScrollEvent(Widget source, EventScroll event) {
+     *         // check if Ctrl key is pressed
+     *         if (event.getState().contains(ModifierType.CONTROL_MASK)) {
+     *             ScrollDirection dir = event.getDirection();
+     *             if (dir == ScrollDirection.UP) {
+     *                 // increment zoom
+     *             } else if (dir == ScrollDirection.DOWN) {
+     *                 // decrement zoom
+     *             }
+     *             // prevent the default scrolling if the Widget is added
+     *             // to a ScrolledWindow
+     *             return true;
+     *         }
+     *         return false;
+     *     }
+     * });
+     * </pre>
+     * 
+     * <p>
+     * It is also useful when your custom Widget can use the scroll events to
+     * perform some related operation. For example, when you scroll a ComboBox
+     * Widget it changes its active item. Of course, this is only useful when
+     * the operation can be seen as a scroll in the particular Widget context;
+     * it is not a good idea, for example, to close a Window or click a Button
+     * in response to a <code>Widget.SrollEvent</code>.
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.12
+     */
+    public interface ScrollEvent extends GtkWidget.ScrollEventSignal
+    {
+        public boolean onScrollEvent(Widget source, EventScroll event);
+    }
+
+    /**
+     * Hook up a <code>Widget.ScrollEvent</code> handler.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(Widget.ScrollEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Handler interface for mouse motion events. This event is emitted when
+     * the user moves the mouse over the Widget.
+     * 
+     * <p>
+     * Note that by default this event is disabled, even if you connect to it.
+     * You will need to {@link Widget#addEvents(EventMask) enable} it. If you
+     * want to receive all mouse motion events, you will need to supply the
+     * POINTER_MOTION mask. Note that it generates a big amount of events,
+     * typically tens of events per second, when the user moves the mouse over
+     * this Widget. If you only care about this event when a mouse button is
+     * pressed, any of LEFT_BUTTON_MOTION, MIDDLE_BUTTON_MOTION,
+     * RIGHT_BUTTON_MOTION or BUTTON_MOTION masks can be used instead.
+     * 
+     * <p>
+     * Many times, however, you are only interested on this events in some
+     * specific circunstances. For example, a drawing application may be
+     * interested on this when the user has selected a drawing tool (e.g. a
+     * pencil) and is actually drawing (e.g. by clicking the mouse). In such
+     * cases, enabling the event when needed, and disabling it when no more
+     * needed, is the best alternative. For example:
+     * 
+     * <pre>
+     * // hook up a handler to mouse button event.
+     * drawarea.connect(new Widget.MotionNotifyEvent() {
+     *     public boolean onMotionNotifyEvent(Widget source, EventMotion event) {
+     *         double x, y;
+     * 
+     *         x = event.getX();
+     *         y = event.getY();
+     * 
+     *         // draw something, x and y hold the mouse position
+     *     }
+     * });
+     * </pre>
+     * 
+     * @author Vreixo Formoso
+     * @since 4.0.15
+     */
+    /*
+     * FUTURE Hint motion events seem interesting, but more research is
+     * needed. FIXME Removed the enableEvents(),disableEvent() discussion
+     * pending more research, but the signature here is correct so this is now
+     * exposed.
+     */
+    public interface MotionNotifyEvent extends GtkWidget.MotionNotifyEventSignal
+    {
+        public boolean onMotionNotifyEvent(Widget source, EventMotion event);
+    }
+
+    /**
+     * Hook up a <code>Widget.MotionNotifyEvent</code> handler.
+     * 
+     * @since 4.0.15
+     */
+    public void connect(MotionNotifyEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Return the Container that this Widget is packed into. If the Widget
+     * doesn't have a parent, or you're already at a top level Widget (ie, a
+     * Window) then expect <code>null</code>.
+     * 
+     * @since 4.0.2
+     */
+    public Container getParent() {
+        return (Container) getPropertyObject("parent");
+    }
+
+    /**
+     * Set whether the Widget is greyed out or not. Being insensitive is the
+     * term GTK uses for a Widget that is still in its parent layout and still
+     * visible on the screen, but no longer responding to user input and
+     * de-emphasized on the screen.
+     * 
+     * <p>
+     * This is frequently used on Buttons and MenuItems to show that a given
+     * course of action is not currently available, but <i>would</i> be if the
+     * user did something different to the application. This can be a terrific
+     * hint to assist with discovery, but can be overdone; having everything
+     * insensitive and leaving the user no idea what to do next doesn't really
+     * help much.
+     * 
+     * <p>
+     * Beware that setting the sensitive property cascades down through the
+     * hierarchy of any children packed into this Widget in the same way that
+     * {@link #showAll() showAll()} is recursive. While this is usually great
+     * for <i>de</i>sensitizing an entire Window, the catch is that if you
+     * <i>re</i>sensitize that same Window <b>every</b> Widget within it will
+     * return to being sensitive; there's no "memory" of which might have been
+     * insensitive before. Thus if you heavily use a mix of sensitive and
+     * insensitive states in a Window and desensitize the whole thing while
+     * carrying out input validation in a worker thread, you will be left with
+     * the task of manually restoring the sensitive state of the various sub
+     * components of your UI should you need to return back to that Window to
+     * have the user re-enter something.
+     * 
+     * @param sensitive
+     *            <code>true</code> to have the Widget respond as normal, and
+     *            <code>false</code> to de-activate the Widget and have it
+     *            "grey out".
+     * @since 4.0.4
+     */
+    public void setSensitive(boolean sensitive) {
+        GtkWidget.setSensitive(this, sensitive);
+    }
+
+    /**
+     * Is this Widget set to be sensitive?
+     * 
+     * <p>
+     * The default is <code>true</code> of course.
+     * 
+     * <p>
+     * The utility of this is somewhat limited, since it only returns the
+     * boolean value of this Widget's <var>sensitive</var> property, whereas
+     * whether a Widget is displayed sensitive (normal) or insensitive (grayed
+     * out) depends on both this property and the settings in the parent
+     * Widgets.
+     * 
+     * @since 4.0.17
+     */
+    public boolean getSensitive() {
+        return GtkWidget.getSensitive(this);
+    }
+
+    /**
+     * Will this Widget be shown as sensitive or insensitive? This is based on
+     * both its <var>sensitive</var> property, and that of all its parents.
+     * 
+     * <p>
+     * You don't need to use this ordinarily (it's GTK that needs to know!)
+     * but if you're curious, well, here you go.
+     * 
+     * @since 4.0.17
+     */
+    public boolean isSensitive() {
+        return GtkWidget.isSensitive(this);
+    }
+
+    /**
+     * Tooltips are notes that will be displayed if a user hovers the mouse
+     * pointer over a Widget. They are usually used with controls such as
+     * Buttons and Entries to brief the user about that Widget's function.
+     * 
+     * @param text
+     *            The string of plain text (i.e. without any Pango markup) you
+     *            wish to be displayed when if the tooltip is popped up.
+     * @since 4.0.4
+     */
+    public void setTooltipText(String text) {
+        GtkWidget.setTooltipText(this, text);
+    }
+
+    /**
+     * Tooltips are notes that will be displayed if a user hovers the mouse
+     * pointer over a Widget. They are usually used with controls such as
+     * Buttons and Entries to brief the user about that Widget's function.
+     * 
+     * @param markup
+     *            The string with Pango markup you wish to be displayed when
+     *            if the tooltip is popped up.
+     * @since 4.0.7
+     */
+    public void setTooltipMarkup(String markup) {
+        GtkWidget.setTooltipMarkup(this, markup);
+    }
+
+    /**
+     * Get the underlying resource being used to power display of, and
+     * interaction with, this Widget.
+     * 
+     * <p>
+     * <b>If you're looking for the top Window in a Widget hierarchy, see</b>
+     * {@link #getToplevel() getToplevel()}. This method is to get a reference
+     * to the lower level GDK mechanisms used by this Widget, not to navigate
+     * up a hierarchy of Widgets to find the top-level Window they are packed
+     * into.
+     * 
+     * <p>
+     * If what you need are the event handling facilities that go with Widgets
+     * that have their own native resources, consider creating an
+     * {@link EventBox EventBox} and putting this Widget into it.
+     * 
+     * <p>
+     * While it is best to wait until the Widget is mapped to screen and user
+     * visible before manipulating underlying properties, there are rare cases
+     * when you need the [org.gnome.gdk] Window to be not-<code>null</code>
+     * before then; if so, you can call {@link #realize() realize()}.
+     * 
+     * <p>
+     * <i>If you call this in a class where you're building Windows, then you
+     * will probably end up having to use the fully qualified name</i>
+     * <code>org.gnome.gdk.Window</code> <i>when declaring variables. That's
+     * an unavoidable consequence of the class mapping algorithm we used:
+     * <code>GdkWindow</code> is the name of the underlying type being
+     * returned, and so Window it is.</i>
+     * 
+     * @return the <code>org.gnome.gdk.Window</code> associated with this
+     *         Widget, or <code>null</code> if this Widget is (as yet) without
+     *         one.
+     * @since 4.0.4
+     */
+    public org.gnome.gdk.Window getWindow() {
+        return GtkWidget.getWindow(this);
+    }
+
+    /**
+     * Adjust the background colour being used when drawing this Widget. This
+     * leaves all other style properties unchanged.
+     * 
+     * @since 4.0.20
+     */
+    public void overrideBackground(StateFlags state, RGBA color) {
+        GtkWidget.overrideBackgroundColor(this, state, color);
+    }
+
+    /**
+     * Set the colour used for text rendered by this Widget. This is the
+     * foreground colour; to change the background colour behind text use
+     * {@link #overrideBackground(StateFlags, RGBA) overrideBackground()}.
+     * 
+     * @since 4.0.20
+     */
+    public void overrideColor(StateFlags state, RGBA color) {
+        GtkWidget.overrideColor(this, state, color);
+    }
+
+    /**
+     * Set the font used for text rendered by this Widget.
+     * 
+     * @since 4.0.20
+     */
+    public void overrideFont(FontDescription desc) {
+        GtkWidget.overrideFont(this, desc);
+    }
+
+    /**
+     * A signal providing notification that the Widget has been obscured or
+     * unobscured. To use this, go through the supplied <code>event</code>
+     * parameter to get to the VisibilityState as follows:
+     * 
+     * <pre>
+     * foo.connect(new Widget.VisibilityNotifyEvent() {
+     *     public boolean onVisibilityNotifyEvent(Widget source, EventVisibility event) {
+     *         VisibilityState state = event.getState();
+     *         if (state == VisibilityState.FULLY_OBSCURED) {
+     *            ...
+     *         }
+     *     }
+     *     return false;
+     * });
+     * </pre>
+     * 
+     * See {@link VisibilityState VisibilityState} for the constants
+     * describing the possible three possible changes to an underlying
+     * element's visibility. See also {@link Widget.UnmapEvent} for a
+     * discussion of how this can be used to actively toggle the presentation
+     * of a Window to the user.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.5
+     */
+    public interface VisibilityNotifyEvent extends GtkWidget.VisibilityNotifyEventSignal
+    {
+        /**
+         * Although this is an <var>event-signal</var>, this merely reports
+         * information coming from the underlying X11 windowing system. Since
+         * a window being obscured by another application's window is not
+         * something you can control (short of requesting the Window holding
+         * this Widget always be on-top), it's not entirely clear what good it
+         * would do to block further emission of this signal. Return
+         * <code>false</code>!
+         */
+        public boolean onVisibilityNotifyEvent(Widget source, EventVisibility event);
+    }
+
+    /**
+     * Connect a <code>Widget.VisibilityNotifyEvent</code> handler.
+     * 
+     * @since 4.0.5
+     */
+    /*
+     * VISIBILITY_NOTIFY is automatically set to receive this event.
+     */
+    public void connect(Widget.VisibilityNotifyEvent handler) {
+        GtkWidget.addEvents(this, EventMask.VISIBILITY_NOTIFY);
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when a Window becomes invisible. This happens in a
+     * variety of scenarios, notably when the Window is minimized, when you
+     * change workspaces, and as a Window is being destroyed.
+     * 
+     * <p>
+     * In combination with {@link Widget.VisibilityNotifyEvent}, this can be
+     * used to detect whether a Window is actually currently presented to the
+     * top of the stack and visible to the user:
+     * 
+     * <pre>
+     * private boolean up = false;
+     * ...
+     * final Window w;
+     * final Button b;
+     * ...
+     * w.connect(new Widget.VisibilityNotifyEvent() {
+     *     public boolean onVisibilityNotifyEvent(Widget source, EventVisibility event) {
+     *         if (event.getState() == VisibilityState.UNOBSCURED) {
+     *             up = true;
+     *         } else {
+     *             up = false;
+     *         }
+     *         return false;
+     *     }
+     * });
+     * 
+     * w.connect(new Widget.UnmapEvent() {
+     *     public boolean onUnmapEvent(Widget source, Event event) {
+     *         up = false;
+     *         return false;
+     *     }
+     * });
+     * </pre>
+     * 
+     * thus allowing you to do something like:
+     * 
+     * <pre>
+     * b.connect(new Button.Clicked() {
+     *     public void onClicked(Button source) {
+     *         if (up) {
+     *             w.hide();
+     *             up = false;
+     *         } else {
+     *             w.present();
+     *             up = true;
+     *         }
+     *     }
+     * });
+     * </pre>
+     * 
+     * to intelligently toggle the visibility of the Window.
+     * 
+     * <p>
+     * Note that you don't need <code>Widget.MapEvent</code> here because the
+     * the <code>Widget.VisibilityNotifyEvent</code> will be tripped if you
+     * come back to the workspace the Window is already on.
+     * 
+     * @author Andrew Cowie
+     * @author Ryan Lortie
+     * @since 4.0.5
+     */
+    public interface UnmapEvent extends GtkWidget.UnmapEventSignal
+    {
+        /**
+         * Although this is an <var>event-signal</var>, this merely reports
+         * information coming from the underlying X11 windowing system. It's
+         * information you can monitor, but don't try to block this signal.
+         * Return <code>false</code>!
+         */
+        boolean onUnmapEvent(Widget source, Event event);
+    }
+
+    /**
+     * Connect a <code>Widget.UnmapEvent</code> handler.
+     * 
+     * @since 4.0.5
+     */
+    public void connect(Widget.UnmapEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Does this Widget currently have the keyboard focus?
+     * 
+     * <p>
+     * This can be quite useful when one Widget takes action in a signal
+     * handler which changes the state of another Widget. Take for example two
+     * related Entry Widgets. The second Entry's <code>Entry.Changed</code>
+     * signal will fire when the first Entry's <code>Entry.Changed</code>
+     * handler calls <code>second.setText()</code>; if it changes the first
+     * Entry then you have an infinite loop on your hands. By checking for
+     * <var>has-focus</var> at the beginning of both handlers, then only the
+     * Widget that the user changed will carry out it's logic; the other will
+     * realize it doesn't have focus and can quickly pass.
+     * 
+     * @since 4.0.6
+     */
+    public boolean getHasFocus() {
+        return getPropertyBoolean("has-focus");
+    }
+
+    /**
+     * Get the Widget at the top of the container hierarchy to which this
+     * Widget belongs.
+     * 
+     * <p>
+     * It's is somewhat common to want to find the ultimately enclosing top
+     * level Window that this Widget belongs to. Assuming that the Widget has
+     * actually been packed into a Container hierarchy that tops out at a
+     * Window (or Dialog, etc) then that is what you'll get. So yes, you can
+     * do:
+     * 
+     * <pre>
+     * w = (Window) obj.getToplevel();
+     * </pre>
+     * 
+     * as you'll get a ClassCastException or NullPointerException if you're
+     * wrong about <code>obj</code> being in a Window yet.
+     * 
+     * <p>
+     * To manually walk up the hierarchy one level at a time, use
+     * {@link #getParent() getParent()}.
+     * 
+     * @return Will return <code>this</code> if the Widget isn't (yet) in a
+     *         hierarchy.
+     * @since 4.0.6
+     */
+    public Widget getToplevel() {
+        return GtkWidget.getToplevel(this);
+    }
+
+    /**
+     * The signal emitted when a Widget is hidden.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface Hide extends GtkWidget.HideSignal
+    {
+        public void onHide(Widget source);
+    }
+
+    /**
+     * Connect a <code>Widget.Hide</code> handler.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Widget.Hide handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Make this Widget have the keyboard focus for the Window it is within.
+     * 
+     * <p>
+     * Obviously, if this is going to actually have affect, this Widget needs
+     * to be <i>in</i> a Window. Furthermore, the Widget needs to be
+     * <i>able</i> to take input focus, that is, it must have the
+     * <var>can-focus</var> property set (which is inherent to the particular
+     * Widget subclass, not something you can change).
+     * 
+     * @since 4.0.6
+     */
+    public void grabFocus() {
+        GtkWidget.grabFocus(this);
+    }
+
+    /**
+     * Set the minimum size that will be requested by this Widget of its
+     * parent Container.
+     * 
+     * <p>
+     * A major feature of GTK is its adaptability in the face of different
+     * languages, fonts, and theme engines, with all of these factors
+     * impacting the number of pixels that will be necessary for drawing. The
+     * box packing model has each Widget request the size it calculates it
+     * needs at runtime of its parent. These requests flow up the Containers
+     * the Widget is packed into, with each Container collating the requests
+     * from its children. When it reaches the toplevel, GTK negotiates with
+     * the X server, and the result is the size allocation for the Window as a
+     * whole. The Window proceeds to inform each Container packed into it how
+     * much space it has been allocated, leaving it to the Containers to in
+     * turn allocate space to each of its children.
+     * 
+     * <p>
+     * The whole point of all this is that in general you are <b>not</b>
+     * supposed to interfere with this process. It is virtually impossible to
+     * calculate the correct size for a Widget on a given user's desktop ahead
+     * of time, so don't try. This method is here for the unusual cases where
+     * you need to force a Widget to be a size other than what the default
+     * request-allocation process results in.
+     * 
+     * <p>
+     * See {@link Requisition} and {@link Allocation} for further discussion
+     * of how the size-request/size-allocation process works and how you can
+     * get insight into it.
+     * 
+     * <p>
+     * A value of <code>-1</code> for either <code>width</code> or
+     * <code>height</code> will cause that dimension to revert to the
+     * "natural" size, that is, the size that would have been requested if
+     * you'd left things alone.
+     * 
+     * <p>
+     * Passing <code>0,0</code> is a special case, meaning "as small as
+     * possible". This will have varying results and may not actually have
+     * much effect.
+     * 
+     * <p>
+     * Incidentally, use {@link Window#setDefaultSize(int, int)
+     * setDefaultSize()} for top level Windows, as that method still allows a
+     * user to make the Window smaller than the specified default.
+     * 
+     * @since 4.0.6
+     */
+    public void setSizeRequest(int width, int height) {
+        if ((width < -1) || (height < -1)) {
+            throw new IllegalArgumentException("width and height need to be >= -1");
+        }
+        GtkWidget.setSizeRequest(this, width, height);
+    }
+
+    /*
+     * We cache our wrappers for the GtkRequisition and GtkAllocation structs
+     * so that we get the same Pointer object back if multiple calls are made
+     * to getRequisition() and getAllocation(), thus creating a Proxy like
+     * behaviour even though these are Boxeds. This avoids allocating
+     * duplicates.
+     */
+
+    /*
+     * This requisition will need to be removed when GTK3 arrives
+     */
+    private Requisition requisition;
+
+    private Allocation allocation;
+
+    /**
+     * Get the details of the rectangle that represents the size that the
+     * windowing system down to GTK on down to the parent containers of this
+     * Widget have allocated to it. Note that the Widget must already have
+     * been realized for the request-allocation cycle to have taken place (ie,
+     * the top level Window and all its children must have been
+     * <code>show()</code>n. In some circumstances the main loop may need to
+     * have iterated).
+     * 
+     * @since 4.0.6
+     */
+    public Allocation getAllocation() {
+        if (allocation == null) {
+            allocation = new Allocation();
+        }
+
+        GtkWidgetOverride.getAllocation(this, allocation);
+
+        return allocation;
+    }
+
+    /**
+     * Get the size that will be (is being) requested by this Widget.
+     * 
+     * <p>
+     * In addition to getting the Requisition object for this Widget, this
+     * method will also ask the Widget to actually calculate its requirements.
+     * This can be a relatively expensive operation as font metrics need to be
+     * worked out relative to the Display's physical characteristics (this
+     * implies that the request calculation won't have any effect if the
+     * Widget is not yet been FIXME to a Screen).
+     * 
+     * @since 4.0.6
+     */
+    public Requisition getRequisition() {
+        if (requisition == null) {
+            requisition = new Requisition();
+        }
+
+        GtkWidgetOverride.getRequisition(this, requisition);
+
+        return requisition;
+    }
+
+    /**
+     * Retreive the width that has been allocated to this Widget, in pixels.
+     * This is meant to be used by <code>Widget.Draw</code> handlers when they
+     * need to know their canvas size.
+     * 
+     * @since 4.1.1
+     */
+    public int getAllocatedWidth() {
+        return GtkWidget.getAllocatedWidth(this);
+    }
+
+    /**
+     * Retreive the height that has been allocated to this Widget. See also
+     * {@link #getAllocatedWidth() getAllocatedWidth()}.
+     * 
+     * @since 4.1.1
+     */
+    public int getAllocatedHeight() {
+        return GtkWidget.getAllocatedHeight(this);
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredWidthNatural() {
+        final int[] natural;
+
+        natural = new int[1];
+
+        GtkWidget.getPreferredWidth(this, null, natural);
+
+        return natural[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredWidthMinimum() {
+        final int[] minimum;
+
+        minimum = new int[1];
+
+        GtkWidget.getPreferredWidth(this, minimum, null);
+
+        return minimum[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredHeightMinimum() {
+        final int[] minimum;
+
+        minimum = new int[1];
+
+        GtkWidget.getPreferredHeight(this, minimum, null);
+
+        return minimum[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredHeightNatural() {
+        final int[] natural;
+
+        natural = new int[1];
+
+        GtkWidget.getPreferredHeight(this, null, natural);
+
+        return natural[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredHeightForWidthMinimum(int width) {
+        final int[] minimum;
+
+        minimum = new int[1];
+
+        GtkWidget.getPreferredHeightForWidth(this, width, minimum, null);
+
+        return minimum[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredHeightForWidthNatural(int width) {
+        final int[] natural;
+
+        natural = new int[1];
+
+        GtkWidget.getPreferredHeightForWidth(this, width, null, natural);
+
+        return natural[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredWidthForHeightMinimum(int height) {
+        final int[] minimum;
+
+        minimum = new int[1];
+
+        GtkWidget.getPreferredWidthForHeight(this, height, minimum, null);
+
+        return minimum[0];
+    }
+
+    /**
+     * @since 4.1.1
+     */
+    public int getPreferredWidthForHeightNatural(int height) {
+        final int[] natural;
+
+        natural = new int[1];
+
+        GtkWidget.getPreferredWidthForHeight(this, height, null, natural);
+
+        return natural[0];
+    }
+
+    /**
+     * Signal fired when the user clicks one of their mouse buttons.
+     * 
+     * <p>
+     * Typically, you will use this to do something specific on a mouse click,
+     * for example popping up a context menu in response to a "right-click"
+     * anywhere in Window <code>w</code>,
+     * 
+     * <pre>
+     * w.connect(new Widget.ButtonPressEvent() {
+     *     boolean onButtonPressEvent(Widget source, EventButton event) {
+     *         if (event.getButton() == MouseButton.RIGHT) {
+     *             // popup menu
+     *         }
+     *         return false;
+     *     }
+     * });
+     * </pre>
+     * 
+     * <p>
+     * Like all event signals, you only return <code>true</code> if you are
+     * intercepting this event and want to prevent the default handlers in GTK
+     * from running.
+     * 
+     * <p>
+     * The signal emitted when the user lets the button go is
+     * {@link Widget.ButtonReleaseEvent}.
+     * 
+     * <p>
+     * Note that this signal doesn't apply just to the user clicking on a
+     * Button Widget. Indeed, "left-click" on a Button will cause
+     * {@link Button.Clicked} to be emitted, and you should use that in
+     * preference for normal purposes.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface ButtonPressEvent extends GtkWidget.ButtonPressEventSignal
+    {
+        public boolean onButtonPressEvent(Widget source, EventButton event);
+    }
+
+    /**
+     * Hook up a <code>Widget.ButtonPressEvent</code> handler.
+     * 
+     * @since 4.0.6
+     */
+    /*
+     * Do we need to force the GDK event mask like we did with
+     * Widget.VisibilityNotifyEvent?
+     */
+    public void connect(Widget.ButtonPressEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when the user releases a pressed mouse button. See
+     * {@link Widget.ButtonPressEvent} for discussion of this set of event
+     * signals.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.6
+     */
+    public interface ButtonReleaseEvent extends GtkWidget.ButtonReleaseEventSignal
+    {
+        public boolean onButtonReleaseEvent(Widget source, EventButton event);
+    }
+
+    /**
+     * Hook up a <code>Widget.ButtonReleaseEvent</code> handler.
+     * 
+     * @since 4.0.6
+     */
+    public void connect(Widget.ButtonReleaseEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Whether the Widget can (is willing to) accept the keyboard input focus.
+     * There's no default, as such; Widgets able to take keyboard focus will
+     * (already) have it <code>true</code>, and others not. The
+     * <var>can-focus</var> property is mostly internal, but it is
+     * occasionally useful to use a widget that can focus in an environment
+     * where you don't want it to take input. Calling
+     * <code>setCanFocus(false)</code> will do the trick.
+     * 
+     * @since 4.0.6
+     */
+    public void setCanFocus(boolean setting) {
+        setPropertyBoolean("can-focus", setting);
+    }
+
+    /**
+     * Get the value of the <var>can-focus</var> property. See
+     * {@link #setCanFocus(boolean) setCanFocus()} and {@link #grabFocus()
+     * grabFocus()} for details.
+     * 
+     * @since 4.0.8
+     */
+    public boolean getCanFocus() {
+        return getPropertyBoolean("can-focus");
+    }
+
+    /**
+     * Whether this Widget is willing to be the default Widget. The
+     * <var>can-default</var> property, like <var>can-focus</var>, is mostly
+     * internal; while telling GTK that this Widget isn't the one that should
+     * activated on <b><code>Enter</code></b> isn't that useful, setting this
+     * <i>sometimes</i> has an effect on whether or not the theme will draw a
+     * dotted line (or other markup) around a Button to indicate that the
+     * Widget is the current default Widget.
+     * 
+     * <p>
+     * Normally, this setting is <code>false</code>, though
+     * <var>activatable</var> Widgets will already have it <code>true</code>.
+     * Disabling <var>can-default</var> will mean that a
+     * {@link #grabDefault() grabDefault()} on this Widget will be ignored.
+     * 
+     * @since 4.0.8
+     */
+    public void setCanDefault(boolean setting) {
+        setPropertyBoolean("can-default", setting);
+    }
+
+    /**
+     * Get the value of the <var>can-default</var> property. See
+     * {@link #setCanDefault(boolean) setCanDefault()} and
+     * {@link #grabDefault() grabDefault()} for details.
+     * 
+     * @since 4.0.8
+     */
+    public boolean getCanDefault() {
+        return getPropertyBoolean("can-default");
+    }
+
+    /**
+     * Make this Widget attempt to become the default. The default Widget is
+     * the one which is activated when the user presses <b><code>Enter</code>
+     * </b>.
+     * 
+     * <p>
+     * This will only work if the Widget is <var>activatable</var> (see
+     * {@link #activate() activate()}) and if the Widget has its
+     * <var>can-default</var> property enabled with
+     * {@link #setCanDefault(boolean) setCanDefault()}. The Widget also needs
+     * to have already been packed into a hierarchy which tops out at a
+     * Window.
+     * 
+     * <p>
+     * If you're reading this you may in fact be looking for
+     * {@link #grabFocus() grabFocus()} which affects where keyboard input is
+     * going, as opposed to this method which affects activation.
+     * 
+     * @since 4.0.8
+     */
+    public void grabDefault() {
+        GtkWidget.grabDefault(this);
+    }
+
+    /**
+     * Make this the current grabbed Widget. Interaction with other Widgets
+     * will be prevented. If this Widget is not sensitive, this call will do
+     * nothing.
+     * 
+     * <p>
+     * Note that being the current grabbed widget means mouse and keyboard
+     * events will not be delivered to other widgets, so use this with care.
+     * 
+     * @since 4.0.11
+     */
+    public void grabAdd() {
+        GtkWidget.grabAdd(this);
+    }
+
+    /**
+     * Removes the "grab" status from this Widget if it is currently grabbed,
+     * otherwise this does nothing. See {@link #grabAdd() grabAdd()}.
+     * 
+     * @since 4.0.11
+     */
+    public void grabRemove() {
+        GtkWidget.grabRemove(this);
+    }
+
+    /**
+     * The signal emitted when a Widget becomes visible on the screen.
+     * 
+     * <p>
+     * This can be used as an indication that your Window is no longer
+     * minimized. Connecting to {@link Widget.Draw} would probably tell you
+     * what you need to know, but if all you want to do is find out your app
+     * is [back] onscreen then <code>Widget.Draw</code> would be a bit heavy
+     * handed. Of course, if you are drawing anyway, then it's fine. See
+     * {@link Widget.UnmapEvent} for examples of other variations on the theme
+     * of tracking the state of your application.
+     * 
+     * <p>
+     * <i>The interaction between the GTK library we use, its underlying GDK
+     * resource management layer, and the the X windowing system which GDK
+     * wraps, is complex. Sometimes there is more than one way to do
+     * things.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.8
+     */
+    public interface MapEvent extends GtkWidget.MapEventSignal
+    {
+        /**
+         * Although this is an <var>event-signal</var>, this merely reports
+         * information coming from the underlying X11 windowing system. It's
+         * information you can monitor, but don't try to block this signal.
+         * Return <code>false</code>!
+         */
+        public boolean onMapEvent(Widget source, Event event);
+    }
+
+    /**
+     * Hook up a <code>Widget.MapEvent</code> signal handler.
+     * 
+     * @since 4.0.8
+     */
+    public void connect(Widget.MapEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * The signal emitted when the user presses the <b><code>Menu</code></b>
+     * key.
+     * 
+     * <p>
+     * This is usually used in conjunction with a
+     * <code>Widget.ButtonPressEvent</code> handler set up to intercept a
+     * right-click, with both handlers being written to call common code to
+     * populate and present a context menu.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.9
+     */
+    public interface PopupMenu extends GtkWidget.PopupMenuSignal
+    {
+        public boolean onPopupMenu(Widget source);
+    }
+
+    /**
+     * Hookup a <code>Widget.PopupMenu</code> handler.
+     * 
+     * @since 4.0.9
+     */
+    public void connect(Widget.PopupMenu handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Enable the given events. While most events are enabled by default, some
+     * need to be activated. Corresponding signal will document this
+     * procedure, if needed.
+     * 
+     * <p>
+     * Take care that events are actually received by the underlying GDK
+     * Window resource being used. Such resource is in many cases shared by
+     * several Widgets, so enabling or disabling an event on one of these can
+     * affect all Widgets. If that is a problem for you, {@link EventBox
+     * EventBox} Widget can be used to ensure only it is affected by this
+     * method.
+     * 
+     * @since 4.0.15
+     */
+    public void addEvents(EventMask events) {
+        GtkWidget.addEvents(this, events);
+    }
+
+    /**
+     * Reset the list of events for this Widget. You probably want
+     * {@link #addEvents(EventMask) addEvents()}. If you use this, you'll need
+     * to <code>or()</code> together all the events that this Widget needs to
+     * function.
+     * 
+     * @since 4.0.15
+     */
+    public void setEvents(EventMask events) {
+        GtkWidget.setEvents(this, events);
+    }
+
+    /**
+     * Cause the resources underlying the Widget to be assigned. Among other
+     * things, this will populate the [org.gnome.gdk] Window that backs this
+     * Widget.
+     * 
+     * <p>
+     * In general you don't want to be calling this. This is largely an
+     * internal method; while you can trigger realization manually you rarely
+     * need to. You <i>do</i> need to show the Widget with {@link #show()
+     * show()} (or better yet {@link #showAll() showAll()} on one of its
+     * parents) once you've built it.
+     * 
+     * <p>
+     * Almost anything that you would do that would invole you needing an
+     * [org.gnome.gdk] Window is best done in a <code>Widget.Draw</code>
+     * handler, at which point the Widget is already realized, mapped, and
+     * showing.
+     * 
+     * @since 4.0.16
+     */
+    public void realize() {
+        GtkWidget.realize(this);
+    }
+
+    /*
+     * Accessors for style properties. The primitive types are fairly straight
+     * forward, but the more complex derived types will take a bit of work.
+     * The underlying function takes a Value as an out-parameter, but you have
+     * to have initialized it to the right "type" first. Tricky.
+     */
+
+    /**
+     * Access a "style property" with an integral value.
+     * 
+     * @since 4.0.17
+     */
+    protected int getStylePropertyInteger(String name) {
+        final Value value;
+
+        value = new Value(0);
+
+        GtkWidget.styleGetProperty(this, name, value);
+
+        return value.getInteger();
+    }
+
+    /**
+     * Access a "style property" with a String value.
+     * 
+     * @since 4.0.17
+     */
+    protected String getStylePropertyString(String name) {
+        final Value value;
+
+        value = new Value("");
+
+        GtkWidget.styleGetProperty(this, name, value);
+
+        return value.getString();
+    }
+
+    /**
+     * Access a "style property" with a boolean value.
+     * 
+     * @since 4.0.17
+     */
+    protected boolean getStylePropertyBoolean(String name) {
+        final Value value;
+
+        value = new Value(true);
+
+        GtkWidget.styleGetProperty(this, name, value);
+
+        return value.getBoolean();
+    }
+
+    /**
+     * Access a "style property" with a float value.
+     * 
+     * @since 4.0.17
+     */
+    protected float getStylePropertyFloat(String name) {
+        final Value value;
+
+        value = new Value(0.0f);
+
+        GtkWidget.styleGetProperty(this, name, value);
+
+        return value.getFloat();
+    }
+
+    /**
+     * Access a "style property" with a double value.
+     * 
+     * @since 4.0.17
+     */
+    protected double getStylePropertyDouble(String name) {
+        final Value value;
+
+        value = new Value(0.0);
+
+        GtkWidget.styleGetProperty(this, name, value);
+
+        return value.getDouble();
+    }
+
+    /**
+     * Access a "style property" with a long value.
+     * 
+     * @since 4.0.17
+     */
+    protected long getStylePropertyLong(String name) {
+        final Value value;
+
+        value = new Value(0L);
+
+        GtkWidget.styleGetProperty(this, name, value);
+
+        return value.getLong();
+    }
+
+    /**
+     * Ask everything connected to this object to release its references. Use
+     * this in preference to Container's {@link Container#remove(Widget)
+     * remove()} if you don't need the Widget any more.
+     * 
+     * <p>
+     * <i>We didn't expose this for a long time in java-gnome; after all,
+     * memory management of both Java references and GObject Ref counts is
+     * handled automatically by the diabolical cunning of this most excellent
+     * library. It turns out, however, that this does not <code>free()</code>
+     * the GtkWidget's memory; it really only does what it says: ask other
+     * GtkWidget to drop whatever Refs they may be holding to this object.
+     * Thus if this GtkWidget is in a GtkContainer and you call</i>
+     * <code>destroy()</code> <i>the GtkContainer will drop its Refs to this
+     * GtkWidget thereby breaking its parent-child relationship.</i>
+     * 
+     * <p>
+     * <i>Note that Java's references remain, so the object will <b>not</b>,
+     * in fact, be eligable for finalizing until you drop all your references;
+     * ie, the Java side Proxy Object goes out of scope. Nevertheless calling
+     * this will speed up release of resources associated with a Widget, so
+     * it's a good idea. Once you've done so,</i> <code>finalize()</code>
+     * <i>will be traversed a short time later and the GObject will be
+     * released.</i>
+     * 
+     * @since 4.0.20
+     */
+    public void destroy() {
+        GtkWidget.destroy(this);
+    }
+
+    /**
+     * Signal handler for when a Widget requests that all other code holding
+     * references to it release those references. In Java-speak, that means if
+     * you have this object in a variable or structure of some kind,
+     * <code>null</code> it out to to release the strong reference to the
+     * object.
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.20
+     */
+    public interface Destroy extends GtkWidget.DestroySignal
+    {
+        /**
+         * Release any references you hold to the given <code>source</code>
+         * Widget.
+         */
+        public void onDestroy(Widget source);
+    }
+
+    /**
+     * Hook up a <code>Widget.Destroy</code> handler.
+     * 
+     * @since 4.0.20
+     */
+    public void connect(Widget.Destroy handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Signal fired when a Widget is given its size allocation.
+     * 
+     * @author Andrew Cowie
+     * @since 4.1.1
+     */
+    public interface SizeAllocate extends GtkWidget.SizeAllocateSignal
+    {
+        void onSizeAllocate(Widget source, Rectangle allocation);
+    }
+
+    /**
+     * Hook up a <code>Widget.SizeAllocate</code> handler.
+     * 
+     * @since 4.1.1
+     */
+    public void connect(Widget.SizeAllocate handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Does the Widget prefer that it be given height for a given width, or
+     * vice versa?
+     * 
+     * <p>
+     * Part of GTK 3's height-for-width geometry management system.
+     * 
+     * @return
+     */
+    public SizeRequestMode getRequestMode() {
+        return GtkWidget.getRequestMode(this);
+    }
+
+    /**
+     * Will this Widget be given any additional space that it's parent
+     * Container has? The default is <code>false</code> which means that as a
+     * child this Widget will be allocated its natural size reqeust, but not
+     * more.
+     * 
+     * <p>
+     * This is the <var>hexpand</var> property.
+     * 
+     * @since 4.1.1
+     */
+    public void setExpandHorizontal(boolean setting) {
+        GtkWidget.setHexpand(this, setting);
+    }
+
+    /**
+     * <p>
+     * This is the <var>vexpand</var> property.
+     * 
+     * @since 4.1.1
+     */
+    public void setExpandVertical(boolean setting) {
+        GtkWidget.setVexpand(this, setting);
+    }
+
+    /**
+     * Set the horizontal positioning of a Widget in its parent Container.
+     * 
+     * <p>
+     * This is the <var>halign</var> property.
+     * 
+     * <p>
+     * <i>This is part of how the GTK 2.x Alignment Widget has been
+     * replaced.</i>
+     * 
+     * @since 4.1.1
+     */
+    public void setAlignHorizontal(Align align) {
+        GtkWidget.setHalign(this, align);
+    }
+
+    /**
+     * Set the vertical positioning of a Widget in its parent Container.
+     * 
+     * <p>
+     * This is the <var>valign</var> property.
+     * 
+     * @since 4.1.1
+     */
+    public void setAlignVertical(Align align) {
+        GtkWidget.setValign(this, align);
+    }
+
+    /**
+     * Get the {@link StyleContext} of a Widget. You will be able to change
+     * the values of the style after getting this object.
+     * 
+     * @since 4.1.2
+     */
+    public StyleContext getStyleContext() {
+        return GtkWidget.getStyleContext(this);
+    }
+
+    /**
+     * Signal fired when requesting a tooltip.
+     * 
+     * When using the method you should return true to either display the
+     * tooltip or false when not to display the tooltip. You can decide
+     * whether to show it or not based on the x and y values that you receive
+     * from the method.
+     * 
+     * Note however that if keyboardMode is true x and y will be undefined.
+     * 
+     * You will also receive the {@link Tooltip} object where you can place
+     * the contents to show in the tooltip. This is the only way to receive a
+     * tooltip object to work with.
+     * 
+     * See {@link Tooltip} for more informtation.
+     * 
+     * @since 4.1.3
+     */
+    /*
+     * As stated in the Tooltip documentation, this is _only_ way to receive
+     * the tooltip object.
+     */
+    public interface QueryTooltip extends GtkWidget.QueryTooltipSignal
+    {
+        boolean onQueryTooltip(Widget source, int x, int y, boolean keyboardMode, Tooltip tooltip);
+    }
+
+    /**
+     * Connect a tooltip query to the widget.
+     * 
+     * This will cause the widget to be be monitored for motion and leave
+     * notifications. Also note that this cannot be turned off.
+     * 
+     * @since 4.1.3
+     */
+    /*
+     * Note that notion in the javadoc entry that mentions that the leave and
+     * motion notifications cannot be turned off. This is true even if you
+     * change the hasTooltip property to false. It changes something in the
+     * GdkWindow masks and simply cannot be undone at all.
+     */
+    public void connect(Widget.QueryTooltip handler) {
+        // needs to be set to true or tooltips won't be shown. Note that this
+        // cannot be turned off.
+        GtkWidget.setHasTooltip(this, true);
+        // and now connect the handler.
+        GtkWidget.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/WidgetHelpType.java b/src/bindings/org/gnome/gtk/WidgetHelpType.java
new file mode 100644
index 0000000..00ba3bf
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/WidgetHelpType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class WidgetHelpType extends Constant
+{
+    private WidgetHelpType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/Window.java b/src/bindings/org/gnome/gtk/Window.java
new file mode 100644
index 0000000..b0d262c
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/Window.java
@@ -0,0 +1,912 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright �� 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.icons.Helper;
+import org.freedesktop.icons.Icon;
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventConfigure;
+import org.gnome.gdk.Gravity;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gdk.Screen;
+import org.gnome.gdk.WindowState;
+import org.gnome.gdk.WindowTypeHint;
+
+/**
+ * The top level Widget that contains other Widgets. Typical examples are
+ * application windows, dialog boxes, and popup menus. <img src="Window.png"
+ * class="snapshot">
+ * 
+ * <p>
+ * It is common to invoke {@link Widget#hide() hide()} on a new top level
+ * Window immediately after instantiating it, as in:
+ * 
+ * <pre>
+ * w = new Window();
+ * w.hide();
+ * ...
+ * // construct Widgets to create user interface and add to w 
+ * ...
+ * w.showAll();
+ * </pre>
+ * 
+ * this prevents the Window from being drawn as a small empty square and then
+ * resizing one or more times as its component Widgets are added to create the
+ * desired user interface during the initial cycles of the main loop.
+ * 
+ * <p>
+ * <code>hide()</code> is also important when Windows are being closed; see
+ * the comments in the description of {@link Window.DeleteEvent
+ * Window.DeleteEvent}.
+ * 
+ * @author Andrew Cowie
+ * @author Srichand Pendyala
+ * @author Sebastian Mancke
+ * @since 4.0.0
+ */
+public class Window extends Bin
+{
+
+    protected Window(long pointer) {
+        super(pointer);
+        GtkWindowOverride.dropUserRef(this);
+    }
+
+    /**
+     * Create a new Window.
+     */
+    public Window() {
+        super(GtkWindow.createWindow(WindowType.TOPLEVEL));
+        GtkWindowOverride.dropUserRef(this);
+    }
+
+    /**
+     * Create a new Window of the specified type. In general you don't need to
+     * use this; see the comments in {@link org.gnome.gtk.WindowType
+     * WindowType}; in particular, {@link org.gnome.gtk.WindowType#POPUP
+     * POPUP} is <b>not</b> for dialog windows!
+     * 
+     * @since 4.0.0
+     */
+    public Window(WindowType type) {
+        super(GtkWindow.createWindow(type));
+        GtkWindowOverride.dropUserRef(this);
+    }
+
+    /**
+     * Sets the title that will be displayed in the Window's title bar.
+     * <p>
+     * The title of a Window is an important usability factor. It should help
+     * the user distinguish this Window from others they may have open - and
+     * that gets tough when many, many applications are running. The key is to
+     * get the most relevant information is first. Examples of good titles
+     * are:
+     * <ul>
+     * <li><b>Invoice.odt</b>
+     * <li><b>Invoice.odt - OpenOffice</b>
+     * <li><b>andrew at procyon:~/src</b>
+     * <li><b>Audio Configuration</b>
+     * </ul>
+     * 
+     * <p>
+     * This is important because the list of Windows titles the user is
+     * looking at may have been truncated with the result that you can't tell
+     * the difference between different Windows of the same application. For
+     * example, these are no good if you can only see the first 20 characters
+     * of the title:
+     * 
+     * <ul>
+     * <li><b>OpenOffice 2.0.4 brought to yo</b>u by the letter B! -
+     * Invoice.odt
+     * <li><b>OpenOffice 2.0.4 brought to yo</b>u by the letter B! -
+     * LoveLetter.odt
+     * </ul>
+     * 
+     * <p>
+     * Don't forget that Windows also have an icon, and that icon will show in
+     * the list too, so you don't even really need the application name -
+     * leaving more room for the details that help identify this Window
+     * uniquely.
+     * 
+     * @see <a
+     *      href="http://developer.gnome.org/projects/gup/hig/2.0/windows-primary.html#primary-window-titles">GNOME
+     *      Human Interface Guidelines</a>
+     * @since 4.0.0
+     */
+    public void setTitle(String title) {
+        GtkWindow.setTitle(this, title);
+    }
+
+    /**
+     * By default, Windows are decorated with a title bar,
+     * minimize/maximize/close buttons, a border, resize handles, etc. This
+     * isn't done by your program, though - it's automatically by the window
+     * manager which is a part of your desktop. Some window managers allow GTK
+     * to disable these decorations, creating a borderless window. If you set
+     * the decorated property to <code>false</code> using this method, GTK
+     * will do its best to convince the window manager not to decorate the
+     * Window.
+     * 
+     * <p>
+     * <ul>
+     * <li>You will have no problem creating undecorated Windows on a GNOME
+     * desktop.
+     * <li>Apparently, turning off decorations will not work if the Window is
+     * already visible on some systems. So if you're going to use
+     * <code>setDecorated(false)</code>, call it before invoking
+     * {@link Widget#show() show()} on the Window.
+     * </ul>
+     * 
+     * @since 4.0.0
+     */
+    public void setDecorated(boolean setting) {
+        GtkWindow.setDecorated(this, setting);
+    }
+
+    /**
+     * Sets the default size of a Window. If the Window's "natural" size (the
+     * size request resulting from the aggregate requests of all the Widgets
+     * contained in this Window) is larger than the default, the default will
+     * be ignored. The default size of a Window only affects the first time a
+     * Window is shown; if a Window is hidden and re-shown, it will remember
+     * the size it had prior to hiding, rather than using the default size.
+     * 
+     * <p>
+     * Depending on your needs, {@link #resize(int, int) resize()} could be
+     * more appropriate, especially if the Window is already realized.
+     * <code>resize()</code> changes the current size of the Window, rather
+     * than the size to be used on initial display which is what this method
+     * is for.
+     * 
+     * <p>
+     * You probably want to call this after you've done the bulk of your
+     * packing.
+     * 
+     * <p>
+     * Incidentally, Windows can't be 0x0; the minimum size is 1x1.
+     * 
+     * @param width
+     *            The default minimum width you'd like to set. A value of 0
+     *            will be silently bumped to 1. A value of -1 will unset any
+     *            previous default width setting.
+     * @param height
+     *            Same.
+     * @since 4.0.1
+     */
+    public void setDefaultSize(int width, int height) {
+        GtkWindow.setDefaultSize(this, width, height);
+    }
+
+    /**
+     * Set a new constraint for the position that the Window will be rendered
+     * on the screen. Note that this is not always honoured by window
+     * managers, but it's a good start.
+     * 
+     * <p>
+     * Somewhat unusually, if the new value for <code>position</code> is
+     * {@link WindowPosition#CENTER_ALWAYS CENTER_ALWAYS}, then this call will
+     * also result in the Window being moved to the new centered position.
+     * 
+     * @since 4.0.3
+     * @see WindowPosition
+     */
+    public void setPosition(WindowPosition position) {
+        GtkWindow.setPosition(this, position);
+    }
+
+    /**
+     * Request that the window manager to place the Window in the fullscreen
+     * state or return it to normal state.
+     * 
+     * <p>
+     * Note that you shouldn't assume the Window is definitely fullscreen (or
+     * restored) afterwards because other entities (e.g. the user or window
+     * manager itself) could toggle it again. Further, not all window managers
+     * honour requests to fullscreen windows. Be prepared for these
+     * eventualities.
+     * 
+     * @param setting
+     *            <code>true</code> to request fullscreen mode,
+     *            <code>false</code> to request that the window be returned to
+     *            normal management.
+     * @since 4.0.4
+     */
+    public void setFullscreen(boolean setting) {
+        if (setting) {
+            GtkWindow.fullscreen(this);
+        } else {
+            GtkWindow.unfullscreen(this);
+        }
+    }
+
+    /**
+     * This signal arises when a user tries to close a top level window. As
+     * you would expect, the default handler for this signal destroys the
+     * Window.
+     * 
+     * <p>
+     * If you want to prevent a Window from being closed, connect this signal,
+     * and return <code>true</code>. Often the reason to do this is to pop up
+     * a notification Dialog, for example asking you if you want to save an
+     * unsaved document. Another technique is reusing a Window: rather than
+     * going to all the trouble to create this Window again, you can just
+     * temporarily hide it by calling Widget's {@link Widget#hide() hide()}.
+     * 
+     * <p>
+     * Likewise, if you are going to take a long time to tear down the
+     * resources used by the Window or application as a whole (often the case
+     * when the user clicks on the <code>[X]</code> button in the window
+     * decorations), it is a good idea to call <code>hide()</code>
+     * immediately. Many window managers will popup a warning dialog asking
+     * you if you want to force-terminate the application if a window is
+     * perceived to be "unresponsive" to a close request. You can avoid this
+     * by simply hiding the Window while you clean up.
+     * 
+     * <p>
+     * <i>This signal is actually "delete-event" which lives on GtkWidget.
+     * That, however, is for implementation reasons in GTK because all the
+     * GdkEvents go to GtkWidget even though this particular signal only has
+     * to do with Windows. So, we expose it here.</i>
+     * 
+     * @author Andrew Cowie
+     * @author Devdas Bhagat
+     * @since 4.0.0
+     */
+    public interface DeleteEvent extends GtkWidget.DeleteEventSignal
+    {
+        public boolean onDeleteEvent(Widget source, Event event);
+    }
+
+    public void connect(DeleteEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+
+    /**
+     * Request that the Window be moved to the specified co-ordinates. As with
+     * other Window operations, the window manager running on the display may
+     * or may not service the request; in particular you sometimes find that
+     * initial placement is overridden by the window manager.
+     * 
+     * <p>
+     * <code>x</code> and <code>y</code> are in pixels.
+     * 
+     * <p>
+     * Chances are
+     * {@link org.gnome.gtk.Window#setPosition(org.gnome.gtk.WindowPosition)
+     * setPosition()} will do what you want more easily than manually moving
+     * the Window.
+     * 
+     * <p>
+     * <i>The co-ordinates <code>x</code>, <code>y</code> are with respect to
+     * the reference point specified by the "gravity" in effect for this
+     * Window; since the default is</i> {@link Gravity#NORTH_WEST NORTH_WEST}
+     * <i>, x and y mean what you want them to: horizontal and vertical
+     * distance of the top-left corner of the Window from the top-left corner,
+     * respectively.</i>
+     * 
+     * @since 4.0.4
+     */
+    public void move(int x, int y) {
+        GtkWindow.move(this, x, y);
+    }
+
+    /**
+     * Set the interpretation of co-ordinates passed to
+     * {@link #move(int, int)} and returned by {@link #getPositionX()
+     * getPosition()}.
+     * 
+     * <p>
+     * <i>The window manager specification has long been notorious for not
+     * actually being a spec; it's more a collection of guesses, assumptions,
+     * and outright lies. Unsurprisingly, then, even a window manager that
+     * wants to do the right thing can't get it right because there isn't
+     * actually a correct answer. Gravity is a case in point, apparently. You
+     * might as well consider that things are broken and stick with the
+     * default, NORTH_WEST. If you insist on using this anyway, keep in mind
+     * that users may experience widely varying results.</i>
+     * 
+     * @since 4.0.4
+     */
+    public void setGravity(Gravity gravity) {
+        GtkWindow.setGravity(this, gravity);
+    }
+
+    /**
+     * Get the position of the Window frame (x co-ordinate). This is relative
+     * to the Window's gravity setting; since the default is
+     * {@link Gravity#NORTH_WEST} this usually means horizontal distance from
+     * the top-left corner, which is the normal usage on X displays.
+     * 
+     * <p>
+     * <i>Apparently this is not entirely reliable; X itself does not provide
+     * an authoritative means to determine the dimensions of any decorations
+     * the window manager might have applied around a Window, and so GTK does
+     * its best to guess the necessary adjustments that "should work with sane
+     * window managers". We leave it as an exercise to the reader to define
+     * sanity.</i>
+     * 
+     * @since 4.0.4
+     */
+    public int getPositionX() {
+        int[] x = new int[1];
+        int[] y = new int[1];
+
+        GtkWindow.getPosition(this, x, y);
+
+        return x[0];
+    }
+
+    /**
+     * Get the position of the Window frame (y co-ordinate). See
+     * {@link #getPositionX()} for details.
+     * 
+     * @since 4.0.4
+     */
+    public int getPositionY() {
+        int[] x = new int[1];
+        int[] y = new int[1];
+
+        GtkWindow.getPosition(this, x, y);
+
+        return y[0];
+    }
+
+    /**
+     * Get the Screen that this Window is on.
+     */
+    public Screen getScreen() {
+        return GtkWindow.getScreen(this);
+    }
+
+    /**
+     * Request that this Window be kept on top of all other windows.
+     * 
+     * <p>
+     * Note that the request to apply the "keep above" state may be overridden
+     * or ignored by the window manager. Likewise, the user may toggle this
+     * state between the program requesting it and the program subsequently
+     * proceeding on the expectation that it is set. As a result you should
+     * not write code that assumes this request has been successful.
+     * 
+     * <p>
+     * The window manager specifications are fairly explicit that these
+     * settings are a user preference. In particular, "keep above" should not
+     * be used as a gimmick to attempt to draw attention to a Window.
+     * 
+     * <p>
+     * Usability note: while it always seems like such a good idea to put your
+     * favourite window on top of everything else, in practise this can pale.
+     * You will find that your current "favourite" changes frequently, and not
+     * being able to rely on the normal window management behaviour to bring
+     * whatever you are <i>now</i> working on over top of the Window you have
+     * kept above will quickly result in you being annoyed that you can't get
+     * rid if it. All the usual arguments against modal windows also apply.
+     * 
+     * <p>
+     * Since a proper window manager like <code>Metacity</code> gives you
+     * quick and immediate access to the "keep on top" mode via a right click
+     * on the Window's title bar decoration, you really only should need this
+     * on the rare occasions when you have turned off decorations. So yes,
+     * there are are legitimate uses for this, but they are few and far
+     * between.
+     * 
+     * @param setting
+     *            <code>true</code> to request keep above be on,
+     *            <code>false</code> to request normal behaviour.
+     * @since 4.0.4
+     */
+    public void setKeepAbove(boolean setting) {
+        GtkWindow.setKeepAbove(this, setting);
+    }
+
+    /**
+     * Request that this Window be behind all other windows showing on the
+     * desktop.
+     * 
+     * <p>
+     * You can call this before <code>show()</code>ing a Window, in which case
+     * the initial presentation will be behind other windows.
+     * 
+     * <p>
+     * The caveats and notes discussed in {@link #setKeepAbove(boolean)
+     * setKeepAbove()} apply here. Once again, while there are legitimate uses
+     * for this method, please think about the impact on user's overall
+     * desktop experience before employing it.
+     * 
+     * 
+     * @param setting
+     *            <code>true</code> to request this Window be kept behind all
+     *            other windows on the desktop, <code>false</code> for normal
+     *            behaviour.
+     * @since 4.0.4
+     */
+    public void setKeepBelow(boolean setting) {
+        GtkWindow.setKeepBelow(this, setting);
+    }
+
+    /**
+     * Request that the Window be visible on all user workspaces.
+     * 
+     * <p>
+     * Many window managers provide the concept of "workspaces" or "virtual
+     * desktops" whereby the user can switch from one to another and use this
+     * as a means of organizing their work. Ordinarily, an application's
+     * Windows will only show in the workspace they appeared in (or to which
+     * they were moved by the user). By calling <code>setStick(true)</code>,
+     * the Window will always be visible, regardless of which workspace is
+     * switched to. While not all window managers have this capability, in
+     * general this will work.
+     * 
+     * <p>
+     * Note that the request to stick may not succeed, or may subsequently be
+     * reversed by the user.
+     * 
+     * <p>
+     * <i>Some desktops show a thumbnail of each workspace and when a window
+     * is stuck, it will "appear" in each workspace thumbnail. This does not
+     * mean there are suddenly four copies of your application running or
+     * anything silly like that.</i>
+     * 
+     * @param setting
+     *            <code>true</code> to request the Window be stuck,
+     *            <code>false</code> to request a return to the normal default
+     *            state.
+     * @since 4.0.4
+     */
+    public void setStick(boolean setting) {
+        if (setting) {
+            GtkWindow.stick(this);
+        } else {
+            GtkWindow.unstick(this);
+        }
+    }
+
+    /**
+     * Request the window manager maximize (grow to cover the whole screen) or
+     * restore (return to normal) this Window.
+     * 
+     * <p>
+     * The difference between this and {@link #setFullscreen(boolean)
+     * setFullscreen(true)} is that a maximized Window still has the title at
+     * the top of the screen (along with other window decorations, depending
+     * on the theme), and the panel(s) are still visible; a fullscreen window
+     * is over top of <i>everything</i>. While there are legitimate uses for
+     * both, maximizing is somewhat preferable since it does not obscure the
+     * panels.
+     * 
+     * <p>
+     * The default for new Windows in ordinary circumstances is that they are
+     * not maximized.
+     * 
+     * <p>
+     * Note that maximizing is generally done by the <i>user</i> via the
+     * global <code>Alt+F10</code> accelerator or the <code>[□]</code>
+     * button in the window title bar. The only reason to call this
+     * programmatically is if restoring the application to the maximized state
+     * in order to maintaining the user's preference from a previous run of
+     * the program. You can accordingly call this method before a Window is
+     * mapped to indicate to the Window manager that you want it to be
+     * maximized when shown.
+     * 
+     * <p>
+     * As with all the other window manager operations, this is a request and
+     * may or may not be honoured by the window manager depending on what
+     * constraints it is operating under.
+     * 
+     * @since 4.0.4
+     */
+    public void setMaximize(boolean setting) {
+        if (setting) {
+            GtkWindow.maximize(this);
+        } else {
+            GtkWindow.unmaximize(this);
+        }
+    }
+
+    /**
+     * Enquire whether or not this Window is maximized.
+     * 
+     * <p>
+     * While this is in the form of a getter, <var>maximize</var> is not a
+     * property, as such. This method only works (ie, reports
+     * <code>true</code>) if the Window is actually on the screen (ie has been
+     * mapped via a <code>show()</code> call), and really <b>is</b> currently
+     * maximized.
+     * 
+     * <p>
+     * In other words, this won't do you any good when initializing your
+     * program. It doesn't refer to a future state that will be realized in
+     * due course - which means, incidentally that it won't tell you if you
+     * already called {@link #setMaximize(boolean) setMaximize(true)} to
+     * register your intent to have the window be maximized on presentation.
+     * 
+     * @since 4.0.4
+     */
+    public boolean getMaximized() {
+        final org.gnome.gdk.Window underlying;
+        final WindowState state;
+
+        underlying = super.getWindow();
+        if (underlying == null) {
+            throw new IllegalStateException("The underlying GdkWindow is null.");
+        }
+        state = underlying.getState();
+
+        if (state.contains(WindowState.MAXIMIZED)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Set the icon image to be used for this Window. The icon will appear in
+     * the window switcher (what appears when you press <code>Alt+Tab</code>),
+     * window list applet and, in most themes, as an identifying image in the
+     * top left corner of the window title bar.
+     * 
+     * <p>
+     * Most often you will simply create an image with
+     * {@link Pixbuf#Pixbuf(String) Pixbuf(filename)} and pass it in.
+     * 
+     * <p>
+     * A 48x48 PNG image is generally the optimal size to work with; you
+     * rarely need icons larger but a lower resolution image will be forced to
+     * scale up with the usual poor quality result.
+     * 
+     * <p>
+     * <i>You should specify the image in its natural form, whatever that is,
+     * as GTK itself will scale the image depending on the various sizes it is
+     * called upon to provide by the theme engine and the window manager.</i>
+     * 
+     * @since 4.0.5
+     */
+    public void setIcon(Pixbuf icon) {
+        GtkWindow.setIcon(this, icon);
+    }
+
+    /**
+     * Set the icon image to be used for this Window. The icon will appear in
+     * the window switcher (what appears when you press <code>Alt+Tab</code>).
+     * 
+     * @since 4.1.1
+     */
+    public void setIcon(Icon icon) {
+        GtkWindow.setIconName(this, Helper.getName(icon));
+    }
+
+    /**
+     * Present the Window to the user. This will raise the window to the top
+     * of the stack, deiconify it, and even bring it to the current virtual
+     * workspace (all depending, as ever, on how co-operative your window
+     * manager is). This is also invokes the equivalent of {@link #show()
+     * show()} to [re]map the Window.
+     * 
+     * <p>
+     * This method is ideal for cases where a Window is already showing
+     * somewhere and you need to [re]present it to the user. It's also what
+     * you should use if you have already called <code>show()</code> to force
+     * the Window to map but then immediately called <code>hide()</code> while
+     * you finished building the Window.
+     * 
+     * @since 4.0.5
+     */
+    public void present() {
+        GtkWindow.present(this);
+    }
+
+    /**
+     * Get the width of the Window.
+     * 
+     * <p>
+     * There are some problems with using this:
+     * 
+     * <ul>
+     * <li>If the Window hasn't been mapped to the screen yet then you will
+     * get GTK's current estimate of what it expects to the geometry of the
+     * Window might be. This is still highly dependent on what the window
+     * manager and the X server actually end up agreeing to allocate.
+     * <li>People frequently call this because they want to manually position
+     * the Window. In GNOME we discourage doing this. It is the window
+     * manager's job to position things, and this reflects among other things
+     * accessibility and user preference. Also, GTK is unable to take into
+     * account the size of any window decorations that may be present. Use
+     * {@link #setPosition(WindowPosition) setPosition()}!
+     * <li>If you need to take a dynamic size dependent action you should hook
+     * up to the {@link Window.ConfigureEvent} signal which has more accurate
+     * information and which will allow you to react appropriately. If you
+     * instead use this you will be subject to a race condition as the size of
+     * the Window may change between you calling this method and taking action
+     * based on the returned value.
+     * </ul>
+     * 
+     * In other words, although this method can be useful for debugging, it's
+     * mostly here to tell you what to use instead.
+     * 
+     * @since 4.0.5
+     */
+    public int getWidth() {
+        int[] width = new int[1];
+        int[] height = new int[1];
+
+        GtkWindow.getSize(this, width, height);
+
+        return width[0];
+    }
+
+    /**
+     * Get the height of the Window.
+     * 
+     * <p>
+     * See {@link #getWidth() getWidth()} for a discussion of the problems
+     * that are inherent in using this method.
+     * 
+     * @since 4.0.5
+     */
+    public int getHeight() {
+        int[] width = new int[1];
+        int[] height = new int[1];
+
+        GtkWindow.getSize(this, width, height);
+
+        return height[0];
+    }
+
+    /**
+     * Set whether the Window is to be modal or not. Modal Windows prevent
+     * interaction with other application Windows.
+     * 
+     * <p>
+     * Non-modal Windows give user more flexibility to perform other tasks
+     * within your application in any order she or he wants. Leaving Windows
+     * non-modal is thus preferred. Making a Window modal should only be done
+     * when the application <i>really</i> requires user to not interact with
+     * other Windows. Its main usage is in critical Dialogs where an urgent
+     * response from the user is required.
+     * 
+     * <p>
+     * If you make a Window modal, you should provide a clear way to close the
+     * Window, such as "Close" or "Cancel" Button.
+     * 
+     * <p>
+     * Finally, it is convenient to make modal Windows to be transient for the
+     * parent, by calling {@link #setTransientFor(Window) setTransientFor()}.
+     * That way, the modal Window will be always on top, even if the user
+     * tries to interact with the parent, which is a good way to indicate to
+     * them that they must close the modal Window before going on. Usage of
+     * modal Windows without marking them transient leads to a severe
+     * usability problem: if the user tries to interact with the parent Window
+     * when the modal Window is hidden below that parent, the situation will
+     * appear as if the application is frozen.
+     * 
+     * @param modal
+     *            <code>true</code> to make the Window modal. The default is
+     *            <code>false</code>.
+     * @since 4.0.5
+     */
+    public void setModal(boolean modal) {
+        GtkWindow.setModal(this, modal);
+    }
+
+    /**
+     * Make this Window as transient to another. When marked this way, the
+     * window manager will keep the Window above the parent, even if the user
+     * tries to interact with the parent.
+     * 
+     * <p>
+     * This is specially useful with modal Windows; see
+     * {@link #setModal(boolean) setModal()}.
+     * 
+     * @param parent
+     *            The Window this will be transient for, or <code>null</code>
+     *            to prevent this Window for being treated as transient
+     *            (that's the default, so you only need to call this when
+     *            explicitly setting a Window as transient).
+     * @since 4.0.5
+     */
+    public void setTransientFor(Window parent) {
+        GtkWindow.setTransientFor(this, parent);
+    }
+
+    /**
+     * Set whether the user can resize this Window. Windows are resizable by
+     * default.
+     * 
+     * <p>
+     * You'd probably best have a very good reason for suppressing this. GTK's
+     * box packing model and size request/size allocation cycle will draw a
+     * Window at the optimum size necessary for all the Widgets packed into it
+     * to fit and so that all text labels draw properly, etc. That said,
+     * sometimes a user wants to see more of a certain column or to expand the
+     * area given to the Window so that some dynamic element within (perhaps
+     * an image) will scale larger. It is very frustrating for a user to find
+     * that the developer has prohibited them from doing such things.
+     * 
+     * @since 4.0.6
+     */
+    public void setResizable(boolean setting) {
+        GtkWindow.setResizable(this, setting);
+    }
+
+    /**
+     * Toggle whether or not this Window is showing a resize grip at the
+     * bottom right of the drawn Window. While ordinarily you'd want to leave
+     * this alone, a resize grip will displace a right-hand Scrollbar and may
+     * need to be removed for visual consistency. Note that when maximized,
+     * windows will not have resize grips.
+     * 
+     * @since 4.1.1
+     */
+    public void setHasResizeGrip(boolean setting) {
+        GtkWindow.setHasResizeGrip(this, setting);
+    }
+
+    /**
+     * Resize the Window to the given <code>width</code> and
+     * <code>height</code>.
+     * 
+     * <p>
+     * The size specified here needs to meet or exceed the current aggregate
+     * size request for this Window as determined by the children packed into
+     * it. If that's a problem, then influence the size request with
+     * {@link #setSizeRequest(int, int) setSizeRequest()}.
+     * 
+     * <p>
+     * If you call this before the Window is realized, then the settings
+     * provided here will override those specified with
+     * {@link #setDefaultSize(int, int) setDefaultSize()}.
+     * 
+     * @since 4.0.8
+     */
+    public void resize(int width, int height) {
+        if ((width < 1) || (height < 1)) {
+            throw new IllegalArgumentException("absolute minimum size is 1x1");
+        }
+        GtkWindow.resize(this, width, height);
+    }
+
+    /**
+     * Request that GNOME not include this Window in lists of open windows.
+     * These are notably the "Window List" and "Window Selector" applets
+     * included with <code>gnome-panel</code> and the on-screen-display popup
+     * presented by the window manager. This is useful when creating special
+     * purpose auxiliary windows that are not the main program.
+     * 
+     * <p>
+     * Like other "hint" setting methods, this is only a request to the
+     * external environment and could potentially be ignored.
+     * 
+     * <p>
+     * You may also need {@link #setSkipPagerHint(boolean) setSkipPagerHint()}.
+     * 
+     * <p>
+     * Note that if the WindowTypeHint of a Window has been set appropriately,
+     * you will not need to call this. Therefore use
+     * {@link #setTypeHint(WindowTypeHint) setTypeHint()} instead.
+     * 
+     * @since 4.0.8
+     */
+    public void setSkipTaskbarHint(boolean setting) {
+        GtkWindow.setSkipTaskbarHint(this, setting);
+    }
+
+    /**
+     * Request that GNOME not include this Window in pagers. Pagers are
+     * applets and other utilities which show thumbnails of windows as an aide
+     * to navigation and switching. The "Workspace Switcher" applet included
+     * with <code>gnome-panel</code> is a pager.
+     * 
+     * <p>
+     * If you're trying to keep this Window off of the list of windows shown
+     * as buttons in a panel, then you're probably looking for
+     * {@link #setSkipTaskbarHint(boolean) setSkipTaskbarHint()} instead,
+     * although this can be a nice touch too.
+     * 
+     * <p>
+     * Note that if the WindowTypeHint of a Window has been set appropriately,
+     * you will not need to call this. Therefore use
+     * {@link #setTypeHint(WindowTypeHint) setTypeHint()} instead.
+     * 
+     * @since 4.0.8
+     */
+    public void setSkipPagerHint(boolean setting) {
+        GtkWindow.setSkipPagerHint(this, setting);
+    }
+
+    /**
+     * Indicate to the window manager what type of use this Window will be put
+     * to. While the default is {@link WindowTypeHint#NORMAL NORMAL}, you may
+     * find the greatest utility from calling this with the
+     * {@link WindowTypeHint#UTILITY UTILITY} hint.
+     * 
+     * @since 4.0.8
+     */
+    /*
+     * Yes, that's a bad pun. I dare you to do better!
+     */
+    public void setTypeHint(WindowTypeHint hint) {
+        GtkWindow.setTypeHint(this, hint);
+    }
+
+    /**
+     * Set the AcceleratorGroup object for this top level Window. You'll need
+     * this to set key bindings for Menus and Actions. See
+     * {@link AcceleratorGroup} for help on how to set key bindings.
+     * 
+     * @since 4.0.16
+     */
+    public void addAcceleratorGroup(AcceleratorGroup group) {
+        GtkWindow.addAccelGroup(this, group);
+    }
+
+    /**
+     * Event emitted when the Window's size or position changes. The
+     * {@link EventConfigure EventConfigure} object has the position and size
+     * information.
+     * 
+     * <p>
+     * This event will also be emitted when the Window is first mapped and
+     * when it reappears on the screen having been obscured, so don't count on
+     * the values received being different from a previous iteration.
+     * 
+     * <p>
+     * <i>Note that this event signal plays a fairly crucial role in GTK
+     * internally; it is used by numerous subsystems (notably the size-request
+     * / size-allocation mechanism) to propagate that a Window had a new
+     * configuration. Do not attempt to block this signal.</i>
+     * 
+     * @author Andrew Cowie
+     * @since 4.0.8
+     */
+    /*
+     * This is here for the same reason that DeleteEvent is.
+     */
+    public interface ConfigureEvent extends GtkWidget.ConfigureEventSignal
+    {
+        /**
+         * Return <code>false</code>! Although this is an event signal with a
+         * boolean return, there is no point in attempting to block further
+         * propagation.
+         */
+        public boolean onConfigureEvent(Widget source, EventConfigure event);
+    }
+
+    /**
+     * Hook up a <code>Window.ConfigureEvent</code> handler.
+     * 
+     * @since 4.0.8
+     */
+    public void connect(ConfigureEvent handler) {
+        GtkWidget.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/WindowGroup.java b/src/bindings/org/gnome/gtk/WindowGroup.java
new file mode 100644
index 0000000..dfc51b3
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/WindowGroup.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class WindowGroup extends Object
+{
+    protected WindowGroup(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/gtk/WindowPosition.java b/src/bindings/org/gnome/gtk/WindowPosition.java
new file mode 100644
index 0000000..39eaa41
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/WindowPosition.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Request that this Window be placed at a specific location on the screen.
+ * Note that this is only a strong suggestion; as ever with window placement
+ * issues, it is up to the window manager to actually decide where and how to
+ * locate a new Window on the display.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public final class WindowPosition extends Constant
+{
+    private WindowPosition(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No need to request altered placement.
+     */
+    public static final WindowPosition NONE = new WindowPosition(GtkWindowPosition.NONE, "NONE");
+
+    /**
+     * The window should be placed at the center of the screen.
+     */
+    public static final WindowPosition CENTER = new WindowPosition(GtkWindowPosition.CENTER, "CENTER");
+
+    /**
+     * The window should be placed where the mouse pointer is presently.
+     */
+    public static final WindowPosition MOUSE = new WindowPosition(GtkWindowPosition.MOUSE, "MOUSE");
+
+    /**
+     * The window should be kept at the center even as it resizes.
+     */
+    public static final WindowPosition CENTER_ALWAYS = new WindowPosition(
+            GtkWindowPosition.CENTER_ALWAYS, "CENTER_ALWAYS");
+
+    /**
+     * The window should be kept centered on its (
+     * {@link Window#setTransientFor(Window) transient}) parent.
+     */
+    public static final WindowPosition CENTER_ON_PARENT = new WindowPosition(
+            GtkWindowPosition.CENTER_ON_PARENT, "CENTER_ON_PARENT");
+}
diff --git a/src/bindings/org/gnome/gtk/WindowType.java b/src/bindings/org/gnome/gtk/WindowType.java
new file mode 100644
index 0000000..c44bfd2
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/WindowType.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * The type of Window. When constructing {@link org.gnome.gtk.Window Window}s
+ * you need to specify what kind of Window it is to be. Since TOPLEVEL is
+ * almost always what you want the default constructor of Window chooses this
+ * automatically.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.0
+ */
+public final class WindowType extends Constant
+{
+    private WindowType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Most things you'd consider a "window" should have type TOPLEVEL;
+     * windows with this type are managed by the window manager and have a
+     * frame by default. [The frame is what you might think of the "border",
+     * although border is actually a characteristic of Widget. You can call
+     * {@link org.gnome.gtk.Window#setDecorated(boolean) setDecorated(false)}
+     * to turn the window manager's frame off]
+     */
+    public static final WindowType TOPLEVEL = new WindowType(GtkWindowType.TOPLEVEL, "TOPLEVEL");
+
+    /**
+     * Windows with type POPUP are ignored by the window manager; window
+     * manager keybindings won't work on them, the window manager won't
+     * decorate the window with a frame (ie borders), and many GTK features
+     * that rely on the window manager will not work (for example resize grips
+     * and maximize/minimize). WindowType POPUP is used to implement widgets
+     * such as menus and tooltips - things that you wouldn't think of as
+     * Windows and don't program as such. In particular, do not use this to
+     * turn off Window borders! That's what
+     * {@link org.gnome.gtk.Window#setDecorated(boolean) setDecorated(false)}
+     * is for.
+     */
+    public static final WindowType POPUP = new WindowType(GtkWindowType.POPUP, "POPUP");
+}
diff --git a/src/bindings/org/gnome/gtk/WrapMode.java b/src/bindings/org/gnome/gtk/WrapMode.java
new file mode 100644
index 0000000..f59e144
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/WrapMode.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Indicate if you want a TextView to wrap, and if so, where it should break
+ * lines. These constants are used with TextView's
+ * {@link TextView#setWrapMode(WrapMode) setWrapMode()} method.
+ * 
+ * @author Stefan Prelle
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public final class WrapMode extends Constant
+{
+    private WrapMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Do not wrap lines; attempt to make the TextView as wide as the widest
+     * line in the underlying TextBuffer; lines will be truncated if they are
+     * longer than the width allocated to the TextView.
+     */
+    public static final WrapMode NONE = new WrapMode(GtkWrapMode.NONE, "NONE");
+
+    /**
+     * Wrap text, breaking lines anywhere the cursor can appear (between
+     * characters, usually)
+     */
+    public static final WrapMode CHAR = new WrapMode(GtkWrapMode.CHAR, "CHAR");
+
+    /**
+     * Wrap text, breaking lines in between words. This is usually the one you
+     * want if you are trying to enable word wrapping, but keep in mind that
+     * something <i>also</i> has to act to constrain the width of the TextView
+     * as it is packed into a Container hierarchy or no wrapping will occur.
+     */
+    public static final WrapMode WORD = new WrapMode(GtkWrapMode.WORD, "WORD");
+
+    /**
+     * Wrap text, breaking lines in between words, or if that is not enough,
+     * also between graphemes. FIXME What is a grapheme?
+     */
+    public static final WrapMode WORD_CHAR = new WrapMode(GtkWrapMode.WORD_CHAR, "WORD_CHAR");
+
+}
diff --git a/src/bindings/org/gnome/gtk/package.html b/src/bindings/org/gnome/gtk/package.html
new file mode 100644
index 0000000..0a6668a
--- /dev/null
+++ b/src/bindings/org/gnome/gtk/package.html
@@ -0,0 +1,51 @@
+<html>
+<head>
+</head>
+<body>
+GTK is the widget toolkit which is used by applications to create rich user
+interfaces on the screen. See {@link org.gnome.gtk.Gtk Gtk} to get started.
+
+<!-- TODO that's still a rather lame starting reference. -->
+
+<h2>History</h2>
+
+<p>GTK was first created by the authors of <a href="http://www.gimp.org/">The
+GIMP</a>, a powerful graphics manipulation program. They had innovative ideas
+about the user interface they wanted to provide, but needed to create an
+entirely new widget toolkit to do so!</p>
+
+<p>The result was GTK (the <b><u>G</u></b>IMP widget <b><u>T</u></b>ool
+<b><u>K</u></b>it). Many liked its power, look and feel, and simplicity, and
+very quickly it became the foundation of the GNOME project and today is used
+not only for all the applications that make up the GNOME Desktop, but for a
+huge range of popular programs available for Linux and Unix.</p>
+
+<p>Originally GTK was a self contained library, but as it became the
+foundation for GNOME it was abstracted into several layers which are reflected
+in the many packages that are available in java-gnome; if you haven't already,
+see the <a href="../../../overview-summary.html">overview</a> for details.</p>
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/org/gnome/notify/Notification.java b/src/bindings/org/gnome/notify/Notification.java
new file mode 100644
index 0000000..c0765e8
--- /dev/null
+++ b/src/bindings/org/gnome/notify/Notification.java
@@ -0,0 +1,324 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.notify;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.GlibException;
+import org.gnome.gtk.Widget;
+
+/**
+ * Notification represents an actual item to be displayed by notification
+ * system. You can simply create and display a Notification after the system
+ * is initialized with {@link Notify#init(String) Notify.init()}.
+ * 
+ * @author Serkan Kaba
+ * @since 4.0.12
+ * 
+ * @see <a href="http://www.galago-project.org/specs/notification/">Desktop
+ *      Notifications Spec</a>
+ */
+public class Notification extends org.gnome.glib.Object
+{
+    /**
+     * Constant for default timeout duration.
+     */
+    public static final int NOTIFY_EXPIRES_DEFAULT = -1;
+
+    /**
+     * Constant for infinite timeout duration.
+     */
+    public static final int NOTIFY_EXPIRES_NEVER = 0;
+
+    protected Notification(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new notification.
+     * 
+     * <p>
+     * The summary appears on the titlebar of notification and body appears as
+     * its text. Icon may be a string defining a theme icon or the filename
+     * identifying the icon that appears next to text.
+     * 
+     * <p>
+     * Note that all but summary can be <code>null</code>.
+     * 
+     * @since 4.0.19
+     */
+
+    public Notification(String summary, String body, String icon) {
+        super(NotifyNotification.createNotification(summary, body, icon));
+    }
+
+    /**
+     * Updates the notification with given parameters see
+     * {@link #Notification(String,String,String,Widget) Notification()} for
+     * parameters.
+     * 
+     * @since 4.0.12
+     */
+    public void update(String summary, String body, String icon) {
+        if (!NotifyNotification.update(this, summary, body, icon)) {
+            throw new RuntimeException("Notification update failed.");
+        }
+    }
+
+    /**
+     * Display the notification on screen.
+     * 
+     * @since 4.0.12
+     */
+    public void show() {
+        try {
+            NotifyNotification.show(this);
+        } catch (GlibException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+    /**
+     * Set the timeout that the notification disappears in milliseconds. Use
+     * {@link Notification#NOTIFY_EXPIRES_DEFAULT NOTIFY_EXPIRES_DEFAULT} for
+     * the default timeout duration. Use
+     * {@link Notification#NOTIFY_EXPIRES_NEVER NOTIFY_EXPIRES_NEVER} for
+     * infinite timeout duration.
+     * 
+     * @since 4.0.12
+     */
+    public void setTimeout(int timeout) {
+        NotifyNotification.setTimeout(this, timeout);
+    }
+
+    /**
+     * Set the category of the notification which may later be used to display
+     * or filter out the notification.<br>
+     * See the "Categories" section in <i>Desktop Notifications
+     * Specification</i> for predefined categories and their meanings.
+     * 
+     * @since 4.0.12
+     */
+    public void setCategory(String category) {
+        NotifyNotification.setCategory(this, category);
+    }
+
+    /**
+     * Sets the urgency to one of {@link Urgency#LOW LOW},
+     * {@link Urgency#NORMAL NORMAL}, or {@link Urgency#CRITICAL CRITICAL}.
+     * 
+     * @since 4.0.12
+     */
+    public void setUrgency(Urgency urgency) {
+        NotifyNotification.setUrgency(this, urgency);
+    }
+
+    /**
+     * Sets the icon of the notification from a {@link Pixbuf}.
+     * 
+     * @since 4.0.12
+     */
+    public void setIcon(Pixbuf icon) {
+        NotifyNotification.setIconFromPixbuf(this, icon);
+    }
+
+    /**
+     * Sets a hint with an integer value. See {@link #setHint(String, byte)
+     * setHint()} for further details.
+     * 
+     * <p>
+     * Example: <code>"x"</code> (sets the horizontal position of the
+     * notification)
+     * 
+     * @since 4.0.12
+     */
+    public void setHint(String key, int value) {
+        NotifyNotification.setHintInt32(this, key, value);
+    }
+
+    /**
+     * Sets a hint with a double value. See {@link #setHint(String, byte)
+     * setHint()} for further details.
+     * 
+     * @since 4.0.12
+     */
+    public void setHint(String key, double value) {
+        NotifyNotification.setHintDouble(this, key, value);
+    }
+
+    /**
+     * Sets a hint with a string value. See {@link #setHint(String, byte)
+     * setHint()} for further details.
+     * 
+     * <p>
+     * Example: <code>"sound-file"</code> (adds sound to the notification)
+     * 
+     * @since 4.0.12
+     */
+    public void setHint(String key, String value) {
+        NotifyNotification.setHintString(this, key, value);
+    }
+
+    /**
+     * Sets a hint with a byte value.
+     * 
+     * <p>
+     * Hints are interpreted by the notification system in various ways to
+     * modify the notification behavior and/or appearance. See the "Hints"
+     * section in <i>Desktop Notifications Specification</i> for standard
+     * hints and their interpretations.
+     * 
+     * @since 4.0.12
+     */
+    public void setHint(String key, byte value) {
+        NotifyNotificationOverride.setHintByte(this, key, value);
+    }
+
+    /**
+     * Sets a hint with a byte array data. See {@link #setHint(String, byte)
+     * setHint()} for further details.
+     * 
+     * @since 4.0.12
+     */
+    public void setHint(String key, byte[] value) {
+        NotifyNotificationOverride.setHintByteArray(this, key, value);
+    }
+
+    /**
+     * Clear hints from the notification.
+     * 
+     * @since 4.0.12
+     */
+    public void clearHints() {
+        NotifyNotification.clearHints(this);
+    }
+
+    /**
+     * Hide the notification on screen.
+     * 
+     * @since 4.0.12
+     */
+    public void close() {
+        try {
+            NotifyNotification.close(this);
+        } catch (GlibException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+    /**
+     * Signal emmitted when a notification is closed. This can happen in three
+     * ways:
+     * 
+     * <ul>
+     * <li>When notification timeout expires.</li>
+     * <li>When user dismisses it by closing.</li>
+     * <li>When {@link #close() close()} is called.</li>
+     * </ul>
+     * 
+     * @author Serkan Kaba
+     * @since 4.0.12
+     */
+    public interface Closed extends NotifyNotification.ClosedSignal
+    {
+        public void onClosed(Notification source);
+    }
+
+    /**
+     * Hook up a handler to receive <code>Notification.Closed</code> events on
+     * this Notification.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(Notification.Closed handler) {
+        NotifyNotification.connect(this, handler, false);
+    }
+
+    /**
+     * Callback invoked when an added action is invoked. See Notification's
+     * {@link Notification#addAction(String, String, Notification.Action)
+     * addAction()}, which is the where this is used from.
+     * 
+     * @author Serkan Kaba
+     * @since 4.0.12
+     */
+    public interface Action
+    {
+        public void onAction(Notification source, String action);
+    }
+
+    private static class ActionHandler implements NotifyNotification.ActionSignal
+    {
+        private final Action handler;
+
+        private final String actionID;
+
+        private ActionHandler(String actionID, Action handler) {
+            this.handler = handler;
+            this.actionID = actionID;
+        }
+
+        public void onAction(Notification source, String action) {
+            if (actionID.equals(action)) {
+                handler.onAction(source, action);
+            }
+        }
+    }
+
+    /**
+     * Add an action to a notification. Notification-daemon displays these as
+     * buttons.
+     * 
+     * <p>
+     * <i>Note that for some bizarre reason the new Notify-OSD of Ubuntu Linux
+     * does not support actions at all. To determine if notification system
+     * supports actions look for</i> <code>"actions"</code> <i>in
+     * capabilities.</i>
+     * 
+     * @see Notify#getServerCapabilities()
+     * @since 4.0.12
+     */
+    public void addAction(String actionID, String label, Notification.Action action) {
+        NotifyNotificationOverride.addAction(this, actionID, label);
+        NotifyNotification.connect(this, new ActionHandler(actionID, action), false);
+    }
+
+    /**
+     * Remove all added actions.
+     * 
+     * @since 4.0.12
+     */
+    public void clearActions() {
+        NotifyNotification.clearActions(this);
+        NotifyNotificationOverride.disconnectAllActions(this);
+    }
+}
diff --git a/src/bindings/org/gnome/notify/Notify.java b/src/bindings/org/gnome/notify/Notify.java
new file mode 100644
index 0000000..0900e7f
--- /dev/null
+++ b/src/bindings/org/gnome/notify/Notify.java
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.notify;
+
+import org.gnome.glib.Glib;
+
+/**
+ * Notification system initialization point. A notification enabled program
+ * written with java-gnome will boil down to this:
+ * 
+ * <pre>
+ * public class ExampleNotificationApp
+ *   
+ *     public static void main(String[] args) {
+ *         Gtk.init(args);
+ *         Notify.init("example-app");
+ *           
+ *         // build user interface
+ *         
+ *         // create and display notifications for application events
+ *           
+ *         Gtk.main();
+ *     }
+ * }
+ * </pre>
+ * 
+ * <p>
+ * The meat of this library is the {@link Notification} class; see there.
+ * 
+ * @author Serkan Kaba
+ * @since 4.0.12
+ * 
+ * @see <a href="http://www.galago-project.org/specs/notification/">Desktop
+ *      Notifications Spec</a>
+ */
+public final class Notify extends Glib
+{
+    private Notify() {}
+
+    /**
+     * Initialize the notification system. <b>This must be called before any
+     * {@link Notification} methods are used.</b>
+     * 
+     * @param applicationName
+     *            Name of the application initializing notification system.
+     * @since 4.0.12
+     */
+    public static boolean init(String applicationName) {
+        if (isInitialized()) {
+            throw new IllegalStateException("Notification already initialized");
+        }
+
+        /*
+         * Initialize notification system.
+         */
+        return NotifyMain.notifyInit(applicationName);
+    }
+
+    /**
+     * Uninitialize the notification system. <b>This should be called when
+     * notification is no longer needed (i.e. upon exit).</b>
+     * 
+     * @since 4.0.12
+     */
+    public static void uninit() {
+        NotifyMain.notifyUninit();
+    }
+
+    /**
+     * Tests whether notification system is initialized or not.
+     * 
+     * @since 4.0.12
+     */
+    public static boolean isInitialized() {
+        return NotifyMain.notifyIsInitted();
+    }
+
+    /**
+     * Returns the registered application name. This is as passed when you
+     * called {@link #init(String) Notify.init()}.
+     * 
+     * @since 4.0.12
+     */
+    public static String getApplicationName() {
+        return NotifyMain.notifyGetAppName();
+    }
+
+    /**
+     * Returns a list of features supported by the notification system.
+     * 
+     * <p>
+     * See the "D-BUS Protocol" section in <i>Desktop Notifications
+     * Specification</i> for standard capabilities.
+     * 
+     * @since 4.0.12
+     */
+    public static String[] getServerCapabilities() {
+        if (!isInitialized()) {
+            throw new IllegalStateException("Notification isn't initialized");
+        }
+        return NotifyMainOverride.getServerCapabilities();
+    }
+}
diff --git a/src/bindings/org/gnome/notify/NotifyMainOverride.c b/src/bindings/org/gnome/notify/NotifyMainOverride.c
new file mode 100644
index 0000000..0d365d1
--- /dev/null
+++ b/src/bindings/org/gnome/notify/NotifyMainOverride.c
@@ -0,0 +1,94 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <libnotify/notify.h>
+#include <jni.h>
+#include "bindings_java.h"
+#include "org_gnome_notify_NotifyMainOverride.h"
+
+/*
+ * Implements
+ *   org.gnome.notify.NotifyMainOverride.notify_get_server_caps()
+ * called from
+ *   org.gnome.notify.Notify.getServerCapabilities()
+ */
+JNIEXPORT jobjectArray JNICALL
+Java_org_gnome_notify_NotifyMainOverride_notify_1get_1server_1caps
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	jobjectArray _array;
+	int i, size;
+	jclass String;
+	GList* caps;
+	GList* iter;
+	jstring cap;
+
+	caps = notify_get_server_caps();
+
+	if (caps == NULL) {
+		size = 0;
+	} else {
+		size = g_list_length(caps);
+	}
+
+	String = (*env)->FindClass(env, "java/lang/String");
+	if (String == NULL) {
+		// exception already thrown
+		return NULL;
+	}
+
+	_array = (*env)->NewObjectArray(env, size, String, NULL);
+	if (_array == NULL) {
+		// exception already thrown
+		return NULL;
+	}
+
+	iter = caps;
+
+	for (i = 0; i < size; ++i) {
+		// Hopefully capability strings are ASCII only.
+		cap = bindings_java_newString(env, iter->data);
+		(*env)->SetObjectArrayElement(env, _array, i, cap);
+		g_free(iter->data);
+		iter = iter->next;
+	}
+
+	if (caps != NULL) {
+		g_list_free(caps);
+	}
+
+	return _array;
+}
diff --git a/src/bindings/org/gnome/notify/NotifyMainOverride.java b/src/bindings/org/gnome/notify/NotifyMainOverride.java
new file mode 100644
index 0000000..1cef39a
--- /dev/null
+++ b/src/bindings/org/gnome/notify/NotifyMainOverride.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.notify;
+
+final class NotifyMainOverride extends Plumbing
+{
+    private NotifyMainOverride() {}
+
+    static final String[] getServerCapabilities() {
+        String[] result;
+
+        synchronized (lock) {
+            result = notify_get_server_caps();
+
+            return result;
+        }
+    }
+
+    private static native final String[] notify_get_server_caps();
+}
diff --git a/src/bindings/org/gnome/notify/NotifyNotificationOverride.c b/src/bindings/org/gnome/notify/NotifyNotificationOverride.c
new file mode 100644
index 0000000..3e17f31
--- /dev/null
+++ b/src/bindings/org/gnome/notify/NotifyNotificationOverride.c
@@ -0,0 +1,227 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <libnotify/notify.h>
+#include "bindings_java.h"
+#include "org_gnome_notify_NotifyNotificationOverride.h"
+
+static guint signalID = 0;
+
+static void
+emit_notification
+(
+	NotifyNotification *notification,
+	gchar *action
+)
+{
+	g_signal_emit_by_name(NOTIFY_NOTIFICATION(notification), "action", action);
+}
+
+/*
+ * Implements
+ *   org.gnome.notify.NotifyNotificationOverride.notify_notification_set_hint_byte()
+ * called from
+ *   org.gnome.notify.Notification.setHint(byte)
+ */
+JNIEXPORT void JNICALL Java_org_gnome_notify_NotifyNotificationOverride_notify_1notification_1set_1hint_1byte
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _self,
+	jstring _key,
+	jbyte _value
+)
+{
+	NotifyNotification* self;
+	const gchar* key;
+	gshort value;
+
+	// convert parameter self
+	self = (NotifyNotification*) _self;
+
+	// convert parameter key
+	key = bindings_java_getString(env, _key);
+	if (key == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	// convert parameter value
+	value = (guchar) _value;
+
+	// call function
+	notify_notification_set_hint_byte(self, key, value);
+
+	// cleanup parameter key
+	bindings_java_releaseString(key);
+}
+
+/*
+ * Implements
+ *   org.gnome.notify.NotifyNotificationOverride.notify_notification_set_hint_byte_array()
+ * called from
+ *   org.gnome.notify.Notification.setHint(byte[])
+ */
+JNIEXPORT void JNICALL Java_org_gnome_notify_NotifyNotificationOverride_notify_1notification_1set_1hint_1byte_1array
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _self,
+	jstring _key,
+	jbyteArray _value
+)
+{
+	NotifyNotification* self;
+	const gchar* key;
+	guchar* value;
+	int size;
+
+	// convert parameter self
+	self = (NotifyNotification*) _self;
+
+	// convert parameter key
+	key = bindings_java_getString(env, _key);
+	if (key == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	// convert parameter value
+	value = (guchar*)(*env)->GetByteArrayElements(env, _value, NULL);
+	if (value == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	// determine array size
+	size = (*env)->GetArrayLength(env, _value);
+
+	// call function
+	notify_notification_set_hint_byte_array(self, key, value, size);
+
+	// cleanup parameter key
+	bindings_java_releaseString(key);
+
+	// cleanup parameter value
+	(*env)->ReleaseByteArrayElements(env, _value, (jbyte*)value, 0);
+}
+
+/*
+ * Implements
+ *   org.gnome.notify.NotifyNotificationOverride.notify_notification_add_action()
+ * called from
+ *   org.gnome.notify.Notification.addAction(String, String, Notification.Action)
+ */
+JNIEXPORT void JNICALL Java_org_gnome_notify_NotifyNotificationOverride_notify_1notification_1add_1action
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _self,
+	jstring _action,
+	jstring _label
+)
+{
+	NotifyNotification* self;
+	const gchar* action;
+	const gchar* label;
+
+	// convert parameter self
+	self = (NotifyNotification*) _self;
+
+	// convert parameter action
+	action = bindings_java_getString(env, _action);
+	if (action == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	// convert parameter label
+	label = bindings_java_getString(env, _label);
+	if (label == NULL) {
+		return; // Java Exception already thrown
+	}
+
+	if(signalID == 0) {
+		signalID = g_signal_new("action",
+					NOTIFY_TYPE_NOTIFICATION,
+					G_SIGNAL_ACTION,
+					0,
+					NULL,
+					NULL,
+					NULL, // note 1
+					G_TYPE_NONE,
+					1,    // note 2
+					G_TYPE_STRING);
+	}
+	notify_notification_add_action(self,action,label,NOTIFY_ACTION_CALLBACK(emit_notification),NULL,NULL);
+
+	// cleanup parameter action
+	bindings_java_releaseString(action);
+
+	// cleanup parameter label
+	bindings_java_releaseString(label);
+}
+
+/*
+ * Implements
+ *   org.gnome.notify.NotifyNotificationOverride.notify_notification_disconnect_all_actions()
+ * called from
+ *   org.gnome.notify.Notification.clearActions()
+ */
+JNIEXPORT void JNICALL Java_org_gnome_notify_NotifyNotificationOverride_notify_1notification_1disconnect_1all_1actions
+(
+	JNIEnv *env,
+	jclass cls,
+	jlong _self
+)
+{
+	NotifyNotification* self;
+	guint handlerID;
+
+	// convert parameter self
+	self = (NotifyNotification*) _self;
+
+	while(TRUE) {
+		handlerID = g_signal_handler_find(
+			NOTIFY_NOTIFICATION(self),
+			G_SIGNAL_MATCH_ID,
+			signalID,
+			0,
+			NULL,
+			NULL,
+			NULL
+		);
+		if(handlerID > 0) {
+			g_signal_handler_disconnect(NOTIFY_NOTIFICATION(self),handlerID);
+		}
+		else {
+			break;
+		}
+	}
+}
diff --git a/src/bindings/org/gnome/notify/NotifyNotificationOverride.java b/src/bindings/org/gnome/notify/NotifyNotificationOverride.java
new file mode 100644
index 0000000..d1f13e5
--- /dev/null
+++ b/src/bindings/org/gnome/notify/NotifyNotificationOverride.java
@@ -0,0 +1,95 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.notify;
+
+final class NotifyNotificationOverride extends Plumbing
+{
+    private NotifyNotificationOverride() {}
+
+    static final void setHintByte(Notification self, String key, byte value) {
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        if (key == null) {
+            throw new IllegalArgumentException("key can't be null");
+        }
+
+        synchronized (lock) {
+            notify_notification_set_hint_byte(pointerOf(self), key, value);
+        }
+    }
+
+    private static native final void notify_notification_set_hint_byte(long self, String key, byte value);
+
+    static final void setHintByteArray(Notification self, String key, byte[] value) {
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        if (key == null) {
+            throw new IllegalArgumentException("key can't be null");
+        }
+
+        if (value == null) {
+            throw new IllegalArgumentException("value can't be null");
+        }
+
+        if (value.length == 0) {
+            throw new IllegalArgumentException("array lenght should be greater than 0");
+        }
+
+        synchronized (lock) {
+            notify_notification_set_hint_byte_array(pointerOf(self), key, value);
+        }
+    }
+
+    private static native final void notify_notification_set_hint_byte_array(long self, String key,
+            byte[] value);
+
+    /**
+     * Manually hookup the function that will emit our custom action signal.
+     */
+    static final void addAction(Notification self, String action, String label) {
+        notify_notification_add_action(pointerOf(self), action, label);
+    }
+
+    private static native final void notify_notification_add_action(long self, String action,
+            String label);
+
+    static final void disconnectAllActions(Notification self) {
+        notify_notification_disconnect_all_actions(pointerOf(self));
+    }
+
+    private static native final void notify_notification_disconnect_all_actions(long pointerOf);
+}
diff --git a/src/bindings/org/gnome/notify/Plumbing.java b/src/bindings/org/gnome/notify/Plumbing.java
new file mode 100644
index 0000000..e00b776
--- /dev/null
+++ b/src/bindings/org/gnome/notify/Plumbing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.notify;
+
+abstract class Plumbing extends org.gnome.glib.Plumbing
+{
+    protected Plumbing() {}
+
+    static {
+        isLibraryReady();
+    }
+}
diff --git a/src/bindings/org/gnome/notify/Urgency.java b/src/bindings/org/gnome/notify/Urgency.java
new file mode 100644
index 0000000..010a534
--- /dev/null
+++ b/src/bindings/org/gnome/notify/Urgency.java
@@ -0,0 +1,63 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.notify;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Used to indicate the urgency level of {@link Notification} shown.
+ * 
+ * @author Serkan Kaba
+ * @since 4.0.12
+ */
+public class Urgency extends Constant
+{
+    protected Urgency(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Represents low urgency used for unimportant notifications.
+     */
+    public static final Urgency LOW = new Urgency(NotifyUrgency.LOW, "LOW");
+
+    /**
+     * Represents normal urgency used for standard notifications.
+     */
+    public static final Urgency NORMAL = new Urgency(NotifyUrgency.NORMAL, "NORMAL");
+
+    /**
+     * Represents critical urgency used for very important notifications.
+     */
+    public static final Urgency CRITICAL = new Urgency(NotifyUrgency.CRITICAL, "CRITICAL");
+}
diff --git a/src/bindings/org/gnome/pango/Alignment.java b/src/bindings/org/gnome/pango/Alignment.java
new file mode 100644
index 0000000..fb090a5
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Alignment.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * How the line is aligned.
+ * 
+ * <p>
+ * If you wonder why there is not a JUSTIFY alignment, that is configured with
+ * the Layout {@link Layout#setJustify(boolean) setJustify()} method.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.8
+ */
+public final class Alignment extends Constant
+{
+    private Alignment(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Center the line within the available space.
+     */
+    public final static Alignment CENTER = new Alignment(PangoAlignment.CENTER, "CENTER");
+
+    /**
+     * Align the line at the left.
+     */
+    public final static Alignment LEFT = new Alignment(PangoAlignment.LEFT, "LEFT");
+
+    /**
+     * Align the line at the right.
+     */
+    public final static Alignment RIGHT = new Alignment(PangoAlignment.RIGHT, "RIGHT");
+}
diff --git a/src/bindings/org/gnome/pango/Analysis.java b/src/bindings/org/gnome/pango/Analysis.java
new file mode 100644
index 0000000..9fe1e2b
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Analysis.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Analysis extends Boxed
+{
+    protected Analysis(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/AttrIterator.java b/src/bindings/org/gnome/pango/AttrIterator.java
new file mode 100644
index 0000000..ab9e3a5
--- /dev/null
+++ b/src/bindings/org/gnome/pango/AttrIterator.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class AttrIterator extends Boxed
+{
+    protected AttrIterator(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/AttrType.java b/src/bindings/org/gnome/pango/AttrType.java
new file mode 100644
index 0000000..f5da684
--- /dev/null
+++ b/src/bindings/org/gnome/pango/AttrType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class AttrType extends Constant
+{
+    private AttrType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Attribute.java b/src/bindings/org/gnome/pango/Attribute.java
new file mode 100644
index 0000000..d9f00d9
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Attribute.java
@@ -0,0 +1,167 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * A (single) specific formatting or font to be applied to a range of Text.
+ * 
+ * <p>
+ * Examples of setting up Attributes include:
+ * 
+ * <pre>
+ * attr = new StyleAttribute(Style.ITALIC);
+ * </pre>
+ * 
+ * although many settings can be compounded by setting a FontDescription:
+ * 
+ * <pre>
+ * desc = new FontDescription("DejaVu Serif, 9pt");
+ * attr = new FontDescriptionAttribute(desc);
+ * </pre>
+ * 
+ * in general it's one Attribute per characteristic. You then aggregate these
+ * together in an AttributeList and then apply them to a Layout. See
+ * {@link AttributeList} for an example of using these on discrete parts of
+ * text.
+ * 
+ * <p>
+ * <b>WARNING</b>:<br>
+ * When coding with Attributes be aware of the following restrictions:
+ * <ul>
+ * <li>Once you have assigned an Attribute to a specific range of text in a
+ * given Layout you must not attempt to reuse it.
+ * 
+ * <li>Once you have inserted an Attribute into an AttributeList it is
+ * "consumed" by that list and you must not attempt to reuse it.
+ * </ul>
+ * 
+ * <p>
+ * <i> The different text attribute manipulations you can do are analogous to
+ * those found on FontDescription and TextTag. Indeed, Pango's Attributes are
+ * the underlying mechanism powering TextView and Label's rendering of rich
+ * markup.</i>
+ * 
+ * 
+ * <p>
+ * <i>Pango Attributes have an internal ugliness which is that each one needs
+ * to be told the offsets of text it applies to. The problem is that these are
+ * in terms of UTF-8 bytes, which not something we have access to from Java
+ * (nor would we want to expose such in our public API). We take care of
+ * setting the start and end points properly when you call</i>
+ * {@link Layout#setAttributes(AttributeList) setAttributes()}<i>, but you
+ * have to have already set the text into the Layout for us to be able to do
+ * so, obviously.</i>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * Apparently there is a facility for developers to extend Attributes, but we
+ * haven't needed to expose that as yet.
+ */
+public abstract class Attribute extends Boxed
+{
+    private int offset = 0;
+
+    /*
+     * We convert this to G_MAXUINT in PangoAttributeOverride.
+     */
+    private int width = Integer.MIN_VALUE;
+
+    private boolean inserted;
+
+    protected Attribute(long pointer) {
+        super(pointer);
+        inserted = false;
+    }
+
+    protected void release() {
+        /*
+         * There is no function in Pango to increment the reference count of a
+         * PangoAttribute. In fact, PangoAttributes do not have reference
+         * counts (which is not surprising; they're just structs). However,
+         * things get ugly because PangoAttrList assumes responsibility for
+         * disposing of a PangoAttribute once you've inserted it into such a
+         * list - but there's no way to tell externally that this has
+         * happened.
+         * 
+         * While we could just ignore this, we don't leak™, and so we go to
+         * the trouble of tracking whether or not this Attribute has been
+         * inserted, and thereby whether we are still responsible for it.
+         * 
+         * There is every possibility that
+         */
+        if (!inserted) {
+            PangoAttribute.destroy(this);
+        }
+    }
+
+    /**
+     * Given the text already in a Pango Layout, a starting position, and a
+     * width, set the indexes of this Attribute accordingly.
+     * <code>offset</code> and <code>width</code> are in terms of Java
+     * characters. The result of this call is that the <var>start_index</var>
+     * and <var>end_index</var> properties of the specified Attribute will be
+     * set.
+     * 
+     * <p>
+     * By default an Attribute added to an AttributeList covers all the text
+     * in whatever that AttributeList is applied to. If that's not what you
+     * want, you need to tell each Attribute what range it covers using this
+     * method.
+     * 
+     * @since 4.0.11
+     */
+    public void setIndices(int offset, int width) {
+        this.offset = offset;
+        this.width = width;
+    }
+
+    final int getOffset() {
+        return offset;
+    }
+
+    final int getWidth() {
+        return width;
+    }
+
+    final boolean isInserted() {
+        return inserted;
+    }
+
+    final void markInserted() {
+        inserted = true;
+    }
+}
diff --git a/src/bindings/org/gnome/pango/AttributeList.java b/src/bindings/org/gnome/pango/AttributeList.java
new file mode 100644
index 0000000..e217ead
--- /dev/null
+++ b/src/bindings/org/gnome/pango/AttributeList.java
@@ -0,0 +1,194 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * A list of Attributes that will be applied to a piece of text.
+ * 
+ * <p>
+ * Used as follows. First, build your text up into a String and initialize the
+ * Layout with it. You'll also have to create the wrapper that will hold the
+ * list of Attributes that will be applied to that Layout.
+ * 
+ * <pre>
+ * layout = new Layout(cr);
+ * layout.setText(str);
+ * 
+ * list = new AttributeList();
+ * </pre>
+ * 
+ * Then, iterate over your text and for each span where you want formatting,
+ * create one or more Attributes and specify the ranges that each will apply.
+ * For instance, for a word starting at offset <code>15</code> and being
+ * <code>4</code> characters wide.
+ * 
+ * <pre>
+ * attr = new StyleAttribute(Style.ITALIC);
+ * attr.setIndexes(15, 4);
+ * list.insert(attr);
+ * 
+ * attr = new ForegroundColorAttribute(0.1, 0.5, 0.9);
+ * attr.setIndexes(15, 4);
+ * list.insert(attr);
+ * </pre>
+ * 
+ * etc, adding each one to the AttributeList. Finally, tell the Layout to use
+ * that list:
+ * 
+ * <pre>
+ * layout.setAttributes(list);
+ * </pre>
+ * 
+ * and you're on your way.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * AttrList was the original mapping, but since we aren't exposing
+ * pango_attr_... anything, and DO have Attribute as the public class for
+ * PangoAttribute pointers, renaming to this to AttributeList makes it much
+ * clearer.
+ */
+public final class AttributeList extends Boxed
+{
+    final ArrayList<Attribute> attributes;
+
+    private boolean used;
+
+    /*
+     * This is probably broken, but there isn't anything is actually exposing
+     * a getAttributes() type functionality at the moment.
+     */
+    protected AttributeList(long pointer) {
+        super(pointer);
+        attributes = null;
+        used = true;
+    }
+
+    /**
+     * Create an AttributeList. You'll want a new one for each paragraph of
+     * text you render.
+     * 
+     * @since 4.0.10
+     */
+    public AttributeList() {
+        super(PangoAttrList.createAttributeList());
+        attributes = new ArrayList<Attribute>(4);
+        used = false;
+    }
+
+    protected void release() {
+        PangoAttrList.unref(this);
+    }
+
+    final List<Attribute> getAttributes() {
+        return attributes;
+    }
+
+    /**
+     * Insert an Attribute into this list. It will be inserted after any other
+     * Attributes already in the list possessing the same <var>start
+     * index</var>.
+     * 
+     * @since 4.0.10
+     * @throws IllegalStateException
+     *             If you attempt to reuse an Attribute that is already in an
+     *             AttributeList.
+     */
+    /*
+     * Actual native insertion is carried out in Layout's setAttributes().
+     */
+    public void insert(Attribute attr) {
+        if (attr.isInserted()) {
+            throw new IllegalStateException("Attribute already in an AttributeList");
+        }
+
+        attributes.add(attr);
+
+        attr.markInserted();
+    }
+
+    /**
+     * Insert an Attribute into this list. Same as {@link #insert(Attribute)
+     * insert()} except that the Attribute will come before other Attributes
+     * already in the list possessing the same <var>start index</var>.
+     * 
+     * @since 4.0.10
+     * @throws IllegalStateException
+     *             If you attempt to reuse an Attribute that is already in an
+     *             AttributeList.
+     */
+    /*
+     * The logic below is a somewhat cumbersome attempt to preserve the order
+     * of insertion to correspond to what the actual native behaviour is
+     * supposed to be, given our constraint of not being able to set the
+     * actual offsets until Layout's setAttributes().
+     */
+    public void insertBefore(Attribute attr) {
+        final int len;
+        int i;
+        Attribute existing;
+
+        if (attr.isInserted()) {
+            throw new IllegalStateException("Attribute already in an AttributeList");
+        }
+
+        len = attributes.size();
+
+        for (i = 0; i < len; i++) {
+            existing = attributes.get(i);
+            if (existing.getOffset() >= attr.getOffset()) {
+                attributes.add(i, attr);
+                attr.markInserted();
+                return;
+            }
+        }
+
+        attributes.add(attr);
+        attr.markInserted();
+    }
+
+    final boolean isUsed() {
+        return used;
+    }
+
+    final void markUsed() {
+        used = true;
+    }
+}
diff --git a/src/bindings/org/gnome/pango/BackgroundColorAttribute.java b/src/bindings/org/gnome/pango/BackgroundColorAttribute.java
new file mode 100644
index 0000000..71a41a5
--- /dev/null
+++ b/src/bindings/org/gnome/pango/BackgroundColorAttribute.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * Set the background ("highlight") colour for the text.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class BackgroundColorAttribute extends Attribute
+{
+    /**
+     * Create a BackgroundColorAttribute. The three colour parameters are in
+     * the same [0,1] range as other Cairo drawing functions use.
+     * 
+     * @since 4.0.10
+     */
+    public BackgroundColorAttribute(double red, double green, double blue) {
+        super(PangoAttribute.createAttributeBackground((char) (red * 65535), (char) (green * 65535),
+                (char) (blue * 65535)));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Color.java b/src/bindings/org/gnome/pango/Color.java
new file mode 100644
index 0000000..dee9dff
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Color.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Color extends Boxed
+{
+    protected Color(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Context.java b/src/bindings/org/gnome/pango/Context.java
new file mode 100644
index 0000000..f10aa1a
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Context.java
@@ -0,0 +1,109 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.cairo.FontOptions;
+import org.gnome.glib.Object;
+
+/**
+ * The internal state used by Pango when rendering.
+ * 
+ * <p>
+ * This is one of those cases where we are unfortunate that the class name
+ * collides with the same name from another package and you could find
+ * yourself using both in the same file. If you're working from a Layout and
+ * need to use this, and given theses:
+ * 
+ * <pre>
+ * import org.freedesktop.cairo.Context;
+ * import org.freedesktop.cairo.FontOptions;
+ * import org.gnome.pango.Layout;
+ * import org.gnome.gtk.Widget;
+ * </pre>
+ * 
+ * etc, you might be well off to do something like this in a
+ * <code>Widget.Draw</code> signal handler:
+ * 
+ * <pre>
+ * final Layout layout;
+ * final FontOptions config;
+ * 
+ * layout = new Layout(cr);
+ * config = new FontOptions();
+ * ...
+ * 
+ * layout.getContext().setFontOptions(config);
+ * </pre>
+ * 
+ * which avoids you having to use the fully qualified
+ * <code>org.gnome.pango.Context</code> name when you call Layout's
+ * <code>getContext()</code>.
+ * 
+ * <p>
+ * <i>You ordinarily do not need to use this, although you might want to know
+ * that every time a Pango Layout is created a fresh Pango Context is done
+ * up.</i>
+ * 
+ * @since 4.0.10
+ */
+public class Context extends Object
+{
+    protected Context(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Set the configuration options that will be used by Cairo when doing the
+     * actual rendering of font glyphs. This is how you control things like
+     * which hinting methods being used.
+     * 
+     * @since 4.0.10
+     */
+    public void setFontOptions(FontOptions options) {
+        PangoContext.setFontOptions(this, options);
+    }
+
+    /**
+     * Given a description, ask the back end to load the font which is the
+     * closest match to the request.
+     * 
+     * <p>
+     * This is the code path used by {@link Layout Layout}, so you can use
+     * this find out what font has actually been selected for rendering.
+     * 
+     * @since 4.0.19
+     */
+    public Font loadFont(FontDescription desc) {
+        return PangoContext.loadFont(this, desc);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/CoverageLevel.java b/src/bindings/org/gnome/pango/CoverageLevel.java
new file mode 100644
index 0000000..20c4234
--- /dev/null
+++ b/src/bindings/org/gnome/pango/CoverageLevel.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class CoverageLevel extends Constant
+{
+    private CoverageLevel(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Direction.java b/src/bindings/org/gnome/pango/Direction.java
new file mode 100644
index 0000000..0adc20f
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Direction.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Direction extends Constant
+{
+    private Direction(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/EllipsizeMode.java b/src/bindings/org/gnome/pango/EllipsizeMode.java
new file mode 100644
index 0000000..bbcbf44
--- /dev/null
+++ b/src/bindings/org/gnome/pango/EllipsizeMode.java
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Those constants specify what sort of ellipsization should be applied to a
+ * line of text. In the ellipsization process characters are removed from the
+ * text in order to make it fit to a given width and replaced with an ellipsis
+ * (...).
+ * 
+ * @author Guillaume Mazoyer
+ * @since 4.0.13
+ */
+public final class EllipsizeMode extends Constant
+{
+    private EllipsizeMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No ellipsization.
+     */
+    public static final EllipsizeMode NONE = new EllipsizeMode(PangoEllipsizeMode.NONE, "NONE");
+
+    /**
+     * Omit characters at the start of the text.
+     */
+    public static final EllipsizeMode START = new EllipsizeMode(PangoEllipsizeMode.START, "START");
+
+    /**
+     * Omit characters in the middle of the text.
+     */
+    public static final EllipsizeMode MIDDLE = new EllipsizeMode(PangoEllipsizeMode.MIDDLE, "MIDDLE");
+
+    /**
+     * Omit characters at the end of the text.
+     */
+    public static final EllipsizeMode END = new EllipsizeMode(PangoEllipsizeMode.END, "END");
+}
diff --git a/src/bindings/org/gnome/pango/Engine.java b/src/bindings/org/gnome/pango/Engine.java
new file mode 100644
index 0000000..0889475
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Engine.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Engine extends Object
+{
+    protected Engine(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/EngineLang.java b/src/bindings/org/gnome/pango/EngineLang.java
new file mode 100644
index 0000000..c799d03
--- /dev/null
+++ b/src/bindings/org/gnome/pango/EngineLang.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class EngineLang extends Engine
+{
+    protected EngineLang(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/EngineShape.java b/src/bindings/org/gnome/pango/EngineShape.java
new file mode 100644
index 0000000..7d141b8
--- /dev/null
+++ b/src/bindings/org/gnome/pango/EngineShape.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class EngineShape extends Engine
+{
+    protected EngineShape(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FallbackAttribute.java b/src/bindings/org/gnome/pango/FallbackAttribute.java
new file mode 100644
index 0000000..833dda2
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FallbackAttribute.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * Use this Attribute to inhibit Pango from falling back to another font if
+ * the glyph it needs is not available in the currently selected font.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.11
+ */
+public final class FallbackAttribute extends Attribute
+{
+    /**
+     * Create a FallbackAttribute. Since the ordinary default is to fallback
+     * according to your system's fontconfig settings, you only need to call
+     * this to set it <code>false</code>.
+     * 
+     * @since 4.0.11
+     */
+    public FallbackAttribute(boolean setting) {
+        super(PangoAttribute.createAttributeFallback(setting));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Font.java b/src/bindings/org/gnome/pango/Font.java
new file mode 100644
index 0000000..dc895d3
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Font.java
@@ -0,0 +1,92 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/**
+ * An abstract rendering-system-independent representation of a font, used by
+ * Pango to manage font backends. While internal to Pango, it has various uses
+ * when trying to manage font selections.
+ * 
+ * <p>
+ * You get a Font object by calling Context's
+ * {@link Context#loadFont(FontDescription) loadFont()}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.19
+ */
+public abstract class Font extends Object
+{
+    protected Font(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Given a calculated Pango Font object, get a description of it. Size
+     * will be in points.
+     * 
+     * @since 4.0.19
+     */
+    public FontDescription describe() {
+        return PangoFont.describe(this);
+    }
+
+    /**
+     * Given a calculated Pango Font object, get a description of it. Size
+     * will be in device units.
+     * 
+     * @since 4.0.19
+     */
+    public FontDescription describeWithAbsoluteSize() {
+        return PangoFont.describeWithAbsoluteSize(this);
+    }
+}
+
+abstract class FcFont extends Font
+{
+    protected FcFont(long pointer) {
+        super(pointer);
+    }
+}
+
+/*
+ * PangoCairoFcFont is what is actually getting passed back by loadFont(). Is
+ * that always the case?
+ */
+final class CairoFcFont extends FcFont
+{
+    protected CairoFcFont(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontDescription.java b/src/bindings/org/gnome/pango/FontDescription.java
new file mode 100644
index 0000000..759186a
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontDescription.java
@@ -0,0 +1,335 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * An abstract description of a font. This class is used both to list what
+ * fonts are available on the system, and also for specifying the
+ * characteristics of a font you'd like to load.
+ * 
+ * <p>
+ * The most common use is to indicate the font you want to use when drawing
+ * text:
+ * 
+ * <pre>
+ * cr = new Context(surface);
+ * layout = new Layout(cr);
+ * 
+ * desc = new FontDescription("Monospace, 12");
+ * layout.setFontDescription(desc);
+ * </pre>
+ * 
+ * The {@link #FontDescription(String) constructor} has an extensive
+ * discussion of the format of the textual descriptions you can use when
+ * hunting for that perfect font to render with.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class FontDescription extends Boxed
+{
+    protected FontDescription(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a blank FontDescription with all fields unset.
+     * 
+     * <p>
+     * {@link FontDescription#FontDescription(String) FontDescription(String)}
+     * is usually a better way to initialize the FontDescription, specially if
+     * you get the description from a {@link org.gnome.gtk.FontSelection
+     * FontSelection} Widget.
+     * 
+     * @since 4.0.10
+     */
+    public FontDescription() {
+        super(PangoFontDescription.createFontDescription());
+    }
+
+    /**
+     * Create a FontDescription from a textual description. The form is:
+     * 
+     * <pre>
+     * "family[,] options size"
+     * </pre>
+     * 
+     * where:
+     * 
+     * <ul>
+     * <li><code>family</code> is a comma separated list of one or more font
+     * <var>families</var>. The trailing <code>','</code> on the family list
+     * is optional but a good idea when a font family you're targeting
+     * includes a space in its name;</li>
+     * <li><code>options</code> is a whitespace separated list of words each
+     * describing a <var>style</var>, <var>variant</var>, <var>weight</var>,
+     * <var>stretch</var>, or <var>gravity</var>; and</li>
+     * <li><code>size</code> is the vertical <var>size</var> of the font,
+     * expressed in points You can use a suffix "px" to specify pixels
+     * instead, although this is only applicable if you're drawing to the
+     * screen or to an image backend.</li>
+     * </ul>
+     * 
+     * <p>
+     * All three are optional when using FontDescription to request a font; if
+     * default values will be used for any parameters which are absent.
+     * 
+     * <p>
+     * Font size is traditionally expressed in "points". Be aware, however,
+     * that having a "10.5" point font doesn't actually mean that lines will
+     * be precisely 10.5 points high. If you need to know their rendered size,
+     * see a resultant LayoutLine's {@link LayoutLine#getExtentsLogical()
+     * getExtentsLogical()}. You can instead follow the number with
+     * <code>"px"</code> to interpret the size argument as an absolute number
+     * of pixels .
+     * 
+     * <p>
+     * Examples include:
+     * 
+     * <ul>
+     * <li>
+     * <p>
+     * <code>"Sans Bold 24"</code><br>
+     * Your system's sans-serif application font at a size that'll probably be
+     * about right for a headline.
+     * </p>
+     * </li>
+     * <li>
+     * <p>
+     * <code>"Monospace 10"</code><br>
+     * Your system's terminal font. Note that it's <code>Monospace</code>, not
+     * <code>Monospaced</code>!
+     * </p>
+     * </li>
+     * <li>
+     * <p>
+     * <code>"Liberation Serif 12"</code><br>
+     * These are an excellent series of fonts obtained for the global
+     * community by Red Hat as libre replacements for the common, but
+     * nevertheless encumbered non-free Arial, Courier, and Times fonts.
+     * Liberation Serif in particular is ideal for output being sent to
+     * printed paper.
+     * </p>
+     * </li>
+     * <li>
+     * <p>
+     * <code>"DejaVu Sans, Book 9"</code><br>
+     * An upgraded version of Bitstream Vera. DejaVu Sans is optimized as a
+     * screen font (and hopefully is what you have set as your application
+     * font in your<b> <code>gnome-appearance-properties</code></b>). "Book"
+     * version is the term used in DejaVu for what other fonts call "Normal".
+     * </p>
+     * </li>
+     * </ul>
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * FIXME The original author or this method ripped it off from the gtkdoc,
+     * and it still reads poorly as a result. Feel free to take a hatchet to
+     * this documentation if you have better information about anything
+     * described here.
+     */
+    public FontDescription(String str) {
+        super(PangoFontDescription.createFontDescriptionFromString(str));
+    }
+
+    protected void release() {
+        PangoFontDescription.free(this);
+    }
+
+    public int hashCode() {
+        return PangoFontDescription.hash(this);
+    }
+
+    public boolean equals(Object obj) {
+        final FontDescription desc;
+
+        if (!(obj instanceof FontDescription)) {
+            return false;
+        }
+        desc = (FontDescription) obj;
+
+        return PangoFontDescription.equal(this, desc);
+    }
+
+    /**
+     * Specify the family (of related font styles) you wish to pick.
+     * 
+     * <p>
+     * See the <code>families</code> argument to the FontDescription
+     * {@link #FontDescription(String) constructor} for details.
+     * 
+     * @since 4.0.10
+     */
+    public void setFamily(String family) {
+        PangoFontDescription.setFamily(this, family);
+    }
+
+    /**
+     * The family the font that this FontDescription represents belongs to.
+     * Returns <code>null</code> if unset.
+     * 
+     * @since 4.0.10
+     */
+    public String getFamily() {
+        return PangoFontDescription.getFamily(this);
+    }
+
+    /**
+     * Set the style of the font you're looking for. This is
+     * {@link Style#ITALIC ITALIC} and friends.
+     * 
+     * <p>
+     * If you've worked with Textview then you might have seen this before as
+     * TextTag's {@link org.gnome.gtk.TextTag#setStyle(Style) setStyle()}.
+     * Same factor.
+     * 
+     * @since 4.0.10
+     */
+    public void setStyle(Style style) {
+        PangoFontDescription.setStyle(this, style);
+    }
+
+    /**
+     * Get the slant style of the font.
+     * 
+     * @since 4.0.10
+     */
+    public Style getStyle() {
+        return PangoFontDescription.getStyle(this);
+    }
+
+    /**
+     * Set the capitalization variant of the Font. This is where
+     * {@link Variant#SMALL_CAPS SMALL_CAPS} lives. Normally you'll leave it
+     * alone; not surprisingly the default is {@link Variant#NORMAL NORMAL}.
+     * 
+     * @since 4.0.10
+     */
+    public void setVariant(Variant variant) {
+        PangoFontDescription.setVariant(this, variant);
+    }
+
+    /**
+     * Get the capitalization variant of the font.
+     * 
+     * @since 4.0.10
+     */
+    public Variant getVariant() {
+        return PangoFontDescription.getVariant(this);
+    }
+
+    /**
+     * Indicate how bold or light the font should be.
+     * 
+     * @since 4.0.10
+     */
+    public void setWeight(Weight weight) {
+        PangoFontDescription.setWeight(this, weight);
+    }
+
+    /**
+     * Get the weight of the font.
+     * 
+     * @since 4.0.10
+     */
+    public Weight getWeight() {
+        return PangoFontDescription.getWeight(this);
+    }
+
+    /**
+     * Get the size of this font, in device units.
+     * 
+     * <p>
+     * Note that this does <i>not</i> imply how high a line in this font will
+     * be; that is up to the Layout doing the rendering. To find out the
+     * height of a rendered line, use LayoutLine's
+     * {@link LayoutLine#getExtentsLogical() getExtentsLogical()}.
+     * 
+     * @since 4.0.10
+     */
+    public double getSize() {
+        return PangoFontDescription.getSize(this) / Pango.SCALE;
+    }
+
+    /**
+     * Set the size of the font you are requesting. Size is expressed in
+     * points.
+     * 
+     * <p>
+     * Since you can indicate the size you want when constructing with a
+     * textual description, you don't need this too often.
+     * 
+     * @since 4.0.10
+     */
+    public void setSize(double size) {
+        PangoFontDescription.setSize(this, (int) (size * Pango.SCALE));
+    }
+
+    /**
+     * Set the size in raw device units (ie pixels if working on screen).
+     * 
+     * <p>
+     * This corresponds to providing a size in a textual description such as
+     * <code>"Sans, 10px"</code> instead of <code>"Sans, 10"</code>; since you
+     * can specify it there you problably don't need this much.
+     * 
+     * @since <span style="color: red">Unstable</span>
+     */
+    /*
+     * TODO Why WOULD anyone would need this? FIXME what happens in the
+     * presence of scaling? What is the real relationship to setSize() given
+     * that Cairo is doing all the work?
+     */
+    public void setSizeAbsolute(double size) {
+        PangoFontDescription.setAbsoluteSize(this, size * Pango.SCALE);
+    }
+
+    /**
+     * Make a deep copy of this FontDescription object.
+     * 
+     * @since 4.0.11
+     */
+    public FontDescription copy() {
+        return PangoFontDescription.copy(this);
+    }
+
+    public String toString() {
+        return PangoFontDescription.toString(this);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontDescriptionAttribute.java b/src/bindings/org/gnome/pango/FontDescriptionAttribute.java
new file mode 100644
index 0000000..50e25dd
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontDescriptionAttribute.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * Create an Attribute that applies the specified FontDescription. This is a
+ * baseline; all the other Attributes will supersede settings established here
+ * by the presence of one of these.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class FontDescriptionAttribute extends Attribute
+{
+    /**
+     * Create a FondDescriptionAttribute.
+     * 
+     * @since 4.0.10
+     */
+    public FontDescriptionAttribute(FontDescription desc) {
+        super(PangoAttribute.createAttributeFontDescription(desc));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontFace.java b/src/bindings/org/gnome/pango/FontFace.java
new file mode 100644
index 0000000..3c6343c
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontFace.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontFace extends Object
+{
+    protected FontFace(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontFamily.java b/src/bindings/org/gnome/pango/FontFamily.java
new file mode 100644
index 0000000..3d4c539
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontFamily.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontFamily extends Object
+{
+    protected FontFamily(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontMap.java b/src/bindings/org/gnome/pango/FontMap.java
new file mode 100644
index 0000000..bcc4be8
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontMap.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontMap extends Object
+{
+    protected FontMap(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontMask.java b/src/bindings/org/gnome/pango/FontMask.java
new file mode 100644
index 0000000..5e24507
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontMask.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FontMask extends Flag
+{
+    private FontMask(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontMetrics.java b/src/bindings/org/gnome/pango/FontMetrics.java
new file mode 100644
index 0000000..5b3142c
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontMetrics.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class FontMetrics extends Boxed
+{
+    protected FontMetrics(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Fontset.java b/src/bindings/org/gnome/pango/Fontset.java
new file mode 100644
index 0000000..f12b7c7
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Fontset.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Fontset extends Object
+{
+    protected Fontset(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/FontsetSimple.java b/src/bindings/org/gnome/pango/FontsetSimple.java
new file mode 100644
index 0000000..f870ddd
--- /dev/null
+++ b/src/bindings/org/gnome/pango/FontsetSimple.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class FontsetSimple extends Fontset
+{
+    protected FontsetSimple(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/ForegroundColorAttribute.java b/src/bindings/org/gnome/pango/ForegroundColorAttribute.java
new file mode 100644
index 0000000..69d5d50
--- /dev/null
+++ b/src/bindings/org/gnome/pango/ForegroundColorAttribute.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * Set the foreground colour for the text.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+/*
+ * This was named ...Color... so that it would be parallel with
+ * UndergroundColorAttribute and StrikethroughColorAttribute.
+ */
+public final class ForegroundColorAttribute extends Attribute
+{
+    /**
+     * Create a ForegroundColorAttribute. The three colour parameters are in
+     * the same [0,1] range as other Cairo drawing functions use.
+     * 
+     * @since 4.0.10
+     */
+    public ForegroundColorAttribute(double red, double green, double blue) {
+        super(PangoAttribute.createAttributeForeground((char) (red * 65535), (char) (green * 65535),
+                (char) (blue * 65535)));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/GlyphGeometry.java b/src/bindings/org/gnome/pango/GlyphGeometry.java
new file mode 100644
index 0000000..aae46a9
--- /dev/null
+++ b/src/bindings/org/gnome/pango/GlyphGeometry.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class GlyphGeometry extends Boxed
+{
+    protected GlyphGeometry(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/GlyphInfo.java b/src/bindings/org/gnome/pango/GlyphInfo.java
new file mode 100644
index 0000000..b64866d
--- /dev/null
+++ b/src/bindings/org/gnome/pango/GlyphInfo.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class GlyphInfo extends Boxed
+{
+    protected GlyphInfo(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/GlyphString.java b/src/bindings/org/gnome/pango/GlyphString.java
new file mode 100644
index 0000000..fc00848
--- /dev/null
+++ b/src/bindings/org/gnome/pango/GlyphString.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class GlyphString extends Boxed
+{
+    protected GlyphString(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Gravity.java b/src/bindings/org/gnome/pango/Gravity.java
new file mode 100644
index 0000000..cf7e50f
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Gravity.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Gravity extends Constant
+{
+    private Gravity(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/GravityHint.java b/src/bindings/org/gnome/pango/GravityHint.java
new file mode 100644
index 0000000..4c826eb
--- /dev/null
+++ b/src/bindings/org/gnome/pango/GravityHint.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class GravityHint extends Constant
+{
+    private GravityHint(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Item.java b/src/bindings/org/gnome/pango/Item.java
new file mode 100644
index 0000000..0a1e22f
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Item.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Item extends Boxed
+{
+    protected Item(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Language.java b/src/bindings/org/gnome/pango/Language.java
new file mode 100644
index 0000000..60a8206
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Language.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Language extends Boxed
+{
+    protected Language(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Layout.java b/src/bindings/org/gnome/pango/Layout.java
new file mode 100644
index 0000000..082ea0e
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Layout.java
@@ -0,0 +1,557 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+import org.gnome.gtk.Widget;
+
+/**
+ * A Layout represents a paragraph of text, together with its attributes.
+ * 
+ * <p>
+ * Drawing is done with Cairo; you get a Layout by passing the Cairo drawing
+ * Context you're currently working in to the constructor. If you're drawing a
+ * Widget, you'll be doing so in a <code>Widget.Draw</code> signal handler
+ * where you'll typically see:
+ * 
+ * <pre>
+ * w.connect(new Widget.Draw() {
+ *     public boolean onDraw(Widget source, Context cr) {
+ *         final Layout layout;
+ * 
+ *         layout = new Layout(cr);
+ * 
+ *         // use layout to lay out the text you wish to draw
+ * 
+ *         cr.showLayout(layout);
+ *     }
+ * });
+ * </pre>
+ * 
+ * <p>
+ * Layout can indeed layout multiple paragraphs of text, but usually you need
+ * more control over positioning, so most of the time you have to work a
+ * paragraph at a time. You can, however, avoid creating a new Layout each
+ * time by calling {@link #setText(String) setText()} with the new paragraph
+ * text.
+ * 
+ * <p>
+ * <i>A single paragraph at a time is how PangoLayout was designed and
+ * intended to be used.</i>
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public class Layout extends Object
+{
+    protected Layout(long pointer) {
+        super(pointer);
+    }
+
+    public String toString() {
+        return PangoLayout.getText(this);
+    }
+
+    /**
+     * Create a new Layout configured to draw using the given Cairo Context
+     * backend.
+     * 
+     * <p>
+     * This Layout can be used to set up the text to draw and its properties.
+     * 
+     * <p>
+     * To actually draw the text, you call the
+     * {@link org.freedesktop.cairo.Context#showLayout(Layout) showLayout()}
+     * method on the Cairo Context you specified when constructing this
+     * Layout.
+     * 
+     * <p>
+     * Note that if you change the transformation or target Surface for the
+     * Context, you <b>must</b> call
+     * {@link org.freedesktop.cairo.Context#updateLayout(Layout)
+     * updateLayout()} to signal this Layout that changes have taken place.
+     * 
+     * @since 4.0.10
+     */
+    public Layout(org.freedesktop.cairo.Context context) {
+        super(PangoLayout.createLayoutFromCairo(context));
+    }
+
+    /**
+     * Sets the text of the Layout. This is the text that will be drawn.
+     * 
+     * <p>
+     * If you wish to pass text enhanced with Pango Markup, use
+     * {@link #setMarkup(String) setMarkup()} instead.
+     * 
+     * <p>
+     * Alternately, you can use this <code>setText()</code> method to set the
+     * full textual content of the Layout and then build up a set of
+     * Attributes describing which formats you wish to be in effect across
+     * what ranges. You assemble this information in an AttributeList and then
+     * apply it to this Layout by calling
+     * {@link #setAttributes(AttributeList) setAttributes()}.
+     * 
+     * @since 4.0.10
+     */
+    public void setText(String text) {
+        PangoLayout.setText(this, text, -1);
+    }
+
+    /**
+     * Set the text of this Layout. Its format is specified using Pango Markup
+     * format.
+     * 
+     * <p>
+     * If you're just passing in normal straight-forward unformatted text, use
+     * {@link #setText(String) setText()}.
+     * 
+     * <p>
+     * <b>WARNING</b>:<br>
+     * Use {@link org.gnome.glib.Glib#markupEscapeText(String)
+     * Glib.markupEscapeText()} unless you are certain that your input does
+     * not contain any characters thatare invalid XML.
+     * 
+     * @since 4.0.10
+     * @see <a
+     *      href="http://library.gnome.org/devel/pango/stable/PangoMarkupFormat.html">Pango
+     *      Markup format</a>
+     */
+    public void setMarkup(String markup) {
+        PangoLayout.setMarkup(this, markup, -1);
+    }
+
+    /**
+     * Get the width of the Layout. This is the width of the layout text,
+     * taking its format into account (for example, the size of the Font will
+     * influence the final size!).
+     * 
+     * <p>
+     * Note that this is not necessarily related with the line wrap width you
+     * set with {@link #setWidth(double) setWidth()} method.
+     * 
+     * @since 4.0.10
+     */
+    public double getSizeWidth() {
+        int[] width = new int[1];
+        PangoLayout.getSize(this, width, null);
+        return width[0] / Pango.SCALE;
+    }
+
+    /**
+     * Get the height of the Layout. This is the height of the layout text,
+     * taking its format into account (for example, the size of the Font will
+     * influence the final size!).
+     * 
+     * @since 4.0.10
+     */
+    public double getSizeHeight() {
+        int[] height = new int[1];
+        PangoLayout.getSize(this, null, height);
+        return height[0] / Pango.SCALE;
+    }
+
+    /**
+     * Get the width, in pixels, of the Layout. This is suitable, together
+     * with {@link #getPixelHeight() getPixelHeight()}, to pass to a Widget's
+     * {@link Widget#setSizeRequest(int, int) setSizeRequest()} in order to
+     * ensure enough space is available for the text to actually be shown.
+     * 
+     * @since 4.0.10
+     */
+    public int getPixelWidth() {
+        int[] width = new int[1];
+        PangoLayout.getPixelSize(this, width, null);
+        return width[0];
+    }
+
+    /**
+     * Get the height, in pixels, of the Layout. See the corresponding method
+     * {@link #getPixelWidth() getPixelWidth()} for details.
+     * 
+     * @since 4.0.10
+     */
+    public int getPixelHeight() {
+        int[] height = new int[1];
+        PangoLayout.getPixelSize(this, null, height);
+        return height[0];
+    }
+
+    /**
+     * Sets the default FontDescription for the Layout.
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * TODO the upstream documentation says
+     * "If none is set, then the FontDescription from the Layout's Context is used."
+     * This means what, exactly? Where does that get set?
+     */
+    public void setFontDescription(FontDescription desc) {
+        PangoLayout.setFontDescription(this, desc);
+    }
+
+    /**
+     * Set the width of the Layout to be used for word-wrapping purposes.
+     * 
+     * <p>
+     * This will determine the positioning of the text and how the lines are
+     * wrapped. If a text line is greater than the given size, it is split
+     * into several lines.
+     * 
+     * @param width
+     *            The width in Cairo terms (typically pixels if you're drawing
+     *            a Widget or image, or points if you're drawing a PDF).
+     * @since 4.0.10
+     */
+    public void setWidth(double width) {
+        PangoLayout.setWidth(this, (int) (width * Pango.SCALE));
+    }
+
+    /**
+     * Sets whether each complete line should be stretched to fill the entire
+     * width of the layout.
+     * 
+     * <p>
+     * This stretching is typically done by adding whitespace, but for some
+     * scripts (such as Arabic), the justification may be done in more complex
+     * ways, like extending the characters.
+     * 
+     * @since 4.0.10
+     */
+    public void setJustify(boolean justify) {
+        PangoLayout.setJustify(this, justify);
+    }
+
+    /**
+     * Gets whether each complete line should be stretched to fill the entire
+     * width of the Layout.
+     * 
+     * @since 4.0.10
+     */
+    public boolean getJustify() {
+        return PangoLayout.getJustify(this);
+    }
+
+    /**
+     * Sets the <var>alignment</var> for the Layout. This controls how partial
+     * lines are positioned within the available horizontal space.
+     * 
+     * <p>
+     * Note that contrary to what is commonly expressed in the user interface
+     * of common tools like word processors, justification is not an alignment
+     * type. If you wish to have equally wide lines, see
+     * {@link #setJustify(boolean) setJustify()}. Alignment remains important
+     * as it controls where indentation is relative to and what to do with the
+     * last line of each paragraph.
+     * 
+     * @since 4.0.10
+     */
+    public void setAlignment(Alignment alignment) {
+        PangoLayout.setAlignment(this, alignment);
+    }
+
+    /**
+     * Get the <var>alignment</var> of the Layout.
+     * 
+     * @since 4.0.10
+     */
+    public Alignment getAlignment() {
+        return PangoLayout.getAlignment(this);
+    }
+
+    /**
+     * Sets the width by which to indent the first line of each paragraph. A
+     * negative value of indent will produce a hanging indentation. That is,
+     * the first line will have the full width, and subsequent lines will be
+     * indented by the absolute value of indent.
+     * 
+     * <p>
+     * Note that the indent is relative to the Alignment of the text, if the
+     * text is aligned to the right, the indent is computed from there.
+     * 
+     * @since 4.0.10
+     */
+    public void setIndent(double indent) {
+        PangoLayout.setIndent(this, (int) (indent * Pango.SCALE));
+    }
+
+    /**
+     * Get the paragraph indent of this Layout. It'll be <code>0</code> unless
+     * you called {@link #setIndent(double) setIndent()} to change it.
+     * 
+     * @since 4.0.10
+     */
+    public double getIndent() {
+        final int units;
+        units = PangoLayout.getIndent(this);
+        return units / Pango.SCALE;
+    }
+
+    /**
+     * Get the LayoutLine representing an individual line of text as have been
+     * laid out by this Layout. The <code>index</code> number is
+     * <code>0</code> origin.
+     * 
+     * @since 4.0.10
+     */
+    public LayoutLine getLine(int index) {
+        return PangoLayout.getLine(this, index);
+    }
+
+    /**
+     * Get the number of lines that this Layout has been laid out into. It
+     * will always be at least <code>1</code> (and indeed will only be
+     * <code>1</code> unless you have called {@link #setWidth(double)
+     * setWidth()} and supplied sufficient text that the Layout has wrapped it
+     * into a multi-line paragraph).
+     * 
+     * @since 4.0.10
+     */
+    public int getLineCount() {
+        return PangoLayout.getLineCount(this);
+    }
+
+    /**
+     * Get the LayoutLine representing an individual line of text as has been
+     * laid out by this Layout. The <code>index</code> number ranges from
+     * <code>0</code> origin to {@link #getLineCount() getLineCount()}
+     * <code> - 1</code>.
+     * 
+     * <p>
+     * This method is optimized for the common case where you are not changing
+     * the characteristics of the individual glyphs in the line, and should be
+     * used in preference to {@link #getLine(int) getLine()}.
+     * 
+     * @since 4.0.10
+     */
+    public LayoutLine getLineReadonly(int index) {
+        return PangoLayout.getLineReadonly(this, index);
+    }
+
+    /**
+     * Get an array of LayoutLines representing the individual lines of text
+     * as have been laid out by this Layout.
+     * 
+     * @since 4.0.10
+     */
+    public LayoutLine[] getLines() {
+        return PangoLayout.getLines(this);
+    }
+
+    /**
+     * Get an array of LayoutLines representing the individual lines of text
+     * as have been laid out by this Layout. This form of
+     * <code>getLines()</code> uses faster code paths optimized for the usual
+     * case that you are not using Pango to modify the text in the lines, but
+     * are instead planning to go directly to rendering them.
+     * 
+     * @since 4.0.10
+     */
+    public LayoutLine[] getLinesReadonly() {
+        return PangoLayout.getLinesReadonly(this);
+    }
+
+    public Rectangle getExtentsInk() {
+        final Rectangle result;
+
+        result = new Rectangle();
+
+        PangoLayout.getExtents(this, result, null);
+
+        return result;
+    }
+
+    /**
+     * Get the Rectangle enclosing the entire Layout as it will be rendered.
+     * 
+     * @since 4.0.10
+     */
+    public Rectangle getExtentsLogical() {
+        final Rectangle result;
+
+        result = new Rectangle();
+
+        PangoLayout.getExtents(this, null, result);
+
+        return result;
+    }
+
+    /**
+     * Get the vertical position of the baseline in the first line of this
+     * Layout.
+     * 
+     * <p>
+     * If you're laying out lines individually, you almost certainly want to
+     * get the extents of each LayoutLine and then use that Rectangle's
+     * {@link Rectangle#getAscent() getAscent()} instead.
+     * 
+     * @since 4.0.10
+     */
+    public double getBaseline() {
+        return PangoLayout.getBaseline(this) / Pango.SCALE;
+    }
+
+    /**
+     * Return the <b>Pango</b> Context powering this Layout.
+     * 
+     * <p>
+     * Since you probably constructed this Layout with a <i>Cairo</i> Context,
+     * you're going to end up with some messy fully qualified names if you
+     * need to use this. You might just want to use the type implicitly:
+     * 
+     * <pre>
+     * layout.getContext().setFontOptions(options);
+     * </pre>
+     * 
+     * so that you can keep the rest of the uses of the bare word
+     * <code>Context</code> as the Cairo one already imported.
+     * 
+     * <p>
+     * Note that having made a call like the one shown, you need to either
+     * call <code>contextChanged()</code> or <code>setText()</code> to cause
+     * the Layout to take notice.
+     * 
+     * @since 4.0.10
+     */
+    public Context getContext() {
+        return PangoLayout.getContext(this);
+    }
+
+    /**
+     * Sets the sequence of Attributes describing the markup you wish to have
+     * in play. This indices of all the Attributes need to have been set after
+     * the text in this Layout was established via {@link #setText(String)
+     * setText()}.
+     * 
+     * <p>
+     * See {@link AttributeList} for a detailed example of using this method
+     * to indicate formatting.
+     * 
+     * @since 4.0.10
+     */
+    public void setAttributes(AttributeList list) {
+        if (list.isUsed()) {
+            throw new IllegalStateException("AttributeList has already been employed");
+        }
+
+        /*
+         * We now go through the exercise of setting the start and end indexes
+         * of the individual Attributes relative to the actual UTF-8 text
+         * being rendered. Until this point we kept note of character offsets
+         * here on the Java side.
+         */
+
+        for (Attribute attr : list.getAttributes()) {
+            PangoAttributeOverride.setIndexes(attr, this, attr.getOffset(), attr.getWidth());
+            PangoAttrList.insert(list, attr);
+        }
+
+        /*
+         * Now we are caught up to the state that Pango would expect.
+         */
+
+        PangoLayout.setAttributes(this, list);
+
+        list.markUsed();
+    }
+
+    /**
+     * Get the spacing between lines of a rendered paragraph.
+     * 
+     * @since 4.0.11
+     */
+    public double getSpacing() {
+        return PangoLayout.getSpacing(this) / Pango.SCALE;
+    }
+
+    /**
+     * Set the spacing that will occur between lines of a rendered paragraph.
+     * 
+     * <p>
+     * Obviously this will only have any effect if you are rendering complete
+     * Layouts as 2D shapes via
+     * {@link org.freedesktop.cairo.Context#showLayout(Layout) showLayout()}.
+     * If you are working instead with individual LayoutLines then it's up to
+     * you how much spacing you pad between lines as you draw them.
+     * 
+     * <p>
+     * The default is <code>0</code>.
+     * 
+     * @since 4.0.11
+     */
+    public void setSpacing(double between) {
+        PangoLayout.setSpacing(this, (int) (between * Pango.SCALE));
+    }
+
+    /**
+     * Set the line wrapping mode (if set, then lines turn into paragraphs).
+     * The <var>width</var> must be set with {@link #setWidth(double)
+     * setWidth()} for this to work.
+     * 
+     * <p>
+     * The default is {@link WrapMode#WORD WORD} so you shouldn't need to call
+     * this. In any case, wrapping is turned on by setting a width greater
+     * than <code>-1</code>, not by this method.
+     * 
+     * @since 4.0.11
+     */
+    public void setWrapMode(WrapMode mode) {
+        PangoLayout.setWrap(this, mode);
+    }
+
+    /**
+     * Indicate that the Layout is not to do paragraph breaks on encountering
+     * LINE_SEPARATOR characters.
+     * 
+     * <p>
+     * If this is turned on then when the Layout encounters newlines they will
+     * be replaced with an symbol marking the position of the newline. This
+     * allows you to create a user interface that edits the newlines
+     * explicitly on a single line.
+     * 
+     * <p>
+     * The default is <code>false</code>, obviously.
+     * 
+     * <p>
+     * Note that word wrapping is not affected by this. This is single
+     * <i>paragraph</i> mode, not single <i>line</i> mode.
+     * 
+     * @since 4.0.11
+     */
+    public void setSingleParagraphMode(boolean setting) {
+        PangoLayout.setSingleParagraphMode(this, setting);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/LayoutIter.java b/src/bindings/org/gnome/pango/LayoutIter.java
new file mode 100644
index 0000000..f092d20
--- /dev/null
+++ b/src/bindings/org/gnome/pango/LayoutIter.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class LayoutIter extends Boxed
+{
+    protected LayoutIter(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/LayoutLine.java b/src/bindings/org/gnome/pango/LayoutLine.java
new file mode 100644
index 0000000..97bd9a0
--- /dev/null
+++ b/src/bindings/org/gnome/pango/LayoutLine.java
@@ -0,0 +1,173 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * A line within a Layout. Once a Layout has been given text to lay out,
+ * individual lines within it can be accessed via the methods on this class.
+ * 
+ * <pre>
+ * lines = layout.getLinesReadonly();
+ * 
+ * x = leftMargin;
+ * y = topMargin + rect.getAscent();
+ * 
+ * for (i = 0; i < lines.length; i++) {
+ *     rect = lines[i].getExtentsLogical();
+ *     y += rect.getHeight();
+ * 
+ *     cr.moveTo(x, y);
+ *     cr.showLayout(lines[i]);
+ * }
+ * </pre>
+ * 
+ * which of course is the hard way of doing:
+ * 
+ * <pre>
+ * cr.showLayout(layout);
+ * </pre>
+ * 
+ * but gives you control over the individual lines of the paragraph which is
+ * necessary when doing paginated layout and worrying about available vertical
+ * space.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class LayoutLine extends Boxed
+{
+    protected LayoutLine(long pointer) {
+        super(pointer);
+        /*
+         * FYI, we changed our .defs data to have the generated code wrapping
+         * pango_layout_line_ref() to return void rather than returning the
+         * PangoLayoutLine pointer. Otherwise we get an endless loop of
+         * init(ling) -> ref() -> boxedFor() -> createPointer() -> init(long)
+         * -> ref() which blows out the stack. The point is to increase the
+         * ref count safely; we don't need the return value.
+         */
+        PangoLayoutLine.ref(this);
+    }
+
+    protected void release() {
+        PangoLayoutLine.unref(this);
+    }
+
+    public Rectangle getExtentsInk() {
+        final Rectangle result;
+
+        result = new Rectangle();
+
+        PangoLayoutLine.getExtents(this, result, null);
+
+        return result;
+    }
+
+    /**
+     * Get a Rectangle describing the logical extents calculated for this line
+     * of rendered text.
+     * 
+     * <p>
+     * The <code>x</code>, <code>y</code>, and <code>height</code> parameters
+     * of these Rectangles are the same for each LayoutLine in a given Layout;
+     * the <var>width</var> will be variable (unless you have evenly justified
+     * the text, and even then last line of each paragraph will be less than
+     * the <var>width</var> of the others).
+     * 
+     * <p>
+     * <b>Note</b><br>
+     * It is a common mistake to assume that the origin of the Pango
+     * co-ordinate space is the top-right corner of an extents Rectangle. This
+     * is not the case; the vertical origin is at the base line.
+     * 
+     * <p>
+     * The {@link org.freedesktop.cairo.Context#showLayout(LayoutLine)
+     * showLayout()} method that takes a LayoutLine starts its drawing by
+     * placing its Rectangle's origin at the current Context point. So to
+     * render consistently spaced lines of text you will need to move the
+     * Context point <b>down</b> by the value of the ascent (which is the
+     * negative of the <code>y</code> co-ordinate describing top of the
+     * rectangle from the origin):
+     * 
+     * <pre>
+     * rect = line.getExtentsLogical();
+     * 
+     * h = leftMargin;
+     * v = topMargin + rect.getAscent() + lineNumber * rect.getHeight();
+     * 
+     * cr.moveTo(h, v);
+     * cr.showLayout(line);
+     * </pre>
+     * 
+     * @since 4.0.10
+     */
+    /*
+     * TODO are x, y, height actually going to be the same for all LayoutLines
+     * in a given Layout? That's seems to make sense, and is indeed what
+     * testing observed. Could be wrong, of course.
+     */
+    public Rectangle getExtentsLogical() {
+        final Rectangle result;
+
+        result = new Rectangle();
+
+        PangoLayoutLine.getExtents(this, null, result);
+
+        return result;
+    }
+
+    /**
+     * Get the character position into the parent Layout that this LayoutLine
+     * begins at.
+     * 
+     * <p>
+     * <i>The underlying PangoLayout and PangoLayoutLine structures work in
+     * byte widths; we convert to character offsets.</i>
+     * 
+     * @since 4.0.14
+     */
+    public int getStartIndex() {
+        return PangoLayoutLineOverride.getStartIndex(this);
+    }
+
+    /**
+     * Get the width of this LayoutLine, in characters.
+     * 
+     * @since 4.0.14
+     */
+    public int getLength() {
+        return PangoLayoutLineOverride.getLength(this);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Matrix.java b/src/bindings/org/gnome/pango/Matrix.java
new file mode 100644
index 0000000..1a514c0
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Matrix.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Matrix extends Boxed
+{
+    protected Matrix(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Pango.java b/src/bindings/org/gnome/pango/Pango.java
new file mode 100644
index 0000000..ff98cd5
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Pango.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Glib;
+
+final class Pango extends Glib
+{
+    private Pango() {}
+
+    /**
+     * Conversion factor to go from Cairo device units to "Pango Units".
+     */
+    /*
+     * The Pango library uses a fixed point system, scaled up by this
+     * constant; Cairo on the other hand uses doubles. Since all the drawing
+     * we're doing with Pango will be in the context of a Cairo drawing
+     * operation, we expose our API as doubles to match Cairo, and quietly
+     * convert internally.
+     * 
+     * Seeing as how Pango draws on Cairo, it'd be nice if Pango just exposed
+     * the doubles and was done with it.
+     * 
+     * Since we divide by this frequently, we keep it here as a double to
+     * reduce the risk of creating divide-by-integer errors.
+     * 
+     * FUTURE retreive from native as this is subject to change in the future.
+     */
+    static final double SCALE = 1024.0;
+}
diff --git a/src/bindings/org/gnome/pango/PangoAttributeOverride.c b/src/bindings/org/gnome/pango/PangoAttributeOverride.c
new file mode 100644
index 0000000..7f249e9
--- /dev/null
+++ b/src/bindings/org/gnome/pango/PangoAttributeOverride.c
@@ -0,0 +1,108 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <pango/pango.h>
+#include "bindings_java.h"
+#include "org_gnome_pango_PangoAttributeOverride.h"
+
+JNIEXPORT void JNICALL
+Java_org_gnome_pango_PangoAttributeOverride_pango_1attribute_1set_1indexes
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self,
+	jlong _layout,
+	jint _offset,
+	jint _width
+)
+{
+	PangoAttribute* self;
+	PangoLayout* layout;
+	gint offset;
+	gint width;
+	const char* text;
+	char* alpha;
+	char* omega;
+	guint start;
+	guint end;
+	
+	// convert paramter self
+	self = (PangoAttribute*) _self;
+
+	// convert paramter layout
+	layout = (PangoLayout*) _layout;
+
+	// convert parameter offset
+	offset = (gint) _offset;
+
+	// convert parameter width
+	width = (gint) _width;
+
+	/*
+	 * We use Integer.MIN_VALUE as our sentinel that we mean unbounded.
+	 */
+
+	if (width == 0x80000000) {
+		width = G_MAXUINT;
+	}
+
+	// convert to bounds
+	/*
+	 * Get the text out of the layout, and then work out what
+	 * the offset and offset+width work out to in byte terms.
+	 */
+
+	text = pango_layout_get_text(layout);
+
+	alpha = g_utf8_offset_to_pointer(text, offset);
+	omega = g_utf8_offset_to_pointer(text, offset + width);
+
+	start = alpha - text;
+	end = omega - text;
+
+	// set fields
+	self->start_index = start;
+	self->end_index = end;
+	
+	// cleanup parameter self
+
+	// cleanup parameter layout
+
+	// cleanup parameter offset
+
+	// cleanup parameter width
+
+	// local text should not be modified or freed
+}
+
diff --git a/src/bindings/org/gnome/pango/PangoAttributeOverride.java b/src/bindings/org/gnome/pango/PangoAttributeOverride.java
new file mode 100644
index 0000000..eec7f2f
--- /dev/null
+++ b/src/bindings/org/gnome/pango/PangoAttributeOverride.java
@@ -0,0 +1,56 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * @author Andrew Cowie
+ */
+final class PangoAttributeOverride extends Plumbing
+{
+    private PangoAttributeOverride() {}
+
+    static final void setIndexes(Attribute self, Layout layout, int offset, int width) {
+        synchronized (lock) {
+            pango_attribute_set_indexes(pointerOf(self), pointerOf(layout), offset, width);
+        }
+    }
+
+    private static native final void pango_attribute_set_indexes(long self, long layout, int offset,
+            int width);
+
+    static int getLengthUTF8(String str) {
+        return strlen(str);
+    }
+
+    private static native final int strlen(String str);
+}
diff --git a/src/bindings/org/gnome/pango/PangoLayoutLineOverride.c b/src/bindings/org/gnome/pango/PangoLayoutLineOverride.c
new file mode 100644
index 0000000..f3cf5ff
--- /dev/null
+++ b/src/bindings/org/gnome/pango/PangoLayoutLineOverride.c
@@ -0,0 +1,166 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "org_gnome_pango_PangoLayoutLineOverride.h"
+
+JNIEXPORT jint JNICALL
+Java_org_gnome_pango_PangoLayoutLineOverride_pango_1layout_1line_1get_1start_1index
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	PangoLayoutLine* self;
+	const gchar* text;
+	const gchar* pointer;
+	glong offset;
+	gint result;
+	jint _result;
+
+	// convert parameter self
+	self = (PangoLayoutLine*) _self;
+
+	// get field value
+
+	/*
+	 * We need to convert to a character offset; to do so we get
+	 * the text backing the Layout, and pass that string and the byte
+         * start_index to the UTF8 conversion function.
+	 */
+
+	text = pango_layout_get_text(self->layout);
+	pointer = text + self->start_index;
+	offset = g_utf8_pointer_to_offset(text, pointer);
+
+	/*
+	 * The start_index and length fields are both integer, so
+	 * so down cast the long to int.
+	 */
+
+	result = (gint) offset;
+
+	// cleanup parameter self
+
+	// translate return value to JNI type
+	_result = (jint) result;
+
+	// and finally
+	return _result;
+}
+
+/*
+ * This ends up being exactly the same logic as the start_index case above
+ * because we need to work in characters and so need the underlying Layout's
+ * underlying string to do the character count.
+ */
+JNIEXPORT jint JNICALL
+Java_org_gnome_pango_PangoLayoutLineOverride_pango_1layout_1line_1get_1length
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	PangoLayoutLine* self;
+	const gchar* text;
+	const gchar* alpha;
+	const gchar* omega;
+	glong begin;
+	glong end;
+	gint result;
+	jint _result;
+
+	// convert parameter self
+	self = (PangoLayoutLine*) _self;
+
+	// get field value
+
+	/*
+	 * We need to convert to a character offset; to do so we get
+	 * the text backing the Layout, and pass that string and the byte
+         * start_index to the UTF8 conversion function.
+	 */
+
+	text = pango_layout_get_text(self->layout);
+	alpha = text + self->start_index;
+	omega = text + self->start_index + self->length;
+	begin = g_utf8_pointer_to_offset(text, alpha);
+	end = g_utf8_pointer_to_offset(text, omega);
+
+	/*
+	 * The start_index and length fields are both integer, so
+	 * so down cast the long to int.
+	 */
+
+	result = (gint) end - begin;
+
+	// cleanup parameter self
+
+	// translate return value to JNI type
+	_result = (jint) result;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	// translate return value to JNI type
+	_result = (jint) result;
+
+	// and finally
+	return _result;
+}
+
diff --git a/src/bindings/org/gnome/pango/PangoLayoutLineOverride.java b/src/bindings/org/gnome/pango/PangoLayoutLineOverride.java
new file mode 100644
index 0000000..fdeac47
--- /dev/null
+++ b/src/bindings/org/gnome/pango/PangoLayoutLineOverride.java
@@ -0,0 +1,73 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * @author Andrew Cowie
+ */
+final class PangoLayoutLineOverride extends Plumbing
+{
+    private PangoLayoutLineOverride() {}
+
+    static final int getStartIndex(LayoutLine self) {
+        int result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = pango_layout_line_get_start_index(pointerOf(self));
+
+            return result;
+        }
+    }
+
+    private static native final int pango_layout_line_get_start_index(long self);
+
+    static final int getLength(LayoutLine self) {
+        int result;
+
+        if (self == null) {
+            throw new IllegalArgumentException("self can't be null");
+        }
+
+        synchronized (lock) {
+            result = pango_layout_line_get_length(pointerOf(self));
+
+            return result;
+        }
+    }
+
+    private static native final int pango_layout_line_get_length(long self);
+}
diff --git a/src/bindings/org/gnome/pango/PangoRectangleOverride.c b/src/bindings/org/gnome/pango/PangoRectangleOverride.c
new file mode 100644
index 0000000..7605696
--- /dev/null
+++ b/src/bindings/org/gnome/pango/PangoRectangleOverride.c
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <pango/pango.h>
+#include "bindings_java.h"
+#include "org_gnome_pango_PangoRectangleOverride.h"
+
+/*
+ * Allocator and release function for PangoRectangle structs.
+ */
+
+JNIEXPORT jlong JNICALL
+Java_org_gnome_pango_PangoRectangleOverride_pango_1rectangle_1new
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	PangoRectangle* result;
+	
+	/*
+	 * This is a dynamic allocation.
+	 */	
+	result = g_slice_new0(PangoRectangle);
+
+	// and finally
+	return (jlong) result;
+}
+
+JNIEXPORT void JNICALL
+Java_org_gnome_pango_PangoRectangleOverride_pango_1rectangle_1free
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	PangoRectangle* self;
+	
+	// convert paramter self
+	self = (PangoRectangle*) _self;
+	
+	// call function
+	g_slice_free(PangoRectangle, self);
+	
+	// cleanup parameter self
+}
diff --git a/src/bindings/org/gnome/pango/PangoRectangleOverride.java b/src/bindings/org/gnome/pango/PangoRectangleOverride.java
new file mode 100644
index 0000000..e1e674b
--- /dev/null
+++ b/src/bindings/org/gnome/pango/PangoRectangleOverride.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * @author Andrew Cowie
+ */
+final class PangoRectangleOverride extends Plumbing
+{
+    private PangoRectangleOverride() {}
+
+    static final long createRectangle() {
+        synchronized (lock) {
+            return pango_rectangle_new();
+        }
+    }
+
+    private static native final long pango_rectangle_new();
+
+    static final void free(Rectangle self) {
+        synchronized (lock) {
+            pango_rectangle_free(pointerOf(self));
+        }
+    }
+
+    private static native final void pango_rectangle_free(long self);
+}
diff --git a/src/bindings/org/gnome/pango/Plumbing.java b/src/bindings/org/gnome/pango/Plumbing.java
new file mode 100644
index 0000000..191933d
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Plumbing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+abstract class Plumbing extends org.gnome.glib.Plumbing
+{
+    static {
+        isLibraryReady();
+    }
+
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/pango/Rectangle.java b/src/bindings/org/gnome/pango/Rectangle.java
new file mode 100644
index 0000000..2f69428
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Rectangle.java
@@ -0,0 +1,135 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * Information about the size of an area rendered by Pango. These are returned
+ * by the various extents methods in Layout and related classes. See
+ * LayoutLine's {@link LayoutLine#getExtentsLogical() getExtentsLogical()} for
+ * an example.
+ * 
+ * <p>
+ * The origin of a Rectangle is the base line of the rendered glyphs, with
+ * positive directions being to the right and down. This means that in
+ * left-to-right text, a Rectangle representing a glyph that lies above the
+ * base line (which most do) will have a negative <code>y</code> value.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class Rectangle extends Boxed
+{
+    protected Rectangle(long pointer) {
+        super(pointer);
+    }
+
+    Rectangle() {
+        super(PangoRectangleOverride.createRectangle());
+    }
+
+    protected void release() {
+        PangoRectangleOverride.free(this);
+    }
+
+    /**
+     * The width of the box described by this Rectangle.
+     * 
+     * @since 4.0.10
+     */
+    public double getWidth() {
+        return PangoRectangle.getWidth(this) / Pango.SCALE;
+    }
+
+    /**
+     * The height of the box described by this Rectangle.
+     * 
+     * @since 4.0.10
+     */
+    public double getHeight() {
+        return PangoRectangle.getHeight(this) / Pango.SCALE;
+    }
+
+    /**
+     * The horizontal co-ordinate of the top left corner of the box described
+     * by this Rectangle.
+     * 
+     * @since 4.0.10
+     */
+    public double getX() {
+        return PangoRectangle.getX(this) / Pango.SCALE;
+    }
+
+    /**
+     * The vertical co-ordinate of the box described by this Rectangle.
+     * 
+     * @since 4.0.10
+     */
+    public double getY() {
+        return PangoRectangle.getY(this) / Pango.SCALE;
+    }
+
+    /*
+     * these are a series of conveniences and equate to various C side macros.
+     */
+
+    /**
+     * Get the <var>ascent</var>, which is the distance that this Rectangle
+     * [describing one or more glyphs] rises above the font's base line.
+     * 
+     * @since 4.0.10
+     */
+    public double getAscent() {
+        return -getY();
+    }
+
+    /**
+     * Get the <var>descent</var>, which is the distance that this Rectangle
+     * [describing one or more glyphs] descends below the font's base line.
+     * 
+     * @since 4.0.10
+     */
+    public double getDescent() {
+        return getHeight() + getY();
+    }
+
+    private static String oneDecimal(double d) {
+        return String.format("%1.1f", d);
+    }
+
+    public String toString() {
+        return this.getClass().getSimpleName() + ": " + oneDecimal(getWidth()) + "x"
+                + oneDecimal(getHeight()) + " at " + oneDecimal(getX()) + "," + oneDecimal(getY());
+    }
+}
diff --git a/src/bindings/org/gnome/pango/RenderPart.java b/src/bindings/org/gnome/pango/RenderPart.java
new file mode 100644
index 0000000..eb0269e
--- /dev/null
+++ b/src/bindings/org/gnome/pango/RenderPart.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class RenderPart extends Constant
+{
+    private RenderPart(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Renderer.java b/src/bindings/org/gnome/pango/Renderer.java
new file mode 100644
index 0000000..eafa785
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Renderer.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Renderer extends Object
+{
+    protected Renderer(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/RiseAttribute.java b/src/bindings/org/gnome/pango/RiseAttribute.java
new file mode 100644
index 0000000..1ba2378
--- /dev/null
+++ b/src/bindings/org/gnome/pango/RiseAttribute.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * An Attribute that lifts the text being rendered off the baseline.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.13
+ */
+/*
+ * Thanks to Behdad Esfahbod for guidance.
+ */
+public final class RiseAttribute extends Attribute
+{
+    /**
+     * Create a RizeAttribute. The <code>rise</code> parameter is in the same
+     * 1/1024th units as the rest of our Pango API.
+     * 
+     * @since 4.0.13
+     */
+    public RiseAttribute(double rise) {
+        super(PangoAttribute.createAttributeRise((int) (rise * Pango.SCALE)));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Scale.java b/src/bindings/org/gnome/pango/Scale.java
new file mode 100644
index 0000000..9e125a9
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Scale.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.DoubleConstant;
+
+/**
+ * Constants use to scale text by an amount relative to that around it. This
+ * is used when specifying text size with TextTag's
+ * {@link org.gnome.gtk.TextTag#setScale(Scale) setScale()}.
+ * 
+ * <p>
+ * The default, such as it is, is {@link #NORMAL NORMAL} which represents a
+ * scaling factor of <code>1.0</code>, (ie. no scaling).
+ * 
+ * <p>
+ * <i>In case you're wondering, these scaling constants are</i>
+ * <code>(1.2)<sup>n</sup></code> <i>where</i> <code>n</code> <i>is
+ * <code>1,2,3</code> for</i> {@link #LARGE LARGE}, {@link #X_LARGE X_LARGE},
+ * {@link #XX_LARGE XX_LARGE}<i>, and <code>-1,-2,-3</code> for</i>
+ * {@link #SMALL SMALL}, {@link #X_SMALL X_SMALL}, <i>and</i>
+ * {@link #XX_SMALL XX_SMALL} <i>respectively.</i>
+ * 
+ * @since 4.0.9
+ */
+/*
+ * FUTURE Ordinarily we would go to native, but at present we don't have a
+ * mechanism for extracting #defines of doubles. So we'll hard code it for
+ * now. DANGER! Watch out for changes in Pango upstream; if that should even
+ * be suggested, write an Override class to access these constants.
+ */
+public class Scale extends DoubleConstant
+{
+    protected Scale(double factor, String nickname) {
+        super(factor, nickname);
+    }
+
+    public static final Scale XX_SMALL = new Scale(1.0 / (1.2 * 1.2 * 1.2), "XX_SMALL");
+
+    public static final Scale X_SMALL = new Scale(1.0 / (1.2 * 1.2), "X_SMALL");
+
+    public static final Scale SMALL = new Scale(1.0 / 1.2, "SMALL");
+
+    private static final Scale MEDIUM = new Scale(1.0, "MEDIUM");
+
+    /**
+     * Normal (unscaled) text, scaling factor <code>1.0</code>.
+     */
+    public static final Scale NORMAL = MEDIUM;
+
+    public static final Scale LARGE = new Scale(1.2, "LARGE");
+
+    public static final Scale X_LARGE = new Scale(1.2 * 1.2, "X_LARGE");
+
+    public static final Scale XX_LARGE = new Scale(1.2 * 1.2 * 1.2, "XX_LARGE");
+}
diff --git a/src/bindings/org/gnome/pango/Script.java b/src/bindings/org/gnome/pango/Script.java
new file mode 100644
index 0000000..20c49a3
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Script.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Script extends Constant
+{
+    private Script(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/SizeAttribute.java b/src/bindings/org/gnome/pango/SizeAttribute.java
new file mode 100644
index 0000000..d95c561
--- /dev/null
+++ b/src/bindings/org/gnome/pango/SizeAttribute.java
@@ -0,0 +1,61 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * An Attribute that modifies the size of the text it is applied to.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class SizeAttribute extends Attribute
+{
+    /**
+     * Create a SizeAttribute.
+     * 
+     * <p>
+     * This is equivalent to using FontDescription's
+     * {@link FontDescription#setSize(double) setSize()} when requesting fonts
+     * and TextTag's {@link org.gnome.gtk.TextTag#setSize(double) setSize()}
+     * when formatting text in a TextBuffer.
+     * 
+     * <p>
+     * <i>The SizeAttribute is, indeed, ultimately what powers both these
+     * properties.</i>
+     * 
+     * @since 4.0.10
+     */
+    public SizeAttribute(double size) {
+        super(PangoAttribute.createAttributeSize((int) (size * Pango.SCALE)));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Stretch.java b/src/bindings/org/gnome/pango/Stretch.java
new file mode 100644
index 0000000..75b3afa
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Stretch.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class Stretch extends Constant
+{
+    private Stretch(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Style.java b/src/bindings/org/gnome/pango/Style.java
new file mode 100644
index 0000000..a5fd0e7
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Style.java
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants specifying the style of a font. Style is the typographic term
+ * describing whether the slant of the characters. The upright default we're
+ * all used to is {@link #NORMAL NORMAL}; when this is tipped over on its side
+ * it is the {@link #OBLIQUE OBLIQUE} style, whereas the more fancy script
+ * like lettering is {@link #ITALIC ITALIC}s.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public final class Style extends Constant
+{
+    private Style(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Ordinary text we use by default.
+     */
+    public static final Style NORMAL = new Style(PangoStyle.NORMAL, "NORMAL");
+
+    /**
+     * Text written in an elegant script, not just slanted over but usually a
+     * more sculpted, rounded, and flowing appearance.
+     */
+    public static final Style ITALIC = new Style(PangoStyle.ITALIC, "ITALIC");
+
+    /**
+     * Normal text slanted over to the side but otherwise appearing the same
+     * as the {@link #NORMAL NORMAL} roman style.
+     */
+    public static final Style OBLIQUE = new Style(PangoStyle.OBLIQUE, "OBLIQUE");
+}
diff --git a/src/bindings/org/gnome/pango/StyleAttribute.java b/src/bindings/org/gnome/pango/StyleAttribute.java
new file mode 100644
index 0000000..e38023e
--- /dev/null
+++ b/src/bindings/org/gnome/pango/StyleAttribute.java
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * An Attribute that modifies the style of the text it is applied to. See
+ * {@link Style}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class StyleAttribute extends Attribute
+{
+    /**
+     * Create a StyleAttribute. {@link Style#ITALIC ITALIC} is usually the
+     * Style people want since <code>NORMAL</code> is the default.
+     * 
+     * <p>
+     * This is equivalent to using FontDescription's
+     * {@link FontDescription#setStyle(Style) setStyle()} when requesting
+     * fonts and TextTag's {@link org.gnome.gtk.TextTag#setStyle(Style)
+     * setStyle()} when formatting text in a TextBuffer.
+     * 
+     * <p>
+     * <i>The StyleAttribute is actually the mechanism that underlies both
+     * properties.</i>
+     * 
+     * 
+     * @since 4.0.10
+     */
+    public StyleAttribute(Style style) {
+        super(PangoAttribute.createAttributeStyle(style));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/TabAlign.java b/src/bindings/org/gnome/pango/TabAlign.java
new file mode 100644
index 0000000..90f295b
--- /dev/null
+++ b/src/bindings/org/gnome/pango/TabAlign.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TabAlign extends Constant
+{
+    private TabAlign(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/pango/TabArray.java b/src/bindings/org/gnome/pango/TabArray.java
new file mode 100644
index 0000000..02d6dc7
--- /dev/null
+++ b/src/bindings/org/gnome/pango/TabArray.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.gnome.glib.Boxed;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class TabArray extends Boxed
+{
+    protected TabArray(long pointer) {
+        super(pointer);
+    }
+
+    protected void release() {
+        /*
+         * FIXME This class's release() method must be implemented to call the
+         * correct free() or unref() function before it can be used.
+         */
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Underline.java b/src/bindings/org/gnome/pango/Underline.java
new file mode 100644
index 0000000..88b6e9f
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Underline.java
@@ -0,0 +1,82 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Constants specifying the type of underlining to be used in a given span of
+ * text.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.9
+ */
+public final class Underline extends Constant
+{
+    private Underline(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * No underline.
+     */
+    public static final Underline NONE = new Underline(PangoUnderline.NONE, "NONE");
+
+    /**
+     * A single horizontal underline stroke below the text.
+     */
+    public static final Underline SINGLE = new Underline(PangoUnderline.SINGLE, "SINGLE");
+
+    /**
+     * A double underline stroke below the text.
+     */
+    public static final Underline DOUBLE = new Underline(PangoUnderline.DOUBLE, "DOUBLE");
+
+    /**
+     * An interesting special case of single underlining, provide an underline
+     * decoration that is absolutely below and clear of the bottom edge of the
+     * drawn glyphs. This is exclusively intended for marking up mnemonic
+     * characters in Labels.
+     * 
+     * <p>
+     * Note that this is <b>not</b> to be applied for extended spans of text.
+     * Use {@link #SINGLE SINGLE} for normal single underlining.
+     */
+    public static final Underline LOW = new Underline(PangoUnderline.LOW, "LOW");
+
+    /**
+     * The squiggly underline typically used to note spelling mistakes or
+     * compile errors.
+     */
+    public static final Underline ERROR = new Underline(PangoUnderline.ERROR, "ERROR");
+}
diff --git a/src/bindings/org/gnome/pango/UnderlineAttribute.java b/src/bindings/org/gnome/pango/UnderlineAttribute.java
new file mode 100644
index 0000000..3013941
--- /dev/null
+++ b/src/bindings/org/gnome/pango/UnderlineAttribute.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * An Attribute that specifies the underlinging to be drawn under the text it
+ * is applied to. See {@link Underline}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class UnderlineAttribute extends Attribute
+{
+    /**
+     * Create an UnderlineAttribute.
+     * 
+     * <p>
+     * This is equivalent to using TextTag's
+     * {@link org.gnome.gtk.TextTag#setUnderline(Underline) setUnderline()}
+     * when formatting text in a TextBuffer.
+     * 
+     * @since 4.0.10
+     */
+    public UnderlineAttribute(Underline underline) {
+        super(PangoAttribute.createAttributeUnderline(underline));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/UnderlineColorAttribute.java b/src/bindings/org/gnome/pango/UnderlineColorAttribute.java
new file mode 100644
index 0000000..b01d126
--- /dev/null
+++ b/src/bindings/org/gnome/pango/UnderlineColorAttribute.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * Set the colour to be used when drawing a line under a range of text.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class UnderlineColorAttribute extends Attribute
+{
+    /**
+     * Create an UnderlineColorAttribute. The three colour parameters are in
+     * the same [0,1] range as other Cairo drawing functions use.
+     * 
+     * @since 4.0.10
+     */
+    public UnderlineColorAttribute(double red, double green, double blue) {
+        super(PangoAttribute.createAttributeUnderlineColor((char) (red * 65535), (char) (green * 65535),
+                (char) (blue * 65535)));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Variant.java b/src/bindings/org/gnome/pango/Variant.java
new file mode 100644
index 0000000..40980d0
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Variant.java
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Capitalization variant of the font.
+ * 
+ * <p>
+ * This controls how lower case characters are displayed: either as normal
+ * lowercase characters or as small capital characters.
+ * 
+ * @author Vreixo Formoso
+ * @since 4.0.8
+ */
+public final class Variant extends Constant
+{
+    private Variant(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Normal font.
+     */
+    public final static Variant NORMAL = new Variant(PangoVariant.NORMAL, "NORMAL");
+
+    /**
+     * A font with the lower case characters replaced by smaller variants of
+     * the capital characters.
+     */
+    public final static Variant SMALL_CAPS = new Variant(PangoVariant.SMALL_CAPS, "SMALL_CAPS");
+}
diff --git a/src/bindings/org/gnome/pango/VariantAttribute.java b/src/bindings/org/gnome/pango/VariantAttribute.java
new file mode 100644
index 0000000..537fd9b
--- /dev/null
+++ b/src/bindings/org/gnome/pango/VariantAttribute.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * An Attribute that modifies the variant of the text it is applied to. See
+ * {@link Variant}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class VariantAttribute extends Attribute
+{
+    /**
+     * Create a VariantAttribute. Since <code>NORMAL</code> is the default is
+     * the default in use essentially all the time, you only need to build one
+     * of these when setting {@link Variant#SMALL_CAPS SMALL_CAPS}.
+     * 
+     * @since 4.0.10
+     */
+    public VariantAttribute(Variant variant) {
+        super(PangoAttribute.createAttributeVariant(variant));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/Weight.java b/src/bindings/org/gnome/pango/Weight.java
new file mode 100644
index 0000000..3e39e06
--- /dev/null
+++ b/src/bindings/org/gnome/pango/Weight.java
@@ -0,0 +1,143 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Flag;
+
+/**
+ * Constants used for selecting the weight of a font. {@link #NORMAL NORMAL}
+ * is the default corresponding to text as we are generally accustomed to
+ * seeing it.
+ * 
+ * <p>
+ * A common use of these constants is to make text in a TextView strong; use
+ * TextTag's {@link org.gnome.gtk.TextTag#setWeight(Weight) setWeight()} and
+ * pass in {@link #BOLD BOLD}.
+ * 
+ * <p>
+ * <i>Note that most fonts do <b>not</b> implement all the values here. If you
+ * specify a weight that is not directly available, the result should be
+ * approximated by the closest one, but you are somewhat at the mercy of
+ * the</i> $diety <i> as to what you actually get.</i>
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @since 4.0.9
+ */
+/*
+ * Yes, you can subclass this if you are desperate for font weights other than
+ * the established constant values supplied here.
+ */
+/*
+ * FIXME I'd prefer if this were a Constant; the fact that we've hacked it to
+ * (define-flags...) is to get at the actual values. We got away with it in
+ * ResponseType but generated PangoFontDescription has a flagFor() in it that
+ * breaks.
+ */
+public class Weight extends Flag
+{
+    private Weight(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    protected Weight(int value) {
+        super(validate(value), Integer.toString(value));
+    }
+
+    static final int validate(int value) {
+        if ((value < 100) || (value > 900)) {
+            throw new IllegalArgumentException("Valid font weights are 100 through 900");
+        }
+        return value;
+    }
+
+    /**
+     * The default font weight.
+     * 
+     * <p>
+     * <i>This has a value of <code>400</code>, apparently.</i>
+     * 
+     * @since 4.0.9
+     */
+    public static final Weight NORMAL = new Weight(PangoWeight.NORMAL, "NORMAL");
+
+    /**
+     * Bold text.
+     * 
+     * <p>
+     * <i>This represents a font weight value of <code>700</code>,
+     * apparently.</i>
+     * 
+     * @since 4.0.9
+     */
+    public static final Weight BOLD = new Weight(PangoWeight.BOLD, "BOLD");
+
+    /**
+     * The lightest text weight available. Not much to it. Anorexic, really.
+     * 
+     * @since 4.0.10
+     */
+    public static final Weight ULTRALIGHT = new Weight(PangoWeight.ULTRALIGHT, "ULTRALIGHT");
+
+    /**
+     * Light weight text.
+     * 
+     * @since 4.0.10
+     */
+    public static final Weight LIGHT = new Weight(PangoWeight.LIGHT, "LIGHT");
+
+    /**
+     * An intermediate weight between {@link #NORMAL NORMAL} and {@link #BOLD
+     * BOLD}.
+     * 
+     * @since 4.0.10
+     */
+    public static final Weight SEMIBOLD = new Weight(PangoWeight.SEMIBOLD, "SEMIBOLD");
+
+    /**
+     * Even stronger than {@link #BOLD BOLD}, is <code>ULTRABOLD</code>!
+     * Sounds like a health food product.
+     * 
+     * @since 4.0.10
+     */
+    public static final Weight ULTRABOLD = new Weight(PangoWeight.ULTRABOLD, "ULTRABOLD");
+
+    /**
+     * The heavy weight. This is clearly for people who missed out on the
+     * healthier food in the lighter {@link #ULTRABOLD ULTRABOLD} department.
+     * 
+     * @since 4.0.10
+     */
+    public static final Weight HEAVY = new Weight(PangoWeight.HEAVY, "HEAVY");
+}
diff --git a/src/bindings/org/gnome/pango/WeightAttribute.java b/src/bindings/org/gnome/pango/WeightAttribute.java
new file mode 100644
index 0000000..25261d8
--- /dev/null
+++ b/src/bindings/org/gnome/pango/WeightAttribute.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+/**
+ * An Attribute that modifies the weight of the text it is applied to. See
+ * {@link Weight}.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.10
+ */
+public final class WeightAttribute extends Attribute
+{
+    /**
+     * Create a WeightAttribute.
+     * 
+     * @since 4.0.10
+     */
+    public WeightAttribute(Weight weight) {
+        super(PangoAttribute.createAttributeWeight(weight));
+    }
+}
diff --git a/src/bindings/org/gnome/pango/WrapMode.java b/src/bindings/org/gnome/pango/WrapMode.java
new file mode 100644
index 0000000..398942c
--- /dev/null
+++ b/src/bindings/org/gnome/pango/WrapMode.java
@@ -0,0 +1,77 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.bindings.Constant;
+
+/**
+ * Indicate how a Pango Layout is to wrap. Set the mode with Layout's
+ * {@link Layout#setWrapMode(WrapMode) setWrapMode()} method.
+ * 
+ * <p>
+ * <i>To our great frustration, these constants exist separately from the ones
+ * used by GTK's TextView even though, quite clearly, the WrapMode Constants
+ * there map to the ones here. Unfortunately the ordinals are different, so we
+ * can't just present one set.</i>
+ * 
+ * @since 4.0.11
+ */
+public final class WrapMode extends Constant
+{
+    private WrapMode(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+
+    /**
+     * Wrap text, breaking lines anywhere the cursor can appear (between
+     * characters, usually)
+     */
+    public static final WrapMode CHAR = new WrapMode(PangoWrapMode.CHAR, "CHAR");
+
+    /**
+     * Wrap text, breaking lines in between words. This is usually the one you
+     * want if you are trying to enable word wrapping, but keep in mind that
+     * you also must have set the width of the Layout with its
+     * {@link Layout#setWidth(double) setWidth()}.
+     */
+    public static final WrapMode WORD = new WrapMode(PangoWrapMode.WORD, "WORD");
+
+    /**
+     * Wrap at word boundaries unless there isn't enough space for a full
+     * word, in which case fall back to wrapping at a character boundary.
+     */
+    /*
+     * TODO How is this different from CHAR?
+     */
+    public static final WrapMode WORD_CHAR = new WrapMode(PangoWrapMode.WORD_CHAR, "WORD_CHAR");
+}
diff --git a/src/bindings/org/gnome/pango/package.html b/src/bindings/org/gnome/pango/package.html
new file mode 100644
index 0000000..cfb7eaf
--- /dev/null
+++ b/src/bindings/org/gnome/pango/package.html
@@ -0,0 +1,36 @@
+<html>
+<head>
+</head>
+<body>
+
+Pango is the text layout and rending engine used to power font rendering
+and internationalization in GNOME.
+
+<p>
+<b>Bindings for Pango have not yet been done in java-gnome. You can contribute 
+to changing this!</b>
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/org/gnome/rsvg/DimensionData.java b/src/bindings/org/gnome/rsvg/DimensionData.java
new file mode 100644
index 0000000..65a2bec
--- /dev/null
+++ b/src/bindings/org/gnome/rsvg/DimensionData.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.rsvg;
+
+import org.gnome.glib.Boxed;
+
+/**
+ * The size of an SVG image.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.18
+ */
+/*
+ * Stupid name! Just call it Dimensions... or howabout Rectangle, like every
+ * other bloody GNOME library?
+ */
+public class DimensionData extends Boxed
+{
+    protected DimensionData(long pointer) {
+        super(pointer);
+    }
+
+    DimensionData() {
+        super(RsvgDimensionDataOverride.createDimensionData());
+    }
+
+    protected void release() {
+        RsvgDimensionDataOverride.free(this);
+    }
+
+    /**
+     * Get the width of the SVG, in pixels.
+     * 
+     * @since 4.0.18
+     */
+    public int getWidth() {
+        return RsvgDimensionData.getWidth(this);
+    }
+
+    /**
+     * Get the height of the SVG, in pixels.
+     * 
+     * @since 4.0.18
+     */
+    public int getHeight() {
+        return RsvgDimensionData.getHeight(this);
+    }
+}
diff --git a/src/bindings/org/gnome/rsvg/Handle.java b/src/bindings/org/gnome/rsvg/Handle.java
new file mode 100644
index 0000000..d4d09b6
--- /dev/null
+++ b/src/bindings/org/gnome/rsvg/Handle.java
@@ -0,0 +1,202 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.rsvg;
+
+/*
+ * This is essentially the same treatment as is found in org.gnome.gdk.Pixbuf
+ */
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.gnome.glib.GlibException;
+
+/**
+ * Handle to an SVG image in memory. This class allows you to load an SVG
+ * image from a file on disk or from memory.
+ * 
+ * <p>
+ * Once you have the Handle you can render it to Cairo directly with Context's
+ * {@link org.freedesktop.cairo.Context#showHandle(Handle) showHandle()},
+ * 
+ * <pre>
+ * Rsvg.init();
+ * ...
+ * 
+ * graphic = new Handle("Tiger.svg");
+ * cr.showHandle(graphic);
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.18
+ */
+public class Handle extends org.gnome.glib.Object
+{
+    public Handle() {
+        super(RsvgHandle.createHandle());
+    }
+
+    /**
+     * Construct a handle to an SVG image sourced from the given filename.
+     * 
+     * @since 4.0.15
+     */
+    public Handle(String filename) throws FileNotFoundException {
+        super(checkHandleFromFile(filename));
+    }
+
+    /*
+     * First check the file exists first, allowing us to isolate the GError
+     * representing image format problems. The RsvgError is not very
+     * impressive.
+     */
+    private static long checkHandleFromFile(String filename) throws FileNotFoundException {
+        final File target;
+
+        target = new File(filename);
+        if (!target.exists()) {
+            throw new FileNotFoundException(target + " not found");
+        }
+        try {
+            return RsvgHandle.createHandleFromFile(filename);
+        } catch (GlibException ge) {
+            throw new RuntimeException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Write data <i>into</i> this Handle.
+     * 
+     * @since <span style="color: red;">Unstable</span>
+     * @throws IOException
+     *             if there is a problem loading the data
+     */
+    /*
+     * Except that it's not actually an IO problem; it'd be a data formatting
+     * error. Still, it's a checked exception for sure.
+     */
+    public void write(byte[] data) throws IOException {
+        try {
+            // FIXME second argument needs work.
+            RsvgHandle.write(this, null, data.length);
+        } catch (Exception ge) {
+            // FIXME actually GlibException.
+            throw new IOException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Indicate you have finished loading data into the Handle.
+     * 
+     * <p>
+     * This method is the compliment of the {@link #write(byte[]) write()}
+     * method, and should be called when you have passed in all the data for
+     * the image you are loading.
+     * 
+     * @since <span style="color: red;">Unstable</span>
+     */
+    public void close() throws IOException {
+        try {
+            RsvgHandle.close(this);
+        } catch (GlibException ge) {
+            throw new RuntimeException(ge.getMessage());
+        }
+    }
+
+    /**
+     * Get the size of the SVG image represented by this Handle.
+     * 
+     * @since 4.0.18
+     */
+    public DimensionData getDimensions() {
+        final DimensionData size;
+
+        size = new DimensionData();
+
+        RsvgHandle.getDimensions(this, size);
+
+        return size;
+    }
+
+    /**
+     * Get the size of a named sub-element of the SVG image represented by
+     * this Handle.
+     * 
+     * <p>
+     * You can pass <code>null<code> to get the size of the entire graphic.
+     * 
+     * @since 4.0.18
+     */
+    public DimensionData getDimensionsSub(String id) {
+        final DimensionData size;
+
+        size = new DimensionData();
+
+        RsvgHandle.getDimensionsSub(this, size, id);
+
+        return size;
+    }
+
+    /**
+     * Get the horizontal resolution of this graphic.
+     * 
+     * <p>
+     * Resolution and SVG is a bit of a weird topic. The default unts in an
+     * SVG file are "pixels", <code>px</code> as defined in the CSS
+     * specification, and the default resolution turns out to be 90 pixels per
+     * inch. So unless the program writing the graphic you are loading has
+     * gone to extraordinary lengths, the value of this property will be
+     * <code>90.0</code> <i>regardless of the user space units in use inside
+     * the graphic</i>.
+     * 
+     * <p>
+     * Under ordinary circumstances it will be the same as the vertical
+     * resolution so you probably don't have to query both.
+     * 
+     * @since 4.0.18
+     */
+    public double getDPIX() {
+        return super.getPropertyDouble("dpi-x");
+    }
+
+    /**
+     * Get the vertical resolution of this graphic. See {@link #getDPIX()
+     * getDPIX()} for details.
+     * 
+     * @since 4.0.18
+     */
+    public double getDPIY() {
+        return super.getPropertyDouble("dpi-y");
+    }
+}
diff --git a/src/bindings/org/gnome/rsvg/Plumbing.java b/src/bindings/org/gnome/rsvg/Plumbing.java
new file mode 100644
index 0000000..9e2bf2a
--- /dev/null
+++ b/src/bindings/org/gnome/rsvg/Plumbing.java
@@ -0,0 +1,38 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.rsvg;
+
+abstract class Plumbing extends org.gnome.glib.Plumbing
+{
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/rsvg/Rsvg.java b/src/bindings/org/gnome/rsvg/Rsvg.java
new file mode 100644
index 0000000..20f3c66
--- /dev/null
+++ b/src/bindings/org/gnome/rsvg/Rsvg.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.rsvg;
+
+import org.gnome.glib.Glib;
+
+/**
+ * The GNOME SVG Library.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.18
+ */
+public final class Rsvg extends Glib
+{
+    private Rsvg() {}
+
+    /**
+     * Initialize <code>librsvg</code>'s subsystems.
+     * 
+     * @since 4.0.18
+     */
+    public static void init() {
+        RsvgMain.init();
+    }
+}
diff --git a/src/bindings/org/gnome/rsvg/RsvgDimensionDataOverride.c b/src/bindings/org/gnome/rsvg/RsvgDimensionDataOverride.c
new file mode 100644
index 0000000..cc7c954
--- /dev/null
+++ b/src/bindings/org/gnome/rsvg/RsvgDimensionDataOverride.c
@@ -0,0 +1,54 @@
+/*
+ * RsvgDimensionDataOverride.c
+ *
+ * Copyright (c) 2009 Operational Dynamics Consulting Pty Ltd
+ *
+ * The code in this file, and the library it is a part of, are made available
+ * to you by the authors under the terms of the "GNU General Public Licence,
+ * version 2" plus the "Classpath Exception" (you may link to this code as a
+ * library into other programs provided you don't make a derivation of it).
+ * See the LICENCE file for the terms governing usage and redistribution.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include <librsvg/rsvg.h>
+#include "bindings_java.h"
+#include "org_gnome_rsvg_RsvgDimensionDataOverride.h"
+
+/*
+ * Allocates a RsvgDimensionData. See GtkTreeIterOverride.c for discussion and
+ * possible remedies.
+ */
+JNIEXPORT jlong JNICALL
+Java_org_gnome_rsvg_RsvgDimensionDataOverride_rsvg_1dimension_1data_1new
+(
+	JNIEnv* env,
+	jclass cls
+)
+{
+	RsvgDimensionData* result;
+	
+	// allocate
+	result = g_slice_new(RsvgDimensionData);
+
+	// and finally
+	return (jlong) result;
+}
+
+JNIEXPORT void JNICALL
+Java_org_gnome_rsvg_RsvgDimensionDataOverride_rsvg_1dimension_1data_1free
+(
+	JNIEnv* env,
+	jclass cls,
+	jlong _self
+)
+{
+	RsvgDimensionData* self;
+
+	// convert self
+	self = (RsvgDimensionData*) _self;
+	
+	// free
+	g_slice_free(RsvgDimensionData, self);
+}
diff --git a/src/bindings/org/gnome/rsvg/RsvgDimensionDataOverride.java b/src/bindings/org/gnome/rsvg/RsvgDimensionDataOverride.java
new file mode 100644
index 0000000..de84a90
--- /dev/null
+++ b/src/bindings/org/gnome/rsvg/RsvgDimensionDataOverride.java
@@ -0,0 +1,37 @@
+/*
+ * RsvgDimensionDataOverride.java
+ *
+ * Copyright (c) 2009 Operational Dynamics Consulting Pty Ltd
+ *
+ * The code in this file, and the library it is a part of, are made available
+ * to you by the authors under the terms of the "GNU General Public Licence,
+ * version 2" plus the "Classpath Exception" (you may link to this code as a
+ * library into other programs provided you don't make a derivation of it).
+ * See the LICENCE file for the terms governing usage and redistribution.
+ */
+package org.gnome.rsvg;
+
+/**
+ * Yet another struct allocator. I'm getting tired of writing these.
+ * 
+ * @author Andrew Cowie
+ */
+final class RsvgDimensionDataOverride extends Plumbing
+{
+    static final long createDimensionData() {
+        synchronized (lock) {
+            return rsvg_dimension_data_new();
+        }
+    }
+
+    private static native final long rsvg_dimension_data_new();
+
+    static final void free(DimensionData self) {
+        synchronized (lock) {
+            rsvg_dimension_data_free(pointerOf(self));
+        }
+    }
+
+    private static native final void rsvg_dimension_data_free(long self);
+
+}
diff --git a/src/bindings/org/gnome/screenshot/Capture.java b/src/bindings/org/gnome/screenshot/Capture.java
new file mode 100644
index 0000000..c181651
--- /dev/null
+++ b/src/bindings/org/gnome/screenshot/Capture.java
@@ -0,0 +1,37 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.screenshot;
+
+abstract class Capture
+{
+}
diff --git a/src/bindings/org/gnome/screenshot/Plumbing.java b/src/bindings/org/gnome/screenshot/Plumbing.java
new file mode 100644
index 0000000..b600ab8
--- /dev/null
+++ b/src/bindings/org/gnome/screenshot/Plumbing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.screenshot;
+
+class Plumbing extends org.gnome.gtk.Plumbing
+{
+    static {
+        isLibraryReady();
+    }
+
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/screenshot/Screenshot.java b/src/bindings/org/gnome/screenshot/Screenshot.java
new file mode 100644
index 0000000..37cc30a
--- /dev/null
+++ b/src/bindings/org/gnome/screenshot/Screenshot.java
@@ -0,0 +1,94 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.screenshot;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.glib.Glib;
+
+/**
+ * Take screenshots. This class is explicitly here to support taking the
+ * screenshots used as illustrations in the java-gnome API documentation.
+ * 
+ * <p>
+ * Usage is simple: given a Window, {@link org.gnome.gtk.Window#present()
+ * present()} it, and then call the <code>capture</code> method here.
+ * 
+ * <pre>
+ * final Window window;
+ * final Pixbuf result;
+ * 
+ * window.present();
+ * result = Screenshot.capture();
+ * result.save(...);
+ * </pre>
+ * 
+ * <p>
+ * Note that for some reason taking screenshots is a very slow and CPU
+ * intensive process. Unfortunately, it occurs within the GDK lock and thus
+ * <i>will</i> block your UI for a few seconds. Threading can't help you
+ * parallelize this.
+ * 
+ * <p style="margin: 10px; border: dashed 3px red; padding: 10px; * background-color: #DDDDDD; max-width: 600px;">
+ * <b>LICENCE WARNING</b><br>
+ * This native code used to take screenshots is licenced under the GNU General
+ * Public Licence, version 2. As a result, use of this class in an application
+ * will mean that entire application will need to be available under a GPL v2
+ * compatible licence.
+ * </p>
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+/*
+ * This is somewhat in the same style as org.gnome.glade.Glade; by extending
+ * Glib we force library initialization in some hypothetical future where
+ * Gtk.init() is optional.
+ */
+public final class Screenshot extends Glib
+{
+    /*
+     * No instantiation. Static methods only!
+     */
+    private Screenshot() {}
+
+    /**
+     * Take a screenshot of the Window which has focus. The window decorations
+     * drawn by the window manager will be captured (so if you don't want
+     * that, be sure to call
+     * {@link org.gnome.gtk.Window#setDecorated(boolean) setDecorated(false)}
+     * on your Window). An alpha blended drop-shadow will be added for effect.
+     */
+    public static Pixbuf capture() {
+        return ScreenshotCapture.capture(true, true, "shadow");
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/DrawSpacesFlags.java b/src/bindings/org/gnome/sourceview/DrawSpacesFlags.java
new file mode 100644
index 0000000..e163d1f
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/DrawSpacesFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class DrawSpacesFlags extends Flag
+{
+    private DrawSpacesFlags(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/Language.java b/src/bindings/org/gnome/sourceview/Language.java
new file mode 100644
index 0000000..95e114d
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/Language.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/**
+ * A Language is used for syntax highlighting in a SourceBuffer. Instances can
+ * be obtained from the {@link LanguageManager}.
+ * 
+ * @author Stefan Schweizer
+ * @since 4.0.12
+ */
+public class Language extends Object
+{
+    protected Language(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Get the ID of the language. For example, the ID for Java is
+     * <code>java</code>. The ID of a language is defined in the corresponding
+     * language definition file.
+     * 
+     * @since 4.0.12
+     */
+    public String getID() {
+        return GtkSourceLanguage.getId(this);
+    }
+
+    /**
+     * Get the localized name of the language.
+     * 
+     * @since 4.0.12
+     */
+    public String getName() {
+        return GtkSourceLanguage.getName(this);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/LanguageManager.java b/src/bindings/org/gnome/sourceview/LanguageManager.java
new file mode 100644
index 0000000..a36f0d0
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/LanguageManager.java
@@ -0,0 +1,85 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/**
+ * A LanguageManager is used to obtain Language objects that are used for
+ * syntax highlighting in a SourceBuffer.
+ * 
+ * <p>
+ * You need to use {@link #getDefault() LangagueManager.getDefault()} to get
+ * the singleton and then use it to request a Language by "id" via it's
+ * {@link #getLanguage(String) getLanguage()} method.
+ * 
+ * @author Stefan Schweizer
+ * @since 4.0.12
+ */
+public class LanguageManager extends Object
+{
+    protected LanguageManager(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Return the default LanguageManager.
+     * 
+     * @since 4.0.12
+     */
+    public static LanguageManager getDefault() {
+        return GtkSourceLanguageManager.getDefault();
+    }
+
+    /**
+     * Return a Language specified by its language ID or <code>null</code> if
+     * the ID is not known.
+     * 
+     * @since 4.0.12
+     */
+    public Language getLanguage(String id) {
+        return GtkSourceLanguageManager.getLanguage(this, id);
+    }
+
+    /**
+     * Get a language based on the filename and content type.
+     * 
+     * This is only a guess and could be wrong. When it is unable to guess the
+     * language it will return null.
+     * 
+     * @since 4.1.3
+     */
+    public Language getLanguageGuess(String fileName, String contentType) {
+        return GtkSourceLanguageManager.guessLanguage(this, fileName, contentType);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/Mark.java b/src/bindings/org/gnome/sourceview/Mark.java
new file mode 100644
index 0000000..ef6fdca
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/Mark.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class Mark extends Object
+{
+    protected Mark(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/Plumbing.java b/src/bindings/org/gnome/sourceview/Plumbing.java
new file mode 100644
index 0000000..8b9a7e7
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/Plumbing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+abstract class Plumbing extends org.gnome.gdk.Plumbing
+{
+    static {
+        isLibraryReady();
+    }
+
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/sourceview/PrintCompositor.java b/src/bindings/org/gnome/sourceview/PrintCompositor.java
new file mode 100644
index 0000000..f81a1aa
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/PrintCompositor.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class PrintCompositor extends Object
+{
+    protected PrintCompositor(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/SearchFlags.java b/src/bindings/org/gnome/sourceview/SearchFlags.java
new file mode 100644
index 0000000..3e9c936
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/SearchFlags.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class SearchFlags extends Object
+{
+    protected SearchFlags(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/SmartHomeEndType.java b/src/bindings/org/gnome/sourceview/SmartHomeEndType.java
new file mode 100644
index 0000000..0a07c29
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/SmartHomeEndType.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.freedesktop.bindings.Constant;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+class SmartHomeEndType extends Constant
+{
+    private SmartHomeEndType(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/SourceBuffer.java b/src/bindings/org/gnome/sourceview/SourceBuffer.java
new file mode 100644
index 0000000..7642515
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/SourceBuffer.java
@@ -0,0 +1,230 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.gtk.TextBuffer;
+import org.gnome.gtk.TextTagTable;
+
+/**
+ * SourceBuffer is the model used in a {@link SourceView}. It extends GTK's
+ * {@link TextBuffer} and adds features typical for text editors. SourceBuffer
+ * contains the actual text that is displayed in the view and allows its
+ * manipulation.
+ * 
+ * <h2>Usage</h2>
+ * 
+ * The following example shows how a SourceBuffer is created and its initial
+ * content is set:
+ * 
+ * <pre>
+ * TextTagTable table;
+ * SourceBuffer buffer;
+ * ...
+ * 
+ * table = new TextTagTable();
+ * buffer = new SourceBuffer();
+ * buffer.setText("Insert text here...");
+ * </pre>
+ * 
+ * The language used for syntax highlighting has to be obtained from the
+ * LanguageManager:
+ * 
+ * <pre>
+ * manager = LanguageManager.getDefault();
+ * language = manager.getLanguage("java");
+ * buffer.setLanguage(language);
+ * </pre>
+ * 
+ * @author Stefan Schweizer
+ * @since 4.0.12
+ */
+public class SourceBuffer extends TextBuffer
+{
+    protected SourceBuffer(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new SourceBuffer. This uses the same default TextTagTable as
+     * used by the no-arg TextTags; see the no-arg TextBuffer
+     * {@link org.gnome.gtk.TextBuffer#TextBuffer() <init>()} for
+     * details.
+     * 
+     * @since 4.0.12
+     */
+    public SourceBuffer() {
+        super(GtkSourceBuffer.createSourceBuffer(getDefaultTable()), true);
+    }
+
+    /**
+     * Create a new SourceBuffer using the given TextTagTable.
+     * 
+     * @since 4.0.12
+     */
+    public SourceBuffer(TextTagTable tags) {
+        super(GtkSourceBuffer.createSourceBuffer(tags));
+    }
+
+    /**
+     * Enable/disable syntax higlighting. The SourceLangage is configured with
+     * <code>setLanguage</code>. Highlighting is enabled by default.
+     * 
+     * @since 4.0.12
+     */
+    public void setHighlightSyntax(boolean highlight) {
+        GtkSourceBuffer.setHighlightSyntax(this, highlight);
+    }
+
+    /**
+     * Return whether syntax highlighting is enabled or not.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getHighlightSyntax() {
+        return GtkSourceBuffer.getHighlightSyntax(this);
+    }
+
+    /**
+     * Set the Language that is used for syntax highlighting.
+     * 
+     * @since 4.0.12
+     */
+    public void setLanguage(Language language) {
+        GtkSourceBuffer.setLanguage(this, language);
+    }
+
+    /**
+     * Get the Language that is used for syntax highlighting.
+     * 
+     * @since 4.0.12
+     */
+    public Language getLanguage() {
+        return GtkSourceBuffer.getLanguage(this);
+    }
+
+    /**
+     * Set the {@link StyleScheme} that is used.
+     * 
+     * @since 4.1.2
+     */
+    public void setStyleScheme(StyleScheme scheme) {
+        GtkSourceBuffer.setStyleScheme(this, scheme);
+    }
+
+    /**
+     * Get the {@link StyleScheme} that is used.
+     * 
+     * @since 4.1.2
+     */
+    public StyleScheme getStyleScheme() {
+        return GtkSourceBuffer.getStyleScheme(this);
+    }
+
+    /**
+     * Enable or disable highlighting of matching brackets. Enabled by
+     * default.
+     * 
+     * @since 4.0.12
+     */
+    public void setHighlightMatchingBrackets(boolean highlight) {
+        GtkSourceBuffer.setHighlightMatchingBrackets(this, highlight);
+    }
+
+    /**
+     * Return whether matching brackets are highlighted.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getHighlightMatchingBrackets() {
+        return GtkSourceBuffer.getHighlightMatchingBrackets(this);
+    }
+
+    /**
+     * Return <code>true</code> if an operation can be undone.
+     * 
+     * @since 4.0.12
+     */
+    public boolean canUndo() {
+        return GtkSourceBuffer.canUndo(this);
+    }
+
+    /**
+     * Return <code>true</code> if an operation can be redone.
+     * 
+     * @since 4.0.12
+     */
+    public boolean canRedo() {
+        return GtkSourceBuffer.canRedo(this);
+    }
+
+    /**
+     * Undo the last operation. You should only call this method if there is
+     * an operation that can be undone. This can be checked with
+     * <code>canUndo()</code>.
+     * 
+     * @since 4.0.12
+     */
+    public void undo() {
+        GtkSourceBuffer.undo(this);
+    }
+
+    /**
+     * Redo the last undone operation. You should only call this method if
+     * there is an operation that can be redone. This can be checked with
+     * <code>canRedo()</code>.
+     * 
+     * @since 4.0.12
+     */
+    public void redo() {
+        GtkSourceBuffer.redo(this);
+    }
+
+    /**
+     * Indicate the beginning of an action that cannot be undone. This is
+     * especially useful when setting the initial content of the buffer.
+     * 
+     * @since 4.0.12
+     */
+    public void beginNotUndoableAction() {
+        GtkSourceBuffer.beginNotUndoableAction(this);
+    }
+
+    /**
+     * Indicate the end of an action that cannot be undone.
+     * 
+     * @since 4.0.12
+     */
+    public void endNotUndoableAction() {
+        GtkSourceBuffer.endNotUndoableAction(this);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/SourceView.java b/src/bindings/org/gnome/sourceview/SourceView.java
new file mode 100644
index 0000000..04e3996
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/SourceView.java
@@ -0,0 +1,257 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.gtk.TextView;
+
+/**
+ * A text Widget for displaying and editing source code.
+ * 
+ * <p>
+ * GtkSourceView extends GTK's {@link TextView} and adds features that are
+ * useful for building text or source-code editors. It provides syntax
+ * highlighting for various languages, undo/redo, control over indentation and
+ * more.
+ * 
+ * <p>
+ * SourceView is the view part of the GtkSourceView library and is always used
+ * together with a {@link SourceBuffer} as its model.
+ * 
+ * <h2>Usage</h2>
+ * 
+ * To create a SourceView a previously instantiated SourceBuffer is needed,
+ * that is passed to the constructor:
+ * 
+ * <pre>
+ * SourceBuffer buffer;
+ * SourceView view;
+ * ...
+ * 
+ * view = new SourceView(buffer);
+ * </pre>
+ * 
+ * @author Stefan Schweizer
+ * @since 4.0.12
+ */
+public class SourceView extends TextView
+{
+    protected SourceView(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a new SourceView that displays the SourceBuffer.
+     * 
+     * @since 4.0.12
+     */
+    public SourceView(SourceBuffer buffer) {
+        super(GtkSourceView.createSourceViewWithBuffer(buffer));
+    }
+
+    /**
+     * Returns whether line numbers are shown next to the text or not.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getShowLineNumbers() {
+        return GtkSourceView.getShowLineNumbers(this);
+    }
+
+    /**
+     * Enable or disable the display of line numbers next to the text. The
+     * display is disabled by default.
+     * 
+     * @since 4.0.12
+     */
+    public void setShowLineNumbers(boolean show) {
+        GtkSourceView.setShowLineNumbers(this, show);
+    }
+
+    /**
+     * Returns whether the current line is highlighted or not. Disabled by
+     * default.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getHighlightCurrentLine() {
+        return GtkSourceView.getHighlightCurrentLine(this);
+    }
+
+    /**
+     * Enable or disable the highlighting of the current line. Disabled by
+     * default.
+     * 
+     * @since 4.0.12
+     */
+    public void setHighlightCurrentLine(boolean highlight) {
+        GtkSourceView.setHighlightCurrentLine(this, highlight);
+    }
+
+    /**
+     * Returns whether the line indicating the right margin is shown or not.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getShowRightMargin() {
+        return GtkSourceView.getShowRightMargin(this);
+    }
+
+    /**
+     * Show a line that indicates the right margin of the text. Disabled by
+     * default.
+     * 
+     * @since 4.0.12
+     */
+    public void setShowRightMargin(boolean show) {
+        GtkSourceView.setShowRightMargin(this, show);
+    }
+
+    /**
+     * Return the position of the line that indicates the right margin of the
+     * text.
+     * 
+     * @since 4.0.12
+     */
+    public int getRightMarginPosition() {
+        return GtkSourceView.getRightMarginPosition(this);
+    }
+
+    /**
+     * Set the position of the line that indicates the right margin of the
+     * text. The default position is 80.
+     * 
+     * @since 4.0.12
+     */
+    public void setRightMarginPosition(int position) {
+        GtkSourceView.setRightMarginPosition(this, position);
+    }
+
+    /**
+     * Returns whether spaces are used instead of the tab character.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getInsertSpacesInsteadOfTabs() {
+        return GtkSourceView.getInsertSpacesInsteadOfTabs(this);
+    }
+
+    /**
+     * Insert spaces instead of the tab character. Disabled by default.
+     * 
+     * @since 4.0.12
+     */
+    public void setInsertSpacesInsteadOfTabs(boolean enable) {
+        GtkSourceView.setInsertSpacesInsteadOfTabs(this, enable);
+    }
+
+    /**
+     * Return the number of spaces that are used for the tab character.
+     * 
+     * @since 4.0.12
+     */
+    public int getTabWidth() {
+        return GtkSourceView.getTabWidth(this);
+    }
+
+    /**
+     * Set the number of spaces that are used for the tab character.
+     * 
+     * @since 4.0.12
+     */
+    public void setTabWidth(int width) {
+        GtkSourceView.setTabWidth(this, width);
+    }
+
+    /**
+     * Return whether audo-indentation is enabled of not.
+     * 
+     * @since 4.0.12
+     */
+    public boolean getAutoIndent() {
+        return GtkSourceView.getAutoIndent(this);
+    }
+
+    /**
+     * Enable/disable auto-indentation. If enabled, a new line will have the
+     * same indentation as the current line. Disabled by default.
+     * 
+     * @since 4.0.12
+     */
+    public void setAutoIndent(boolean enable) {
+        GtkSourceView.setAutoIndent(this, enable);
+    }
+
+    /**
+     * The handler interface used for undo signals.
+     * 
+     * @author Stefan Schweizer
+     * @since 4.0.12
+     */
+    public interface Undo extends GtkSourceView.UndoSignal
+    {
+        public void onUndo(SourceView source);
+    }
+
+    /**
+     * Connect a handler to receive <code>SourceView.Undo</code> signals. It
+     * is emitted whenever something is undone in the editor window, e.g. by
+     * hitting Ctrl+Z.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(SourceView.Undo handler) {
+        GtkSourceView.connect(this, handler, false);
+    }
+
+    /**
+     * The handler interface used for redo signals.
+     * 
+     * @author Stefan Schweizer
+     * @since 4.0.12
+     */
+    public interface Redo extends GtkSourceView.RedoSignal
+    {
+        public void onRedo(SourceView source);
+    }
+
+    /**
+     * Connect a handler to receive <code>SourceView.Redo</code> signals. It
+     * is emitted whenever something is redone in the editor window, e.g. by
+     * hitting <code><b>Shift+Ctrl+Z</b></code>.
+     * 
+     * @since 4.0.12
+     */
+    public void connect(SourceView.Redo handler) {
+        GtkSourceView.connect(this, handler, false);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/Style.java b/src/bindings/org/gnome/sourceview/Style.java
new file mode 100644
index 0000000..cd13cb9
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/Style.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/**
+ * Style is used to describe text attributes which are set when given style is
+ * used.
+ * 
+ * @author Georgios Migdos
+ * @since 4.1.2
+ */
+public class Style extends Object
+{
+    private Style(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Create a copy of this Style, that has the same attributes set.
+     * 
+     * @since 4.1.2
+     */
+    public Style copy() {
+        return GtkSourceStyle.copy(this);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/StyleScheme.java b/src/bindings/org/gnome/sourceview/StyleScheme.java
new file mode 100644
index 0000000..eeda7c2
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/StyleScheme.java
@@ -0,0 +1,110 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/**
+ * StyleScheme contains all the text styles to be used in {@link SourceView}
+ * and {@link SourceBuffer}. For instance, it contains text styles for syntax
+ * highlighting, it may contain foreground and background color for
+ * non-highlighted text, color for the line numbers, etc. used.
+ * 
+ * @author Georgios Migdos
+ * @since 4.1.2
+ */
+public class StyleScheme extends Object
+{
+    private StyleScheme(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Return this StyleScheme's unique identifier.
+     * 
+     * @since 4.1.2
+     */
+    public String getID() {
+        return GtkSourceStyleScheme.getId(this);
+    }
+
+    /**
+     * Return this StyleScheme's name (e.g. what would be presented in a
+     * preferences dialog).
+     * 
+     * @since 4.1.2
+     */
+    public String getName() {
+        return GtkSourceStyleScheme.getName(this);
+    }
+
+    /**
+     * Return this StyleScheme's description.
+     * 
+     * @since 4.1.2
+     */
+    public String getDescription() {
+        return GtkSourceStyleScheme.getDescription(this);
+    }
+
+    /**
+     * Return a String array containing information about this scheme's
+     * authors or <code>null</code> if no author is specified by the style
+     * scheme.
+     * 
+     * @since 4.1.2
+     */
+    public String[] getAuthors() {
+        return GtkSourceStyleScheme.getAuthors(this);
+    }
+
+    /**
+     * Return a file name if the scheme was created parsing a style scheme
+     * file or <code>null</code>.
+     * 
+     * @since 4.1.2
+     */
+    public String getFilename() {
+        return GtkSourceStyleScheme.getFilename(this);
+    }
+
+    /**
+     * Return the {@link Style} which corresponds to styleID in the scheme, or
+     * <code>null</code> when no style with this name exists.
+     * 
+     * @since 4.1.2
+     */
+    public Style getStyle(String styleID) {
+        return GtkSourceStyleScheme.getStyle(this, styleID);
+    }
+}
diff --git a/src/bindings/org/gnome/sourceview/StyleSchemeManager.java b/src/bindings/org/gnome/sourceview/StyleSchemeManager.java
new file mode 100644
index 0000000..7026d52
--- /dev/null
+++ b/src/bindings/org/gnome/sourceview/StyleSchemeManager.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.glib.Object;
+
+/**
+ * StyleSchemeManager provides access to {@link StyleScheme}s.
+ * 
+ * @author Georgios Migdos
+ * @since 4.1.2
+ */
+public class StyleSchemeManager extends Object
+{
+    private StyleSchemeManager(long pointer) {
+        super(pointer);
+    }
+
+    /**
+     * Return the default StyleSchemeManager instance.
+     * 
+     * @since 4.1.2
+     */
+    public static StyleSchemeManager getDefault() {
+        return GtkSourceStyleSchemeManager.getDefault();
+    }
+
+    /**
+     * Return a scheme specified by its ID or <code>null</code> if the ID is
+     * not known.
+     * 
+     * @since 4.1.2
+     */
+    public StyleScheme getScheme(String schemeID) {
+        return GtkSourceStyleSchemeManager.getScheme(this, schemeID);
+    }
+
+    /**
+     * Return a <code>String</code> array containing the the ids of the
+     * available style schemes or <code>null</code> if no style scheme is
+     * available.
+     * 
+     * @since 4.1.2
+     */
+    public final String[] getSchemeIDs() {
+        return GtkSourceStyleSchemeManager.getSchemeIds(this);
+    }
+}
diff --git a/src/bindings/org/gnome/unixprint/PageSetupUnixDialog.java b/src/bindings/org/gnome/unixprint/PageSetupUnixDialog.java
new file mode 100644
index 0000000..09e466d
--- /dev/null
+++ b/src/bindings/org/gnome/unixprint/PageSetupUnixDialog.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.unixprint;
+
+import org.gnome.gtk.Dialog;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PageSetupUnixDialog extends Dialog
+{
+    protected PageSetupUnixDialog(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/unixprint/Plumbing.java b/src/bindings/org/gnome/unixprint/Plumbing.java
new file mode 100644
index 0000000..24cd52c
--- /dev/null
+++ b/src/bindings/org/gnome/unixprint/Plumbing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.unixprint;
+
+abstract class Plumbing extends org.gnome.glib.Plumbing
+{
+    static {
+        isLibraryReady();
+    }
+
+    protected Plumbing() {}
+}
diff --git a/src/bindings/org/gnome/unixprint/PrintCapabilities.java b/src/bindings/org/gnome/unixprint/PrintCapabilities.java
new file mode 100644
index 0000000..f8821c2
--- /dev/null
+++ b/src/bindings/org/gnome/unixprint/PrintCapabilities.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.unixprint;
+
+import org.freedesktop.bindings.Flag;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public final class PrintCapabilities extends Flag
+{
+    private PrintCapabilities(int ordinal, String nickname) {
+        super(ordinal, nickname);
+    }
+}
diff --git a/src/bindings/org/gnome/unixprint/PrintJob.java b/src/bindings/org/gnome/unixprint/PrintJob.java
new file mode 100644
index 0000000..3bf6dec
--- /dev/null
+++ b/src/bindings/org/gnome/unixprint/PrintJob.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.unixprint;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PrintJob extends Object
+{
+    protected PrintJob(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/unixprint/PrintUnixDialog.java b/src/bindings/org/gnome/unixprint/PrintUnixDialog.java
new file mode 100644
index 0000000..f920869
--- /dev/null
+++ b/src/bindings/org/gnome/unixprint/PrintUnixDialog.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.unixprint;
+
+import org.gnome.gtk.Dialog;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class PrintUnixDialog extends Dialog
+{
+    protected PrintUnixDialog(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/org/gnome/unixprint/Printer.java b/src/bindings/org/gnome/unixprint/Printer.java
new file mode 100644
index 0000000..447b2e0
--- /dev/null
+++ b/src/bindings/org/gnome/unixprint/Printer.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+package org.gnome.unixprint;
+
+import org.gnome.glib.Object;
+
+/*
+ * FIXME this is a placeholder stub for what will become the public API for
+ * this type. Replace this comment with appropriate javadoc including author
+ * and since tags. Note that the class may need to be made abstract, implement
+ * interfaces, or even have its parent changed. No API stability guarantees
+ * are made about this class until it has been reviewed by a hacker and this
+ * comment has been replaced.
+ */
+public class Printer extends Object
+{
+    protected Printer(long pointer) {
+        super(pointer);
+    }
+}
diff --git a/src/bindings/overview.html b/src/bindings/overview.html
new file mode 100644
index 0000000..7283abb
--- /dev/null
+++ b/src/bindings/overview.html
@@ -0,0 +1,111 @@
+<html>
+<body>
+This is the java-gnome language bindings project!
+The libraries here are as follows:
+
+<dl>
+
+<dt><a href="org/gnome/gtk/package-summary.html">GTK</a>
+<dd><p>GTK, the widget toolkit that us used to create amazing desktop
+applications for the GNOME desktop and other platforms that support it. GTK
+was originally created as the <b><u>G</u></b>IMP's widget <b><u>T</u></b>ool
+<b><u>K</u></b>it), and has since become the backbone of the entire GNOME
+project.</p>
+
+<dt><a href="org/gnome/gdk/package-summary.html">GDK</a>
+<dd><p>GDK contains the low level <b><u>D</u></b>rawing primitives (elements
+on the screen like points, images, cursors, etc) along with facilities for
+handling events coming back from the user (such as mouse clicks and
+keystrokes). It has implementations of various backends allowing GTK to be
+used on a number of different platforms. <i>Most of the actual drawing is done
+via Cairo.</i></p>
+
+<dt><a href="org/gnome/glib/package-summary.html">GLib and GObject</a>
+<dd><p>GLib and GObject are the base libraries in GNOME, providing general
+purpose utilities and an extensible object-oriented type system. These are
+largely transparent to the Java developer, but nevertheless the infrastructure
+needed to support the other libraries resides here.</p>
+
+<dt>Pango
+<dd><p>Pango, the text layout and rending engine used to power font rendering
+and internationalization in GNOME.</p>
+
+<dt>ATK
+<dd><p>ATK, the <b><u>A</u></b>ccessibility toolkit that enables GNOME to be
+used by people needing extra support to make the most of their computers.  ATK
+is used by tools such as screen readers, magnifiers, and input devices to
+permit a rich interaction with the desktop through alternative means. It is
+also, amazingly enough, used by testing frameworks to introspect widgets and
+text on the screen.</p>
+
+<dt>GtkSourceView
+<dd><p>A variant of TextView that does source code highlighting.</p>
+
+<dt>LibNotify
+<dd><p>Popup warnings to the user.</p>
+
+<dt>GtkSpell
+<dd><p>Spell checking for TextView Widgets.</p>
+
+<dt>LibUnique
+<dd><p>A small library to facilitate the IPC necessary to enable you to
+maintain one instance (only) of an application.</p>
+
+</dl>
+
+<h2>Getting started</h3>
+
+<!-- Tutorials -->
+
+<p>The first call you will make in any java-gnome program is going to be
+{@link org.gnome.gtk.Gtk#init(java.lang.String[]) Gtk.init()}, so you might
+try starting there.</p>
+
+<h3>External resources</h3>
+
+<p>For further reference, you might try
+
+<dl>
+<dt>
+<a href="http://java-gnome.sourceforge.net/4.0/"><code>http://java-gnome.sourceforge.net</code></a>
+<dd>The java-gnome website<br/><br/></dd>
+
+<dt>
+<a href="http://www.gtk.org/"><code>http://www.gtk.org</code></a>
+<dd>The GTK+ project page<br/><br/></dd>
+
+<dt><a href="http://library.gnome.org/devel/gtk/"><code>http://library.gnome.org</code></a>
+<dd>The GNOME developers site, with low level API documentation</dd>
+
+</dl>
+
+<p>The java-gnome project have an IRC channel, <code>#java-gnome</code>, and a
+mailing list, <code>java-gnome-developer</code> that are great places to ask
+questions. See the <a
+href="http://java-gnome.sourceforge.net/4.0/lists/">contact us</a> page for
+details.</p>
+
+</body>
+</html>
+
+<!--
+ 
+  Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+
+  As project documentation, this file forms an integral part of the source
+  code of the library it accompanies, and thus is made available to you by its
+  authors as open source software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License version 2 ("GPL") as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+
+  You should have received a copy of the GPL along with this program. If not,
+  see http://www.gnu.org/licenses/. The authors of this program may be
+  contacted through http://java-gnome.sourceforge.net/.
+
+  vim: set textwidth=78 nowrap:
+
+-->
diff --git a/src/bindings/stylesheet.css b/src/bindings/stylesheet.css
new file mode 100644
index 0000000..e950bcc
--- /dev/null
+++ b/src/bindings/stylesheet.css
@@ -0,0 +1,53 @@
+body { background-color: #FFFFFF }
+
+a:link             { text-decoration: underline; color: #333366; }
+a:visited          { text-decoration: underline; color: #1a2491; } 
+a:hover            { text-decoration: underline; color: red; }
+
+img.snapshot {
+	padding-top: 10px;
+	padding-left: 20px;
+	padding-right: 5px;
+	float: right;
+	vertical-align: top;
+}
+
+hr {
+	clear: both;
+}
+
+pre {
+	padding-bottom: 0px;
+	margin-bottom: 0px;
+}
+
+var {
+	color: #005200;
+}
+
+/*
+ * The remainder of this file is verbatim from the default JavaDoc stylesheet.
+ */
+
+/* Headings */
+h1 { font-size: 145% }
+
+/* Table colors */
+.TableHeadingColor     { background: #CCCCFF } /* Dark mauve */
+.TableSubHeadingColor  { background: #EEEEFF } /* Light mauve */
+.TableRowColor         { background: #FFFFFF } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont   { font-size: 100%; font-family: Helvetica, Arial, sans-serif }
+.FrameHeadingFont { font-size:  90%; font-family: Helvetica, Arial, sans-serif }
+.FrameItemFont    { font-size:  90%; font-family: Helvetica, Arial, sans-serif }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1    { background-color:#EEEEFF;} /* Light mauve */
+.NavBarCell1Rev { background-color:#00008B;} /* Dark Blue */
+.NavBarFont1    { font-family: Arial, Helvetica, sans-serif; color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
+
+.NavBarCell2    { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+.NavBarCell3    { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+
diff --git a/src/defs/AtkAction.defs b/src/defs/AtkAction.defs
new file mode 100644
index 0000000..8c7d0c9
--- /dev/null
+++ b/src/defs/AtkAction.defs
@@ -0,0 +1,121 @@
+(define-interface Action
+  (in-module "Atk")
+  (c-name "AtkAction")
+  (gtype-id "ATK_TYPE_ACTION")
+)
+
+(define-method do_action
+  (of-object "AtkAction")
+  (c-name "atk_action_do_action")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_n_actions
+  (of-object "AtkAction")
+  (c-name "atk_action_get_n_actions")
+  (return-type "gint")
+)
+
+(define-method get_description
+  (of-object "AtkAction")
+  (c-name "atk_action_get_description")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_name
+  (of-object "AtkAction")
+  (c-name "atk_action_get_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_keybinding
+  (of-object "AtkAction")
+  (c-name "atk_action_get_keybinding")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method set_description
+  (of-object "AtkAction")
+  (c-name "atk_action_set_description")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+    '("const-gchar*" "desc")
+  )
+)
+
+(define-method get_localized_name
+  (of-object "AtkAction")
+  (c-name "atk_action_get_localized_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual do_action
+  (of-object "AtkAction")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_n_actions
+  (of-object "AtkAction")
+  (return-type "gint")
+)
+
+(define-virtual get_description
+  (of-object "AtkAction")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_name
+  (of-object "AtkAction")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_keybinding
+  (of-object "AtkAction")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual set_description
+  (of-object "AtkAction")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+    '("const-gchar*" "desc")
+  )
+)
+
+(define-virtual get_localized_name
+  (of-object "AtkAction")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
diff --git a/src/defs/AtkAttributeSet.defs b/src/defs/AtkAttributeSet.defs
new file mode 100644
index 0000000..e38df3a
--- /dev/null
+++ b/src/defs/AtkAttributeSet.defs
@@ -0,0 +1,6 @@
+(define-method free
+  (of-object "AtkAttributeSet")
+  (c-name "atk_attribute_set_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/AtkComponent.defs b/src/defs/AtkComponent.defs
new file mode 100644
index 0000000..aca13a1
--- /dev/null
+++ b/src/defs/AtkComponent.defs
@@ -0,0 +1,264 @@
+(define-interface Component
+  (in-module "Atk")
+  (c-name "AtkComponent")
+  (gtype-id "ATK_TYPE_COMPONENT")
+)
+
+(define-method add_focus_handler
+  (of-object "AtkComponent")
+  (c-name "atk_component_add_focus_handler")
+  (return-type "guint")
+  (parameters
+    '("AtkFocusHandler" "handler_function")
+  )
+)
+
+(define-method contains
+  (of-object "AtkComponent")
+  (c-name "atk_component_contains")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-method ref_accessible_at_point
+  (of-object "AtkComponent")
+  (c-name "atk_component_ref_accessible_at_point")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-method get_extents
+  (of-object "AtkComponent")
+  (c-name "atk_component_get_extents")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gint*" "width")
+    '("gint*" "height")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-method get_position
+  (of-object "AtkComponent")
+  (c-name "atk_component_get_position")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-method get_size
+  (of-object "AtkComponent")
+  (c-name "atk_component_get_size")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method grab_focus
+  (of-object "AtkComponent")
+  (c-name "atk_component_grab_focus")
+  (return-type "gboolean")
+)
+
+(define-method remove_focus_handler
+  (of-object "AtkComponent")
+  (c-name "atk_component_remove_focus_handler")
+  (return-type "none")
+  (parameters
+    '("guint" "handler_id")
+  )
+)
+
+(define-method set_extents
+  (of-object "AtkComponent")
+  (c-name "atk_component_set_extents")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-method set_position
+  (of-object "AtkComponent")
+  (c-name "atk_component_set_position")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-method set_size
+  (of-object "AtkComponent")
+  (c-name "atk_component_set_size")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method get_layer
+  (of-object "AtkComponent")
+  (c-name "atk_component_get_layer")
+  (return-type "AtkLayer")
+)
+
+(define-method get_mdi_zorder
+  (of-object "AtkComponent")
+  (c-name "atk_component_get_mdi_zorder")
+  (return-type "gint")
+)
+
+(define-method get_alpha
+  (of-object "AtkComponent")
+  (c-name "atk_component_get_alpha")
+  (return-type "gdouble")
+)
+
+(define-virtual add_focus_handler
+  (of-object "AtkComponent")
+  (return-type "guint")
+  (parameters
+    '("AtkFocusHandler" "handler_function")
+  )
+)
+
+(define-virtual contains
+  (of-object "AtkComponent")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual ref_accessible_at_point
+  (of-object "AtkComponent")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_extents
+  (of-object "AtkComponent")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gint*" "width")
+    '("gint*" "height")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_position
+  (of-object "AtkComponent")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_size
+  (of-object "AtkComponent")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-virtual grab_focus
+  (of-object "AtkComponent")
+  (return-type "gboolean")
+)
+
+(define-virtual remove_focus_handler
+  (of-object "AtkComponent")
+  (return-type "none")
+  (parameters
+    '("guint" "handler_id")
+  )
+)
+
+(define-virtual set_extents
+  (of-object "AtkComponent")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual set_position
+  (of-object "AtkComponent")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual set_size
+  (of-object "AtkComponent")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-virtual get_layer
+  (of-object "AtkComponent")
+  (return-type "AtkLayer")
+)
+
+(define-virtual get_mdi_zorder
+  (of-object "AtkComponent")
+  (return-type "gint")
+)
+
+(define-virtual bounds_changed
+  (of-object "AtkComponent")
+  (return-type "none")
+  (parameters
+    '("AtkRectangle*" "bounds")
+  )
+)
+
+(define-virtual get_alpha
+  (of-object "AtkComponent")
+  (return-type "gdouble")
+)
+
diff --git a/src/defs/AtkCoordType.defs b/src/defs/AtkCoordType.defs
new file mode 100644
index 0000000..7b750d3
--- /dev/null
+++ b/src/defs/AtkCoordType.defs
@@ -0,0 +1,10 @@
+(define-enum CoordType
+  (in-module "Atk")
+  (c-name "AtkCoordType")
+  (gtype-id "ATK_TYPE_COORD_TYPE")
+  (values
+    '("screen" "ATK_XY_SCREEN")
+    '("window" "ATK_XY_WINDOW")
+  )
+)
+
diff --git a/src/defs/AtkDocument.defs b/src/defs/AtkDocument.defs
new file mode 100644
index 0000000..e8877d5
--- /dev/null
+++ b/src/defs/AtkDocument.defs
@@ -0,0 +1,75 @@
+(define-interface Document
+  (in-module "Atk")
+  (c-name "AtkDocument")
+  (gtype-id "ATK_TYPE_DOCUMENT")
+)
+
+(define-method get_document_type
+  (of-object "AtkDocument")
+  (c-name "atk_document_get_document_type")
+  (return-type "const-gchar*")
+)
+
+(define-method get_document
+  (of-object "AtkDocument")
+  (c-name "atk_document_get_document")
+  (return-type "gpointer")
+)
+
+(define-method get_attributes
+  (of-object "AtkDocument")
+  (c-name "atk_document_get_attributes")
+  (return-type "AtkAttributeSet*")
+)
+
+(define-method get_attribute_value
+  (of-object "AtkDocument")
+  (c-name "atk_document_get_attribute_value")
+  (return-type "const-gchar*")
+  (parameters
+    '("const-gchar*" "attribute_name")
+  )
+)
+
+(define-method set_attribute_value
+  (of-object "AtkDocument")
+  (c-name "atk_document_set_attribute_value")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "attribute_name")
+    '("const-gchar*" "attribute_value")
+  )
+)
+
+(define-virtual get_document_type
+  (of-object "AtkDocument")
+  (return-type "const-gchar*")
+)
+
+(define-virtual get_document
+  (of-object "AtkDocument")
+  (return-type "gpointer")
+)
+
+(define-virtual get_document_attributes
+  (of-object "AtkDocument")
+  (return-type "AtkAttributeSet*")
+)
+
+(define-virtual get_document_attribute_value
+  (of-object "AtkDocument")
+  (return-type "G_CONST_RETURNgchar*")
+  (parameters
+    '("const-gchar*" "attribute_name")
+  )
+)
+
+(define-virtual set_document_attribute
+  (of-object "AtkDocument")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "attribute_name")
+    '("const-gchar*" "attribute_value")
+  )
+)
+
diff --git a/src/defs/AtkEditableText.defs b/src/defs/AtkEditableText.defs
new file mode 100644
index 0000000..20c3b31
--- /dev/null
+++ b/src/defs/AtkEditableText.defs
@@ -0,0 +1,139 @@
+(define-interface EditableText
+  (in-module "Atk")
+  (c-name "AtkEditableText")
+  (gtype-id "ATK_TYPE_EDITABLE_TEXT")
+)
+
+(define-method set_run_attributes
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_set_run_attributes")
+  (return-type "gboolean")
+  (parameters
+    '("AtkAttributeSet*" "attrib_set")
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-method set_text_contents
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_set_text_contents")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "string")
+  )
+)
+
+(define-method insert_text
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_insert_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "string")
+    '("gint" "length")
+    '("gint*" "position")
+  )
+)
+
+(define-method copy_text
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_copy_text")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-method cut_text
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_cut_text")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-method delete_text
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_delete_text")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-method paste_text
+  (of-object "AtkEditableText")
+  (c-name "atk_editable_text_paste_text")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+  )
+)
+
+(define-virtual set_run_attributes
+  (of-object "AtkEditableText")
+  (return-type "gboolean")
+  (parameters
+    '("AtkAttributeSet*" "attrib_set")
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-virtual set_text_contents
+  (of-object "AtkEditableText")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "string")
+  )
+)
+
+(define-virtual insert_text
+  (of-object "AtkEditableText")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "string")
+    '("gint" "length")
+    '("gint*" "position")
+  )
+)
+
+(define-virtual copy_text
+  (of-object "AtkEditableText")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual cut_text
+  (of-object "AtkEditableText")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual delete_text
+  (of-object "AtkEditableText")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual paste_text
+  (of-object "AtkEditableText")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+  )
+)
+
diff --git a/src/defs/AtkGObjectAccessible.defs b/src/defs/AtkGObjectAccessible.defs
new file mode 100644
index 0000000..e655cfb
--- /dev/null
+++ b/src/defs/AtkGObjectAccessible.defs
@@ -0,0 +1,13 @@
+(define-object GObjectAccessible
+  (in-module "Atk")
+  (parent "AtkObject")
+  (c-name "AtkGObjectAccessible")
+  (gtype-id "ATK_TYPE_GOBJECT_ACCESSIBLE")
+)
+
+(define-method get_object
+  (of-object "AtkGObjectAccessible")
+  (c-name "atk_gobject_accessible_get_object")
+  (return-type "GObject*")
+)
+
diff --git a/src/defs/AtkHyperlink.defs b/src/defs/AtkHyperlink.defs
new file mode 100644
index 0000000..6d99308
--- /dev/null
+++ b/src/defs/AtkHyperlink.defs
@@ -0,0 +1,114 @@
+(define-object Hyperlink
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkHyperlink")
+  (gtype-id "ATK_TYPE_HYPERLINK")
+)
+
+(define-method get_uri
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_get_uri")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_object
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_get_object")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_end_index
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_get_end_index")
+  (return-type "gint")
+)
+
+(define-method get_start_index
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_get_start_index")
+  (return-type "gint")
+)
+
+(define-method is_valid
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_is_valid")
+  (return-type "gboolean")
+)
+
+(define-method get_n_anchors
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_get_n_anchors")
+  (return-type "gint")
+)
+
+(define-method is_inline
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_is_inline")
+  (return-type "gboolean")
+)
+
+(define-method is_selected_link
+  (of-object "AtkHyperlink")
+  (c-name "atk_hyperlink_is_selected_link")
+  (return-type "gboolean")
+)
+
+(define-virtual get_uri
+  (of-object "AtkHyperlink")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_object
+  (of-object "AtkHyperlink")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_end_index
+  (of-object "AtkHyperlink")
+  (return-type "gint")
+)
+
+(define-virtual get_start_index
+  (of-object "AtkHyperlink")
+  (return-type "gint")
+)
+
+(define-virtual is_valid
+  (of-object "AtkHyperlink")
+  (return-type "gboolean")
+)
+
+(define-virtual get_n_anchors
+  (of-object "AtkHyperlink")
+  (return-type "gint")
+)
+
+(define-virtual link_state
+  (of-object "AtkHyperlink")
+  (return-type "guint")
+)
+
+(define-virtual is_selected_link
+  (of-object "AtkHyperlink")
+  (return-type "gboolean")
+)
+
+(define-virtual link_activated
+  (of-object "AtkHyperlink")
+  (return-type "none")
+)
+
diff --git a/src/defs/AtkHyperlinkImpl.defs b/src/defs/AtkHyperlinkImpl.defs
new file mode 100644
index 0000000..c84ca82
--- /dev/null
+++ b/src/defs/AtkHyperlinkImpl.defs
@@ -0,0 +1,17 @@
+(define-interface HyperlinkImpl
+  (in-module "Atk")
+  (c-name "AtkHyperlinkImpl")
+  (gtype-id "ATK_TYPE_HYPERLINK_IMPL")
+)
+
+(define-method get_hyperlink
+  (of-object "AtkHyperlinkImpl")
+  (c-name "atk_hyperlink_impl_get_hyperlink")
+  (return-type "AtkHyperlink*")
+)
+
+(define-virtual get_hyperlink
+  (of-object "AtkHyperlinkImpl")
+  (return-type "AtkHyperlink*")
+)
+
diff --git a/src/defs/AtkHyperlinkStateFlags.defs b/src/defs/AtkHyperlinkStateFlags.defs
new file mode 100644
index 0000000..713f5c1
--- /dev/null
+++ b/src/defs/AtkHyperlinkStateFlags.defs
@@ -0,0 +1,9 @@
+(define-flags HyperlinkStateFlags
+  (in-module "Atk")
+  (c-name "AtkHyperlinkStateFlags")
+  (gtype-id "ATK_TYPE_HYPERLINK_STATE_FLAGS")
+  (values
+    '("e" "ATK_HYPERLINK_IS_INLINE")
+  )
+)
+
diff --git a/src/defs/AtkHypertext.defs b/src/defs/AtkHypertext.defs
new file mode 100644
index 0000000..46b4a0f
--- /dev/null
+++ b/src/defs/AtkHypertext.defs
@@ -0,0 +1,59 @@
+(define-interface Hypertext
+  (in-module "Atk")
+  (c-name "AtkHypertext")
+  (gtype-id "ATK_TYPE_HYPERTEXT")
+)
+
+(define-method get_link
+  (of-object "AtkHypertext")
+  (c-name "atk_hypertext_get_link")
+  (return-type "AtkHyperlink*")
+  (parameters
+    '("gint" "link_index")
+  )
+)
+
+(define-method get_n_links
+  (of-object "AtkHypertext")
+  (c-name "atk_hypertext_get_n_links")
+  (return-type "gint")
+)
+
+(define-method get_link_index
+  (of-object "AtkHypertext")
+  (c-name "atk_hypertext_get_link_index")
+  (return-type "gint")
+  (parameters
+    '("gint" "char_index")
+  )
+)
+
+(define-virtual get_link
+  (of-object "AtkHypertext")
+  (return-type "AtkHyperlink*")
+  (parameters
+    '("gint" "link_index")
+  )
+)
+
+(define-virtual get_n_links
+  (of-object "AtkHypertext")
+  (return-type "gint")
+)
+
+(define-virtual get_link_index
+  (of-object "AtkHypertext")
+  (return-type "gint")
+  (parameters
+    '("gint" "char_index")
+  )
+)
+
+(define-virtual link_selected
+  (of-object "AtkHypertext")
+  (return-type "none")
+  (parameters
+    '("gint" "link_index")
+  )
+)
+
diff --git a/src/defs/AtkImage.defs b/src/defs/AtkImage.defs
new file mode 100644
index 0000000..a99a926
--- /dev/null
+++ b/src/defs/AtkImage.defs
@@ -0,0 +1,74 @@
+(define-interface Image
+  (in-module "Atk")
+  (c-name "AtkImage")
+  (gtype-id "ATK_TYPE_IMAGE")
+)
+
+(define-method get_image_description
+  (of-object "AtkImage")
+  (c-name "atk_image_get_image_description")
+  (return-type "const-gchar*")
+)
+
+(define-method get_image_size
+  (of-object "AtkImage")
+  (c-name "atk_image_get_image_size")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method set_image_description
+  (of-object "AtkImage")
+  (c-name "atk_image_set_image_description")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "description")
+  )
+)
+
+(define-method get_image_position
+  (of-object "AtkImage")
+  (c-name "atk_image_get_image_position")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_image_position
+  (of-object "AtkImage")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_image_description
+  (of-object "AtkImage")
+  (return-type "const-gchar*")
+)
+
+(define-virtual get_image_size
+  (of-object "AtkImage")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-virtual set_image_description
+  (of-object "AtkImage")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "description")
+  )
+)
+
diff --git a/src/defs/AtkImplementor.defs b/src/defs/AtkImplementor.defs
new file mode 100644
index 0000000..f1ad26c
--- /dev/null
+++ b/src/defs/AtkImplementor.defs
@@ -0,0 +1,5 @@
+(define-virtual ref_accessible
+  (of-object "AtkImplementor")
+  (return-type "AtkObject*")
+)
+
diff --git a/src/defs/AtkImplementorIface.defs b/src/defs/AtkImplementorIface.defs
new file mode 100644
index 0000000..2fb27ec
--- /dev/null
+++ b/src/defs/AtkImplementorIface.defs
@@ -0,0 +1,12 @@
+(define-interface ImplementorIface
+  (in-module "Atk")
+  (c-name "AtkImplementorIface")
+  (gtype-id "ATK_TYPE_IMPLEMENTOR")
+)
+
+(define-method ref_accessible
+  (of-object "AtkImplementorIface")
+  (c-name "atk_implementor_ref_accessible")
+  (return-type "AtkObject*")
+)
+
diff --git a/src/defs/AtkKeyEventType.defs b/src/defs/AtkKeyEventType.defs
new file mode 100644
index 0000000..3a7f137
--- /dev/null
+++ b/src/defs/AtkKeyEventType.defs
@@ -0,0 +1,11 @@
+(define-enum KeyEventType
+  (in-module "Atk")
+  (c-name "AtkKeyEventType")
+  (gtype-id "ATK_TYPE_KEY_EVENT_TYPE")
+  (values
+    '("press" "ATK_KEY_EVENT_PRESS")
+    '("release" "ATK_KEY_EVENT_RELEASE")
+    '("last-defined" "ATK_KEY_EVENT_LAST_DEFINED")
+  )
+)
+
diff --git a/src/defs/AtkLayer.defs b/src/defs/AtkLayer.defs
new file mode 100644
index 0000000..0b8454f
--- /dev/null
+++ b/src/defs/AtkLayer.defs
@@ -0,0 +1,15 @@
+(define-enum Layer
+  (in-module "Atk")
+  (c-name "AtkLayer")
+  (gtype-id "ATK_TYPE_LAYER")
+  (values
+    '("invalid" "ATK_LAYER_INVALID")
+    '("background" "ATK_LAYER_BACKGROUND")
+    '("canvas" "ATK_LAYER_CANVAS")
+    '("widget" "ATK_LAYER_WIDGET")
+    '("mdi" "ATK_LAYER_MDI")
+    '("popup" "ATK_LAYER_POPUP")
+    '("overlay" "ATK_LAYER_OVERLAY")
+  )
+)
+
diff --git a/src/defs/AtkNoOpObject.defs b/src/defs/AtkNoOpObject.defs
new file mode 100644
index 0000000..d4289c1
--- /dev/null
+++ b/src/defs/AtkNoOpObject.defs
@@ -0,0 +1,17 @@
+(define-object NoOpObject
+  (in-module "Atk")
+  (parent "AtkObject")
+  (c-name "AtkNoOpObject")
+  (gtype-id "ATK_TYPE_NO_OP_OBJECT")
+)
+
+(define-function atk_no_op_object_new
+  (is-constructor-of "AtkNoOpObject")
+  (c-name "atk_no_op_object_new")
+  (caller-owns-return #t)
+  (return-type "AtkObject*")
+  (parameters
+    '("GObject*" "obj")
+  )
+)
+
diff --git a/src/defs/AtkNoOpObjectFactory.defs b/src/defs/AtkNoOpObjectFactory.defs
new file mode 100644
index 0000000..44fd7a3
--- /dev/null
+++ b/src/defs/AtkNoOpObjectFactory.defs
@@ -0,0 +1,14 @@
+(define-object NoOpObjectFactory
+  (in-module "Atk")
+  (parent "AtkObjectFactory")
+  (c-name "AtkNoOpObjectFactory")
+  (gtype-id "ATK_TYPE_NO_OP_OBJECT_FACTORY")
+)
+
+(define-function atk_no_op_object_factory_new
+  (is-constructor-of "AtkNoOpObjectFactory")
+  (c-name "atk_no_op_object_factory_new")
+  (caller-owns-return #t)
+  (return-type "AtkObjectFactory*")
+)
+
diff --git a/src/defs/AtkObject.defs b/src/defs/AtkObject.defs
new file mode 100644
index 0000000..124b3f2
--- /dev/null
+++ b/src/defs/AtkObject.defs
@@ -0,0 +1,341 @@
+(define-object Object
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkObject")
+  (gtype-id "ATK_TYPE_OBJECT")
+)
+
+(define-method get_attributes
+  (of-object "AtkObject")
+  (c-name "atk_object_get_attributes")
+  (return-type "AtkAttributeSet*")
+)
+
+(define-method get_name
+  (of-object "AtkObject")
+  (c-name "atk_object_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_description
+  (of-object "AtkObject")
+  (c-name "atk_object_get_description")
+  (return-type "const-gchar*")
+)
+
+(define-method get_parent
+  (of-object "AtkObject")
+  (c-name "atk_object_get_parent")
+  (return-type "AtkObject*")
+)
+
+(define-method get_n_accessible_children
+  (of-object "AtkObject")
+  (c-name "atk_object_get_n_accessible_children")
+  (return-type "gint")
+)
+
+(define-method ref_accessible_child
+  (of-object "AtkObject")
+  (c-name "atk_object_ref_accessible_child")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method ref_relation_set
+  (of-object "AtkObject")
+  (c-name "atk_object_ref_relation_set")
+  (return-type "AtkRelationSet*")
+)
+
+(define-method get_role
+  (of-object "AtkObject")
+  (c-name "atk_object_get_role")
+  (return-type "AtkRole")
+)
+
+(define-method get_layer
+  (of-object "AtkObject")
+  (c-name "atk_object_get_layer")
+  (return-type "AtkLayer")
+)
+
+(define-method get_mdi_zorder
+  (of-object "AtkObject")
+  (c-name "atk_object_get_mdi_zorder")
+  (return-type "gint")
+)
+
+(define-method ref_state_set
+  (of-object "AtkObject")
+  (c-name "atk_object_ref_state_set")
+  (return-type "AtkStateSet*")
+)
+
+(define-method get_index_in_parent
+  (of-object "AtkObject")
+  (c-name "atk_object_get_index_in_parent")
+  (return-type "gint")
+)
+
+(define-method set_name
+  (of-object "AtkObject")
+  (c-name "atk_object_set_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method set_description
+  (of-object "AtkObject")
+  (c-name "atk_object_set_description")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "description")
+  )
+)
+
+(define-method set_parent
+  (of-object "AtkObject")
+  (c-name "atk_object_set_parent")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "parent")
+  )
+)
+
+(define-method set_role
+  (of-object "AtkObject")
+  (c-name "atk_object_set_role")
+  (return-type "none")
+  (parameters
+    '("AtkRole" "role")
+  )
+)
+
+(define-method connect_property_change_handler
+  (of-object "AtkObject")
+  (c-name "atk_object_connect_property_change_handler")
+  (return-type "guint")
+  (parameters
+    '("AtkPropertyChangeHandler*" "handler")
+  )
+)
+
+(define-method remove_property_change_handler
+  (of-object "AtkObject")
+  (c-name "atk_object_remove_property_change_handler")
+  (return-type "none")
+  (parameters
+    '("guint" "handler_id")
+  )
+)
+
+(define-method notify_state_change
+  (of-object "AtkObject")
+  (c-name "atk_object_notify_state_change")
+  (return-type "none")
+  (parameters
+    '("AtkState" "state")
+    '("gboolean" "value")
+  )
+)
+
+(define-method initialize
+  (of-object "AtkObject")
+  (c-name "atk_object_initialize")
+  (return-type "none")
+  (parameters
+    '("gpointer" "data")
+  )
+)
+
+(define-method add_relationship
+  (of-object "AtkObject")
+  (c-name "atk_object_add_relationship")
+  (return-type "gboolean")
+  (parameters
+    '("AtkRelationType" "relationship")
+    '("AtkObject*" "target")
+  )
+)
+
+(define-method remove_relationship
+  (of-object "AtkObject")
+  (c-name "atk_object_remove_relationship")
+  (return-type "gboolean")
+  (parameters
+    '("AtkRelationType" "relationship")
+    '("AtkObject*" "target")
+  )
+)
+
+(define-virtual get_attributes
+  (of-object "AtkObject")
+  (return-type "AtkAttributeSet*")
+)
+
+(define-virtual get_name
+  (of-object "AtkObject")
+  (return-type "const-gchar*")
+)
+
+(define-virtual get_description
+  (of-object "AtkObject")
+  (return-type "const-gchar*")
+)
+
+(define-virtual get_parent
+  (of-object "AtkObject")
+  (return-type "AtkObject*")
+)
+
+(define-virtual get_n_children
+  (of-object "AtkObject")
+  (return-type "gint")
+)
+
+(define-virtual ref_child
+  (of-object "AtkObject")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_index_in_parent
+  (of-object "AtkObject")
+  (return-type "gint")
+)
+
+(define-virtual ref_relation_set
+  (of-object "AtkObject")
+  (return-type "AtkRelationSet*")
+)
+
+(define-virtual get_role
+  (of-object "AtkObject")
+  (return-type "AtkRole")
+)
+
+(define-virtual get_layer
+  (of-object "AtkObject")
+  (return-type "AtkLayer")
+)
+
+(define-virtual get_mdi_zorder
+  (of-object "AtkObject")
+  (return-type "gint")
+)
+
+(define-virtual ref_state_set
+  (of-object "AtkObject")
+  (return-type "AtkStateSet*")
+)
+
+(define-virtual set_name
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-virtual set_description
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "description")
+  )
+)
+
+(define-virtual set_parent
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "parent")
+  )
+)
+
+(define-virtual set_role
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("AtkRole" "role")
+  )
+)
+
+(define-virtual connect_property_change_handler
+  (of-object "AtkObject")
+  (return-type "guint")
+  (parameters
+    '("AtkPropertyChangeHandler*" "handler_function")
+  )
+)
+
+(define-virtual remove_property_change_handler
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("guint" "handler_id")
+  )
+)
+
+(define-virtual initialize
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("gpointer" "data")
+  )
+)
+
+(define-virtual children_changed
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("guint" "change_index")
+    '("gpointer" "changed_child")
+  )
+)
+
+(define-virtual focus_event
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("gboolean" "focus_in")
+  )
+)
+
+(define-virtual property_change
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("AtkPropertyValues*" "values")
+  )
+)
+
+(define-virtual state_change
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("gboolean" "state_set")
+  )
+)
+
+(define-virtual visible_data_changed
+  (of-object "AtkObject")
+  (return-type "none")
+)
+
+(define-virtual active_descendant_changed
+  (of-object "AtkObject")
+  (return-type "none")
+  (parameters
+    '("gpointer*" "child")
+  )
+)
+
diff --git a/src/defs/AtkObjectFactory.defs b/src/defs/AtkObjectFactory.defs
new file mode 100644
index 0000000..63858e1
--- /dev/null
+++ b/src/defs/AtkObjectFactory.defs
@@ -0,0 +1,38 @@
+(define-object ObjectFactory
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkObjectFactory")
+  (gtype-id "ATK_TYPE_OBJECT_FACTORY")
+)
+
+(define-method create_accessible
+  (of-object "AtkObjectFactory")
+  (c-name "atk_object_factory_create_accessible")
+  (return-type "AtkObject*")
+  (parameters
+    '("GObject*" "obj")
+  )
+)
+
+(define-method invalidate
+  (of-object "AtkObjectFactory")
+  (c-name "atk_object_factory_invalidate")
+  (return-type "none")
+)
+
+(define-method get_accessible_type
+  (of-object "AtkObjectFactory")
+  (c-name "atk_object_factory_get_accessible_type")
+  (return-type "GType")
+)
+
+(define-virtual create_accessible
+  (of-object "AtkObjectFactory")
+  (return-type "AtkObject*")
+)
+
+(define-virtual invalidate
+  (of-object "AtkObjectFactory")
+  (return-type "none")
+)
+
diff --git a/src/defs/AtkRectangle.defs b/src/defs/AtkRectangle.defs
new file mode 100644
index 0000000..a9bfd07
--- /dev/null
+++ b/src/defs/AtkRectangle.defs
@@ -0,0 +1,12 @@
+(define-boxed Rectangle
+  (in-module "Atk")
+  (c-name "AtkRectangle")
+  (gtype-id "ATK_TYPE_RECTANGLE")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
diff --git a/src/defs/AtkRegistry.defs b/src/defs/AtkRegistry.defs
new file mode 100644
index 0000000..3d96329
--- /dev/null
+++ b/src/defs/AtkRegistry.defs
@@ -0,0 +1,35 @@
+(define-object Registry
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkRegistry")
+  (gtype-id "ATK_TYPE_REGISTRY")
+)
+
+(define-method set_factory_type
+  (of-object "AtkRegistry")
+  (c-name "atk_registry_set_factory_type")
+  (return-type "none")
+  (parameters
+    '("GType" "type")
+    '("GType" "factory_type")
+  )
+)
+
+(define-method get_factory_type
+  (of-object "AtkRegistry")
+  (c-name "atk_registry_get_factory_type")
+  (return-type "GType")
+  (parameters
+    '("GType" "type")
+  )
+)
+
+(define-method get_factory
+  (of-object "AtkRegistry")
+  (c-name "atk_registry_get_factory")
+  (return-type "AtkObjectFactory*")
+  (parameters
+    '("GType" "type")
+  )
+)
+
diff --git a/src/defs/AtkRelation.defs b/src/defs/AtkRelation.defs
new file mode 100644
index 0000000..5cb398f
--- /dev/null
+++ b/src/defs/AtkRelation.defs
@@ -0,0 +1,40 @@
+(define-object Relation
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkRelation")
+  (gtype-id "ATK_TYPE_RELATION")
+)
+
+(define-function relation_new
+  (is-constructor-of "AtkRelation")
+  (c-name "atk_relation_new")
+  (caller-owns-return #t)
+  (return-type "AtkRelation*")
+  (parameters
+    '("AtkObject**" "targets")
+    '("gint" "n_targets")
+    '("AtkRelationType" "relationship")
+  )
+)
+
+(define-method get_relation_type
+  (of-object "AtkRelation")
+  (c-name "atk_relation_get_relation_type")
+  (return-type "AtkRelationType")
+)
+
+(define-method get_target
+  (of-object "AtkRelation")
+  (c-name "atk_relation_get_target")
+  (return-type "GPtrArray*")
+)
+
+(define-method add_target
+  (of-object "AtkRelation")
+  (c-name "atk_relation_add_target")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "target")
+  )
+)
+
diff --git a/src/defs/AtkRelationSet.defs b/src/defs/AtkRelationSet.defs
new file mode 100644
index 0000000..40ada7b
--- /dev/null
+++ b/src/defs/AtkRelationSet.defs
@@ -0,0 +1,75 @@
+(define-object RelationSet
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkRelationSet")
+  (gtype-id "ATK_TYPE_RELATION_SET")
+)
+
+(define-function relation_set_new
+  (is-constructor-of "AtkRelationSet")
+  (c-name "atk_relation_set_new")
+  (caller-owns-return #t)
+  (return-type "AtkRelationSet*")
+)
+
+(define-method contains
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_contains")
+  (return-type "gboolean")
+  (parameters
+    '("AtkRelationType" "relationship")
+  )
+)
+
+(define-method remove
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_remove")
+  (return-type "none")
+  (parameters
+    '("AtkRelation*" "relation")
+  )
+)
+
+(define-method add
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_add")
+  (return-type "none")
+  (parameters
+    '("AtkRelation*" "relation")
+  )
+)
+
+(define-method get_n_relations
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_get_n_relations")
+  (return-type "gint")
+)
+
+(define-method get_relation
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_get_relation")
+  (return-type "AtkRelation*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_relation_by_type
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_get_relation_by_type")
+  (return-type "AtkRelation*")
+  (parameters
+    '("AtkRelationType" "relationship")
+  )
+)
+
+(define-method add_relation_by_type
+  (of-object "AtkRelationSet")
+  (c-name "atk_relation_set_add_relation_by_type")
+  (return-type "none")
+  (parameters
+    '("AtkRelationType" "relationship")
+    '("AtkObject*" "target")
+  )
+)
+
diff --git a/src/defs/AtkRelationType.defs b/src/defs/AtkRelationType.defs
new file mode 100644
index 0000000..303dd62
--- /dev/null
+++ b/src/defs/AtkRelationType.defs
@@ -0,0 +1,16 @@
+(define-enum RelationType
+  (in-module "Atk")
+  (c-name "AtkRelationType")
+  (gtype-id "ATK_TYPE_RELATION_TYPE")
+  (values
+    '("null" "ATK_RELATION_NULL")
+    '("controlled-by" "ATK_RELATION_CONTROLLED_BY")
+    '("controller-for" "ATK_RELATION_CONTROLLER_FOR")
+    '("label-for" "ATK_RELATION_LABEL_FOR")
+    '("labelled-by" "ATK_RELATION_LABELLED_BY")
+    '("member-of" "ATK_RELATION_MEMBER_OF")
+    '("node-child-of" "ATK_RELATION_NODE_CHILD_OF")
+    '("last-defined" "ATK_RELATION_LAST_DEFINED")
+  )
+)
+
diff --git a/src/defs/AtkRole.defs b/src/defs/AtkRole.defs
new file mode 100644
index 0000000..63cc2d8
--- /dev/null
+++ b/src/defs/AtkRole.defs
@@ -0,0 +1,78 @@
+(define-enum Role
+  (in-module "Atk")
+  (c-name "AtkRole")
+  (gtype-id "ATK_TYPE_ROLE")
+  (values
+    '("invalid" "ATK_ROLE_INVALID")
+    '("accel-label" "ATK_ROLE_ACCEL_LABEL")
+    '("alert" "ATK_ROLE_ALERT")
+    '("animation" "ATK_ROLE_ANIMATION")
+    '("arrow" "ATK_ROLE_ARROW")
+    '("calendar" "ATK_ROLE_CALENDAR")
+    '("canvas" "ATK_ROLE_CANVAS")
+    '("check-box" "ATK_ROLE_CHECK_BOX")
+    '("check-menu-item" "ATK_ROLE_CHECK_MENU_ITEM")
+    '("color-chooser" "ATK_ROLE_COLOR_CHOOSER")
+    '("column-header" "ATK_ROLE_COLUMN_HEADER")
+    '("combo-box" "ATK_ROLE_COMBO_BOX")
+    '("date-editor" "ATK_ROLE_DATE_EDITOR")
+    '("desktop-icon" "ATK_ROLE_DESKTOP_ICON")
+    '("desktop-frame" "ATK_ROLE_DESKTOP_FRAME")
+    '("dial" "ATK_ROLE_DIAL")
+    '("dialog" "ATK_ROLE_DIALOG")
+    '("directory-pane" "ATK_ROLE_DIRECTORY_PANE")
+    '("drawing-area" "ATK_ROLE_DRAWING_AREA")
+    '("file-chooser" "ATK_ROLE_FILE_CHOOSER")
+    '("filler" "ATK_ROLE_FILLER")
+    '("font-chooser" "ATK_ROLE_FONT_CHOOSER")
+    '("frame" "ATK_ROLE_FRAME")
+    '("glass-pane" "ATK_ROLE_GLASS_PANE")
+    '("html-container" "ATK_ROLE_HTML_CONTAINER")
+    '("icon" "ATK_ROLE_ICON")
+    '("image" "ATK_ROLE_IMAGE")
+    '("internal-frame" "ATK_ROLE_INTERNAL_FRAME")
+    '("label" "ATK_ROLE_LABEL")
+    '("layered-pane" "ATK_ROLE_LAYERED_PANE")
+    '("list" "ATK_ROLE_LIST")
+    '("list-item" "ATK_ROLE_LIST_ITEM")
+    '("menu" "ATK_ROLE_MENU")
+    '("menu-bar" "ATK_ROLE_MENU_BAR")
+    '("menu-item" "ATK_ROLE_MENU_ITEM")
+    '("option-pane" "ATK_ROLE_OPTION_PANE")
+    '("page-tab" "ATK_ROLE_PAGE_TAB")
+    '("page-tab-list" "ATK_ROLE_PAGE_TAB_LIST")
+    '("panel" "ATK_ROLE_PANEL")
+    '("password-text" "ATK_ROLE_PASSWORD_TEXT")
+    '("popup-menu" "ATK_ROLE_POPUP_MENU")
+    '("progress-bar" "ATK_ROLE_PROGRESS_BAR")
+    '("push-button" "ATK_ROLE_PUSH_BUTTON")
+    '("radio-button" "ATK_ROLE_RADIO_BUTTON")
+    '("radio-menu-item" "ATK_ROLE_RADIO_MENU_ITEM")
+    '("root-pane" "ATK_ROLE_ROOT_PANE")
+    '("row-header" "ATK_ROLE_ROW_HEADER")
+    '("scroll-bar" "ATK_ROLE_SCROLL_BAR")
+    '("scroll-pane" "ATK_ROLE_SCROLL_PANE")
+    '("separator" "ATK_ROLE_SEPARATOR")
+    '("slider" "ATK_ROLE_SLIDER")
+    '("split-pane" "ATK_ROLE_SPLIT_PANE")
+    '("spin-button" "ATK_ROLE_SPIN_BUTTON")
+    '("statusbar" "ATK_ROLE_STATUSBAR")
+    '("table" "ATK_ROLE_TABLE")
+    '("table-cell" "ATK_ROLE_TABLE_CELL")
+    '("table-column-header" "ATK_ROLE_TABLE_COLUMN_HEADER")
+    '("table-row-header" "ATK_ROLE_TABLE_ROW_HEADER")
+    '("tear-off-menu-item" "ATK_ROLE_TEAR_OFF_MENU_ITEM")
+    '("terminal" "ATK_ROLE_TERMINAL")
+    '("text" "ATK_ROLE_TEXT")
+    '("toggle-button" "ATK_ROLE_TOGGLE_BUTTON")
+    '("tool-bar" "ATK_ROLE_TOOL_BAR")
+    '("tool-tip" "ATK_ROLE_TOOL_TIP")
+    '("tree" "ATK_ROLE_TREE")
+    '("tree-table" "ATK_ROLE_TREE_TABLE")
+    '("unknown" "ATK_ROLE_UNKNOWN")
+    '("viewport" "ATK_ROLE_VIEWPORT")
+    '("window" "ATK_ROLE_WINDOW")
+    '("last-defined" "ATK_ROLE_LAST_DEFINED")
+  )
+)
+
diff --git a/src/defs/AtkSelection.defs b/src/defs/AtkSelection.defs
new file mode 100644
index 0000000..17f3377
--- /dev/null
+++ b/src/defs/AtkSelection.defs
@@ -0,0 +1,112 @@
+(define-interface Selection
+  (in-module "Atk")
+  (c-name "AtkSelection")
+  (gtype-id "ATK_TYPE_SELECTION")
+)
+
+(define-method add_selection
+  (of-object "AtkSelection")
+  (c-name "atk_selection_add_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method clear_selection
+  (of-object "AtkSelection")
+  (c-name "atk_selection_clear_selection")
+  (return-type "gboolean")
+)
+
+(define-method ref_selection
+  (of-object "AtkSelection")
+  (c-name "atk_selection_ref_selection")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_selection_count
+  (of-object "AtkSelection")
+  (c-name "atk_selection_get_selection_count")
+  (return-type "gint")
+)
+
+(define-method is_child_selected
+  (of-object "AtkSelection")
+  (c-name "atk_selection_is_child_selected")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method remove_selection
+  (of-object "AtkSelection")
+  (c-name "atk_selection_remove_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method select_all_selection
+  (of-object "AtkSelection")
+  (c-name "atk_selection_select_all_selection")
+  (return-type "gboolean")
+)
+
+(define-virtual add_selection
+  (of-object "AtkSelection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual clear_selection
+  (of-object "AtkSelection")
+  (return-type "gboolean")
+)
+
+(define-virtual ref_selection
+  (of-object "AtkSelection")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_selection_count
+  (of-object "AtkSelection")
+  (return-type "gint")
+)
+
+(define-virtual is_child_selected
+  (of-object "AtkSelection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual remove_selection
+  (of-object "AtkSelection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual select_all_selection
+  (of-object "AtkSelection")
+  (return-type "gboolean")
+)
+
+(define-virtual selection_changed
+  (of-object "AtkSelection")
+  (return-type "none")
+)
+
diff --git a/src/defs/AtkStateSet.defs b/src/defs/AtkStateSet.defs
new file mode 100644
index 0000000..4ac25dd
--- /dev/null
+++ b/src/defs/AtkStateSet.defs
@@ -0,0 +1,100 @@
+(define-object StateSet
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkStateSet")
+  (gtype-id "ATK_TYPE_STATE_SET")
+)
+
+(define-function atk_state_set_new
+  (is-constructor-of "AtkStateSet")
+  (c-name "atk_state_set_new")
+  (caller-owns-return #t)
+  (return-type "AtkStateSet*")
+)
+
+(define-method is_empty
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_is_empty")
+  (return-type "gboolean")
+)
+
+(define-method add_state
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_add_state")
+  (return-type "gboolean")
+  (parameters
+    '("AtkStateType" "type")
+  )
+)
+
+(define-method add_states
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_add_states")
+  (return-type "none")
+  (parameters
+    '("AtkStateType*" "types")
+    '("gint" "n_types")
+  )
+)
+
+(define-method clear_states
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_clear_states")
+  (return-type "none")
+)
+
+(define-method contains_state
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_contains_state")
+  (return-type "gboolean")
+  (parameters
+    '("AtkStateType" "type")
+  )
+)
+
+(define-method contains_states
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_contains_states")
+  (return-type "gboolean")
+  (parameters
+    '("AtkStateType*" "types")
+    '("gint" "n_types")
+  )
+)
+
+(define-method remove_state
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_remove_state")
+  (return-type "gboolean")
+  (parameters
+    '("AtkStateType" "type")
+  )
+)
+
+(define-method and_sets
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_and_sets")
+  (return-type "AtkStateSet*")
+  (parameters
+    '("AtkStateSet*" "compare_set")
+  )
+)
+
+(define-method or_sets
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_or_sets")
+  (return-type "AtkStateSet*")
+  (parameters
+    '("AtkStateSet*" "compare_set")
+  )
+)
+
+(define-method xor_sets
+  (of-object "AtkStateSet")
+  (c-name "atk_state_set_xor_sets")
+  (return-type "AtkStateSet*")
+  (parameters
+    '("AtkStateSet*" "compare_set")
+  )
+)
+
diff --git a/src/defs/AtkStateType.defs b/src/defs/AtkStateType.defs
new file mode 100644
index 0000000..d5dd5f9
--- /dev/null
+++ b/src/defs/AtkStateType.defs
@@ -0,0 +1,38 @@
+(define-enum StateType
+  (in-module "Atk")
+  (c-name "AtkStateType")
+  (gtype-id "ATK_TYPE_STATE_TYPE")
+  (values
+    '("invalid" "ATK_STATE_INVALID")
+    '("active" "ATK_STATE_ACTIVE")
+    '("armed" "ATK_STATE_ARMED")
+    '("busy" "ATK_STATE_BUSY")
+    '("checked" "ATK_STATE_CHECKED")
+    '("defunct" "ATK_STATE_DEFUNCT")
+    '("editable" "ATK_STATE_EDITABLE")
+    '("enabled" "ATK_STATE_ENABLED")
+    '("expandable" "ATK_STATE_EXPANDABLE")
+    '("expanded" "ATK_STATE_EXPANDED")
+    '("focusable" "ATK_STATE_FOCUSABLE")
+    '("focused" "ATK_STATE_FOCUSED")
+    '("horizontal" "ATK_STATE_HORIZONTAL")
+    '("iconified" "ATK_STATE_ICONIFIED")
+    '("modal" "ATK_STATE_MODAL")
+    '("multi-line" "ATK_STATE_MULTI_LINE")
+    '("multiselectable" "ATK_STATE_MULTISELECTABLE")
+    '("opaque" "ATK_STATE_OPAQUE")
+    '("pressed" "ATK_STATE_PRESSED")
+    '("resizable" "ATK_STATE_RESIZABLE")
+    '("selectable" "ATK_STATE_SELECTABLE")
+    '("selected" "ATK_STATE_SELECTED")
+    '("sensitive" "ATK_STATE_SENSITIVE")
+    '("showing" "ATK_STATE_SHOWING")
+    '("single-line" "ATK_STATE_SINGLE_LINE")
+    '("stale" "ATK_STATE_STALE")
+    '("transient" "ATK_STATE_TRANSIENT")
+    '("vertical" "ATK_STATE_VERTICAL")
+    '("visible" "ATK_STATE_VISIBLE")
+    '("last-defined" "ATK_STATE_LAST_DEFINED")
+  )
+)
+
diff --git a/src/defs/AtkStreamableContent.defs b/src/defs/AtkStreamableContent.defs
new file mode 100644
index 0000000..f34c210
--- /dev/null
+++ b/src/defs/AtkStreamableContent.defs
@@ -0,0 +1,69 @@
+(define-interface StreamableContent
+  (in-module "Atk")
+  (c-name "AtkStreamableContent")
+  (gtype-id "ATK_TYPE_STREAMABLE_CONTENT")
+)
+
+(define-method get_n_mime_types
+  (of-object "AtkStreamableContent")
+  (c-name "atk_streamable_content_get_n_mime_types")
+  (return-type "gint")
+)
+
+(define-method get_mime_type
+  (of-object "AtkStreamableContent")
+  (c-name "atk_streamable_content_get_mime_type")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-method get_stream
+  (of-object "AtkStreamableContent")
+  (c-name "atk_streamable_content_get_stream")
+  (return-type "GIOChannel*")
+  (parameters
+    '("const-gchar*" "mime_type")
+  )
+)
+
+(define-method get_uri
+  (of-object "AtkStreamableContent")
+  (c-name "atk_streamable_content_get_uri")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-gchar*" "mime_type")
+  )
+)
+
+(define-virtual get_n_mime_types
+  (of-object "AtkStreamableContent")
+  (return-type "gint")
+)
+
+(define-virtual get_mime_type
+  (of-object "AtkStreamableContent")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "i")
+  )
+)
+
+(define-virtual get_stream
+  (of-object "AtkStreamableContent")
+  (return-type "GIOChannel*")
+  (parameters
+    '("const-gchar*" "mime_type")
+  )
+)
+
+(define-virtual get_uri
+  (of-object "AtkStreamableContent")
+  (return-type "G_CONST_RETURNgchar*")
+  (parameters
+    '("const-gchar*" "mime_type")
+  )
+)
+
diff --git a/src/defs/AtkTable.defs b/src/defs/AtkTable.defs
new file mode 100644
index 0000000..34faed9
--- /dev/null
+++ b/src/defs/AtkTable.defs
@@ -0,0 +1,544 @@
+(define-interface Table
+  (in-module "Atk")
+  (c-name "AtkTable")
+  (gtype-id "ATK_TYPE_TABLE")
+)
+
+(define-method ref_at
+  (of-object "AtkTable")
+  (c-name "atk_table_ref_at")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-method get_index_at
+  (of-object "AtkTable")
+  (c-name "atk_table_get_index_at")
+  (return-type "gint")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-method get_column_at_index
+  (of-object "AtkTable")
+  (c-name "atk_table_get_column_at_index")
+  (return-type "gint")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method get_row_at_index
+  (of-object "AtkTable")
+  (c-name "atk_table_get_row_at_index")
+  (return-type "gint")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method get_n_columns
+  (of-object "AtkTable")
+  (c-name "atk_table_get_n_columns")
+  (return-type "gint")
+)
+
+(define-method get_n_rows
+  (of-object "AtkTable")
+  (c-name "atk_table_get_n_rows")
+  (return-type "gint")
+)
+
+(define-method get_column_extent_at
+  (of-object "AtkTable")
+  (c-name "atk_table_get_column_extent_at")
+  (return-type "gint")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-method get_row_extent_at
+  (of-object "AtkTable")
+  (c-name "atk_table_get_row_extent_at")
+  (return-type "gint")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-method get_caption
+  (of-object "AtkTable")
+  (c-name "atk_table_get_caption")
+  (return-type "AtkObject*")
+)
+
+(define-method get_column_description
+  (of-object "AtkTable")
+  (c-name "atk_table_get_column_description")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_column_header
+  (of-object "AtkTable")
+  (c-name "atk_table_get_column_header")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_row_description
+  (of-object "AtkTable")
+  (c-name "atk_table_get_row_description")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-method get_row_header
+  (of-object "AtkTable")
+  (c-name "atk_table_get_row_header")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-method get_summary
+  (of-object "AtkTable")
+  (c-name "atk_table_get_summary")
+  (return-type "AtkObject*")
+)
+
+(define-method set_caption
+  (of-object "AtkTable")
+  (c-name "atk_table_set_caption")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "caption")
+  )
+)
+
+(define-method set_column_description
+  (of-object "AtkTable")
+  (c-name "atk_table_set_column_description")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+    '("const-gchar*" "description")
+  )
+)
+
+(define-method set_column_header
+  (of-object "AtkTable")
+  (c-name "atk_table_set_column_header")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+    '("AtkObject*" "header")
+  )
+)
+
+(define-method set_row_description
+  (of-object "AtkTable")
+  (c-name "atk_table_set_row_description")
+  (return-type "none")
+  (parameters
+    '("gint" "row")
+    '("const-gchar*" "description")
+  )
+)
+
+(define-method set_row_header
+  (of-object "AtkTable")
+  (c-name "atk_table_set_row_header")
+  (return-type "none")
+  (parameters
+    '("gint" "row")
+    '("AtkObject*" "header")
+  )
+)
+
+(define-method set_summary
+  (of-object "AtkTable")
+  (c-name "atk_table_set_summary")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "accessible")
+  )
+)
+
+(define-method get_selected_columns
+  (of-object "AtkTable")
+  (c-name "atk_table_get_selected_columns")
+  (return-type "gint")
+  (parameters
+    '("gint**" "selected")
+  )
+)
+
+(define-method get_selected_rows
+  (of-object "AtkTable")
+  (c-name "atk_table_get_selected_rows")
+  (return-type "gint")
+  (parameters
+    '("gint**" "selected")
+  )
+)
+
+(define-method is_column_selected
+  (of-object "AtkTable")
+  (c-name "atk_table_is_column_selected")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method is_row_selected
+  (of-object "AtkTable")
+  (c-name "atk_table_is_row_selected")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-method is_selected
+  (of-object "AtkTable")
+  (c-name "atk_table_is_selected")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-method add_row_selection
+  (of-object "AtkTable")
+  (c-name "atk_table_add_row_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-method remove_row_selection
+  (of-object "AtkTable")
+  (c-name "atk_table_remove_row_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-method add_column_selection
+  (of-object "AtkTable")
+  (c-name "atk_table_add_column_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method remove_column_selection
+  (of-object "AtkTable")
+  (c-name "atk_table_remove_column_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-virtual ref_at
+  (of-object "AtkTable")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-virtual get_index_at
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-virtual get_column_at_index
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-virtual get_row_at_index
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-virtual get_n_columns
+  (of-object "AtkTable")
+  (return-type "gint")
+)
+
+(define-virtual get_n_rows
+  (of-object "AtkTable")
+  (return-type "gint")
+)
+
+(define-virtual get_column_extent_at
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-virtual get_row_extent_at
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-virtual get_caption
+  (of-object "AtkTable")
+  (return-type "AtkObject*")
+)
+
+(define-virtual get_column_description
+  (of-object "AtkTable")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-virtual get_column_header
+  (of-object "AtkTable")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-virtual get_row_description
+  (of-object "AtkTable")
+  (return-type "const-gchar*")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-virtual get_row_header
+  (of-object "AtkTable")
+  (return-type "AtkObject*")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-virtual get_summary
+  (of-object "AtkTable")
+  (return-type "AtkObject*")
+)
+
+(define-virtual set_caption
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "caption")
+  )
+)
+
+(define-virtual set_column_description
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+    '("const-gchar*" "description")
+  )
+)
+
+(define-virtual set_column_header
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+    '("AtkObject*" "header")
+  )
+)
+
+(define-virtual set_row_description
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "row")
+    '("const-gchar*" "description")
+  )
+)
+
+(define-virtual set_row_header
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "row")
+    '("AtkObject*" "header")
+  )
+)
+
+(define-virtual set_summary
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "accessible")
+  )
+)
+
+(define-virtual get_selected_columns
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint**" "selected")
+  )
+)
+
+(define-virtual get_selected_rows
+  (of-object "AtkTable")
+  (return-type "gint")
+  (parameters
+    '("gint**" "selected")
+  )
+)
+
+(define-virtual is_column_selected
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-virtual is_row_selected
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-virtual is_selected
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+    '("gint" "column")
+  )
+)
+
+(define-virtual add_row_selection
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-virtual remove_row_selection
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "row")
+  )
+)
+
+(define-virtual add_column_selection
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-virtual remove_column_selection
+  (of-object "AtkTable")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-virtual row_inserted
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "row")
+    '("gint" "num_inserted")
+  )
+)
+
+(define-virtual column_inserted
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+    '("gint" "num_inserted")
+  )
+)
+
+(define-virtual row_deleted
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "row")
+    '("gint" "num_deleted")
+  )
+)
+
+(define-virtual column_deleted
+  (of-object "AtkTable")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+    '("gint" "num_deleted")
+  )
+)
+
+(define-virtual row_reordered
+  (of-object "AtkTable")
+  (return-type "none")
+)
+
+(define-virtual column_reordered
+  (of-object "AtkTable")
+  (return-type "none")
+)
+
+(define-virtual model_changed
+  (of-object "AtkTable")
+  (return-type "none")
+)
+
diff --git a/src/defs/AtkText.defs b/src/defs/AtkText.defs
new file mode 100644
index 0000000..e8e7e98
--- /dev/null
+++ b/src/defs/AtkText.defs
@@ -0,0 +1,402 @@
+(define-interface Text
+  (in-module "Atk")
+  (c-name "AtkText")
+  (gtype-id "ATK_TYPE_TEXT")
+)
+
+(define-method get_text
+  (of-object "AtkText")
+  (c-name "atk_text_get_text")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-method get_character_at_offset
+  (of-object "AtkText")
+  (c-name "atk_text_get_character_at_offset")
+  (return-type "gunichar")
+  (parameters
+    '("gint" "offset")
+  )
+)
+
+(define-method get_text_after_offset
+  (of-object "AtkText")
+  (c-name "atk_text_get_text_after_offset")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "offset")
+    '("AtkTextBoundary" "boundary_type")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-method get_text_at_offset
+  (of-object "AtkText")
+  (c-name "atk_text_get_text_at_offset")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "offset")
+    '("AtkTextBoundary" "boundary_type")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-method get_text_before_offset
+  (of-object "AtkText")
+  (c-name "atk_text_get_text_before_offset")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "offset")
+    '("AtkTextBoundary" "boundary_type")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-method get_caret_offset
+  (of-object "AtkText")
+  (c-name "atk_text_get_caret_offset")
+  (return-type "gint")
+)
+
+(define-method get_character_extents
+  (of-object "AtkText")
+  (c-name "atk_text_get_character_extents")
+  (return-type "none")
+  (parameters
+    '("gint" "offset")
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gint*" "width")
+    '("gint*" "height")
+    '("AtkCoordType" "coords")
+  )
+)
+
+(define-method get_run_attributes
+  (of-object "AtkText")
+  (c-name "atk_text_get_run_attributes")
+  (return-type "AtkAttributeSet*")
+  (parameters
+    '("gint" "offset")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-method get_default_attributes
+  (of-object "AtkText")
+  (c-name "atk_text_get_default_attributes")
+  (return-type "AtkAttributeSet*")
+)
+
+(define-method get_character_count
+  (of-object "AtkText")
+  (c-name "atk_text_get_character_count")
+  (return-type "gint")
+)
+
+(define-method get_offset_at_point
+  (of-object "AtkText")
+  (c-name "atk_text_get_offset_at_point")
+  (return-type "gint")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coords")
+  )
+)
+
+(define-method get_n_selections
+  (of-object "AtkText")
+  (c-name "atk_text_get_n_selections")
+  (return-type "gint")
+)
+
+(define-method get_selection
+  (of-object "AtkText")
+  (c-name "atk_text_get_selection")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "selection_num")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-method add_selection
+  (of-object "AtkText")
+  (c-name "atk_text_add_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-method remove_selection
+  (of-object "AtkText")
+  (c-name "atk_text_remove_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "selection_num")
+  )
+)
+
+(define-method set_selection
+  (of-object "AtkText")
+  (c-name "atk_text_set_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "selection_num")
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-method set_caret_offset
+  (of-object "AtkText")
+  (c-name "atk_text_set_caret_offset")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "offset")
+  )
+)
+
+(define-method get_range_extents
+  (of-object "AtkText")
+  (c-name "atk_text_get_range_extents")
+  (return-type "none")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+    '("AtkCoordType" "coord_type")
+    '("AtkTextRectangle*" "rect")
+  )
+)
+
+(define-method get_bounded_ranges
+  (of-object "AtkText")
+  (c-name "atk_text_get_bounded_ranges")
+  (return-type "AtkTextRange**")
+  (parameters
+    '("AtkTextRectangle*" "rect")
+    '("AtkCoordType" "coord_type")
+    '("AtkTextClipType" "x_clip_type")
+    '("AtkTextClipType" "y_clip_type")
+  )
+)
+
+(define-virtual get_text
+  (of-object "AtkText")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-virtual get_text_after_offset
+  (of-object "AtkText")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "offset")
+    '("AtkTextBoundary" "boundary_type")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-virtual get_text_at_offset
+  (of-object "AtkText")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "offset")
+    '("AtkTextBoundary" "boundary_type")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-virtual get_character_at_offset
+  (of-object "AtkText")
+  (return-type "gunichar")
+  (parameters
+    '("gint" "offset")
+  )
+)
+
+(define-virtual get_text_before_offset
+  (of-object "AtkText")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "offset")
+    '("AtkTextBoundary" "boundary_type")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-virtual get_caret_offset
+  (of-object "AtkText")
+  (return-type "gint")
+)
+
+(define-virtual get_run_attributes
+  (of-object "AtkText")
+  (return-type "AtkAttributeSet*")
+  (parameters
+    '("gint" "offset")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-virtual get_default_attributes
+  (of-object "AtkText")
+  (return-type "AtkAttributeSet*")
+)
+
+(define-virtual get_character_extents
+  (of-object "AtkText")
+  (return-type "none")
+  (parameters
+    '("gint" "offset")
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gint*" "width")
+    '("gint*" "height")
+    '("AtkCoordType" "coords")
+  )
+)
+
+(define-virtual get_character_count
+  (of-object "AtkText")
+  (return-type "gint")
+)
+
+(define-virtual get_offset_at_point
+  (of-object "AtkText")
+  (return-type "gint")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("AtkCoordType" "coords")
+  )
+)
+
+(define-virtual get_n_selections
+  (of-object "AtkText")
+  (return-type "gint")
+)
+
+(define-virtual get_selection
+  (of-object "AtkText")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "selection_num")
+    '("gint*" "start_offset")
+    '("gint*" "end_offset")
+  )
+)
+
+(define-virtual add_selection
+  (of-object "AtkText")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-virtual remove_selection
+  (of-object "AtkText")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "selection_num")
+  )
+)
+
+(define-virtual set_selection
+  (of-object "AtkText")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "selection_num")
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-virtual set_caret_offset
+  (of-object "AtkText")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "offset")
+  )
+)
+
+(define-virtual text_changed
+  (of-object "AtkText")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+    '("gint" "length")
+  )
+)
+
+(define-virtual text_caret_moved
+  (of-object "AtkText")
+  (return-type "none")
+  (parameters
+    '("gint" "location")
+  )
+)
+
+(define-virtual text_selection_changed
+  (of-object "AtkText")
+  (return-type "none")
+)
+
+(define-virtual text_attributes_changed
+  (of-object "AtkText")
+  (return-type "none")
+)
+
+(define-virtual get_range_extents
+  (of-object "AtkText")
+  (return-type "none")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+    '("AtkCoordType" "coord_type")
+    '("AtkTextRectangle*" "rect")
+  )
+)
+
+(define-virtual get_bounded_ranges
+  (of-object "AtkText")
+  (return-type "AtkTextRange**")
+  (parameters
+    '("AtkTextRectangle*" "rect")
+    '("AtkCoordType" "coord_type")
+    '("AtkTextClipType" "x_clip_type")
+    '("AtkTextClipType" "y_clip_type")
+  )
+)
+
diff --git a/src/defs/AtkTextAttribute.defs b/src/defs/AtkTextAttribute.defs
new file mode 100644
index 0000000..28ae0bc
--- /dev/null
+++ b/src/defs/AtkTextAttribute.defs
@@ -0,0 +1,35 @@
+(define-enum TextAttribute
+  (in-module "Atk")
+  (c-name "AtkTextAttribute")
+  (gtype-id "ATK_TYPE_TEXT_ATTRIBUTE")
+  (values
+    '("left-margin" "ATK_TEXT_ATTR_LEFT_MARGIN")
+    '("right-margin" "ATK_TEXT_ATTR_RIGHT_MARGIN")
+    '("indent" "ATK_TEXT_ATTR_INDENT")
+    '("invisible" "ATK_TEXT_ATTR_INVISIBLE")
+    '("editable" "ATK_TEXT_ATTR_EDITABLE")
+    '("pixels-above-lines" "ATK_TEXT_ATTR_PIXELS_ABOVE_LINES")
+    '("pixels-below-lines" "ATK_TEXT_ATTR_PIXELS_BELOW_LINES")
+    '("pixels-inside-wrap" "ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP")
+    '("bg-full-height" "ATK_TEXT_ATTR_BG_FULL_HEIGHT")
+    '("rise" "ATK_TEXT_ATTR_RISE")
+    '("underline" "ATK_TEXT_ATTR_UNDERLINE")
+    '("strikethrough" "ATK_TEXT_ATTR_STRIKETHROUGH")
+    '("size" "ATK_TEXT_ATTR_SIZE")
+    '("scale" "ATK_TEXT_ATTR_SCALE")
+    '("weight" "ATK_TEXT_ATTR_WEIGHT")
+    '("language" "ATK_TEXT_ATTR_LANGUAGE")
+    '("family-name" "ATK_TEXT_ATTR_FAMILY_NAME")
+    '("bg-color" "ATK_TEXT_ATTR_BG_COLOR")
+    '("fg-color" "ATK_TEXT_ATTR_FG_COLOR")
+    '("bg-stipple" "ATK_TEXT_ATTR_BG_STIPPLE")
+    '("fg-stipple" "ATK_TEXT_ATTR_FG_STIPPLE")
+    '("wrap-mode" "ATK_TEXT_ATTR_WRAP_MODE")
+    '("direction" "ATK_TEXT_ATTR_DIRECTION")
+    '("justification" "ATK_TEXT_ATTR_JUSTIFICATION")
+    '("stretch" "ATK_TEXT_ATTR_STRETCH")
+    '("variant" "ATK_TEXT_ATTR_VARIANT")
+    '("style" "ATK_TEXT_ATTR_STYLE")
+  )
+)
+
diff --git a/src/defs/AtkTextBoundary.defs b/src/defs/AtkTextBoundary.defs
new file mode 100644
index 0000000..f074c33
--- /dev/null
+++ b/src/defs/AtkTextBoundary.defs
@@ -0,0 +1,15 @@
+(define-enum TextBoundary
+  (in-module "Atk")
+  (c-name "AtkTextBoundary")
+  (gtype-id "ATK_TYPE_TEXT_BOUNDARY")
+  (values
+    '("char" "ATK_TEXT_BOUNDARY_CHAR")
+    '("word-start" "ATK_TEXT_BOUNDARY_WORD_START")
+    '("word-end" "ATK_TEXT_BOUNDARY_WORD_END")
+    '("sentence-start" "ATK_TEXT_BOUNDARY_SENTENCE_START")
+    '("sentence-end" "ATK_TEXT_BOUNDARY_SENTENCE_END")
+    '("line-start" "ATK_TEXT_BOUNDARY_LINE_START")
+    '("line-end" "ATK_TEXT_BOUNDARY_LINE_END")
+  )
+)
+
diff --git a/src/defs/AtkTextClipType.defs b/src/defs/AtkTextClipType.defs
new file mode 100644
index 0000000..a8e509a
--- /dev/null
+++ b/src/defs/AtkTextClipType.defs
@@ -0,0 +1,12 @@
+(define-enum TextClipType
+  (in-module "Atk")
+  (c-name "AtkTextClipType")
+  (gtype-id "ATK_TYPE_TEXT_CLIP_TYPE")
+  (values
+    '("none" "ATK_TEXT_CLIP_NONE")
+    '("min" "ATK_TEXT_CLIP_MIN")
+    '("max" "ATK_TEXT_CLIP_MAX")
+    '("both" "ATK_TEXT_CLIP_BOTH")
+  )
+)
+
diff --git a/src/defs/AtkTextRange.defs b/src/defs/AtkTextRange.defs
new file mode 100644
index 0000000..573b8d4
--- /dev/null
+++ b/src/defs/AtkTextRange.defs
@@ -0,0 +1,10 @@
+(define-boxed TextRange
+  (in-module "Atk")
+  (c-name "AtkTextRange")
+  (fields
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+    '("gchar*" "content")
+  )
+)
+
diff --git a/src/defs/AtkTextRectangle.defs b/src/defs/AtkTextRectangle.defs
new file mode 100644
index 0000000..d85f4b5
--- /dev/null
+++ b/src/defs/AtkTextRectangle.defs
@@ -0,0 +1,11 @@
+(define-boxed TextRectangle
+  (in-module "Atk")
+  (c-name "AtkTextRectangle")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
diff --git a/src/defs/AtkUtil.defs b/src/defs/AtkUtil.defs
new file mode 100644
index 0000000..448e269
--- /dev/null
+++ b/src/defs/AtkUtil.defs
@@ -0,0 +1,33 @@
+(define-object Util
+  (in-module "Atk")
+  (parent "GObject")
+  (c-name "AtkUtil")
+  (gtype-id "ATK_TYPE_UTIL")
+)
+
+(define-virtual add_global_event_listener
+  (of-object "AtkUtil")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "event_type")
+  )
+)
+
+(define-virtual remove_global_event_listener
+  (of-object "AtkUtil")
+  (return-type "none")
+)
+
+(define-virtual add_key_event_listener
+  (of-object "AtkUtil")
+  (return-type "guint")
+  (parameters
+    '("gpointer" "data")
+  )
+)
+
+(define-virtual remove_key_event_listener
+  (of-object "AtkUtil")
+  (return-type "none")
+)
+
diff --git a/src/defs/AtkValue.defs b/src/defs/AtkValue.defs
new file mode 100644
index 0000000..136a04c
--- /dev/null
+++ b/src/defs/AtkValue.defs
@@ -0,0 +1,91 @@
+(define-interface Value
+  (in-module "Atk")
+  (c-name "AtkValue")
+  (gtype-id "ATK_TYPE_VALUE")
+)
+
+(define-method get_current_value
+  (of-object "AtkValue")
+  (c-name "atk_value_get_current_value")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-method get_maximum_value
+  (of-object "AtkValue")
+  (c-name "atk_value_get_maximum_value")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-method get_minimum_value
+  (of-object "AtkValue")
+  (c-name "atk_value_get_minimum_value")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-method set_current_value
+  (of-object "AtkValue")
+  (c-name "atk_value_set_current_value")
+  (return-type "gboolean")
+  (parameters
+    '("const-GValue*" "value")
+  )
+)
+
+(define-method get_minimum_increment
+  (of-object "AtkValue")
+  (c-name "atk_value_get_minimum_increment")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-virtual get_current_value
+  (of-object "AtkValue")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-virtual get_maximum_value
+  (of-object "AtkValue")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-virtual get_minimum_value
+  (of-object "AtkValue")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
+(define-virtual set_current_value
+  (of-object "AtkValue")
+  (return-type "gboolean")
+  (parameters
+    '("const-GValue*" "value")
+  )
+)
+
+(define-virtual get_minimum_increment
+  (of-object "AtkValue")
+  (return-type "none")
+  (parameters
+    '("GValue*" "value")
+  )
+)
+
diff --git a/src/defs/CairoAntialias.defs b/src/defs/CairoAntialias.defs
new file mode 100644
index 0000000..d2702b4
--- /dev/null
+++ b/src/defs/CairoAntialias.defs
@@ -0,0 +1,10 @@
+(define-enum Antialias
+  (in-module "Cairo")
+  (c-name "cairo_antialias_t")
+  (values
+    '("default" "CAIRO_ANTIALIAS_DEFAULT")
+    '("none" "CAIRO_ANTIALIAS_NONE")
+    '("gray" "CAIRO_ANTIALIAS_GRAY")
+    '("subpixel" "CAIRO_ANTIALIAS_SUBPIXEL")
+  )
+)
diff --git a/src/defs/CairoContent.defs b/src/defs/CairoContent.defs
new file mode 100644
index 0000000..1c39018
--- /dev/null
+++ b/src/defs/CairoContent.defs
@@ -0,0 +1,10 @@
+(define-flags Content
+  (in-module "Cairo")
+  (c-name "cairo_content_t")
+  (values
+    '("color" "CAIRO_CONTENT_COLOR")
+    '("alpha" "CAIRO_CONTENT_ALPHA")
+    '("color_alpha" "CAIRO_CONTENT_COLOR_ALPHA")
+  )
+)
+
diff --git a/src/defs/CairoContext.defs b/src/defs/CairoContext.defs
new file mode 100644
index 0000000..1b8ae48
--- /dev/null
+++ b/src/defs/CairoContext.defs
@@ -0,0 +1,432 @@
+(define-entity Context
+  (in-module "Cairo")
+  (c-name "cairo_t")
+  (import-header "librsvg/rsvg.h")
+  (import-header "librsvg/rsvg-cairo.h")
+)
+
+;; the block name is contrived to match the pattern used in GTK so that
+;; mungeConstructorName() doesn't choke on it when called by
+;; ConstructorGenerator. This could probably be fixed, but whatever. It's the
+;; c-name that matters, and that's correct.
+
+(define-function cairo_context_new
+  (is-constructor-of "cairo_t")
+  (c-name "cairo_create")
+  (caller-owns-return #t)
+  (return-type "cairo_t*")
+  (parameters
+    '("cairo_surface_t*" "target")
+  )
+)
+
+(define-method destroy
+  (of-object "cairo_t")
+  (c-name "cairo_destroy")
+  (return-type "none")
+)
+
+(define-method save
+  (of-object "cairo_t")
+  (c-name "cairo_save")
+  (return-type "none")
+)
+
+(define-method restore
+  (of-object "cairo_t")
+  (c-name "cairo_restore")
+  (return-type "none")
+)
+
+(define-method clip
+  (of-object "cairo_t")
+  (c-name "cairo_clip")
+  (return-type "none")
+)
+
+(define-method clip_preserve
+  (of-object "cairo_t")
+  (c-name "cairo_clip_preserve")
+  (return-type "none")
+)
+
+(define-method stroke
+  (of-object "cairo_t")
+  (c-name "cairo_stroke")
+  (return-type "none")
+)
+
+(define-method stroke_preserve
+  (of-object "cairo_t")
+  (c-name "cairo_stroke_preserve")
+  (return-type "none")
+)
+
+(define-method rotate
+  (of-object "cairo_t")
+  (c-name "cairo_rotate")
+  (return-type "none")
+  (parameters
+    '("double" "rad")
+  )
+)
+
+(define-method translate
+  (of-object "cairo_t")
+  (c-name "cairo_translate")
+  (return-type "none")
+  (parameters
+    '("double" "tx")
+    '("double" "ty")
+  )
+)
+
+(define-method scale
+  (of-object "cairo_t")
+  (c-name "cairo_scale")
+  (return-type "none")
+  (parameters
+    '("double" "sx")
+    '("double" "sy")
+  )
+)
+
+(define-method set_source_rgb
+  (of-object "cairo_t")
+  (c-name "cairo_set_source_rgb")
+  (return-type "none")
+  (parameters
+    '("double" "red")
+    '("double" "green")
+    '("double" "blue")
+  )
+)
+
+(define-method set_source_rgba
+  (of-object "cairo_t")
+  (c-name "cairo_set_source_rgba")
+  (return-type "none")
+  (parameters
+    '("double" "red")
+    '("double" "green")
+    '("double" "blue")
+    '("double" "alpha")
+  )
+)
+
+(define-method line_to
+  (of-object "cairo_t")
+  (c-name "cairo_line_to")
+  (return-type "none")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method rel_line_to
+  (of-object "cairo_t")
+  (c-name "cairo_rel_line_to")
+  (return-type "none")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method set_line_width
+  (of-object "cairo_t")
+  (c-name "cairo_set_line_width")
+  (return-type "none")
+  (parameters
+    '("double" "width")
+  )
+)
+
+(define-method get_line_width
+  (of-object "cairo_t")
+  (c-name "cairo_get_line_width")
+  (return-type "double")
+)
+
+(define-method set_antialias
+  (of-object "cairo_t")
+  (c-name "cairo_set_antialias")
+  (return-type "none")
+  (parameters
+    '("cairo_antialias_t" "antialias")
+  )
+)
+
+(define-method move_to
+  (of-object "cairo_t")
+  (c-name "cairo_move_to")
+  (return-type "none")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method rel_move_to
+  (of-object "cairo_t")
+  (c-name "cairo_rel_move_to")
+  (return-type "none")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method rectangle
+  (of-object "cairo_t")
+  (c-name "cairo_rectangle")
+  (return-type "none")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+    '("double" "width")
+    '("double" "height")
+  )
+)
+
+(define-method arc
+  (of-object "cairo_t")
+  (c-name "cairo_arc")
+  (return-type "none")
+  (parameters
+    '("double" "xc")
+    '("double" "yc")
+    '("double" "radius")
+    '("double" "angle1")
+    '("double" "angle2")
+  )
+)
+
+(define-method arc_negative
+  (of-object "cairo_t")
+  (c-name "cairo_arc_negative")
+  (return-type "none")
+  (parameters
+    '("double" "xc")
+    '("double" "yc")
+    '("double" "radius")
+    '("double" "angle1")
+    '("double" "angle2")
+  )
+)
+
+(define-method fill
+  (of-object "cairo_t")
+  (c-name "cairo_fill")
+  (return-type "none")
+)
+
+(define-method fill_preserve
+  (of-object "cairo_t")
+  (c-name "cairo_fill_preserve")
+  (return-type "none")
+)
+
+(define-method show_layout
+  (of-object "cairo_t")
+  (c-name "pango_cairo_show_layout")
+  (return-type "none")
+  (parameters
+    '("PangoLayout*" "layout")
+  )
+)
+
+(define-method update_layout
+  (of-object "cairo_t")
+  (c-name "pango_cairo_update_layout")
+  (return-type "none")
+  (parameters
+    '("PangoLayout*" "layout")
+  )
+)
+
+(define-method show_layout_line
+  (of-object "cairo_t")
+  (c-name "pango_cairo_show_layout_line")
+  (return-type "none")
+  (parameters
+    '("PangoLayoutLine*" "line")
+  )
+)
+
+(define-method get_source
+  (of-object "cairo_t")
+  (c-name "cairo_get_source")
+  (return-type "cairo_pattern_t*")
+  (caller-owns-return #f)
+)
+
+(define-method status
+  (of-object "cairo_t")
+  (c-name "cairo_status")
+  (return-type "cairo_status_t")
+)
+
+(define-method get_target
+  (of-object "cairo_t")
+  (c-name "cairo_get_target")
+  (return-type "cairo_surface_t*")
+)
+
+(define-method set_operator
+  (of-object "cairo_t")
+  (c-name "cairo_set_operator")
+  (return-type "none")
+  (parameters
+    '("cairo_operator_t" "op")
+  )
+)
+
+(define-method paint
+  (of-object "cairo_t")
+  (c-name "cairo_paint")
+  (return-type "none")
+)
+
+(define-method paint_with_alpha
+  (of-object "cairo_t")
+  (c-name "cairo_paint_with_alpha")
+  (return-type "none")
+  (parameters
+    '("double" "alpha")
+  )
+)
+
+(define-method set_source
+  (of-object "cairo_t")
+  (c-name "cairo_set_source")
+  (return-type "none")
+  (parameters
+    '("cairo_pattern_t*" "pattern")
+  )
+)
+
+(define-method mask
+  (of-object "cairo_t")
+  (c-name "cairo_mask")
+  (return-type "none")
+  (parameters
+    '("cairo_pattern_t*" "pattern")
+  )
+)
+
+(define-method mask_surface
+  (of-object "cairo_t")
+  (c-name "cairo_mask_surface")
+  (return-type "none")
+  (parameters
+    '("cairo_surface_t*" "surface")
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method set_source_surface
+  (of-object "cairo_t")
+  (c-name "cairo_set_source_surface")
+  (return-type "none")
+  (parameters
+    '("cairo_surface_t*" "surface")
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method get_current_point
+  (of-object "cairo_t")
+  (c-name "cairo_get_current_point")
+  (return-type "none")
+  (parameters
+    '("double*" "x")
+    '("double*" "y")
+  )
+)
+
+;; strictly, this belongs in CairoStatus.defs, but functions don't go in
+;; Enum blocks.
+
+(define-function status_to_string
+  (of-object "cairo_t")
+  (c-name "cairo_status_to_string")
+  (return-type "const-char*")
+  (parameters
+    '("cairo_status_t" "status")
+  )
+)
+
+(define-method transform
+  (of-object "cairo_t")
+  (c-name "cairo_transform")
+  (return-type "none")
+  (parameters
+    '("cairo_matrix_t*" "matrix")
+  )
+)
+
+(define-method set_dash
+  (of-object "cairo_t")
+  (c-name "cairo_set_dash")
+  (return-type "none")
+  (parameters
+    '("const-double*" "dashes")
+    '("int" "num_dashes")
+    '("double" "offset")
+  )
+)
+
+(define-function show_handle
+  (of-object "cairo_t")
+  (c-name "rsvg_handle_render_cairo")
+  (return-type "none")
+  (parameters
+    '("RsvgHandle*" "handle")
+    '("cairo_t*" "cr")
+  )
+)
+
+(define-method close_path
+  (of-object "cairo_t")
+  (c-name "cairo_close_path")
+  (return-type "none")
+)
+
+(define-method new_sub_path
+  (of-object "cairo_t")
+  (c-name "cairo_new_sub_path")
+  (return-type "none")
+)
+
+(define-method in_fill
+  (of-object "cairo_t")
+  (c-name "cairo_in_fill")
+  (return-type "cairo_bool_t")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method in_stroke
+  (of-object "cairo_t")
+  (c-name "cairo_in_stroke")
+  (return-type "cairo_bool_t")
+  (parameters
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method set_fill_rule
+  (of-object "cairo_t")
+  (c-name "cairo_set_fill_rule")
+  (return-type "none")
+  (parameters
+    '("cairo_fill_rule_t" "fill_rule")
+  )
+)
diff --git a/src/defs/CairoExtend.defs b/src/defs/CairoExtend.defs
new file mode 100644
index 0000000..e51599a
--- /dev/null
+++ b/src/defs/CairoExtend.defs
@@ -0,0 +1,11 @@
+(define-enum Extend
+  (in-module "Cairo")
+  (c-name "cairo_extend_t")
+  (values
+    '("NONE" "CAIRO_EXTEND_NONE")
+    '("REPEAT" "CAIRO_EXTEND_REPEAT")
+    '("REFLECT" "CAIRO_EXTEND_REFLECT")
+    '("PAD" "CAIRO_EXTEND_PAD")
+  )
+)
+
diff --git a/src/defs/CairoFillRule.defs b/src/defs/CairoFillRule.defs
new file mode 100644
index 0000000..948b9e4
--- /dev/null
+++ b/src/defs/CairoFillRule.defs
@@ -0,0 +1,9 @@
+(define-enum FillRule
+  (in-module "Cairo")
+  (c-name "cairo_fill_rule_t")
+  (values
+    '("WINDING" "CAIRO_FILL_RULE_WINDING")
+    '("EVEN_ODD" "CAIRO_FILL_RULE_EVEN_ODD")
+  )
+)
+
diff --git a/src/defs/CairoFilter.defs b/src/defs/CairoFilter.defs
new file mode 100644
index 0000000..8ab5bc5
--- /dev/null
+++ b/src/defs/CairoFilter.defs
@@ -0,0 +1,12 @@
+(define-enum Filter
+  (in-module "Cairo")
+  (c-name "cairo_filter_t")
+  (values
+    '("FAST" "CAIRO_FILTER_FAST")
+    '("GOOD" "CAIRO_FILTER_GOOD")
+    '("BEST" "CAIRO_FILTER_BEST")
+    '("NEAREST" "CAIRO_FILTER_NEAREST")
+    '("BILINEAR" "CAIRO_FILTER_BILINEAR")
+    '("GAUSSIAN" "CAIRO_FILTER_GAUSSIAN")
+  )
+)
diff --git a/src/defs/CairoFontOptions.defs b/src/defs/CairoFontOptions.defs
new file mode 100644
index 0000000..74a5402
--- /dev/null
+++ b/src/defs/CairoFontOptions.defs
@@ -0,0 +1,41 @@
+(define-entity FontOptions
+  (in-module "Cairo")
+  (c-name "cairo_font_options_t")
+)
+
+(define-function cairo_font_options_new
+  (is-constructor-of "cairo_font_options_t")
+  (c-name "cairo_font_options_create")
+  (caller-owns-return #t)
+  (return-type "cairo_font_options_t*")
+)
+
+(define-method destroy
+  (of-object "cairo_font_options_t")
+  (c-name "cairo_font_options_destroy")
+  (return-type "none")
+)
+
+(define-method status
+  (of-object "cairo_font_options_t")
+  (c-name "cairo_font_options_status")
+  (return-type "cairo_status_t")
+)
+
+(define-method set_hint_metrics
+  (of-object "cairo_font_options_t")
+  (c-name "cairo_font_options_set_hint_metrics")
+  (return-type "none")
+  (parameters
+    '("cairo_hint_metrics_t" "hint_metrics")
+  )
+)
+
+(define-method set_hint_style
+  (of-object "cairo_font_options_t")
+  (c-name "cairo_font_options_set_hint_style")
+  (return-type "none")
+  (parameters
+    '("cairo_hint_style_t" "hint_style")
+  )
+)
diff --git a/src/defs/CairoFormat.defs b/src/defs/CairoFormat.defs
new file mode 100644
index 0000000..0e09964
--- /dev/null
+++ b/src/defs/CairoFormat.defs
@@ -0,0 +1,12 @@
+(define-enum Format
+  (in-module "Cairo")
+  (c-name "cairo_format_t")
+  (values
+    '("ARGB32" "CAIRO_FORMAT_ARGB32")
+    '("RGB24" "CAIRO_FORMAT_RGB24")
+    '("A8" "CAIRO_FORMAT_A8")
+    '("A1" "CAIRO_FORMAT_A1")
+    '("removed" "CAIRO_FORMAT_RGB16_565")
+  )
+)
+
diff --git a/src/defs/CairoHintMetrics.defs b/src/defs/CairoHintMetrics.defs
new file mode 100644
index 0000000..1b7fef4
--- /dev/null
+++ b/src/defs/CairoHintMetrics.defs
@@ -0,0 +1,10 @@
+(define-enum HintMetrics
+  (in-module "Cairo")
+  (c-name "cairo_hint_metrics_t")
+  (values
+    '("DEFAULT" "CAIRO_HINT_METRICS_DEFAULT")
+    '("OFF" "CAIRO_HINT_METRICS_OFF")
+    '("ON" "CAIRO_HINT_METRICS_ON")
+  )
+)
+
diff --git a/src/defs/CairoHintStyle.defs b/src/defs/CairoHintStyle.defs
new file mode 100644
index 0000000..5a80e46
--- /dev/null
+++ b/src/defs/CairoHintStyle.defs
@@ -0,0 +1,12 @@
+(define-enum HintStyle
+  (in-module "Cairo")
+  (c-name "cairo_hint_style_t")
+  (values
+    '("DEFAULT" "CAIRO_HINT_STYLE_DEFAULT")
+    '("NONE" "CAIRO_HINT_STYLE_NONE")
+    '("SLIGHT" "CAIRO_HINT_STYLE_SLIGHT")
+    '("MEDIUM" "CAIRO_HINT_STYLE_MEDIUM")
+    '("FULL" "CAIRO_HINT_STYLE_FULL")
+  )
+)
+
diff --git a/src/defs/CairoMatrix.defs b/src/defs/CairoMatrix.defs
new file mode 100644
index 0000000..f9e8fdb
--- /dev/null
+++ b/src/defs/CairoMatrix.defs
@@ -0,0 +1,33 @@
+(define-entity Matrix
+  (in-module "Cairo")
+  (c-name "cairo_matrix_t")
+)
+
+(define-method rotate
+  (of-object "cairo_matrix_t")
+  (c-name "cairo_matrix_rotate")
+  (return-type "none")
+  (parameters
+    '("double" "angle")
+  )
+)
+
+(define-method translate
+  (of-object "cairo_matrix_t")
+  (c-name "cairo_matrix_translate")
+  (return-type "none")
+  (parameters
+    '("double" "tx")
+    '("double" "ty")
+  )
+)
+
+(define-method scale
+  (of-object "cairo_matrix_t")
+  (c-name "cairo_matrix_scale")
+  (return-type "none")
+  (parameters
+    '("double" "sx")
+    '("double" "sy")
+  )
+)
diff --git a/src/defs/CairoOperator.defs b/src/defs/CairoOperator.defs
new file mode 100644
index 0000000..d36b234
--- /dev/null
+++ b/src/defs/CairoOperator.defs
@@ -0,0 +1,21 @@
+(define-enum Operator
+  (in-module "Cairo")
+  (c-name "cairo_operator_t")
+  (values
+    '("clear" "CAIRO_OPERATOR_CLEAR")
+    '("source" "CAIRO_OPERATOR_SOURCE")
+    '("over" "CAIRO_OPERATOR_OVER")
+    '("in" "CAIRO_OPERATOR_IN")
+    '("out" "CAIRO_OPERATOR_OUT")
+    '("atop" "CAIRO_OPERATOR_ATOP")
+    '("dest" "CAIRO_OPERATOR_DEST")
+    '("dest_over" "CAIRO_OPERATOR_DEST_OVER")
+    '("dest_in" "CAIRO_OPERATOR_DEST_IN")
+    '("dest_out" "CAIRO_OPERATOR_DEST_OUT")
+    '("dest_atop" "CAIRO_OPERATOR_DEST_ATOP")
+    '("xor" "CAIRO_OPERATOR_XOR")
+    '("add" "CAIRO_OPERATOR_ADD")
+    '("saturate" "CAIRO_OPERATOR_SATURATE")
+  )
+)
+
diff --git a/src/defs/CairoPattern.defs b/src/defs/CairoPattern.defs
new file mode 100644
index 0000000..4027988
--- /dev/null
+++ b/src/defs/CairoPattern.defs
@@ -0,0 +1,124 @@
+(define-entity Pattern
+  (in-module "Cairo")
+  (c-name "cairo_pattern_t")
+)
+
+(define-method destroy
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_destroy")
+  (return-type "none")
+)
+
+(define-method reference
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_reference")
+  (return-type "cairo_pattern_t*")
+  (caller-owns-return #t)
+)
+
+;; Have to munge the name of this function so it comes out as
+;; createForSurface() in the generated translation layer.
+
+(define-function cairo_pattern_new_for_surface
+  (of-object "cairo_pattern_t")
+  (is-constructor-of "cairo_t")
+  (caller-owns-return #t)
+  (c-name "cairo_pattern_create_for_surface")
+  (return-type "cairo_pattern_t*")
+  (parameters
+    '("cairo_surface_t*" "surface")
+  )
+)
+
+(define-function cairo_pattern_new_rgba
+  (of-object "cairo_pattern_t")
+  (is-constructor-of "cairo_t")
+  (caller-owns-return #t)
+  (c-name "cairo_pattern_create_rgba")
+  (return-type "cairo_pattern_t*")
+  (parameters
+    '("double" "red")
+    '("double" "green")
+    '("double" "blue")
+    '("double" "alpha")
+  )
+)
+
+(define-function cairo_pattern_new_linear
+  (of-object "cairo_pattern_t")
+  (is-constructor-of "cairo_t")
+  (caller-owns-return #t)
+  (c-name "cairo_pattern_create_linear")
+  (return-type "cairo_pattern_t*")
+  (parameters
+    '("double" "x0")
+    '("double" "y0")
+    '("double" "x1")
+    '("double" "y1")
+  )
+)
+
+(define-function cairo_pattern_new_radial
+  (of-object "cairo_pattern_t")
+  (is-constructor-of "cairo_t")
+  (caller-owns-return #t)
+  (c-name "cairo_pattern_create_radial")
+  (return-type "cairo_pattern_t*")
+  (parameters
+    '("double" "cx0")
+    '("double" "cy0")
+    '("double" "radius0")
+    '("double" "cx1")
+    '("double" "cy1")
+    '("double" "radius1")
+  )
+)
+
+(define-method add_color_stop_rgb
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_add_color_stop_rgb")
+  (return-type "none")
+  (parameters
+    '("double" "offset")
+    '("double" "red")
+    '("double" "green")
+    '("double" "blue")
+  )
+)
+
+(define-method add_color_stop_rgba
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_add_color_stop_rgba")
+  (return-type "none")
+  (parameters
+    '("double" "offset")
+    '("double" "red")
+    '("double" "green")
+    '("double" "blue")
+    '("double" "alpha")
+  )
+)
+
+(define-method status
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_status")
+  (return-type "cairo_status_t")
+)
+
+(define-method set_extend
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_set_extend")
+  (return-type "none")
+  (parameters
+    '("cairo_extend_t" "extend")
+  )
+)
+
+(define-method set_filter
+  (of-object "cairo_pattern_t")
+  (c-name "cairo_pattern_set_filter")
+  (return-type "none")
+  (parameters
+    '("cairo_filter_t" "filter")
+  )
+)
diff --git a/src/defs/CairoStatus.defs b/src/defs/CairoStatus.defs
new file mode 100644
index 0000000..f9a2913
--- /dev/null
+++ b/src/defs/CairoStatus.defs
@@ -0,0 +1,29 @@
+(define-enum Status
+  (in-module "Cairo")
+  (c-name "cairo_status_t")
+  (values
+    '("success" "CAIRO_STATUS_SUCCESS")
+    '("no_memory" "CAIRO_STATUS_NO_MEMORY")
+    '("invalid_restore" "CAIRO_STATUS_INVALID_RESTORE")
+    '("invalid_pop_group" "CAIRO_STATUS_INVALID_POP_GROUP")
+    '("no_current_point" "CAIRO_STATUS_NO_CURRENT_POINT")
+    '("invalid_matrix" "CAIRO_STATUS_INVALID_MATRIX")
+    '("invalid_status" "CAIRO_STATUS_INVALID_STATUS")
+    '("null_pointer" "CAIRO_STATUS_NULL_POINTER")
+    '("invalid_string" "CAIRO_STATUS_INVALID_STRING")
+    '("invalid_path_data" "CAIRO_STATUS_INVALID_PATH_DATA")
+    '("read_error" "CAIRO_STATUS_READ_ERROR")
+    '("write_error" "CAIRO_STATUS_WRITE_ERROR")
+    '("surface_finished" "CAIRO_STATUS_SURFACE_FINISHED")
+    '("surface_type_mismatch" "CAIRO_STATUS_SURFACE_TYPE_MISMATCH")
+    '("pattern_type_mismatch" "CAIRO_STATUS_PATTERN_TYPE_MISMATCH")
+    '("invalid_content" "CAIRO_STATUS_INVALID_CONTENT")
+    '("invalid_format" "CAIRO_STATUS_INVALID_FORMAT")
+    '("invalid_visual" "CAIRO_STATUS_INVALID_VISUAL")
+    '("file_not_found" "CAIRO_STATUS_FILE_NOT_FOUND")
+    '("invalid_dash" "CAIRO_STATUS_INVALID_DASH")
+    '("invalid_dsc_comment" "CAIRO_STATUS_INVALID_DSC_COMMENT")
+    '("invalid_index" "CAIRO_STATUS_INVALID_INDEX")
+    '("clip_not_representable" "CAIRO_STATUS_CLIP_NOT_REPRESENTABLE")
+  )
+)
diff --git a/src/defs/CairoSurface.defs b/src/defs/CairoSurface.defs
new file mode 100644
index 0000000..159b121
--- /dev/null
+++ b/src/defs/CairoSurface.defs
@@ -0,0 +1,101 @@
+(define-entity Surface
+  (in-module "Cairo")
+  (c-name "cairo_surface_t")
+  (import-header "cairo-svg.h")
+  (import-header "cairo-pdf.h")
+)
+
+(define-method destroy
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_destroy")
+  (return-type "none")
+)
+
+(define-method flush
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_flush")
+  (return-type "none")
+)
+
+(define-method finish
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_finish")
+  (return-type "none")
+)
+
+(define-method write_to_png
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_write_to_png")
+  (return-type "cairo_status_t")
+  (parameters
+    '("const-char*" "filename")
+  )
+)
+
+(define-function create_similar
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_create_similar")
+  (caller-owns-return #t)
+  (return-type "cairo_surface_t*")
+  (parameters
+    '("cairo_surface_t*" "other")
+    '("cairo_content_t" "content")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-method status
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_status")
+  (return-type "cairo_status_t")
+)
+
+(define-function cairo_image_surface_new
+  (is-constructor-of "cairo_surface_t")
+  (c-name "cairo_image_surface_create")
+  (caller-owns-return #t)
+  (return-type "cairo_surface_t*")
+  (parameters
+    '("cairo_format_t" "format")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-function cairo_surface_new_svg
+  (is-constructor-of "cairo_surface_t")
+  (c-name "cairo_svg_surface_create")
+  (caller-owns-return #t)
+  (return-type "cairo_surface_t*")
+  (parameters
+    '("const-char*" "filename")
+    '("double" "width_in_points")
+    '("double" "height_in_points")
+  )
+)
+
+(define-function cairo_surface_new_pdf
+  (is-constructor-of "cairo_surface_t")
+  (c-name "cairo_pdf_surface_create")
+  (caller-owns-return #t)
+  (return-type "cairo_surface_t*")
+  (parameters
+    '("const-char*" "filename" (null-ok))
+    '("double" "width_in_points")
+    '("double" "height_in_points")
+  )
+)
+
+(define-method show_page
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_show_page")
+  (return-type "none")
+)
+
+(define-method copy_page
+  (of-object "cairo_surface_t")
+  (c-name "cairo_surface_copy_page")
+  (return-type "none")
+)
+
diff --git a/src/defs/EnchantBroker.defs b/src/defs/EnchantBroker.defs
new file mode 100644
index 0000000..3109127
--- /dev/null
+++ b/src/defs/EnchantBroker.defs
@@ -0,0 +1,56 @@
+;; hand written based on studying Enchant's src/enchant.h and src/enchant.c
+
+(define-entity Broker
+  (in-module "Enchant")
+  (c-name "EnchantBroker")
+  (import-header "enchant.h")
+)
+
+(define-function enchant_broker_new
+  (is-constructor-of "EnchantBroker")
+  (c-name "enchant_broker_init")
+  (return-type "EnchantBroker*")
+  (caller-owns-return #t)
+)
+
+(define-method free
+  (of-object "EnchantBroker")
+  (c-name "enchant_broker_free")
+  (return-type "none")
+)
+
+(define-method dict_exists
+  (of-object "EnchantBroker")
+  (c-name "enchant_broker_dict_exists")
+  (return-type "int")
+  (parameters
+    '("const-char*" "tag")
+  )
+)
+
+(define-method free_dict
+  (of-object "EnchantBroker")
+  (c-name "enchant_broker_free_dict")
+  (return-type "none")
+  (parameters
+    '("EnchantDict*" "dict")
+  )
+)
+
+(define-method request_dict
+  (of-object "EnchantBroker")
+  (c-name "enchant_broker_request_dict")
+  (return-type "EnchantDict*")
+  (parameters
+    '("const-char*" "tag")
+  )
+)
+
+(define-method request_pwl_dict
+  (of-object "EnchantBroker")
+  (c-name "enchant_broker_request_pwl_dict")
+  (return-type "EnchantDict*")
+  (parameters
+    '("const-char*" "pwl")
+  )
+)
diff --git a/src/defs/EnchantDict.defs b/src/defs/EnchantDict.defs
new file mode 100644
index 0000000..14ad771
--- /dev/null
+++ b/src/defs/EnchantDict.defs
@@ -0,0 +1,49 @@
+;; hand written based on studying Enchant's src/enchant.h and src/enchant.c
+
+(define-entity Dictionary
+  (in-module "Enchant")
+  (c-name "EnchantDict")
+  (import-header "enchant.h")
+)
+
+(define-method check
+  (of-object "EnchantDict")
+  (c-name "enchant_dict_check")
+  (return-type "int")
+  (parameters
+    '("const-char*" "word")
+    '("gssize" "len")
+  )
+)
+
+(define-method suggest
+  (of-object "EnchantDict")
+  (c-name "enchant_dict_suggest")
+  (return-type "char**")
+  (caller-owns-return #t)
+  (parameters
+    '("const-char*" "word")
+    '("gssize" "len")
+    '("gsize*" "out_n_suggs" (null-ok))
+  )
+)
+
+(define-method add
+  (of-object "EnchantDict")
+  (c-name "enchant_dict_add")
+  (return-type "none")
+  (parameters
+    '("const-char*" "word")
+    '("gssize" "len")
+  )
+)
+
+(define-method remove
+  (of-object "EnchantDict")
+  (c-name "enchant_dict_remove")
+  (return-type "none")
+  (parameters
+    '("const-char*" "word")
+    '("gssize" "len")
+  )
+)
diff --git a/src/defs/GApplication.defs b/src/defs/GApplication.defs
new file mode 100644
index 0000000..fe73e57
--- /dev/null
+++ b/src/defs/GApplication.defs
@@ -0,0 +1,140 @@
+(define-object Application
+  (in-module "Glib")
+  (parent "GObject")
+  (c-name "GApplication")
+  (gtype-id "G_TYPE_APPLICATION")
+)
+
+(define-function is_valid_id
+  (of-object "GApplication")
+  (c-name "g_application_id_is_valid")
+  (caller-owns-return #t)
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "application_id")
+  )
+)
+
+(define-function g_application_new
+  (is-constructor-of "GApplication")
+  (c-name "g_application_new")
+  (caller-owns-return #t)
+  (return-type "GApplication*")
+  (parameters
+    '("const-gchar*" "application_id")
+    '("GApplicationFlags" "flags")
+  )
+)
+
+(define-method get_application_id
+  (of-object "GApplication")
+  (c-name "g_application_get_application_id")
+  (return-type "const-gchar*")
+)
+
+(define-method set_application_id
+  (of-object "GApplication")
+  (c-name "g_application_set_application_id")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "application_id")
+  )
+)
+
+(define-method get_inactivity_timeout
+  (of-object "GApplication")
+  (c-name "g_application_get_inactivity_timeout")
+  (return-type "guint")
+)
+
+(define-method set_inactivity_timeout
+  (of-object "GApplication")
+  (c-name "g_application_set_inactivity_timeout")
+  (return-type "none")
+  (parameters
+    '("guint" "inactivity_timeout")
+  )
+)
+
+(define-method get_flags
+  (of-object "GApplication")
+  (c-name "g_application_get_flags")
+  (return-type "GApplicationFlags")
+)
+
+(define-method set_flags
+  (of-object "GApplication")
+  (c-name "g_application_set_flags")
+  (return-type "none")
+  (parameters
+    '("GApplicationFlags" "flags")
+  )
+)
+
+(define-method is_remote
+  (of-object "GApplication")
+  (c-name "g_application_get_is_remote")
+  (return-type "gboolean")
+)
+
+(define-method hold
+  (of-object "GApplication")
+  (c-name "g_application_hold")
+  (return-type "none")
+)
+
+(define-method release
+  (of-object "GApplication")
+  (c-name "g_application_release")
+  (return-type "none")
+)
+
+(define-method quit
+  (of-object "GApplication")
+  (c-name "g_application_quit")
+  (return-type "none")
+)
+
+(define-method activate
+  (of-object "GApplication")
+  (c-name "g_application_activate")
+  (return-type "none")
+)
+
+(define-method run
+  (of-object "GApplication")
+  (c-name "g_application_run")
+  (return-type "int")
+  (parameters
+    '("int" "argc")
+    '("char**" "argv" (null-ok))
+  )
+)
+
+(define-virtual activate
+  (of-object "GApplication")
+  (return-type "none")
+)
+
+(define-virtual startup
+  (of-object "GApplication")
+  (return-type "none")
+)
+
+(define-virtual open
+  (of-object "GApplication")
+  (return-type "none")
+  (parameters
+    '("GFile**" "files")
+    '("gint" "n_files")
+    '("gchar*" "hint")
+  )
+)
+
+(define-virtual command_line
+  (of-object "GApplication")
+  (return-type "gint")
+  (parameters
+    '("GApplicationCommandLine*" "command")
+  )
+)
diff --git a/src/defs/GApplicationCommandLine.defs b/src/defs/GApplicationCommandLine.defs
new file mode 100644
index 0000000..9c24105
--- /dev/null
+++ b/src/defs/GApplicationCommandLine.defs
@@ -0,0 +1,23 @@
+(define-object ApplicationCommandLine
+  (in-module "Glib")
+  (parent "GObject")
+  (c-name "GApplicationCommandLine")
+)
+
+(define-method get_arguments
+  (of-object "GApplicationCommandLine")
+  (c-name "g_application_command_line_get_arguments")
+  (return-type "gchar**")
+  (parameters
+    '("int*" "argc")
+  )
+)
+
+;; terrible terrible hack, attempting to create the effect of _exit() 
+;; as a placeholder until the real function shows up in Glib.
+(define-method broken
+  (of-object "GApplicationCommandLine")
+  (c-name "g_object_unref")
+  (return-type "none")
+)
+
diff --git a/src/defs/GApplicationFlags.defs b/src/defs/GApplicationFlags.defs
new file mode 100644
index 0000000..14383f1
--- /dev/null
+++ b/src/defs/GApplicationFlags.defs
@@ -0,0 +1,14 @@
+(define-flags ApplicationFlags
+  (in-module "Glib")
+  (c-name "GApplicationFlags")
+  (gtype-id "G_TYPE_APPLICATION_FLAGS")
+  (values
+    '("none" "G_APPLICATION_FLAGS_NONE")
+    '("is-service" "G_APPLICATION_IS_SERVICE")
+    '("is-launcher" "G_APPLICATION_IS_LAUNCHER")
+    '("handles-open" "G_APPLICATION_HANDLES_OPEN")
+    '("handles-command-line" "G_APPLICATION_HANDLES_COMMAND_LINE")
+    '("send-environment" "G_APPLICATION_SEND_ENVIRONMENT")
+    '("non-unique" "G_APPLICATION_NON_UNIQUE")
+  )
+)
diff --git a/src/defs/GFile.defs b/src/defs/GFile.defs
new file mode 100644
index 0000000..0e45614
--- /dev/null
+++ b/src/defs/GFile.defs
@@ -0,0 +1,21 @@
+(define-object File
+  (in-module "Glib")
+  (parent "GObject")
+  (c-name "GFile")
+)
+
+(define-function g_file_new_for_path
+  (is-constructor-of "GFile")
+  (c-name "g_file_new_for_path")
+  (caller-owns-return #t)
+  (return-type "GFile*")
+  (parameters
+    '("const-char*" "path")
+  )
+)
+
+(define-method get_path
+  (of-object "GFile")
+  (c-name "g_file_get_path")
+  (return-type "char*")
+)
diff --git a/src/defs/GFormatSizeFlags.defs b/src/defs/GFormatSizeFlags.defs
new file mode 100644
index 0000000..646cf75
--- /dev/null
+++ b/src/defs/GFormatSizeFlags.defs
@@ -0,0 +1,10 @@
+(define-flags FormatSizeFlags
+  (in-module "Glib")
+  (c-name "GFormatSizeFlags")
+  (gtype-id "G_TYPE_FORMAT_SIZE_FLAGS")
+  (values
+    '("default" "G_FORMAT_SIZE_DEFAULT")
+    '("long-format" "G_FORMAT_SIZE_LONG_FORMAT")
+    '("iec-units" "G_FORMAT_SIZE_IEC_UNITS")
+  )
+)
diff --git a/src/defs/GUserDirectory.defs b/src/defs/GUserDirectory.defs
new file mode 100644
index 0000000..448e931
--- /dev/null
+++ b/src/defs/GUserDirectory.defs
@@ -0,0 +1,17 @@
+(define-enum UserDirectory
+  (in-module "Glib")
+  (c-name "GUserDirectory")
+  (gtype-id "G_TYPE_USER_DIRECTORY")
+  (values
+    '("directory-desktop" "G_USER_DIRECTORY_DESKTOP")
+    '("directory-documents" "G_USER_DIRECTORY_DOCUMENTS")
+    '("directory-download" "G_USER_DIRECTORY_DOWNLOAD")
+    '("directory-music" "G_USER_DIRECTORY_MUSIC")
+    '("directory-pictures" "G_USER_DIRECTORY_PICTURES")
+    '("directory-public-share" "G_USER_DIRECTORY_PUBLIC_SHARE")
+    '("directory-templates" "G_USER_DIRECTORY_TEMPLATES")
+    '("directory-videos" "G_USER_DIRECTORY_VIDEOS")
+    '("n-directories" "G_USER_N_DIRECTORIES")
+  )
+)
+
diff --git a/src/defs/GdkAtom.defs b/src/defs/GdkAtom.defs
new file mode 100644
index 0000000..9b82fb1
--- /dev/null
+++ b/src/defs/GdkAtom.defs
@@ -0,0 +1,7 @@
+(define-method name
+  (of-object "GdkAtom")
+  (c-name "gdk_atom_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
diff --git a/src/defs/GdkAxisUse.defs b/src/defs/GdkAxisUse.defs
new file mode 100644
index 0000000..4a7fcfd
--- /dev/null
+++ b/src/defs/GdkAxisUse.defs
@@ -0,0 +1,16 @@
+(define-enum AxisUse
+  (in-module "Gdk")
+  (c-name "GdkAxisUse")
+  (gtype-id "GDK_TYPE_AXIS_USE")
+  (values
+    '("ignore" "GDK_AXIS_IGNORE")
+    '("x" "GDK_AXIS_X")
+    '("y" "GDK_AXIS_Y")
+    '("pressure" "GDK_AXIS_PRESSURE")
+    '("xtilt" "GDK_AXIS_XTILT")
+    '("ytilt" "GDK_AXIS_YTILT")
+    '("wheel" "GDK_AXIS_WHEEL")
+    '("last" "GDK_AXIS_LAST")
+  )
+)
+
diff --git a/src/defs/GdkByteOrder.defs b/src/defs/GdkByteOrder.defs
new file mode 100644
index 0000000..80805bf
--- /dev/null
+++ b/src/defs/GdkByteOrder.defs
@@ -0,0 +1,11 @@
+(define-enum ByteOrder
+  (unnecessary)
+  (in-module "Gdk")
+  (c-name "GdkByteOrder")
+  (gtype-id "GDK_TYPE_BYTE_ORDER")
+  (values
+    '("lsb-first" "GDK_LSB_FIRST")
+    '("msb-first" "GDK_MSB_FIRST")
+  )
+)
+
diff --git a/src/defs/GdkCapStyle.defs b/src/defs/GdkCapStyle.defs
new file mode 100644
index 0000000..35db2f3
--- /dev/null
+++ b/src/defs/GdkCapStyle.defs
@@ -0,0 +1,12 @@
+(define-enum CapStyle
+  (in-module "Gdk")
+  (c-name "GdkCapStyle")
+  (gtype-id "GDK_TYPE_CAP_STYLE")
+  (values
+    '("not-last" "GDK_CAP_NOT_LAST")
+    '("butt" "GDK_CAP_BUTT")
+    '("round" "GDK_CAP_ROUND")
+    '("projecting" "GDK_CAP_PROJECTING")
+  )
+)
+
diff --git a/src/defs/GdkColorspace.defs b/src/defs/GdkColorspace.defs
new file mode 100644
index 0000000..c2901ef
--- /dev/null
+++ b/src/defs/GdkColorspace.defs
@@ -0,0 +1,9 @@
+(define-enum Colorspace
+  (in-module "Gdk")
+  (c-name "GdkColorspace")
+  (gtype-id "GDK_TYPE_COLORSPACE")
+  (values
+    '("b" "GDK_COLORSPACE_RGB")
+  )
+)
+
diff --git a/src/defs/GdkCrossingMode.defs b/src/defs/GdkCrossingMode.defs
new file mode 100644
index 0000000..b74c173
--- /dev/null
+++ b/src/defs/GdkCrossingMode.defs
@@ -0,0 +1,14 @@
+(define-enum CrossingMode
+  (in-module "Gdk")
+  (c-name "GdkCrossingMode")
+  (gtype-id "GDK_TYPE_CROSSING_MODE")
+  (values
+    '("normal" "GDK_CROSSING_NORMAL")
+    '("grab" "GDK_CROSSING_GRAB")
+    '("ungrab" "GDK_CROSSING_UNGRAB")
+    '("gtk-grab" "GDK_CROSSING_GTK_GRAB")
+    '("gtk-ungrab" "GDK_CROSSING_GTK_UNGRAB")
+    '("state-changed" "GDK_CROSSING_STATE_CHANGED")
+  )
+)
+
diff --git a/src/defs/GdkCursor.defs b/src/defs/GdkCursor.defs
new file mode 100644
index 0000000..a6c2613
--- /dev/null
+++ b/src/defs/GdkCursor.defs
@@ -0,0 +1,84 @@
+(define-boxed Cursor
+  (in-module "Gdk")
+  (c-name "GdkCursor")
+  (gtype-id "GDK_TYPE_CURSOR")
+  (copy-func "gdk_cursor_ref")
+  (release-func "gdk_cursor_unref")
+)
+
+(define-method ref
+  (of-object "GdkCursor")
+  (c-name "gdk_cursor_ref")
+  (return-type "GdkCursor*")
+)
+
+(define-method unref
+  (of-object "GdkCursor")
+  (c-name "gdk_cursor_unref")
+  (return-type "none")
+)
+
+(define-method get_image
+  (of-object "GdkCursor")
+  (c-name "gdk_cursor_get_image")
+  (return-type "GdkPixbuf*")
+)
+
+(define-function cursor_new
+  (is-constructor-of "GdkCursor")
+  (c-name "gdk_cursor_new")
+  (caller-owns-return #t)
+  (return-type "GdkCursor*")
+  (parameters
+    '("GdkCursorType" "cursor_type")
+  )
+)
+
+(define-function cursor_new_from_name
+  (is-constructor-of "GdkCursor")
+  (c-name "gdk_cursor_new_from_name")
+  (return-type "GdkCursor*")
+  (caller-owns-return #t)
+  (parameters
+    '("GdkDisplay*" "display")
+    '("const-gchar*" "name")
+  )
+)
+
+
+(define-function cursor_new_for_display
+  (is-constructor-of "GdkCursor")
+  (c-name "gdk_cursor_new_for_display")
+  (caller-owns-return #t)
+  (return-type "GdkCursor*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkCursorType" "cursor_type")
+  )
+)
+
+(define-function cursor_new_from_pixbuf
+  (is-constructor-of "GdkCursor")
+  (c-name "gdk_cursor_new_from_pixbuf")
+  (caller-owns-return #t)
+  (return-type "GdkCursor*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkPixbuf*" "source")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_display
+  (of-object "GdkCursor")
+  (c-name "gdk_cursor_get_display")
+  (return-type "GdkDisplay*")
+)
+
+(define-method get_cursor_type
+  (of-object "GdkCursor")
+  (c-name "gdk_cursor_get_cursor_type")
+  (return-type "GdkCursorType")
+)
+
diff --git a/src/defs/GdkCursorType.defs b/src/defs/GdkCursorType.defs
new file mode 100644
index 0000000..0fc9856
--- /dev/null
+++ b/src/defs/GdkCursorType.defs
@@ -0,0 +1,28 @@
+;; Manually tweaked from enum to flags due to non integer sequence of ordinal
+;; values as defined in header file declaring GdkCursorType. There are *many*
+;; more constants, but I'm not sure what use any of them are.
+
+(define-flags CursorType
+  (in-module "Gdk")
+  (c-name "GdkCursorType")
+  (gtype-id "GDK_TYPE_CURSOR_TYPE")
+  (values
+    '("left-ptr" "GDK_LEFT_PTR")
+    '("right-ptr" "GDK_LEFT_PTR")
+    '("watch" "GDK_WATCH")
+    '("xterm" "GDK_XTERM")
+    '("left-side" "GDK_LEFT_SIDE")
+    '("right-side" "GDK_RIGHT_SIDE")
+    '("top-left-corner" "GDK_TOP_LEFT_CORNER")
+    '("top-right-corner" "GDK_TOP_RIGHT_CORNER")
+    '("top-side" "GDK_TOP_SIDE")
+    '("bottom-left-corner" "GDK_BOTTOM_LEFT_CORNER")
+    '("bottom-right-corner" "GDK_BOTTOM_RIGHT_CORNER")
+    '("bottom-side" "GDK_BOTTOM_SIDE")
+    '("fleur" "GDK_FLEUR")
+    '("cursor-is-pixmap" "GDK_CURSOR_IS_PIXMAP")
+    '("hand1" "GDK_HAND1")
+    '("hand2" "GDK_HAND2")
+  )
+)
+
diff --git a/src/defs/GdkDevice.defs b/src/defs/GdkDevice.defs
new file mode 100644
index 0000000..51e8bb8
--- /dev/null
+++ b/src/defs/GdkDevice.defs
@@ -0,0 +1,82 @@
+(define-object Device
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkDevice")
+  (gtype-id "GDK_TYPE_DEVICE")
+  (fields
+    '("gchar*" "name")
+    '("GdkInputSource" "source")
+    '("GdkInputMode" "mode")
+    '("gboolean" "has_cursor")
+    '("gint" "num_axes")
+    '("GdkDeviceAxis*" "axes")
+    '("gint" "num_keys")
+    '("GdkDeviceKey*" "keys")
+  )
+)
+
+(define-method set_mode
+  (of-object "GdkDevice")
+  (c-name "gdk_device_set_mode")
+  (return-type "gboolean")
+  (parameters
+    '("GdkInputMode" "mode")
+  )
+)
+
+(define-method set_key
+  (of-object "GdkDevice")
+  (c-name "gdk_device_set_key")
+  (return-type "none")
+  (parameters
+    '("guint" "index")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-method set_axis_use
+  (of-object "GdkDevice")
+  (c-name "gdk_device_set_axis_use")
+  (return-type "none")
+  (parameters
+    '("guint" "index")
+    '("GdkAxisUse" "use")
+  )
+)
+
+(define-method get_state
+  (of-object "GdkDevice")
+  (c-name "gdk_device_get_state")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "window")
+    '("gdouble*" "axes")
+    '("GdkModifierType*" "mask")
+  )
+)
+
+(define-method get_history
+  (of-object "GdkDevice")
+  (c-name "gdk_device_get_history")
+  (return-type "gboolean")
+  (parameters
+    '("GdkWindow*" "window")
+    '("guint32" "start")
+    '("guint32" "stop")
+    '("GdkTimeCoord***" "events")
+    '("gint*" "n_events")
+  )
+)
+
+(define-method get_axis
+  (of-object "GdkDevice")
+  (c-name "gdk_device_get_axis")
+  (return-type "gboolean")
+  (parameters
+    '("gdouble*" "axes")
+    '("GdkAxisUse" "use")
+    '("gdouble*" "value")
+  )
+)
+
diff --git a/src/defs/GdkDisplay.defs b/src/defs/GdkDisplay.defs
new file mode 100644
index 0000000..6a564ed
--- /dev/null
+++ b/src/defs/GdkDisplay.defs
@@ -0,0 +1,300 @@
+(define-object Display
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkDisplay")
+  (gtype-id "GDK_TYPE_DISPLAY")
+)
+
+(define-function display_open
+  (is-constructor-of "GdkDisplay")
+  (c-name "gdk_display_open")
+  (caller-owns-return #t)
+  (return-type "GdkDisplay*")
+  (parameters
+    '("const-gchar*" "display_name" (null-ok))
+  )
+)
+
+(define-method get_name
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_n_screens
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_n_screens")
+  (return-type "gint")
+)
+
+(define-method get_screen
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_screen")
+  (return-type "GdkScreen*")
+  (parameters
+    '("gint" "screen_num")
+  )
+)
+
+(define-method get_default_screen
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_default_screen")
+  (return-type "GdkScreen*")
+)
+
+(define-method pointer_ungrab
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_pointer_ungrab")
+  (return-type "none")
+  (parameters
+    '("guint32" "time_" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-method keyboard_ungrab
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_keyboard_ungrab")
+  (return-type "none")
+  (parameters
+    '("guint32" "time_" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-method pointer_is_grabbed
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_pointer_is_grabbed")
+  (return-type "gboolean")
+)
+
+(define-method beep
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_beep")
+  (return-type "none")
+)
+
+(define-method sync
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_sync")
+  (return-type "none")
+)
+
+(define-method close
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_close")
+  (return-type "none")
+)
+
+(define-method list_devices
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_list_devices")
+  (return-type "GList*")
+)
+
+(define-method get_event
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_event")
+  (return-type "GdkEvent*")
+)
+
+(define-method peek_event
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_peek_event")
+  (return-type "GdkEvent*")
+)
+
+(define-method put_event
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_put_event")
+  (return-type "none")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-method add_client_message_filter
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_add_client_message_filter")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "message_type")
+    '("GdkFilterFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-method set_double_click_time
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_set_double_click_time")
+  (return-type "none")
+  (parameters
+    '("guint" "msec")
+  )
+)
+
+(define-method get_pointer
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_pointer")
+  (return-type "none")
+  (parameters
+    '("GdkScreen**" "screen")
+    '("gint*" "x")
+    '("gint*" "y")
+    '("GdkModifierType*" "mask")
+  )
+)
+
+(define-method get_window_at_pointer
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_window_at_pointer")
+  (return-type "GdkWindow*")
+  (parameters
+    '("gint*" "win_x")
+    '("gint*" "win_y")
+  )
+)
+
+(define-method set_pointer_hooks
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_set_pointer_hooks")
+  (return-type "GdkDisplayPointerHooks*")
+  (parameters
+    '("const-GdkDisplayPointerHooks*" "new_hooks")
+  )
+)
+
+(define-method store_clipboard
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_store_clipboard")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "clipboard_window")
+    '("guint32" "time_")
+    '("GdkAtom*" "targets")
+    '("gint" "n_targets")
+  )
+)
+
+(define-method supports_selection_notification
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_supports_selection_notification")
+  (return-type "gboolean")
+)
+
+(define-method request_selection_notification
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_request_selection_notification")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "selection")
+  )
+)
+
+(define-method supports_clipboard_persistence
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_supports_clipboard_persistence")
+  (return-type "gboolean")
+)
+
+(define-method flush
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_flush")
+  (return-type "none")
+)
+
+(define-method set_double_click_distance
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_set_double_click_distance")
+  (return-type "none")
+  (parameters
+    '("guint" "distance")
+  )
+)
+
+(define-method supports_cursor_alpha
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_supports_cursor_alpha")
+  (return-type "gboolean")
+)
+
+(define-method supports_cursor_color
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_supports_cursor_color")
+  (return-type "gboolean")
+)
+
+(define-method get_default_cursor_size
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_default_cursor_size")
+  (return-type "guint")
+)
+
+(define-method get_maximal_cursor_size
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_maximal_cursor_size")
+  (return-type "none")
+  (parameters
+    '("guint*" "width")
+    '("guint*" "height")
+  )
+)
+
+(define-method get_default_group
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_get_default_group")
+  (return-type "GdkWindow*")
+)
+
+(define-method warp_pointer
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_warp_pointer")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-virtual get_display_name
+  (of-object "GdkDisplay")
+  (return-type "const-gchar*")
+)
+
+(define-virtual get_n_screens
+  (of-object "GdkDisplay")
+  (return-type "gint")
+)
+
+(define-virtual get_screen
+  (of-object "GdkDisplay")
+  (return-type "GdkScreen*")
+  (parameters
+    '("gint" "screen_num")
+  )
+)
+
+(define-virtual get_default_screen
+  (of-object "GdkDisplay")
+  (return-type "GdkScreen*")
+)
+
+(define-virtual closed
+  (of-object "GdkDisplay")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_error")
+  )
+)
+
+(define-method supports_shapes
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_supports_shapes")
+  (return-type "gboolean")
+)
+
+(define-method supports_input_shapes
+  (of-object "GdkDisplay")
+  (c-name "gdk_display_supports_input_shapes")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GdkDisplayManager.defs b/src/defs/GdkDisplayManager.defs
new file mode 100644
index 0000000..414529a
--- /dev/null
+++ b/src/defs/GdkDisplayManager.defs
@@ -0,0 +1,37 @@
+(define-object DisplayManager
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkDisplayManager")
+  (gtype-id "GDK_TYPE_DISPLAY_MANAGER")
+)
+
+(define-method get_default_display
+  (of-object "GdkDisplayManager")
+  (c-name "gdk_display_manager_get_default_display")
+  (return-type "GdkDisplay*")
+)
+
+(define-method set_default_display
+  (of-object "GdkDisplayManager")
+  (c-name "gdk_display_manager_set_default_display")
+  (return-type "none")
+  (parameters
+    '("GdkDisplay*" "display")
+  )
+)
+
+(define-method list_displays
+  (of-object "GdkDisplayManager")
+  (c-name "gdk_display_manager_list_displays")
+  (caller-owns-return #l)
+  (return-type "GSList-GdkDisplay*")
+)
+
+(define-virtual display_opened
+  (of-object "GdkDisplayManager")
+  (return-type "none")
+  (parameters
+    '("GdkDisplay*" "display")
+  )
+)
+
diff --git a/src/defs/GdkDragAction.defs b/src/defs/GdkDragAction.defs
new file mode 100644
index 0000000..bb24051
--- /dev/null
+++ b/src/defs/GdkDragAction.defs
@@ -0,0 +1,14 @@
+(define-flags DragAction
+  (in-module "Gdk")
+  (c-name "GdkDragAction")
+  (gtype-id "GDK_TYPE_DRAG_ACTION")
+  (values
+    '("default" "GDK_ACTION_DEFAULT")
+    '("copy" "GDK_ACTION_COPY")
+    '("move" "GDK_ACTION_MOVE")
+    '("link" "GDK_ACTION_LINK")
+    '("private" "GDK_ACTION_PRIVATE")
+    '("ask" "GDK_ACTION_ASK")
+  )
+)
+
diff --git a/src/defs/GdkDragContext.defs b/src/defs/GdkDragContext.defs
new file mode 100644
index 0000000..ef0b856
--- /dev/null
+++ b/src/defs/GdkDragContext.defs
@@ -0,0 +1,174 @@
+(define-object DragContext
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkDragContext")
+  (gtype-id "GDK_TYPE_DRAG_CONTEXT")
+  (fields
+    '("GdkDragProtocol" "protocol")
+    '("gboolean" "is_source")
+    '("GdkWindow*" "source_window")
+    '("GdkWindow*" "dest_window")
+    '("GList*" "targets")
+    '("GdkDragAction" "actions")
+    '("GdkDragAction" "suggested_action")
+    '("GdkDragAction" "action")
+    '("guint32" "start_time")
+  )
+)
+
+(define-method drag_status
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_status")
+  (return-type "none")
+  (parameters
+    '("GdkDragAction" "action")
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-method drop_reply
+  (of-object "GdkDragContext")
+  (c-name "gdk_drop_reply")
+  (return-type "none")
+  (parameters
+    '("gboolean" "ok")
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-method drop_finish
+  (of-object "GdkDragContext")
+  (c-name "gdk_drop_finish")
+  (return-type "none")
+  (parameters
+    '("gboolean" "success")
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-method drag_get_selection
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_get_selection")
+  (return-type "GdkAtom")
+)
+
+(define-method drag_find_window_for_screen
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_find_window_for_screen")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "drag_window")
+    '("GdkScreen*" "screen")
+    '("gint" "x_root")
+    '("gint" "y_root")
+    '("GdkWindow**" "dest_window")
+    '("GdkDragProtocol*" "protocol")
+  )
+)
+
+(define-method drag_motion
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_motion")
+  (return-type "gboolean")
+  (parameters
+    '("GdkWindow*" "dest_window")
+    '("GdkDragProtocol" "protocol")
+    '("gint" "x_root")
+    '("gint" "y_root")
+    '("GdkDragAction" "suggested_action")
+    '("GdkDragAction" "possible_actions")
+    '("guint32" "time")
+  )
+)
+
+(define-method drag_drop
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_drop")
+  (return-type "none")
+  (parameters
+    '("guint32" "time")
+  )
+)
+
+(define-method drag_abort
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_abort")
+  (return-type "none")
+  (parameters
+    '("guint32" "time")
+  )
+)
+
+(define-method drag_drop_succeeded
+  (of-object "GdkDragContext")
+  (c-name "gdk_drag_drop_succeeded")
+  (return-type "gboolean")
+)
+
+(define-method finish
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_finish")
+  (return-type "none")
+  (parameters
+    '("gboolean" "success")
+    '("gboolean" "del")
+    '("guint32" "time" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-method get_source_widget
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_get_source_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_icon_widget
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_set_icon_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-method set_icon_pixbuf
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_set_icon_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-method set_icon_stock
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_set_icon_stock")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-method set_icon_default
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_set_icon_default")
+  (return-type "none")
+)
+
+(define-method set_icon_name
+  (of-object "GdkDragContext")
+  (c-name "gtk_drag_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
diff --git a/src/defs/GdkDragProtocol.defs b/src/defs/GdkDragProtocol.defs
new file mode 100644
index 0000000..6a73ad6
--- /dev/null
+++ b/src/defs/GdkDragProtocol.defs
@@ -0,0 +1,15 @@
+(define-enum DragProtocol
+  (in-module "Gdk")
+  (c-name "GdkDragProtocol")
+  (gtype-id "GDK_TYPE_DRAG_PROTOCOL")
+  (values
+    '("motif" "GDK_DRAG_PROTO_MOTIF")
+    '("xdnd" "GDK_DRAG_PROTO_XDND")
+    '("rootwin" "GDK_DRAG_PROTO_ROOTWIN")
+    '("none" "GDK_DRAG_PROTO_NONE")
+    '("win32-dropfiles" "GDK_DRAG_PROTO_WIN32_DROPFILES")
+    '("ole2" "GDK_DRAG_PROTO_OLE2")
+    '("local" "GDK_DRAG_PROTO_LOCAL")
+  )
+)
+
diff --git a/src/defs/GdkEvent.defs b/src/defs/GdkEvent.defs
new file mode 100644
index 0000000..647334b
--- /dev/null
+++ b/src/defs/GdkEvent.defs
@@ -0,0 +1,96 @@
+(define-boxed Event
+  (in-module "Gdk")
+  (c-name "GdkEvent")
+  (gtype-id "GDK_TYPE_EVENT")
+  (copy-func "gdk_event_copy")
+  (release-func "gdk_event_free")
+)
+
+(define-method put
+  (of-object "GdkEvent")
+  (c-name "gdk_event_put")
+  (return-type "none")
+)
+
+(define-function event_new
+  (is-constructor-of "GdkEvent")
+  (c-name "gdk_event_new")
+  (caller-owns-return #t)
+  (return-type "GdkEvent*")
+  (parameters
+    '("GdkEventType" "type")
+  )
+)
+
+(define-method copy
+  (of-object "GdkEvent")
+  (c-name "gdk_event_copy")
+  (return-type "GdkEvent*")
+)
+
+(define-method free
+  (of-object "GdkEvent")
+  (c-name "gdk_event_free")
+  (return-type "none")
+)
+
+(define-method get_time
+  (of-object "GdkEvent")
+  (c-name "gdk_event_get_time")
+  (return-type "guint32")
+)
+
+(define-method get_state
+  (of-object "GdkEvent")
+  (c-name "gdk_event_get_state")
+  (return-type "gboolean")
+  (parameters
+    '("GdkModifierType*" "state")
+  )
+)
+
+(define-method get_coords
+  (of-object "GdkEvent")
+  (c-name "gdk_event_get_coords")
+  (return-type "gboolean")
+  (parameters
+    '("gdouble*" "x_win")
+    '("gdouble*" "y_win")
+  )
+)
+
+(define-method get_root_coords
+  (of-object "GdkEvent")
+  (c-name "gdk_event_get_root_coords")
+  (return-type "gboolean")
+  (parameters
+    '("gdouble*" "x_root")
+    '("gdouble*" "y_root")
+  )
+)
+
+(define-method get_axis
+  (of-object "GdkEvent")
+  (c-name "gdk_event_get_axis")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAxisUse" "axis_use")
+    '("gdouble*" "value")
+  )
+)
+
+(define-method set_screen
+  (of-object "GdkEvent")
+  (c-name "gdk_event_set_screen")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method get_screen
+  (of-object "GdkEvent")
+  (c-name "gdk_event_get_screen")
+  (return-type "GdkScreen*")
+)
+
diff --git a/src/defs/GdkEventAny.defs b/src/defs/GdkEventAny.defs
new file mode 100644
index 0000000..a6b8a0a
--- /dev/null
+++ b/src/defs/GdkEventAny.defs
@@ -0,0 +1,10 @@
+(define-boxed EventAny
+  (in-module "Gdk")
+  (c-name "GdkEventAny")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+  )
+)
+
diff --git a/src/defs/GdkEventButton.defs b/src/defs/GdkEventButton.defs
new file mode 100644
index 0000000..8e177e2
--- /dev/null
+++ b/src/defs/GdkEventButton.defs
@@ -0,0 +1,19 @@
+(define-boxed EventButton
+  (in-module "Gdk")
+  (c-name "GdkEventButton")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint32" "time")
+    '("gdouble" "x")
+    '("gdouble" "y")
+    '("gdouble*" "axes")
+    '("guint" "state")
+    '("guint" "button")
+    '("GdkDevice*" "device")
+    '("gdouble" "x_root")
+    '("gdouble" "y_root")
+  )
+)
+
diff --git a/src/defs/GdkEventConfigure.defs b/src/defs/GdkEventConfigure.defs
new file mode 100644
index 0000000..10c98c9
--- /dev/null
+++ b/src/defs/GdkEventConfigure.defs
@@ -0,0 +1,14 @@
+(define-boxed EventConfigure
+  (in-module "Gdk")
+  (c-name "GdkEventConfigure")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
diff --git a/src/defs/GdkEventCrossing.defs b/src/defs/GdkEventCrossing.defs
new file mode 100644
index 0000000..46aab61
--- /dev/null
+++ b/src/defs/GdkEventCrossing.defs
@@ -0,0 +1,19 @@
+(define-boxed EventCrossing
+  (in-module "Gdk")
+  (c-name "GdkEventCrossing")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint32" "time")
+    '("gdouble" "x")
+    '("gdouble" "y")
+    '("gdouble" "x_root")
+    '("gdouble" "y_root")
+    '("GdkCrossingMode" "mode")
+    '("GdkNotifyType" "detail")
+    '("gboolean" "focus")
+    '("guint" "state")
+  )
+)
+
diff --git a/src/defs/GdkEventFocus.defs b/src/defs/GdkEventFocus.defs
new file mode 100644
index 0000000..d509352
--- /dev/null
+++ b/src/defs/GdkEventFocus.defs
@@ -0,0 +1,12 @@
+(define-boxed EventFocus
+  (in-module "Gdk")
+  (c-name "GdkEventFocus")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint16" "in")
+  )
+)
+
+;; they use 16 bits for a boolean?!?
diff --git a/src/defs/GdkEventKey.defs b/src/defs/GdkEventKey.defs
new file mode 100644
index 0000000..aa118ca
--- /dev/null
+++ b/src/defs/GdkEventKey.defs
@@ -0,0 +1,18 @@
+(define-boxed EventKey
+  (in-module "Gdk")
+  (c-name "GdkEventKey")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint32" "time")
+    '("guint" "state")
+    '("guint" "keyval")
+    '("gint" "length")
+    '("gchar*" "string")
+    '("guint16" "hardware_keycode")
+    '("guint8" "group")
+    '("gboolean" "is_modifier")
+  )
+)
+
diff --git a/src/defs/GdkEventMask.defs b/src/defs/GdkEventMask.defs
new file mode 100644
index 0000000..0116769
--- /dev/null
+++ b/src/defs/GdkEventMask.defs
@@ -0,0 +1,30 @@
+(define-flags EventMask
+  (in-module "Gdk")
+  (c-name "GdkEventMask")
+  (gtype-id "GDK_TYPE_EVENT_MASK")
+  (values
+    '("exposure-mask" "GDK_EXPOSURE_MASK")
+    '("pointer-motion-mask" "GDK_POINTER_MOTION_MASK")
+    '("pointer-motion-hint-mask" "GDK_POINTER_MOTION_HINT_MASK")
+    '("button-motion-mask" "GDK_BUTTON_MOTION_MASK")
+    '("button1-motion-mask" "GDK_BUTTON1_MOTION_MASK")
+    '("button2-motion-mask" "GDK_BUTTON2_MOTION_MASK")
+    '("button3-motion-mask" "GDK_BUTTON3_MOTION_MASK")
+    '("button-press-mask" "GDK_BUTTON_PRESS_MASK")
+    '("button-release-mask" "GDK_BUTTON_RELEASE_MASK")
+    '("key-press-mask" "GDK_KEY_PRESS_MASK")
+    '("key-release-mask" "GDK_KEY_RELEASE_MASK")
+    '("enter-notify-mask" "GDK_ENTER_NOTIFY_MASK")
+    '("leave-notify-mask" "GDK_LEAVE_NOTIFY_MASK")
+    '("focus-change-mask" "GDK_FOCUS_CHANGE_MASK")
+    '("structure-mask" "GDK_STRUCTURE_MASK")
+    '("property-change-mask" "GDK_PROPERTY_CHANGE_MASK")
+    '("visibility-notify-mask" "GDK_VISIBILITY_NOTIFY_MASK")
+    '("proximity-in-mask" "GDK_PROXIMITY_IN_MASK")
+    '("proximity-out-mask" "GDK_PROXIMITY_OUT_MASK")
+    '("substructure-mask" "GDK_SUBSTRUCTURE_MASK")
+    '("scroll-mask" "GDK_SCROLL_MASK")
+    '("all-events-mask" "GDK_ALL_EVENTS_MASK")
+  )
+)
+
diff --git a/src/defs/GdkEventMotion.defs b/src/defs/GdkEventMotion.defs
new file mode 100644
index 0000000..6f7acda
--- /dev/null
+++ b/src/defs/GdkEventMotion.defs
@@ -0,0 +1,19 @@
+(define-boxed EventMotion
+  (in-module "Gdk")
+  (c-name "GdkEventMotion")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint32" "time")
+    '("gdouble" "x")
+    '("gdouble" "y")
+    '("gdouble*" "axes")
+    '("guint" "state")
+    '("gint16" "is_hint")
+    '("GdkDevice*" "device")
+    '("gdouble" "x_root")
+    '("gdouble" "y_root")
+  )
+)
+
diff --git a/src/defs/GdkEventOwnerChange.defs b/src/defs/GdkEventOwnerChange.defs
new file mode 100644
index 0000000..b51b101
--- /dev/null
+++ b/src/defs/GdkEventOwnerChange.defs
@@ -0,0 +1,14 @@
+(define-boxed EventOwnerChange
+  (in-module "Gdk")
+  (c-name "GdkEventOwnerChange")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("GdkNativeWidnow" "owner")
+    '("GdkOwnerChange" "reason")
+    '("GdkAtom" "selection")
+    '("guint32" "time")
+    '("guint32" "selection_time")
+  )
+)
diff --git a/src/defs/GdkEventScroll.defs b/src/defs/GdkEventScroll.defs
new file mode 100644
index 0000000..bdd4bd5
--- /dev/null
+++ b/src/defs/GdkEventScroll.defs
@@ -0,0 +1,18 @@
+(define-boxed EventScroll
+  (in-module "Gdk")
+  (c-name "GdkEventScroll")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint32" "time")
+    '("gdouble" "x")
+    '("gdouble" "y")
+    '("guint" "state")
+    '("GdkScrollDirection" "direction")
+    '("GdkDevice*" "device")
+    '("gdouble" "x_root")
+    '("gdouble" "y_root")
+  )
+)
+
diff --git a/src/defs/GdkEventType.defs b/src/defs/GdkEventType.defs
new file mode 100644
index 0000000..3425b94
--- /dev/null
+++ b/src/defs/GdkEventType.defs
@@ -0,0 +1,45 @@
+(define-enum EventType
+  (in-module "Gdk")
+  (c-name "GdkEventType")
+  (gtype-id "GDK_TYPE_EVENT_TYPE")
+  (values
+    '("delete" "GDK_DELETE")
+    '("destroy" "GDK_DESTROY")
+    '("expose" "GDK_EXPOSE")
+    '("motion-notify" "GDK_MOTION_NOTIFY")
+    '("button-press" "GDK_BUTTON_PRESS")
+    '("button-press-double" "GDK_2BUTTON_PRESS")
+    '("button-press-triple" "GDK_3BUTTON_PRESS")
+    '("button-release" "GDK_BUTTON_RELEASE")
+    '("key-press" "GDK_KEY_PRESS")
+    '("key-release" "GDK_KEY_RELEASE")
+    '("enter-notify" "GDK_ENTER_NOTIFY")
+    '("leave-notify" "GDK_LEAVE_NOTIFY")
+    '("focus-change" "GDK_FOCUS_CHANGE")
+    '("configure" "GDK_CONFIGURE")
+    '("map" "GDK_MAP")
+    '("unmap" "GDK_UNMAP")
+    '("property-notify" "GDK_PROPERTY_NOTIFY")
+    '("selection-clear" "GDK_SELECTION_CLEAR")
+    '("selection-request" "GDK_SELECTION_REQUEST")
+    '("selection-notify" "GDK_SELECTION_NOTIFY")
+    '("proximity-in" "GDK_PROXIMITY_IN")
+    '("proximity-out" "GDK_PROXIMITY_OUT")
+    '("drag-enter" "GDK_DRAG_ENTER")
+    '("drag-leave" "GDK_DRAG_LEAVE")
+    '("drag-motion" "GDK_DRAG_MOTION")
+    '("drag-status" "GDK_DRAG_STATUS")
+    '("drop-start" "GDK_DROP_START")
+    '("drop-finished" "GDK_DROP_FINISHED")
+    '("client-event" "GDK_CLIENT_EVENT")
+    '("visibility-notify" "GDK_VISIBILITY_NOTIFY")
+    '("no-expose" "GDK_NO_EXPOSE")
+    '("scroll" "GDK_SCROLL")
+    '("window-state" "GDK_WINDOW_STATE")
+    '("setting" "GDK_SETTING")
+    '("owner-change" "GDK_OWNER_CHANGE")
+    '("grab-broken" "GDK_GRAB_BROKEN")
+    '("damage" "GDK_DAMAGE")
+  )
+)
+
diff --git a/src/defs/GdkEventVisibility.defs b/src/defs/GdkEventVisibility.defs
new file mode 100644
index 0000000..f10ea16
--- /dev/null
+++ b/src/defs/GdkEventVisibility.defs
@@ -0,0 +1,10 @@
+(define-boxed EventVisibility
+  (in-module "Gdk")
+  (c-name "GdkEventVisibility")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("GdkVisibilityState" "state")
+  )
+)
diff --git a/src/defs/GdkExtensionMode.defs b/src/defs/GdkExtensionMode.defs
new file mode 100644
index 0000000..a71c4e7
--- /dev/null
+++ b/src/defs/GdkExtensionMode.defs
@@ -0,0 +1,11 @@
+(define-enum ExtensionMode
+  (in-module "Gdk")
+  (c-name "GdkExtensionMode")
+  (gtype-id "GDK_TYPE_EXTENSION_MODE")
+  (values
+    '("none" "GDK_EXTENSION_EVENTS_NONE")
+    '("all" "GDK_EXTENSION_EVENTS_ALL")
+    '("cursor" "GDK_EXTENSION_EVENTS_CURSOR")
+  )
+)
+
diff --git a/src/defs/GdkFill.defs b/src/defs/GdkFill.defs
new file mode 100644
index 0000000..4a2bde3
--- /dev/null
+++ b/src/defs/GdkFill.defs
@@ -0,0 +1,12 @@
+(define-enum Fill
+  (in-module "Gdk")
+  (c-name "GdkFill")
+  (gtype-id "GDK_TYPE_FILL")
+  (values
+    '("solid" "GDK_SOLID")
+    '("tiled" "GDK_TILED")
+    '("stippled" "GDK_STIPPLED")
+    '("opaque-stippled" "GDK_OPAQUE_STIPPLED")
+  )
+)
+
diff --git a/src/defs/GdkFillRule.defs b/src/defs/GdkFillRule.defs
new file mode 100644
index 0000000..30bb237
--- /dev/null
+++ b/src/defs/GdkFillRule.defs
@@ -0,0 +1,10 @@
+(define-enum FillRule
+  (in-module "Gdk")
+  (c-name "GdkFillRule")
+  (gtype-id "GDK_TYPE_FILL_RULE")
+  (values
+    '("even-odd-rule" "GDK_EVEN_ODD_RULE")
+    '("winding-rule" "GDK_WINDING_RULE")
+  )
+)
+
diff --git a/src/defs/GdkFilterReturn.defs b/src/defs/GdkFilterReturn.defs
new file mode 100644
index 0000000..c9847ef
--- /dev/null
+++ b/src/defs/GdkFilterReturn.defs
@@ -0,0 +1,11 @@
+(define-enum FilterReturn
+  (in-module "Gdk")
+  (c-name "GdkFilterReturn")
+  (gtype-id "GDK_TYPE_FILTER_RETURN")
+  (values
+    '("continue" "GDK_FILTER_CONTINUE")
+    '("translate" "GDK_FILTER_TRANSLATE")
+    '("remove" "GDK_FILTER_REMOVE")
+  )
+)
+
diff --git a/src/defs/GdkFunction.defs b/src/defs/GdkFunction.defs
new file mode 100644
index 0000000..a2e4546
--- /dev/null
+++ b/src/defs/GdkFunction.defs
@@ -0,0 +1,24 @@
+(define-enum Function
+  (in-module "Gdk")
+  (c-name "GdkFunction")
+  (gtype-id "GDK_TYPE_FUNCTION")
+  (values
+    '("copy" "GDK_COPY")
+    '("invert" "GDK_INVERT")
+    '("xor" "GDK_XOR")
+    '("clear" "GDK_CLEAR")
+    '("and" "GDK_AND")
+    '("and-reverse" "GDK_AND_REVERSE")
+    '("and-invert" "GDK_AND_INVERT")
+    '("noop" "GDK_NOOP")
+    '("or" "GDK_OR")
+    '("equiv" "GDK_EQUIV")
+    '("or-reverse" "GDK_OR_REVERSE")
+    '("copy-invert" "GDK_COPY_INVERT")
+    '("or-invert" "GDK_OR_INVERT")
+    '("nand" "GDK_NAND")
+    '("nor" "GDK_NOR")
+    '("set" "GDK_SET")
+  )
+)
+
diff --git a/src/defs/GdkGeometry.defs b/src/defs/GdkGeometry.defs
new file mode 100644
index 0000000..e35291f
--- /dev/null
+++ b/src/defs/GdkGeometry.defs
@@ -0,0 +1,18 @@
+(define-boxed Geometry
+  (in-module "Gdk")
+  (c-name "GdkGeometry")
+  (fields
+    '("gint" "min_width")
+    '("gint" "min_height")
+    '("gint" "max_width")
+    '("gint" "max_height")
+    '("gint" "base_width")
+    '("gint" "base_height")
+    '("gint" "width_inc")
+    '("gint" "height_inc")
+    '("gdouble" "min_aspect")
+    '("gdouble" "max_aspect")
+    '("GdkGravity" "win_gravity")
+  )
+)
+
diff --git a/src/defs/GdkGrabStatus.defs b/src/defs/GdkGrabStatus.defs
new file mode 100644
index 0000000..f53ac22
--- /dev/null
+++ b/src/defs/GdkGrabStatus.defs
@@ -0,0 +1,13 @@
+(define-enum GrabStatus
+  (in-module "Gdk")
+  (c-name "GdkGrabStatus")
+  (gtype-id "GDK_TYPE_GRAB_STATUS")
+  (values
+    '("success" "GDK_GRAB_SUCCESS")
+    '("already-grabbed" "GDK_GRAB_ALREADY_GRABBED")
+    '("invalid-time" "GDK_GRAB_INVALID_TIME")
+    '("not-viewable" "GDK_GRAB_NOT_VIEWABLE")
+    '("frozen" "GDK_GRAB_FROZEN")
+  )
+)
+
diff --git a/src/defs/GdkGravity.defs b/src/defs/GdkGravity.defs
new file mode 100644
index 0000000..1e319f8
--- /dev/null
+++ b/src/defs/GdkGravity.defs
@@ -0,0 +1,18 @@
+(define-enum Gravity
+  (in-module "Gdk")
+  (c-name "GdkGravity")
+  (gtype-id "GDK_TYPE_GRAVITY")
+  (values
+    '("north-west" "GDK_GRAVITY_NORTH_WEST")
+    '("north" "GDK_GRAVITY_NORTH")
+    '("north-east" "GDK_GRAVITY_NORTH_EAST")
+    '("west" "GDK_GRAVITY_WEST")
+    '("center" "GDK_GRAVITY_CENTER")
+    '("east" "GDK_GRAVITY_EAST")
+    '("south-west" "GDK_GRAVITY_SOUTH_WEST")
+    '("south" "GDK_GRAVITY_SOUTH")
+    '("south-east" "GDK_GRAVITY_SOUTH_EAST")
+    '("static" "GDK_GRAVITY_STATIC")
+  )
+)
+
diff --git a/src/defs/GdkInputMode.defs b/src/defs/GdkInputMode.defs
new file mode 100644
index 0000000..e789983
--- /dev/null
+++ b/src/defs/GdkInputMode.defs
@@ -0,0 +1,11 @@
+(define-enum InputMode
+  (in-module "Gdk")
+  (c-name "GdkInputMode")
+  (gtype-id "GDK_TYPE_INPUT_MODE")
+  (values
+    '("disabled" "GDK_MODE_DISABLED")
+    '("screen" "GDK_MODE_SCREEN")
+    '("window" "GDK_MODE_WINDOW")
+  )
+)
+
diff --git a/src/defs/GdkInputSource.defs b/src/defs/GdkInputSource.defs
new file mode 100644
index 0000000..a3a02a4
--- /dev/null
+++ b/src/defs/GdkInputSource.defs
@@ -0,0 +1,12 @@
+(define-enum InputSource
+  (in-module "Gdk")
+  (c-name "GdkInputSource")
+  (gtype-id "GDK_TYPE_INPUT_SOURCE")
+  (values
+    '("mouse" "GDK_SOURCE_MOUSE")
+    '("pen" "GDK_SOURCE_PEN")
+    '("eraser" "GDK_SOURCE_ERASER")
+    '("cursor" "GDK_SOURCE_CURSOR")
+  )
+)
+
diff --git a/src/defs/GdkInterpType.defs b/src/defs/GdkInterpType.defs
new file mode 100644
index 0000000..9dccbab
--- /dev/null
+++ b/src/defs/GdkInterpType.defs
@@ -0,0 +1,12 @@
+(define-enum InterpType
+  (in-module "Gdk")
+  (c-name "GdkInterpType")
+  (gtype-id "GDK_TYPE_INTERP_TYPE")
+  (values
+    '("nearest" "GDK_INTERP_NEAREST")
+    '("tiles" "GDK_INTERP_TILES")
+    '("bilinear" "GDK_INTERP_BILINEAR")
+    '("hyper" "GDK_INTERP_HYPER")
+  )
+)
+
diff --git a/src/defs/GdkJoinStyle.defs b/src/defs/GdkJoinStyle.defs
new file mode 100644
index 0000000..2c712ef
--- /dev/null
+++ b/src/defs/GdkJoinStyle.defs
@@ -0,0 +1,11 @@
+(define-enum JoinStyle
+  (in-module "Gdk")
+  (c-name "GdkJoinStyle")
+  (gtype-id "GDK_TYPE_JOIN_STYLE")
+  (values
+    '("miter" "GDK_JOIN_MITER")
+    '("round" "GDK_JOIN_ROUND")
+    '("bevel" "GDK_JOIN_BEVEL")
+  )
+)
+
diff --git a/src/defs/GdkKeymap.defs b/src/defs/GdkKeymap.defs
new file mode 100644
index 0000000..37e2a88
--- /dev/null
+++ b/src/defs/GdkKeymap.defs
@@ -0,0 +1,70 @@
+(define-object Keymap
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkKeymap")
+  (gtype-id "GDK_TYPE_KEYMAP")
+)
+
+(define-method lookup_key
+  (of-object "GdkKeymap")
+  (c-name "gdk_keymap_lookup_key")
+  (return-type "guint")
+  (parameters
+    '("const-GdkKeymapKey*" "key")
+  )
+)
+
+(define-method translate_keyboard_state
+  (of-object "GdkKeymap")
+  (c-name "gdk_keymap_translate_keyboard_state")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "hardware_keycode")
+    '("GdkModifierType" "state")
+    '("gint" "group")
+    '("guint*" "keyval")
+    '("gint*" "effective_group")
+    '("gint*" "level")
+    '("GdkModifierType*" "consumed_modifiers")
+  )
+)
+
+(define-method get_entries_for_keyval
+  (of-object "GdkKeymap")
+  (c-name "gdk_keymap_get_entries_for_keyval")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "keyval")
+    '("GdkKeymapKey**" "keys")
+    '("gint*" "n_keys")
+  )
+)
+
+(define-method get_entries_for_keycode
+  (of-object "GdkKeymap")
+  (c-name "gdk_keymap_get_entries_for_keycode")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "hardware_keycode")
+    '("GdkKeymapKey**" "keys")
+    '("guint**" "keyvals")
+    '("gint*" "n_entries")
+  )
+)
+
+(define-method get_direction
+  (of-object "GdkKeymap")
+  (c-name "gdk_keymap_get_direction")
+  (return-type "PangoDirection")
+)
+
+(define-virtual direction_changed
+  (of-object "GdkKeymap")
+  (return-type "none")
+)
+
+(define-virtual keys_changed
+  (of-object "GdkKeymap")
+  (return-type "none")
+)
+
diff --git a/src/defs/GdkKeymapKey.defs b/src/defs/GdkKeymapKey.defs
new file mode 100644
index 0000000..a628ff3
--- /dev/null
+++ b/src/defs/GdkKeymapKey.defs
@@ -0,0 +1,10 @@
+(define-boxed KeymapKey
+  (in-module "Gdk")
+  (c-name "GdkKeymapKey")
+  (fields
+    '("guint" "keycode")
+    '("gint" "group")
+    '("gint" "level")
+  )
+)
+
diff --git a/src/defs/GdkKeyval.defs b/src/defs/GdkKeyval.defs
new file mode 100644
index 0000000..4dec5a4
--- /dev/null
+++ b/src/defs/GdkKeyval.defs
@@ -0,0 +1,90 @@
+;; This is somewhat faked; we'd prefer it to be define-enum but in any event
+;; we've registered it manually as a TypedefEnumThing.
+
+(define-boxed Keyval
+  (in-module "Gdk")
+  (c-name "GdkKeyval")
+)
+
+(define-function name
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_name")
+  (return-type "gchar*")
+  (parameters
+    '("guint" "keyval")
+  )
+)
+
+(define-function from_name
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_from_name")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "keyval_name")
+  )
+)
+
+(define-function convert_case
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_convert_case")
+  (return-type "none")
+  (parameters
+    '("guint" "symbol")
+    '("guint*" "lower")
+    '("guint*" "upper")
+  )
+)
+
+(define-function to_upper
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_to_upper")
+  (return-type "guint")
+  (parameters
+    '("guint" "keyval")
+  )
+)
+
+(define-function to_lower
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_to_lower")
+  (return-type "guint")
+  (parameters
+    '("guint" "keyval")
+  )
+)
+
+(define-function is_upper
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_is_upper")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "keyval")
+  )
+)
+
+(define-function is_lower
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_is_lower")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "keyval")
+  )
+)
+
+(define-function to_unicode
+  (of-object "GdkKeyval")
+  (c-name "gdk_keyval_to_unicode")
+  (return-type "guint32")
+  (parameters
+    '("guint" "keyval")
+  )
+)
+
+(define-function unicode_to_keyval
+  (of-object "GdkKeyval")
+  (c-name "gdk_unicode_to_keyval")
+  (return-type "guint")
+  (parameters
+    '("guint32" "wc")
+  )
+)
diff --git a/src/defs/GdkLineStyle.defs b/src/defs/GdkLineStyle.defs
new file mode 100644
index 0000000..42a4b35
--- /dev/null
+++ b/src/defs/GdkLineStyle.defs
@@ -0,0 +1,11 @@
+(define-enum LineStyle
+  (in-module "Gdk")
+  (c-name "GdkLineStyle")
+  (gtype-id "GDK_TYPE_LINE_STYLE")
+  (values
+    '("solid" "GDK_LINE_SOLID")
+    '("on-off-dash" "GDK_LINE_ON_OFF_DASH")
+    '("double-dash" "GDK_LINE_DOUBLE_DASH")
+  )
+)
+
diff --git a/src/defs/GdkModifierType.defs b/src/defs/GdkModifierType.defs
new file mode 100644
index 0000000..254c855
--- /dev/null
+++ b/src/defs/GdkModifierType.defs
@@ -0,0 +1,26 @@
+(define-flags ModifierType
+  (in-module "Gdk")
+  (c-name "GdkModifierType")
+  (gtype-id "GDK_TYPE_MODIFIER_TYPE")
+  (values
+    '("shift-mask" "GDK_SHIFT_MASK")
+    '("lock-mask" "GDK_LOCK_MASK")
+    '("control-mask" "GDK_CONTROL_MASK")
+    '("mod1-mask" "GDK_MOD1_MASK")
+    '("mod2-mask" "GDK_MOD2_MASK")
+    '("mod3-mask" "GDK_MOD3_MASK")
+    '("mod4-mask" "GDK_MOD4_MASK")
+    '("mod5-mask" "GDK_MOD5_MASK")
+    '("button1-mask" "GDK_BUTTON1_MASK")
+    '("button2-mask" "GDK_BUTTON2_MASK")
+    '("button3-mask" "GDK_BUTTON3_MASK")
+    '("button4-mask" "GDK_BUTTON4_MASK")
+    '("button5-mask" "GDK_BUTTON5_MASK")
+    '("super-mask" "GDK_SUPER_MASK")
+    '("hyper-mask" "GDK_HYPER_MASK")
+    '("meta-mask" "GDK_META_MASK")
+    '("release-mask" "GDK_RELEASE_MASK")
+    '("modifier-mask" "GDK_MODIFIER_MASK")
+  )
+)
+
diff --git a/src/defs/GdkNotifyType.defs b/src/defs/GdkNotifyType.defs
new file mode 100644
index 0000000..99f5de6
--- /dev/null
+++ b/src/defs/GdkNotifyType.defs
@@ -0,0 +1,14 @@
+(define-enum NotifyType
+  (in-module "Gdk")
+  (c-name "GdkNotifyType")
+  (gtype-id "GDK_TYPE_NOTIFY_TYPE")
+  (values
+    '("ancestor" "GDK_NOTIFY_ANCESTOR")
+    '("virtual" "GDK_NOTIFY_VIRTUAL")
+    '("inferior" "GDK_NOTIFY_INFERIOR")
+    '("nonlinear" "GDK_NOTIFY_NONLINEAR")
+    '("nonlinear-virtual" "GDK_NOTIFY_NONLINEAR_VIRTUAL")
+    '("unknown" "GDK_NOTIFY_UNKNOWN")
+  )
+)
+
diff --git a/src/defs/GdkOverlapType.defs b/src/defs/GdkOverlapType.defs
new file mode 100644
index 0000000..9ecc3f4
--- /dev/null
+++ b/src/defs/GdkOverlapType.defs
@@ -0,0 +1,11 @@
+(define-enum OverlapType
+  (in-module "Gdk")
+  (c-name "GdkOverlapType")
+  (gtype-id "GDK_TYPE_OVERLAP_TYPE")
+  (values
+    '("in" "GDK_OVERLAP_RECTANGLE_IN")
+    '("out" "GDK_OVERLAP_RECTANGLE_OUT")
+    '("part" "GDK_OVERLAP_RECTANGLE_PART")
+  )
+)
+
diff --git a/src/defs/GdkOwnerChange.defs b/src/defs/GdkOwnerChange.defs
new file mode 100644
index 0000000..1e9cb12
--- /dev/null
+++ b/src/defs/GdkOwnerChange.defs
@@ -0,0 +1,11 @@
+(define-enum OwnerChange
+  (in-module "Gdk")
+  (c-name "GdkOwnerChange")
+  (gtype-id "GDK_TYPE_OWNER_CHANGE")
+  (values
+    '("new-owner" "GDK_OWNER_CHANGE_NEW_OWNER")
+    '("destroy" "GDK_OWNER_CHANGE_DESTROY")
+    '("close" "GDK_OWNER_CHANGE_CLOSE")
+  )
+)
+
diff --git a/src/defs/GdkPangoAttrEmbossed.defs b/src/defs/GdkPangoAttrEmbossed.defs
new file mode 100644
index 0000000..4f68137
--- /dev/null
+++ b/src/defs/GdkPangoAttrEmbossed.defs
@@ -0,0 +1,10 @@
+(define-function pango_attr_embossed_new
+  (is-constructor-of "GdkPangoAttrEmbossed")
+  (c-name "gdk_pango_attr_embossed_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("gboolean" "embossed")
+  )
+)
+
diff --git a/src/defs/GdkPangoAttrStipple.defs b/src/defs/GdkPangoAttrStipple.defs
new file mode 100644
index 0000000..8439108
--- /dev/null
+++ b/src/defs/GdkPangoAttrStipple.defs
@@ -0,0 +1,10 @@
+(define-function pango_attr_stipple_new
+  (is-constructor-of "GdkPangoAttrStipple")
+  (c-name "gdk_pango_attr_stipple_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("GdkBitmap*" "stipple")
+  )
+)
+
diff --git a/src/defs/GdkPixbuf.defs b/src/defs/GdkPixbuf.defs
new file mode 100644
index 0000000..d9f48b2
--- /dev/null
+++ b/src/defs/GdkPixbuf.defs
@@ -0,0 +1,384 @@
+(define-object Pixbuf
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkPixbuf")
+  (gtype-id "GDK_TYPE_PIXBUF")
+  (fields
+    '("guchar*" "pixel_array")
+  )
+)
+
+(define-function pixbuf_new_from_file
+  (is-constructor-of "GdkPixbuf")
+  (c-name "gdk_pixbuf_new_from_file")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-char*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-function pixbuf_new_from_file_at_size
+  (is-constructor-of "GdkPixbuf")
+  (c-name "gdk_pixbuf_new_from_file_at_size")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-char*" "filename")
+    '("int" "width")
+    '("int" "height")
+    '("GError**" "error")
+  )
+)
+
+(define-function pixbuf_new_from_file_at_scale
+  (is-constructor-of "GdkPixbuf")
+  (c-name "gdk_pixbuf_new_from_file_at_scale")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-char*" "filename")
+    '("int" "width")
+    '("int" "height")
+    '("gboolean" "preserve_aspect_ratio")
+    '("GError**" "error")
+  )
+)
+
+(define-method render_threshold_alpha
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_render_threshold_alpha")
+  (return-type "none")
+  (parameters
+    '("GdkBitmap*" "bitmap")
+    '("int" "src_x")
+    '("int" "src_y")
+    '("int" "dest_x")
+    '("int" "dest_y")
+    '("int" "width")
+    '("int" "height")
+    '("int" "alpha_threshold")
+  )
+)
+
+(define-method rotate_simple
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_rotate_simple")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("int" "angle")
+  )
+)
+
+(define-method get_colorspace
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_colorspace")
+  (return-type "GdkColorspace")
+)
+
+(define-method get_n_channels
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_n_channels")
+  (return-type "int")
+)
+
+(define-method get_has_alpha
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_has_alpha")
+  (return-type "gboolean")
+)
+
+(define-method get_bits_per_sample
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_bits_per_sample")
+  (return-type "int")
+)
+
+(define-method get_pixels
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_pixels")
+  (return-type "guchar*")
+)
+
+(define-method get_width
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_width")
+  (return-type "int")
+)
+
+(define-method get_height
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_height")
+  (return-type "int")
+)
+
+(define-method get_rowstride
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_rowstride")
+  (return-type "int")
+)
+
+(define-function pixbuf_new
+  (is-constructor-of "GdkPixbuf")
+  (c-name "gdk_pixbuf_new")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("GdkColorspace" "colorspace")
+    '("gboolean" "has_alpha")
+    '("int" "bits_per_sample")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-method copy
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_copy")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+)
+
+(define-method subpixbuf
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_new_subpixbuf")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("int" "src_x")
+    '("int" "src_y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-method fill
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_fill")
+  (return-type "none")
+  (parameters
+    '("guint32" "pixel")
+  )
+)
+
+(define-method save
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_save")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "filename")
+    '("const-char*" "type")
+    '("GError**" "error")
+  )
+  (varargs #t)
+)
+
+(define-method savev
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_savev")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "filename")
+    '("const-char*" "type")
+    '("char**" "option_keys" (null-ok))
+    '("char**" "option_values" (null-ok))
+    '("GError**" "error")
+  )
+)
+
+;;FIXME
+;; (define-method save_to_callback
+;;  (of-object "GdkPixbuf")
+;;  (c-name "gdk_pixbuf_save_to_callback")
+;;  (return-type "gboolean")
+;;)
+
+(define-method add_alpha
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_add_alpha")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("gboolean" "substitute_color")
+    '("guchar" "r")
+    '("guchar" "g")
+    '("guchar" "b")
+  )
+)
+
+(define-method copy_area
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_copy_area")
+  (return-type "none")
+  (parameters
+    '("int" "src_x")
+    '("int" "src_y")
+    '("int" "width")
+    '("int" "height")
+    '("GdkPixbuf*" "dest_pixbuf")
+    '("int" "dest_x")
+    '("int" "dest_y")
+  )
+)
+
+(define-method saturate_and_pixelate
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_saturate_and_pixelate")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "dest")
+    '("gfloat" "saturation")
+    '("gboolean" "pixelate")
+  )
+)
+
+(define-method scale
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_scale")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "dest")
+    '("int" "dest_x")
+    '("int" "dest_y")
+    '("int" "dest_width")
+    '("int" "dest_height")
+    '("double" "offset_x")
+    '("double" "offset_y")
+    '("double" "scale_x")
+    '("double" "scale_y")
+    '("GdkInterpType" "interp_type")
+  )
+)
+
+(define-method composite
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_composite")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "dest")
+    '("int" "dest_x")
+    '("int" "dest_y")
+    '("int" "dest_width")
+    '("int" "dest_height")
+    '("double" "offset_x")
+    '("double" "offset_y")
+    '("double" "scale_x")
+    '("double" "scale_y")
+    '("GdkInterpType" "interp_type")
+    '("int" "overall_alpha")
+  )
+)
+
+(define-method composite_color
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_composite_color")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "dest")
+    '("int" "dest_x")
+    '("int" "dest_y")
+    '("int" "dest_width")
+    '("int" "dest_height")
+    '("double" "offset_x")
+    '("double" "offset_y")
+    '("double" "scale_x")
+    '("double" "scale_y")
+    '("GdkInterpType" "interp_type")
+    '("int" "overall_alpha")
+    '("int" "check_x")
+    '("int" "check_y")
+    '("int" "check_size")
+    '("guint32" "color1")
+    '("guint32" "color2")
+  )
+)
+
+(define-method scale_simple
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_scale_simple")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("int" "dest_width")
+    '("int" "dest_height")
+    '("GdkInterpType" "interp_type")
+  )
+)
+
+(define-method composite_color_simple
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_composite_color_simple")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("int" "dest_width")
+    '("int" "dest_height")
+    '("GdkInterpType" "interp_type")
+    '("int" "overall_alpha")
+    '("int" "check_size")
+    '("guint32" "color1")
+    '("guint32" "color2")
+  )
+)
+
+(define-method save_to_callbackv
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_save_to_callbackv")
+  (return-type "gboolean")
+  (parameters
+    '("GdkPixbufSaveFunc" "save_func")
+    '("gpointer" "user_data")
+    '("const-char*" "type")
+    '("char**" "option_keys")
+    '("char**" "option_values")
+    '("GError**" "error")
+  )
+)
+
+(define-method save_to_buffer
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_save_to_buffer")
+  (return-type "gboolean")
+  (parameters
+    '("gchar**" "buffer")
+    '("gsize*" "buffer_size")
+    '("const-char*" "type")
+    '("GError**" "error")
+  )
+  (varargs #t)
+)
+
+(define-method save_to_bufferv
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_save_to_bufferv")
+  (return-type "gboolean")
+  (parameters
+    '("gchar**" "buffer")
+    '("gsize*" "buffer_size")
+    '("const-char*" "type")
+    '("char**" "option_keys")
+    '("char**" "option_values")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_option
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_get_option")
+  (return-type "const-char*")
+  (parameters
+    '("const-char*" "key")
+  )
+)
+
+(define-method flip
+  (of-object "GdkPixbuf")
+  (c-name "gdk_pixbuf_flip")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("gboolean" "horizontal")
+  )
+)
+
diff --git a/src/defs/GdkPixbufAlphaMode.defs b/src/defs/GdkPixbufAlphaMode.defs
new file mode 100644
index 0000000..7e12df0
--- /dev/null
+++ b/src/defs/GdkPixbufAlphaMode.defs
@@ -0,0 +1,10 @@
+(define-enum PixbufAlphaMode
+  (in-module "Gdk")
+  (c-name "GdkPixbufAlphaMode")
+  (gtype-id "GDK_TYPE_PIXBUF_ALPHA_MODE")
+  (values
+    '("bilevel" "GDK_PIXBUF_ALPHA_BILEVEL")
+    '("full" "GDK_PIXBUF_ALPHA_FULL")
+  )
+)
+
diff --git a/src/defs/GdkPixbufAnimation.defs b/src/defs/GdkPixbufAnimation.defs
new file mode 100644
index 0000000..73adf33
--- /dev/null
+++ b/src/defs/GdkPixbufAnimation.defs
@@ -0,0 +1,51 @@
+(define-object PixbufAnimation
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkPixbufAnimation")
+  (gtype-id "GDK_TYPE_PIXBUF_ANIMATION")
+)
+
+(define-function pixbuf_animation_new_from_file
+  (is-constructor-of "GdkPixbufAnimation")
+  (c-name "gdk_pixbuf_animation_new_from_file")
+  (caller-owns-return #t)
+  (return-type "GdkPixbufAnimation*")
+  (parameters
+    '("const-char*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_width
+  (of-object "GdkPixbufAnimation")
+  (c-name "gdk_pixbuf_animation_get_width")
+  (return-type "int")
+)
+
+(define-method get_height
+  (of-object "GdkPixbufAnimation")
+  (c-name "gdk_pixbuf_animation_get_height")
+  (return-type "int")
+)
+
+(define-method is_static_image
+  (of-object "GdkPixbufAnimation")
+  (c-name "gdk_pixbuf_animation_is_static_image")
+  (return-type "gboolean")
+)
+
+(define-method get_static_image
+  (of-object "GdkPixbufAnimation")
+  (c-name "gdk_pixbuf_animation_get_static_image")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method get_iter
+  (of-object "GdkPixbufAnimation")
+  (c-name "gdk_pixbuf_animation_get_iter")
+  (return-type "GdkPixbufAnimationIter*")
+  (parameters
+    '("const-GTimeVal*" "start_time")
+  )
+)
+
diff --git a/src/defs/GdkPixbufAnimationIter.defs b/src/defs/GdkPixbufAnimationIter.defs
new file mode 100644
index 0000000..67cd117
--- /dev/null
+++ b/src/defs/GdkPixbufAnimationIter.defs
@@ -0,0 +1,34 @@
+(define-object PixbufAnimationIter
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkPixbufAnimationIter")
+  (gtype-id "GDK_TYPE_PIXBUF_ANIMATION_ITER")
+)
+
+(define-method get_delay_time
+  (of-object "GdkPixbufAnimationIter")
+  (c-name "gdk_pixbuf_animation_iter_get_delay_time")
+  (return-type "int")
+)
+
+(define-method get_pixbuf
+  (of-object "GdkPixbufAnimationIter")
+  (c-name "gdk_pixbuf_animation_iter_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method on_currently_loading_frame
+  (of-object "GdkPixbufAnimationIter")
+  (c-name "gdk_pixbuf_animation_iter_on_currently_loading_frame")
+  (return-type "gboolean")
+)
+
+(define-method advance
+  (of-object "GdkPixbufAnimationIter")
+  (c-name "gdk_pixbuf_animation_iter_advance")
+  (return-type "gboolean")
+  (parameters
+    '("const-GTimeVal*" "current_time")
+  )
+)
+
diff --git a/src/defs/GdkPixbufError.defs b/src/defs/GdkPixbufError.defs
new file mode 100644
index 0000000..680344b
--- /dev/null
+++ b/src/defs/GdkPixbufError.defs
@@ -0,0 +1,17 @@
+(define-enum PixbufError
+  (in-module "Gdk")
+  (c-name "GdkPixbufError")
+  (gtype-id "GDK_TYPE_PIXBUF_ERROR")
+  (values
+    '("header-corrupt" "GDK_PIXBUF_ERROR_HEADER_CORRUPT")
+    '("pixel-corrupt" "GDK_PIXBUF_ERROR_PIXEL_CORRUPT")
+    '("unknown-format" "GDK_PIXBUF_ERROR_UNKNOWN_FORMAT")
+    '("corrupt-image" "GDK_PIXBUF_ERROR_CORRUPT_IMAGE")
+    '("insufficient-memory" "GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY")
+    '("bad-option-value" "GDK_PIXBUF_ERROR_BAD_OPTION_VALUE")
+    '("unknown-type" "GDK_PIXBUF_ERROR_UNKNOWN_TYPE")
+    '("unsupported-operation" "GDK_PIXBUF_ERROR_UNSUPPORTED_OPERATION")
+    '("failed" "GDK_PIXBUF_ERROR_FAILED")
+  )
+)
+
diff --git a/src/defs/GdkPixbufFormat.defs b/src/defs/GdkPixbufFormat.defs
new file mode 100644
index 0000000..bdb6398
--- /dev/null
+++ b/src/defs/GdkPixbufFormat.defs
@@ -0,0 +1,62 @@
+(define-method get_name
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_get_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_description
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_get_description")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_mime_types
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_get_mime_types")
+  (caller-owns-return #t)
+  (return-type "gchar**")
+)
+
+(define-method get_extensions
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_get_extensions")
+  (caller-owns-return #t)
+  (return-type "gchar**")
+)
+
+(define-method is_writable
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_is_writable")
+  (return-type "gboolean")
+)
+
+(define-method is_scalable
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_is_scalable")
+  (return-type "gboolean")
+)
+
+(define-method is_disabled
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_is_disabled")
+  (return-type "gboolean")
+)
+
+(define-method set_disabled
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_set_disabled")
+  (return-type "none")
+  (parameters
+    '("gboolean" "disabled")
+  )
+)
+
+(define-method get_license
+  (of-object "GdkPixbufFormat")
+  (c-name "gdk_pixbuf_format_get_license")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
diff --git a/src/defs/GdkPixbufLoader.defs b/src/defs/GdkPixbufLoader.defs
new file mode 100644
index 0000000..83b70cf
--- /dev/null
+++ b/src/defs/GdkPixbufLoader.defs
@@ -0,0 +1,96 @@
+(define-object PixbufLoader
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkPixbufLoader")
+  (gtype-id "GDK_TYPE_PIXBUF_LOADER")
+)
+
+(define-function pixbuf_loader_new_with_type
+  (is-constructor-of "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_new_with_type")
+  (caller-owns-return #t)
+  (return-type "GdkPixbufLoader*")
+  (parameters
+    '("const-char*" "image_type")
+    '("GError**" "error")
+  )
+)
+
+(define-method write
+  (of-object "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_write")
+  (return-type "gboolean")
+  (parameters
+    '("const-guchar*" "buf")
+    '("gsize" "count")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_pixbuf
+  (of-object "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method get_animation
+  (of-object "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_get_animation")
+  (return-type "GdkPixbufAnimation*")
+)
+
+(define-method close
+  (of-object "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_close")
+  (return-type "gboolean")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-method set_size
+  (of-object "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_set_size")
+  (return-type "none")
+  (parameters
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-method get_format
+  (of-object "GdkPixbufLoader")
+  (c-name "gdk_pixbuf_loader_get_format")
+  (return-type "GdkPixbufFormat*")
+)
+
+(define-virtual size_prepared
+  (of-object "GdkPixbufLoader")
+  (return-type "none")
+  (parameters
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-virtual area_prepared
+  (of-object "GdkPixbufLoader")
+  (return-type "none")
+)
+
+(define-virtual area_updated
+  (of-object "GdkPixbufLoader")
+  (return-type "none")
+  (parameters
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-virtual closed
+  (of-object "GdkPixbufLoader")
+  (return-type "none")
+)
+
diff --git a/src/defs/GdkPixbufRotation.defs b/src/defs/GdkPixbufRotation.defs
new file mode 100644
index 0000000..c1b16e5
--- /dev/null
+++ b/src/defs/GdkPixbufRotation.defs
@@ -0,0 +1,12 @@
+(define-enum PixbufRotation
+  (in-module "Gdk")
+  (c-name "GdkPixbufRotation")
+  (gtype-id "GDK_TYPE_PIXBUF_ROTATION")
+  (values
+    '("none" "GDK_PIXBUF_ROTATE_NONE")
+    '("counterclockwise" "GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE")
+    '("upsidedown" "GDK_PIXBUF_ROTATE_UPSIDEDOWN")
+    '("clockwise" "GDK_PIXBUF_ROTATE_CLOCKWISE")
+  )
+)
+
diff --git a/src/defs/GdkPixbufSimpleAnim.defs b/src/defs/GdkPixbufSimpleAnim.defs
new file mode 100644
index 0000000..d164d20
--- /dev/null
+++ b/src/defs/GdkPixbufSimpleAnim.defs
@@ -0,0 +1,28 @@
+(define-object PixbufSimpleAnim
+  (in-module "Gdk")
+  (parent "GdkPixbufAnimation")
+  (c-name "GdkPixbufSimpleAnim")
+  (gtype-id "GDK_TYPE_PIXBUF_SIMPLE_ANIM")
+)
+
+(define-function pixbuf_simple_anim_new
+  (is-constructor-of "GdkPixbufSimpleAnim")
+  (c-name "gdk_pixbuf_simple_anim_new")
+  (caller-owns-return #t)
+  (return-type "GdkPixbufSimpleAnim*")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+    '("gfloat" "rate")
+  )
+)
+
+(define-method add_frame
+  (of-object "GdkPixbufSimpleAnim")
+  (c-name "gdk_pixbuf_simple_anim_add_frame")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
diff --git a/src/defs/GdkPixbufSimpleAnimIter.defs b/src/defs/GdkPixbufSimpleAnimIter.defs
new file mode 100644
index 0000000..255a1c9
--- /dev/null
+++ b/src/defs/GdkPixbufSimpleAnimIter.defs
@@ -0,0 +1,7 @@
+(define-object PixbufSimpleAnimIter
+  (in-module "Gdk")
+  (parent "GdkPixbufAnimationIter")
+  (c-name "GdkPixbufSimpleAnimIter")
+  (gtype-id "GDK_TYPE_PIXBUF_SIMPLE_ANIM_ITER")
+)
+
diff --git a/src/defs/GdkPixdata.defs b/src/defs/GdkPixdata.defs
new file mode 100644
index 0000000..1502d9d
--- /dev/null
+++ b/src/defs/GdkPixdata.defs
@@ -0,0 +1,40 @@
+(define-method serialize
+  (of-object "GdkPixdata")
+  (c-name "gdk_pixdata_serialize")
+  (return-type "guint8*")
+  (parameters
+    '("guint*" "stream_length_p")
+  )
+)
+
+(define-method deserialize
+  (of-object "GdkPixdata")
+  (c-name "gdk_pixdata_deserialize")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "stream_length")
+    '("const-guint8*" "stream")
+    '("GError**" "error")
+  )
+)
+
+(define-method from_pixbuf
+  (of-object "GdkPixdata")
+  (c-name "gdk_pixdata_from_pixbuf")
+  (return-type "gpointer")
+  (parameters
+    '("const-GdkPixbuf*" "pixbuf")
+    '("gboolean" "use_rle")
+  )
+)
+
+(define-method to_csource
+  (of-object "GdkPixdata")
+  (c-name "gdk_pixdata_to_csource")
+  (return-type "GString*")
+  (parameters
+    '("const-gchar*" "name")
+    '("GdkPixdataDumpType" "dump_type")
+  )
+)
+
diff --git a/src/defs/GdkPoint.defs b/src/defs/GdkPoint.defs
new file mode 100644
index 0000000..c938d88
--- /dev/null
+++ b/src/defs/GdkPoint.defs
@@ -0,0 +1,9 @@
+(define-boxed Point
+  (in-module "Gdk")
+  (c-name "GdkPoint")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
diff --git a/src/defs/GdkPropMode.defs b/src/defs/GdkPropMode.defs
new file mode 100644
index 0000000..fc9a3a8
--- /dev/null
+++ b/src/defs/GdkPropMode.defs
@@ -0,0 +1,11 @@
+(define-enum PropMode
+  (in-module "Gdk")
+  (c-name "GdkPropMode")
+  (gtype-id "GDK_TYPE_PROP_MODE")
+  (values
+    '("replace" "GDK_PROP_MODE_REPLACE")
+    '("prepend" "GDK_PROP_MODE_PREPEND")
+    '("append" "GDK_PROP_MODE_APPEND")
+  )
+)
+
diff --git a/src/defs/GdkPropertyState.defs b/src/defs/GdkPropertyState.defs
new file mode 100644
index 0000000..9073f37
--- /dev/null
+++ b/src/defs/GdkPropertyState.defs
@@ -0,0 +1,10 @@
+(define-enum PropertyState
+  (in-module "Gdk")
+  (c-name "GdkPropertyState")
+  (gtype-id "GDK_TYPE_PROPERTY_STATE")
+  (values
+    '("new-value" "GDK_PROPERTY_NEW_VALUE")
+    '("delete" "GDK_PROPERTY_DELETE")
+  )
+)
+
diff --git a/src/defs/GdkRGBA.defs b/src/defs/GdkRGBA.defs
new file mode 100644
index 0000000..ab95e04
--- /dev/null
+++ b/src/defs/GdkRGBA.defs
@@ -0,0 +1,40 @@
+(define-boxed RGBA
+  (in-module "Gdk")
+  (c-name "GdkRGBA")
+  (copy-func "gdk_rgba_copy")
+  (release-func "gdk_rgba_free")
+  (fields
+    '("gdouble" "red")
+    '("gdouble" "green")
+    '("gdouble" "blue")
+    '("gdouble" "alpha")
+  )
+)
+
+(define-method copy
+  (of-object "GdkRGBA")
+  (c-name "gdk_rgba_copy")
+  (return-type "GdkRGBA*")
+)
+
+(define-method free
+  (of-object "GdkRGBA")
+  (c-name "gdk_rgba_free")
+  (return-type "none")
+)
+
+(define-method hash
+  (of-object "GdkRGBA")
+  (c-name "gdk_rgba_hash")
+  (return-type "guint")
+)
+
+(define-method equal
+  (of-object "GdkRGBA")
+  (c-name "gdk_rgba_equal")
+  (return-type "gboolean")
+  (parameters
+    '("const-GdkRGBA*" "other")
+  )
+)
+
diff --git a/src/defs/GdkRectangle.defs b/src/defs/GdkRectangle.defs
new file mode 100644
index 0000000..7920604
--- /dev/null
+++ b/src/defs/GdkRectangle.defs
@@ -0,0 +1,32 @@
+(define-boxed Rectangle
+  (in-module "Gdk")
+  (c-name "GdkRectangle")
+  (gtype-id "GDK_TYPE_RECTANGLE")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method intersect
+  (of-object "GdkRectangle")
+  (c-name "gdk_rectangle_intersect")
+  (return-type "gboolean")
+  (parameters
+    '("GdkRectangle*" "src2")
+    '("GdkRectangle*" "dest")
+  )
+)
+
+(define-method union
+  (of-object "GdkRectangle")
+  (c-name "gdk_rectangle_union")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "src2")
+    '("GdkRectangle*" "dest")
+  )
+)
+
diff --git a/src/defs/GdkRgbDither.defs b/src/defs/GdkRgbDither.defs
new file mode 100644
index 0000000..681eb8c
--- /dev/null
+++ b/src/defs/GdkRgbDither.defs
@@ -0,0 +1,11 @@
+(define-enum RgbDither
+  (in-module "Gdk")
+  (c-name "GdkRgbDither")
+  (gtype-id "GDK_TYPE_RGB_DITHER")
+  (values
+    '("none" "GDK_RGB_DITHER_NONE")
+    '("normal" "GDK_RGB_DITHER_NORMAL")
+    '("max" "GDK_RGB_DITHER_MAX")
+  )
+)
+
diff --git a/src/defs/GdkScreen.defs b/src/defs/GdkScreen.defs
new file mode 100644
index 0000000..f05bc35
--- /dev/null
+++ b/src/defs/GdkScreen.defs
@@ -0,0 +1,198 @@
+(define-object Screen
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkScreen")
+  (gtype-id "GDK_TYPE_SCREEN")
+)
+
+(define-method get_system_visual
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_system_visual")
+  (return-type "GdkVisual*")
+)
+
+(define-method get_rgba_visual
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_rgba_visual")
+  (return-type "GdkVisual*")
+)
+
+(define-method get_root_window
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_root_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method get_display
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_display")
+  (return-type "GdkDisplay*")
+)
+
+(define-method get_number
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_number")
+  (return-type "gint")
+)
+
+(define-method get_width
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_width")
+  (return-type "gint")
+)
+
+(define-method get_height
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_height")
+  (return-type "gint")
+)
+
+(define-method get_width_mm
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_width_mm")
+  (return-type "gint")
+)
+
+(define-method get_height_mm
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_height_mm")
+  (return-type "gint")
+)
+
+(define-method list_visuals
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_list_visuals")
+  (caller-owns-return #l)
+  (return-type "GList-GdkVisual*")
+)
+
+(define-method get_toplevel_windows
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_toplevel_windows")
+  (caller-owns-return #l)
+  (return-type "GList-GdkWindow*")
+)
+
+(define-method make_display_name
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_make_display_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_n_monitors
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_n_monitors")
+  (return-type "gint")
+)
+
+(define-method get_monitor_geometry
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_monitor_geometry")
+  (return-type "none")
+  (parameters
+    '("gint" "monitor_num")
+    '("GdkRectangle*" "dest")
+  )
+)
+
+(define-method get_monitor_at_point
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_monitor_at_point")
+  (return-type "gint")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_monitor_at_window
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_monitor_at_window")
+  (return-type "gint")
+  (parameters
+    '("GdkWindow*" "window")
+  )
+)
+
+(define-method get_setting
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_setting")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "name")
+    '("GValue*" "value")
+  )
+)
+
+(define-method alternative_dialog_button_order
+  (of-object "GdkScreen")
+  (c-name "gtk_alternative_dialog_button_order")
+  (return-type "gboolean")
+)
+
+(define-virtual size_changed
+  (of-object "GdkScreen")
+  (return-type "none")
+)
+
+(define-method is_composited
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_is_composited")
+  (return-type "gboolean")
+)
+
+(define-method set_font_options
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_set_font_options")
+  (return-type "none")
+  (parameters
+    '("const-cairo_font_options_t*" "options")
+  )
+)
+
+(define-method get_font_options
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_font_options")
+  (return-type "const-cairo_font_options_t*")
+)
+
+(define-method set_resolution
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_set_resolution")
+  (return-type "none")
+  (parameters
+    '("gdouble" "dpi")
+  )
+)
+
+(define-method get_resolution
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_resolution")
+  (return-type "gdouble")
+)
+
+(define-method get_active_window
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_active_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method get_window_stack
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_window_stack")
+  (caller-owns-return #f)
+  (return-type "GList-GdkWindow*")
+)
+
+(define-virtual composited_changed
+  (of-object "GdkScreen")
+  (return-type "none")
+)
+
+(define-function get_default
+  (of-object "GdkScreen")
+  (c-name "gdk_screen_get_default")
+  (return-type "GdkScreen*")
+)
+
diff --git a/src/defs/GdkScrollDirection.defs b/src/defs/GdkScrollDirection.defs
new file mode 100644
index 0000000..7dad16d
--- /dev/null
+++ b/src/defs/GdkScrollDirection.defs
@@ -0,0 +1,12 @@
+(define-enum ScrollDirection
+  (in-module "Gdk")
+  (c-name "GdkScrollDirection")
+  (gtype-id "GDK_TYPE_SCROLL_DIRECTION")
+  (values
+    '("up" "GDK_SCROLL_UP")
+    '("down" "GDK_SCROLL_DOWN")
+    '("left" "GDK_SCROLL_LEFT")
+    '("right" "GDK_SCROLL_RIGHT")
+  )
+)
+
diff --git a/src/defs/GdkSettingAction.defs b/src/defs/GdkSettingAction.defs
new file mode 100644
index 0000000..0a28c1e
--- /dev/null
+++ b/src/defs/GdkSettingAction.defs
@@ -0,0 +1,11 @@
+(define-enum SettingAction
+  (in-module "Gdk")
+  (c-name "GdkSettingAction")
+  (gtype-id "GDK_TYPE_SETTING_ACTION")
+  (values
+    '("new" "GDK_SETTING_ACTION_NEW")
+    '("changed" "GDK_SETTING_ACTION_CHANGED")
+    '("deleted" "GDK_SETTING_ACTION_DELETED")
+  )
+)
+
diff --git a/src/defs/GdkStatus.defs b/src/defs/GdkStatus.defs
new file mode 100644
index 0000000..aa68ceb
--- /dev/null
+++ b/src/defs/GdkStatus.defs
@@ -0,0 +1,14 @@
+(define-enum Status
+  (unnecessary)
+  (in-module "Gdk")
+  (c-name "GdkStatus")
+  (gtype-id "GDK_TYPE_STATUS")
+  (values
+    '("ok" "GDK_OK")
+    '("error" "GDK_ERROR")
+    '("error-param" "GDK_ERROR_PARAM")
+    '("error-file" "GDK_ERROR_FILE")
+    '("error-mem" "GDK_ERROR_MEM")
+  )
+)
+
diff --git a/src/defs/GdkSubwindowMode.defs b/src/defs/GdkSubwindowMode.defs
new file mode 100644
index 0000000..14db9ac
--- /dev/null
+++ b/src/defs/GdkSubwindowMode.defs
@@ -0,0 +1,10 @@
+(define-enum SubwindowMode
+  (in-module "Gdk")
+  (c-name "GdkSubwindowMode")
+  (gtype-id "GDK_TYPE_SUBWINDOW_MODE")
+  (values
+    '("clip-by-children" "GDK_CLIP_BY_CHILDREN")
+    '("include-inferiors" "GDK_INCLUDE_INFERIORS")
+  )
+)
+
diff --git a/src/defs/GdkVisibilityState.defs b/src/defs/GdkVisibilityState.defs
new file mode 100644
index 0000000..7a730a7
--- /dev/null
+++ b/src/defs/GdkVisibilityState.defs
@@ -0,0 +1,11 @@
+(define-enum VisibilityState
+  (in-module "Gdk")
+  (c-name "GdkVisibilityState")
+  (gtype-id "GDK_TYPE_VISIBILITY_STATE")
+  (values
+    '("unobscured" "GDK_VISIBILITY_UNOBSCURED")
+    '("partial" "GDK_VISIBILITY_PARTIAL")
+    '("fully-obscured" "GDK_VISIBILITY_FULLY_OBSCURED")
+  )
+)
+
diff --git a/src/defs/GdkVisual.defs b/src/defs/GdkVisual.defs
new file mode 100644
index 0000000..cded37a
--- /dev/null
+++ b/src/defs/GdkVisual.defs
@@ -0,0 +1,46 @@
+(define-object Visual
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkVisual")
+  (gtype-id "GDK_TYPE_VISUAL")
+  (fields
+    '("GdkVisualType" "type")
+    '("gint" "depth")
+    '("GdkByteOrder" "byte_order")
+    '("gint" "colormap_size")
+    '("gint" "bits_per_rgb")
+    '("guint32" "red_mask")
+    '("gint" "red_shift")
+    '("gint" "red_prec")
+    '("guint32" "green_mask")
+    '("gint" "green_shift")
+    '("gint" "green_prec")
+    '("guint32" "blue_mask")
+    '("gint" "blue_shift")
+    '("gint" "blue_prec")
+  )
+)
+
+(define-function visual_get_best_with_both
+  (is-constructor-of "GdkVisual")
+  (c-name "gdk_visual_get_best_with_both")
+  (caller-owns-return #t)
+  (return-type "GdkVisual*")
+  (parameters
+    '("gint" "depth")
+    '("GdkVisualType" "visual_type")
+  )
+)
+
+(define-method get_screen
+  (of-object "GdkVisual")
+  (c-name "gdk_visual_get_screen")
+  (return-type "GdkScreen*")
+)
+
+(define-function get_best_depth
+  (of-object "GdkVisual")
+  (c-name "gdk_visual_get_best_depth")
+  (return-type "gint")
+)
+
diff --git a/src/defs/GdkVisualType.defs b/src/defs/GdkVisualType.defs
new file mode 100644
index 0000000..75c5862
--- /dev/null
+++ b/src/defs/GdkVisualType.defs
@@ -0,0 +1,14 @@
+(define-enum VisualType
+  (in-module "Gdk")
+  (c-name "GdkVisualType")
+  (gtype-id "GDK_TYPE_VISUAL_TYPE")
+  (values
+    '("static-gray" "GDK_VISUAL_STATIC_GRAY")
+    '("grayscale" "GDK_VISUAL_GRAYSCALE")
+    '("static-color" "GDK_VISUAL_STATIC_COLOR")
+    '("pseudo-color" "GDK_VISUAL_PSEUDO_COLOR")
+    '("true-color" "GDK_VISUAL_TRUE_COLOR")
+    '("direct-color" "GDK_VISUAL_DIRECT_COLOR")
+  )
+)
+
diff --git a/src/defs/GdkWMDecoration.defs b/src/defs/GdkWMDecoration.defs
new file mode 100644
index 0000000..1d84382
--- /dev/null
+++ b/src/defs/GdkWMDecoration.defs
@@ -0,0 +1,16 @@
+(define-flags WMDecoration
+  (unnecessary)
+  (in-module "Gdk")
+  (c-name "GdkWMDecoration")
+  (gtype-id "GDK_TYPE_WM_DECORATION")
+  (values
+    '("all" "GDK_DECOR_ALL")
+    '("border" "GDK_DECOR_BORDER")
+    '("resizeh" "GDK_DECOR_RESIZEH")
+    '("title" "GDK_DECOR_TITLE")
+    '("menu" "GDK_DECOR_MENU")
+    '("minimize" "GDK_DECOR_MINIMIZE")
+    '("maximize" "GDK_DECOR_MAXIMIZE")
+  )
+)
+
diff --git a/src/defs/GdkWMFunction.defs b/src/defs/GdkWMFunction.defs
new file mode 100644
index 0000000..40e00e9
--- /dev/null
+++ b/src/defs/GdkWMFunction.defs
@@ -0,0 +1,15 @@
+(define-flags WMFunction
+  (unnecessary)
+  (in-module "Gdk")
+  (c-name "GdkWMFunction")
+  (gtype-id "GDK_TYPE_WM_FUNCTION")
+  (values
+    '("all" "GDK_FUNC_ALL")
+    '("resize" "GDK_FUNC_RESIZE")
+    '("move" "GDK_FUNC_MOVE")
+    '("minimize" "GDK_FUNC_MINIMIZE")
+    '("maximize" "GDK_FUNC_MAXIMIZE")
+    '("close" "GDK_FUNC_CLOSE")
+  )
+)
+
diff --git a/src/defs/GdkWindow.defs b/src/defs/GdkWindow.defs
new file mode 100644
index 0000000..ea79c2c
--- /dev/null
+++ b/src/defs/GdkWindow.defs
@@ -0,0 +1,825 @@
+(define-object Window
+  (in-module "Gdk")
+  (parent "GObject")
+  (c-name "GdkWindow")
+  (gtype-id "GDK_TYPE_WINDOW")
+)
+
+(define-method drag_begin
+  (of-object "GdkWindow")
+  (c-name "gdk_drag_begin")
+  (return-type "GdkDragContext*")
+  (parameters
+    '("GList*" "targets")
+  )
+)
+
+(define-method property_get
+  (of-object "GdkWindow")
+  (c-name "gdk_property_get")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "property")
+    '("GdkAtom" "type")
+    '("gulong" "offset")
+    '("gulong" "length")
+    '("gint" "pdelete")
+    '("GdkAtom*" "actual_property_type")
+    '("gint*" "actual_format")
+    '("gint*" "actual_length")
+    '("guchar**" "data")
+  )
+)
+
+(define-method property_change
+  (of-object "GdkWindow")
+  (c-name "gdk_property_change")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "property")
+    '("GdkAtom" "type")
+    '("gint" "format")
+    '("GdkPropMode" "mode")
+    '("const-guchar*" "data")
+    '("gint" "nelements")
+  )
+)
+
+(define-method property_delete
+  (of-object "GdkWindow")
+  (c-name "gdk_property_delete")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "property")
+  )
+)
+
+(define-method selection_convert
+  (of-object "GdkWindow")
+  (c-name "gdk_selection_convert")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "selection")
+    '("GdkAtom" "target")
+    '("guint32" "time")
+  )
+)
+
+(define-method selection_property_get
+  (of-object "GdkWindow")
+  (c-name "gdk_selection_property_get")
+  (return-type "gboolean")
+  (parameters
+    '("guchar**" "data")
+    '("GdkAtom*" "prop_type")
+    '("gint*" "prop_format")
+  )
+)
+
+(define-function new
+  (is-constructor-of "GdkWindow")
+  (c-name "gdk_window_new")
+  (caller-owns-return #t)
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkWindow*" "parent")
+    '("GdkWindowAttr*" "attributes")
+    '("gint" "attributes_mask")
+  )
+)
+
+(define-method set_keep_above
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_keep_above")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method set_keep_below
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_keep_below")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method destroy
+  (of-object "GdkWindow")
+  (c-name "gdk_window_destroy")
+  (return-type "none")
+)
+
+(define-method get_window_type
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_window_type")
+  (return-type "GdkWindowType")
+)
+
+(define-method show
+  (of-object "GdkWindow")
+  (c-name "gdk_window_show")
+  (return-type "none")
+)
+
+(define-method hide
+  (of-object "GdkWindow")
+  (c-name "gdk_window_hide")
+  (return-type "none")
+)
+
+(define-method withdraw
+  (of-object "GdkWindow")
+  (c-name "gdk_window_withdraw")
+  (return-type "none")
+)
+
+(define-method move
+  (of-object "GdkWindow")
+  (c-name "gdk_window_move")
+  (return-type "none")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method resize
+  (of-object "GdkWindow")
+  (c-name "gdk_window_resize")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method move_resize
+  (of-object "GdkWindow")
+  (c-name "gdk_window_move_resize")
+  (return-type "none")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method reparent
+  (of-object "GdkWindow")
+  (c-name "gdk_window_reparent")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "new_parent")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method raise
+  (of-object "GdkWindow")
+  (c-name "gdk_window_raise")
+  (return-type "none")
+)
+
+(define-method lower
+  (of-object "GdkWindow")
+  (c-name "gdk_window_lower")
+  (return-type "none")
+)
+
+(define-method focus
+  (of-object "GdkWindow")
+  (c-name "gdk_window_focus")
+  (return-type "none")
+  (parameters
+    '("guint32" "timestamp" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-method set_user_data
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_user_data")
+  (return-type "none")
+  (parameters
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method get_user_data
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_user_data")
+  (return-type "none")
+  (parameters
+    '("gpointer*" "user_data")
+  )
+)
+
+(define-method set_override_redirect
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_override_redirect")
+  (return-type "none")
+  (parameters
+    '("gboolean" "override_redirect")
+  )
+)
+
+(define-method add_filter
+  (of-object "GdkWindow")
+  (c-name "gdk_window_add_filter")
+  (return-type "none")
+  (parameters
+    '("GdkFilterFunc" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-method remove_filter
+  (of-object "GdkWindow")
+  (c-name "gdk_window_remove_filter")
+  (return-type "none")
+  (parameters
+    '("GdkFilterFunc" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-method scroll
+  (of-object "GdkWindow")
+  (c-name "gdk_window_scroll")
+  (return-type "none")
+  (parameters
+    '("gint" "dx")
+    '("gint" "dy")
+  )
+)
+
+(define-method set_child_shapes
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_child_shapes")
+  (return-type "none")
+)
+
+(define-method merge_child_shapes
+  (of-object "GdkWindow")
+  (c-name "gdk_window_merge_child_shapes")
+  (return-type "none")
+)
+
+(define-method is_visible
+  (of-object "GdkWindow")
+  (c-name "gdk_window_is_visible")
+  (return-type "gboolean")
+)
+
+(define-method is_viewable
+  (of-object "GdkWindow")
+  (c-name "gdk_window_is_viewable")
+  (return-type "gboolean")
+)
+
+(define-method get_state
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_state")
+  (return-type "GdkWindowState")
+)
+
+(define-method set_static_gravities
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_static_gravities")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "use_static")
+  )
+)
+
+(define-method set_type_hint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_type_hint")
+  (return-type "none")
+  (parameters
+    '("GdkWindowTypeHint" "hint")
+  )
+)
+
+(define-method set_modal_hint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_modal_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "modal")
+  )
+)
+
+(define-method set_skip_taskbar_hint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_skip_taskbar_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "modal")
+  )
+)
+
+(define-method set_skip_pager_hint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_skip_pager_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "modal")
+  )
+)
+
+(define-method set_geometry_hints
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_geometry_hints")
+  (return-type "none")
+  (parameters
+    '("GdkGeometry*" "geometry")
+    '("GdkWindowHints" "flags")
+  )
+)
+
+(define-method begin_paint_rect
+  (of-object "GdkWindow")
+  (c-name "gdk_window_begin_paint_rect")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "rectangle")
+  )
+)
+
+(define-method begin_paint_region
+  (of-object "GdkWindow")
+  (c-name "gdk_window_begin_paint_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "region")
+  )
+)
+
+(define-method end_paint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_end_paint")
+  (return-type "none")
+)
+
+(define-method set_title
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method set_role
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_role")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "role")
+  )
+)
+
+(define-method set_transient_for
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_transient_for")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "leader")
+  )
+)
+
+(define-method set_background
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_background")
+  (return-type "none")
+  (parameters
+    '("GdkColor*" "color")
+  )
+)
+
+(define-method set_cursor
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_cursor")
+  (return-type "none")
+  (parameters
+    '("GdkCursor*" "cursor" (null-ok))
+  )
+)
+
+(define-method get_geometry
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_geometry")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method get_position
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_position")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-method get_origin
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_origin")
+  (return-type "gint")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-method get_root_origin
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_root_origin")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-method get_frame_extents
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_frame_extents")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "rect")
+  )
+)
+
+(define-method get_pointer
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_pointer")
+  (return-type "GdkWindow*")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("GdkModifierType*" "mask")
+  )
+)
+
+(define-method get_parent
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_parent")
+  (return-type "GdkWindow*")
+)
+
+(define-method get_toplevel
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_toplevel")
+  (return-type "GdkWindow*")
+)
+
+(define-method get_children
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_children")
+  (caller-owns-return #l)
+  (return-type "GList-GdkWindow*")
+)
+
+(define-method peek_children
+  (of-object "GdkWindow")
+  (c-name "gdk_window_peek_children")
+  (return-type "GList-GdkWindow*")
+)
+
+(define-method get_events
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_events")
+  (return-type "GdkEventMask")
+)
+
+(define-method set_events
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_events")
+  (return-type "none")
+  (parameters
+    '("GdkEventMask" "event_mask")
+  )
+)
+
+(define-method set_icon_list
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_icon_list")
+  (return-type "none")
+  (parameters
+    '("GList-GdkPixbuf*" "pixbufs")
+  )
+)
+
+(define-method set_icon_name
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method set_group
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_group")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "leader")
+  )
+)
+
+(define-method get_group
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_group")
+  (return-type "GdkWindow*")
+)
+
+(define-method set_decorations
+  (unnecessary)
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_decorations")
+  (return-type "none")
+  (parameters
+    '("GdkWMDecoration" "decorations")
+  )
+)
+
+(define-method get_decorations
+  (unnecessary)
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_decorations")
+  (return-type "gboolean")
+  (parameters
+    '("GdkWMDecoration*" "decorations")
+  )
+)
+
+(define-method set_functions
+  (unnecessary)
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_functions")
+  (return-type "none")
+  (parameters
+    '("GdkWMFunction" "functions")
+  )
+)
+
+(define-method iconify
+  (of-object "GdkWindow")
+  (c-name "gdk_window_iconify")
+  (return-type "none")
+)
+
+(define-method deiconify
+  (of-object "GdkWindow")
+  (c-name "gdk_window_deiconify")
+  (return-type "none")
+)
+
+(define-method stick
+  (of-object "GdkWindow")
+  (c-name "gdk_window_stick")
+  (return-type "none")
+)
+
+(define-method unstick
+  (of-object "GdkWindow")
+  (c-name "gdk_window_unstick")
+  (return-type "none")
+)
+
+(define-method maximize
+  (of-object "GdkWindow")
+  (c-name "gdk_window_maximize")
+  (return-type "none")
+)
+
+(define-method unmaximize
+  (of-object "GdkWindow")
+  (c-name "gdk_window_unmaximize")
+  (return-type "none")
+)
+
+(define-method fullscreen
+  (of-object "GdkWindow")
+  (c-name "gdk_window_fullscreen")
+  (return-type "none")
+)
+
+(define-method unfullscreen
+  (of-object "GdkWindow")
+  (c-name "gdk_window_unfullscreen")
+  (return-type "none")
+)
+
+(define-method register_dnd
+  (of-object "GdkWindow")
+  (c-name "gdk_window_register_dnd")
+  (return-type "none")
+)
+
+(define-method begin_resize_drag
+  (of-object "GdkWindow")
+  (c-name "gdk_window_begin_resize_drag")
+  (return-type "none")
+  (parameters
+    '("GdkWindowEdge" "edge")
+    '("gint" "button")
+    '("gint" "root_x")
+    '("gint" "root_y")
+    '("guint32" "timestamp")
+  )
+)
+
+(define-method begin_move_drag
+  (of-object "GdkWindow")
+  (c-name "gdk_window_begin_move_drag")
+  (return-type "none")
+  (parameters
+    '("gint" "button")
+    '("gint" "root_x")
+    '("gint" "root_y")
+    '("guint32" "timestamp")
+  )
+)
+
+(define-method invalidate_rect
+  (of-object "GdkWindow")
+  (c-name "gdk_window_invalidate_rect")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "rect" (null-ok))
+    '("gboolean" "invalidate_children")
+  )
+)
+
+(define-method invalidate_region
+  (of-object "GdkWindow")
+  (c-name "gdk_window_invalidate_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "region")
+    '("gboolean" "invalidate_children")
+  )
+)
+
+(define-method get_update_area
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_update_area")
+  (caller-owns-return #t)
+  (return-type "cairo_region_t*")
+)
+
+(define-method freeze_updates
+  (of-object "GdkWindow")
+  (c-name "gdk_window_freeze_updates")
+  (return-type "none")
+)
+
+(define-method thaw_updates
+  (of-object "GdkWindow")
+  (c-name "gdk_window_thaw_updates")
+  (return-type "none")
+)
+
+(define-method process_updates
+  (of-object "GdkWindow")
+  (c-name "gdk_window_process_updates")
+  (return-type "none")
+  (parameters
+    '("gboolean" "update_children")
+  )
+)
+
+(define-method set_accept_focus
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_accept_focus")
+  (return-type "none")
+  (parameters
+    '("gboolean" "accept_focus")
+  )
+)
+
+(define-method set_focus_on_map
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_focus_on_map")
+  (return-type "none")
+  (parameters
+    '("gboolean" "focus_on_map")
+  )
+)
+
+(define-method enable_synchronized_configure
+  (of-object "GdkWindow")
+  (c-name "gdk_window_enable_synchronized_configure")
+  (return-type "none")
+)
+
+(define-method configure_finished
+  (of-object "GdkWindow")
+  (c-name "gdk_window_configure_finished")
+  (return-type "none")
+)
+
+(define-method set_urgency_hint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_urgency_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "urgent")
+  )
+)
+
+(define-method show_unraised
+  (of-object "GdkWindow")
+  (c-name "gdk_window_show_unraised")
+  (return-type "none")
+)
+
+(define-method move_region
+  (of-object "GdkWindow")
+  (c-name "gdk_window_move_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "region")
+    '("gint" "dx")
+    '("gint" "dy")
+  )
+)
+
+(define-method shape_combine_region
+  (of-object "GdkWindow")
+  (c-name "gdk_window_shape_combine_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "shape_region" (null-ok))
+    '("gint" "offset_x")
+    '("gint" "offset_y")
+  )
+)
+
+(define-method input_shape_combine_region
+  (of-object "GdkWindow")
+  (c-name "gdk_window_input_shape_combine_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "shape_region")
+    '("gint" "offset_x")
+    '("gint" "offset_y")
+  )
+)
+
+(define-method set_child_input_shapes
+  (of-object "GdkWindow")
+  (c-name "gdk_window_set_child_input_shapes")
+  (return-type "none")
+)
+
+(define-method merge_child_input_shapes
+  (of-object "GdkWindow")
+  (c-name "gdk_window_merge_child_input_shapes")
+  (return-type "none")
+)
+
+(define-method get_type_hint
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_type_hint")
+  (return-type "GdkWindowTypeHint")
+)
+
+(define-function get_default_root_window
+  (of-object "GdkWindow")
+  (c-name "gdk_get_default_root_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method ensure_native
+  (of-object "GdkWindow")
+  (c-name "gdk_window_ensure_native")
+  (return-type "gboolean")
+)
+
+(define-method get_width
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_width")
+  (return-type "int")
+)
+
+(define-method get_height
+  (of-object "GdkWindow")
+  (c-name "gdk_window_get_height")
+  (return-type "int")
+)
+
diff --git a/src/defs/GdkWindowAttr.defs b/src/defs/GdkWindowAttr.defs
new file mode 100644
index 0000000..1ae2364
--- /dev/null
+++ b/src/defs/GdkWindowAttr.defs
@@ -0,0 +1,5 @@
+(define-boxed WindowAttr
+  (in-module "Gdk")
+  (c-name "GdkWindowAttr")
+)
+
diff --git a/src/defs/GdkWindowAttributesType.defs b/src/defs/GdkWindowAttributesType.defs
new file mode 100644
index 0000000..9fc0fcb
--- /dev/null
+++ b/src/defs/GdkWindowAttributesType.defs
@@ -0,0 +1,15 @@
+(define-flags WindowAttributesType
+  (in-module "Gdk")
+  (c-name "GdkWindowAttributesType")
+  (gtype-id "GDK_TYPE_WINDOW_ATTRIBUTES_TYPE")
+  (values
+    '("title" "GDK_WA_TITLE")
+    '("x" "GDK_WA_X")
+    '("y" "GDK_WA_Y")
+    '("cursor" "GDK_WA_CURSOR")
+    '("visual" "GDK_WA_VISUAL")
+    '("wmclass" "GDK_WA_WMCLASS")
+    '("noredir" "GDK_WA_NOREDIR")
+  )
+)
+
diff --git a/src/defs/GdkWindowClass.defs b/src/defs/GdkWindowClass.defs
new file mode 100644
index 0000000..7ce906e
--- /dev/null
+++ b/src/defs/GdkWindowClass.defs
@@ -0,0 +1,10 @@
+(define-enum WindowClass
+  (in-module "Gdk")
+  (c-name "GdkWindowClass")
+  (gtype-id "GDK_TYPE_WINDOW_CLASS")
+  (values
+    '("input-output" "GDK_INPUT_OUTPUT")
+    '("input-only" "GDK_INPUT_ONLY")
+  )
+)
+
diff --git a/src/defs/GdkWindowEdge.defs b/src/defs/GdkWindowEdge.defs
new file mode 100644
index 0000000..01fa62b
--- /dev/null
+++ b/src/defs/GdkWindowEdge.defs
@@ -0,0 +1,16 @@
+(define-enum WindowEdge
+  (in-module "Gdk")
+  (c-name "GdkWindowEdge")
+  (gtype-id "GDK_TYPE_WINDOW_EDGE")
+  (values
+    '("north-west" "GDK_WINDOW_EDGE_NORTH_WEST")
+    '("north" "GDK_WINDOW_EDGE_NORTH")
+    '("north-east" "GDK_WINDOW_EDGE_NORTH_EAST")
+    '("west" "GDK_WINDOW_EDGE_WEST")
+    '("east" "GDK_WINDOW_EDGE_EAST")
+    '("south-west" "GDK_WINDOW_EDGE_SOUTH_WEST")
+    '("south" "GDK_WINDOW_EDGE_SOUTH")
+    '("south-east" "GDK_WINDOW_EDGE_SOUTH_EAST")
+  )
+)
+
diff --git a/src/defs/GdkWindowHints.defs b/src/defs/GdkWindowHints.defs
new file mode 100644
index 0000000..6fc2e3a
--- /dev/null
+++ b/src/defs/GdkWindowHints.defs
@@ -0,0 +1,17 @@
+(define-flags WindowHints
+  (in-module "Gdk")
+  (c-name "GdkWindowHints")
+  (gtype-id "GDK_TYPE_WINDOW_HINTS")
+  (values
+    '("pos" "GDK_HINT_POS")
+    '("min-size" "GDK_HINT_MIN_SIZE")
+    '("max-size" "GDK_HINT_MAX_SIZE")
+    '("base-size" "GDK_HINT_BASE_SIZE")
+    '("aspect" "GDK_HINT_ASPECT")
+    '("resize-inc" "GDK_HINT_RESIZE_INC")
+    '("win-gravity" "GDK_HINT_WIN_GRAVITY")
+    '("user-pos" "GDK_HINT_USER_POS")
+    '("user-size" "GDK_HINT_USER_SIZE")
+  )
+)
+
diff --git a/src/defs/GdkWindowState.defs b/src/defs/GdkWindowState.defs
new file mode 100644
index 0000000..b155c55
--- /dev/null
+++ b/src/defs/GdkWindowState.defs
@@ -0,0 +1,16 @@
+(define-flags WindowState
+  (in-module "Gdk")
+  (c-name "GdkWindowState")
+  (gtype-id "GDK_TYPE_WINDOW_STATE")
+  (values
+    '("withdrawn" "GDK_WINDOW_STATE_WITHDRAWN")
+    '("iconified" "GDK_WINDOW_STATE_ICONIFIED")
+    '("maximized" "GDK_WINDOW_STATE_MAXIMIZED")
+    '("sticky" "GDK_WINDOW_STATE_STICKY")
+    '("fullscreen" "GDK_WINDOW_STATE_FULLSCREEN")
+    '("above" "GDK_WINDOW_STATE_ABOVE")
+    '("below" "GDK_WINDOW_STATE_BELOW")
+    '("focused" "GDK_WINDOW_STATE_FOCUSED")
+  )
+)
+
diff --git a/src/defs/GdkWindowType.defs b/src/defs/GdkWindowType.defs
new file mode 100644
index 0000000..19afbd8
--- /dev/null
+++ b/src/defs/GdkWindowType.defs
@@ -0,0 +1,14 @@
+(define-enum WindowType
+  (in-module "Gdk")
+  (c-name "GdkWindowType")
+  (gtype-id "GDK_TYPE_WINDOW_TYPE")
+  (values
+    '("root" "GDK_WINDOW_ROOT")
+    '("toplevel" "GDK_WINDOW_TOPLEVEL")
+    '("child" "GDK_WINDOW_CHILD")
+    '("dialog" "GDK_WINDOW_DIALOG")
+    '("temp" "GDK_WINDOW_TEMP")
+    '("foreign" "GDK_WINDOW_FOREIGN")
+  )
+)
+
diff --git a/src/defs/GdkWindowTypeHint.defs b/src/defs/GdkWindowTypeHint.defs
new file mode 100644
index 0000000..4ff4c84
--- /dev/null
+++ b/src/defs/GdkWindowTypeHint.defs
@@ -0,0 +1,16 @@
+(define-enum WindowTypeHint
+  (in-module "Gdk")
+  (c-name "GdkWindowTypeHint")
+  (gtype-id "GDK_TYPE_WINDOW_TYPE_HINT")
+  (values
+    '("normal" "GDK_WINDOW_TYPE_HINT_NORMAL")
+    '("dialog" "GDK_WINDOW_TYPE_HINT_DIALOG")
+    '("menu" "GDK_WINDOW_TYPE_HINT_MENU")
+    '("toolbar" "GDK_WINDOW_TYPE_HINT_TOOLBAR")
+    '("splashscreen" "GDK_WINDOW_TYPE_HINT_SPLASHSCREEN")
+    '("utility" "GDK_WINDOW_TYPE_HINT_UTILITY")
+    '("dock" "GDK_WINDOW_TYPE_HINT_DOCK")
+    '("desktop" "GDK_WINDOW_TYPE_HINT_DESKTOP")
+  )
+)
+
diff --git a/src/defs/GlibMisc.defs b/src/defs/GlibMisc.defs
new file mode 100644
index 0000000..de14067
--- /dev/null
+++ b/src/defs/GlibMisc.defs
@@ -0,0 +1,122 @@
+;; another hand written .defs file. Misc isn't a GBoxed, in fact, it isn't
+;; anything. This is rather ugly, but ;; it saves us having to write the JNI
+;; code for general utility functions in Glib by hand.
+
+(define-boxed Misc
+  (in-module "Glib")
+  (c-name "GlibMisc")
+)
+
+(define-function set_prgname
+  (of-object "GlibMisc")
+  (c-name "g_set_prgname")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "prgname")
+  )
+)
+
+(define-function get_prgname
+  (of-object "GlibMisc")
+  (c-name "g_get_prgname")
+  (return-type "gchar*")
+)
+
+(define-function get_user_config_dir
+  (of-object "GlibMisc")
+  (c-name "g_get_user_config_dir")
+  (return-type "const-gchar*")
+)
+
+(define-function get_user_name
+  (of-object "GlibMisc")
+  (c-name "g_get_user_name")
+  (return-type "const-gchar*")
+)
+
+(define-function get_user_cache_dir
+  (of-object "GlibMisc")
+  (c-name "g_get_user_cache_dir")
+  (return-type "const-gchar*")
+)
+
+(define-function get_user_data_dir
+  (of-object "GlibMisc")
+  (c-name "g_get_user_data_dir")
+  (return-type "const-gchar*")
+)
+
+(define-function get_user_special_dir
+  (of-object "GlibMisc")
+  (c-name "g_get_user_special_dir")
+  (return-type "const-gchar*")
+  (parameters
+    '("GUserDirectory" "directory")
+  )
+)
+
+(define-function get_real_name
+  (of-object "GlibMisc")
+  (c-name "g_get_real_name")
+  (return-type "const-gchar*")
+)
+
+(define-function reload_user_special_dirs_cache
+  (of-object "GlibMisc")
+  (c-name "g_reload_user_special_dirs_cache")
+  (return-type "none")
+)
+
+(define-function get_system_data_dirs
+  (of-object "GlibMisc")
+  (c-name "g_get_system_data_dirs")
+  (return-type "const-gchar**")
+)
+
+(define-function get_system_config_dirs
+  (of-object "GlibMisc")
+  (c-name "g_get_system_config_dirs")
+  (return-type "const-gchar**")
+)
+
+(define-function format_size
+  (of-object "GlibMisc")
+  (c-name "g_format_size")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("guint64" "size")
+  )
+)
+
+(define-function format_size
+  (of-object "GlibMisc")
+  (c-name "g_format_size_full")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("guint64" "size")
+    '("GFormatSizeFlags" "flags")
+  )
+)
+
+(define-function format_size_for_display
+  (of-object "GlibMisc")
+  (c-name "g_format_size_for_display")
+  (caller-owns-return #t)
+  (return-type "char*")
+  (parameters
+    '("goffset" "size")
+  )
+)
+
+(define-function markup_escape_text
+  (of-object "GlibMisc")
+  (c-name "g_markup_escape_text")
+  (caller-owns-return #t)
+  (return-type "char*")
+  (parameters
+    '("const-gchar*" "text")
+    '("gssize" "len")
+  )
+)
diff --git a/src/defs/GtkAboutDialog.defs b/src/defs/GtkAboutDialog.defs
new file mode 100644
index 0000000..96f5102
--- /dev/null
+++ b/src/defs/GtkAboutDialog.defs
@@ -0,0 +1,246 @@
+(define-object AboutDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (c-name "GtkAboutDialog")
+  (gtype-id "GTK_TYPE_ABOUT_DIALOG")
+)
+
+(define-function gtk_about_dialog_new
+  (is-constructor-of "GtkAboutDialog")
+  (c-name "gtk_about_dialog_new")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_version
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_version")
+  (return-type "const-gchar*")
+)
+
+(define-method set_version
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_version")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "version" (null-ok))
+  )
+)
+
+(define-method get_copyright
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_copyright")
+  (return-type "const-gchar*")
+)
+
+(define-method set_copyright
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_copyright")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "copyright" (null-ok))
+  )
+)
+
+(define-method get_comments
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_comments")
+  (return-type "const-gchar*")
+)
+
+(define-method set_comments
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_comments")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "comments" (null-ok))
+  )
+)
+
+(define-method get_license
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_license")
+  (return-type "const-gchar*")
+)
+
+(define-method set_license
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_license")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "license" (null-ok))
+  )
+)
+
+(define-method get_wrap_license
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_wrap_license")
+  (return-type "gboolean")
+)
+
+(define-method set_wrap_license
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_wrap_license")
+  (return-type "none")
+  (parameters
+    '("gboolean" "wrap_license")
+  )
+)
+
+(define-method set_license_type
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_license_type")
+  (return-type "none")
+  (parameters
+    '("GtkLicense" "license")
+  )
+)
+
+(define-method get_license_type
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_license_type")
+  (return-type "GtkLicense")
+)
+
+(define-method get_website
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_website")
+  (return-type "const-gchar*")
+)
+
+(define-method set_website
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_website")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "website" (null-ok))
+  )
+)
+
+(define-method get_website_label
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_website_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_website_label
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_website_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "website_label" (null-ok))
+  )
+)
+
+(define-method get_authors
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_authors")
+  (return-type "gchar**")
+)
+
+(define-method set_authors
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_authors")
+  (return-type "none")
+  (parameters
+    '("const-gchar**" "authors")
+  )
+)
+
+(define-method get_documenters
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_documenters")
+  (return-type "const-gchar**")
+)
+
+(define-method set_documenters
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_documenters")
+  (return-type "none")
+  (parameters
+    '("const-gchar**" "documenters")
+  )
+)
+
+(define-method get_artists
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_artists")
+  (return-type "const-gchar**")
+)
+
+(define-method set_artists
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_artists")
+  (return-type "none")
+  (parameters
+    '("const-gchar**" "artists")
+  )
+)
+
+(define-method get_translator_credits
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_translator_credits")
+  (return-type "const-gchar*")
+)
+
+(define-method set_translator_credits
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_translator_credits")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "translator_credits" (null-ok))
+  )
+)
+
+(define-method get_logo
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_logo")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method set_logo
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_logo")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "logo" (null-ok))
+  )
+)
+
+(define-method get_logo_icon_name
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_logo_icon_name")
+  (return-type "const-gchar*")
+)
+
+(define-method set_logo_icon_name
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_logo_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name" (null-ok))
+  )
+)
+
+(define-method set_program_name
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_set_program_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name" (null-ok))
+  )
+)
+
+(define-method get_program_name
+  (of-object "GtkAboutDialog")
+  (c-name "gtk_about_dialog_get_program_name")
+  (return-type "const-gchar*")
+)
+
+(define-virtual activate_link
+  (of-object "GtkAboutDialog")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
diff --git a/src/defs/GtkAccelFlags.defs b/src/defs/GtkAccelFlags.defs
new file mode 100644
index 0000000..ae67742
--- /dev/null
+++ b/src/defs/GtkAccelFlags.defs
@@ -0,0 +1,11 @@
+(define-flags AccelFlags
+  (in-module "Gtk")
+  (c-name "GtkAccelFlags")
+  (gtype-id "GTK_TYPE_ACCEL_FLAGS")
+  (values
+    '("visible" "GTK_ACCEL_VISIBLE")
+    '("locked" "GTK_ACCEL_LOCKED")
+    '("mask" "GTK_ACCEL_MASK")
+  )
+)
+
diff --git a/src/defs/GtkAccelGroup.defs b/src/defs/GtkAccelGroup.defs
new file mode 100644
index 0000000..61bdc93
--- /dev/null
+++ b/src/defs/GtkAccelGroup.defs
@@ -0,0 +1,110 @@
+(define-object AcceleratorGroup
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkAccelGroup")
+  (gtype-id "GTK_TYPE_ACCEL_GROUP")
+)
+
+(define-function gtk_accel_group_new
+  (is-constructor-of "GtkAccelGroup")
+  (c-name "gtk_accel_group_new")
+  (caller-owns-return #t)
+  (return-type "GtkAccelGroup*")
+)
+
+(define-method lock
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_lock")
+  (return-type "none")
+)
+
+(define-method unlock
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_unlock")
+  (return-type "none")
+)
+
+(define-method connect
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_connect")
+  (return-type "none")
+  (parameters
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("GtkAccelFlags" "accel_flags")
+    '("GClosure*" "closure")
+  )
+)
+
+(define-method connect_by_path
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_connect_by_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path")
+    '("GClosure*" "closure")
+  )
+)
+
+(define-method disconnect
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_disconnect")
+  (return-type "gboolean")
+  (parameters
+    '("GClosure*" "closure")
+  )
+)
+
+(define-method disconnect_key
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_disconnect_key")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+  )
+)
+
+(define-method activate
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_activate")
+  (return-type "gboolean")
+  (parameters
+    '("GQuark" "accel_quark")
+    '("GObject*" "acceleratable")
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+  )
+)
+
+;;FIXME
+;;(define-method find
+;;  (of-object "GtkAccelGroup")
+;;  (c-name "gtk_accel_group_find")
+;;  (return-type "GtkAccelKey*")
+;;  (parameters
+;;    '("gboolean" "(*find_func")
+;;  )
+;;)
+
+(define-method query
+  (of-object "GtkAccelGroup")
+  (c-name "gtk_accel_group_query")
+  (return-type "GtkAccelGroupEntry*")
+  (parameters
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("guint*" "n_entries")
+  )
+)
+
+(define-virtual accel_changed
+  (of-object "GtkAccelGroup")
+  (return-type "none")
+  (parameters
+    '("guint" "keyval")
+    '("GdkModifierType" "modifier")
+    '("GClosure*" "accel_closure")
+  )
+)
+
diff --git a/src/defs/GtkAccelKey.defs b/src/defs/GtkAccelKey.defs
new file mode 100644
index 0000000..4605112
--- /dev/null
+++ b/src/defs/GtkAccelKey.defs
@@ -0,0 +1,62 @@
+(define-boxed AccelKey
+  (in-module "Gtk")
+  (c-name "GtkAccelKey")
+  (fields
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("guint" "accel_flags")
+  )
+)
+
+(define-function accelerator_valid
+  (c-name "gtk_accelerator_valid")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-function accelerator_parse
+  (c-name "gtk_accelerator_parse")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accelerator")
+    '("guint*" "accelerator_key")
+    '("GdkModifierType*" "accelerator_mods")
+  )
+)
+
+(define-function accelerator_name
+  (c-name "gtk_accelerator_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("guint" "accelerator_key")
+    '("GdkModifierType" "accelerator_mods")
+  )
+)
+
+(define-function accelerator_set_default_mod_mask
+  (c-name "gtk_accelerator_set_default_mod_mask")
+  (return-type "none")
+  (parameters
+    '("GdkModifierType" "default_mod_mask")
+  )
+)
+
+(define-function accelerator_get_default_mod_mask
+  (c-name "gtk_accelerator_get_default_mod_mask")
+  (return-type "GdkModifierType")
+)
+
+(define-function accelerator_get_label
+  (c-name "gtk_accelerator_get_label")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("guint" "accelerator_key")
+    '("GdkModifierType" "accelerator_mods")
+  )
+)
+
diff --git a/src/defs/GtkAccelLabel.defs b/src/defs/GtkAccelLabel.defs
new file mode 100644
index 0000000..56db344
--- /dev/null
+++ b/src/defs/GtkAccelLabel.defs
@@ -0,0 +1,53 @@
+(define-object AccelLabel
+  (in-module "Gtk")
+  (parent "GtkLabel")
+  (c-name "GtkAccelLabel")
+  (gtype-id "GTK_TYPE_ACCEL_LABEL")
+)
+
+(define-function gtk_accel_label_new
+  (is-constructor-of "GtkAccelLabel")
+  (c-name "gtk_accel_label_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method get_accel_widget
+  (of-object "GtkAccelLabel")
+  (c-name "gtk_accel_label_get_accel_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_accel_width
+  (of-object "GtkAccelLabel")
+  (c-name "gtk_accel_label_get_accel_width")
+  (return-type "guint")
+)
+
+(define-method set_accel_widget
+  (of-object "GtkAccelLabel")
+  (c-name "gtk_accel_label_set_accel_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "accel_widget")
+  )
+)
+
+(define-method set_accel_closure
+  (of-object "GtkAccelLabel")
+  (c-name "gtk_accel_label_set_accel_closure")
+  (return-type "none")
+  (parameters
+    '("GClosure*" "accel_closure")
+  )
+)
+
+(define-method refetch
+  (of-object "GtkAccelLabel")
+  (c-name "gtk_accel_label_refetch")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkAccelMap.defs b/src/defs/GtkAccelMap.defs
new file mode 100644
index 0000000..1c38560
--- /dev/null
+++ b/src/defs/GtkAccelMap.defs
@@ -0,0 +1,123 @@
+(define-object AccelMap
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkAccelMap")
+  (gtype-id "GTK_TYPE_ACCEL_MAP")
+)
+
+(define-function add_entry
+  (c-name "gtk_accel_map_add_entry")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path")
+    '("GdkKeyval" "accel_key")
+    '("GdkModifierType" "accel_mods")
+  )
+)
+
+(define-function lookup_entry
+  (c-name "gtk_accel_map_lookup_entry")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "accel_path")
+    '("GtkAccelKey*" "key" (null-ok))
+  )
+)
+
+(define-function change_entry
+  (c-name "gtk_accel_map_change_entry")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "accel_path")
+    '("GdkKeyval" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("gboolean" "replace")
+  )
+)
+
+(define-function load
+  (c-name "gtk_accel_map_load")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "file_name")
+  )
+)
+
+(define-function save
+  (c-name "gtk_accel_map_save")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "file_name")
+  )
+)
+
+(define-function foreach
+  (c-name "gtk_accel_map_foreach")
+  (return-type "none")
+  (parameters
+    '("gpointer" "data")
+    '("GtkAccelMapForeach" "foreach_func")
+  )
+)
+
+(define-function load_fd
+  (c-name "gtk_accel_map_load_fd")
+  (return-type "none")
+  (parameters
+    '("gint" "fd")
+  )
+)
+
+(define-function load_scanner
+  (c-name "gtk_accel_map_load_scanner")
+  (return-type "none")
+  (parameters
+    '("GScanner*" "scanner")
+  )
+)
+
+(define-function save_fd
+  (c-name "gtk_accel_map_save_fd")
+  (return-type "none")
+  (parameters
+    '("gint" "fd")
+  )
+)
+
+(define-function lock_path
+  (c-name "gtk_accel_map_lock_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path")
+  )
+)
+
+(define-function unlock_path
+  (c-name "gtk_accel_map_unlock_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path")
+  )
+)
+
+(define-function add_filter
+  (c-name "gtk_accel_map_add_filter")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filter_pattern")
+  )
+)
+
+(define-function foreach_unfiltered
+  (c-name "gtk_accel_map_foreach_unfiltered")
+  (return-type "none")
+  (parameters
+    '("gpointer" "data")
+    '("GtkAccelMapForeach" "foreach_func")
+  )
+)
+
+(define-function get
+  (c-name "gtk_accel_map_get")
+  (return-type "GtkAccelMap*")
+)
diff --git a/src/defs/GtkAccessible.defs b/src/defs/GtkAccessible.defs
new file mode 100644
index 0000000..324e3ec
--- /dev/null
+++ b/src/defs/GtkAccessible.defs
@@ -0,0 +1,18 @@
+(define-object Accessible
+  (in-module "Gtk")
+  (parent "AtkObject")
+  (c-name "GtkAccessible")
+  (gtype-id "GTK_TYPE_ACCESSIBLE")
+)
+
+(define-method connect_widget_destroyed
+  (of-object "GtkAccessible")
+  (c-name "gtk_accessible_connect_widget_destroyed")
+  (return-type "none")
+)
+
+(define-virtual connect_widget_destroyed
+  (of-object "GtkAccessible")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkAction.defs b/src/defs/GtkAction.defs
new file mode 100644
index 0000000..bbf5d4d
--- /dev/null
+++ b/src/defs/GtkAction.defs
@@ -0,0 +1,198 @@
+(define-object Action
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkAction")
+  (gtype-id "GTK_TYPE_ACTION")
+)
+
+(define-function gtk_action_new
+  (is-constructor-of "GtkAction")
+  (c-name "gtk_action_new")
+  (caller-owns-return #t)
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "label" (null-ok))
+    '("const-gchar*" "tooltip" (null-ok))
+    '("const-gchar*" "stock_id" (null-ok))
+  )
+)
+
+(define-method get_name
+  (of-object "GtkAction")
+  (c-name "gtk_action_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method is_sensitive
+  (of-object "GtkAction")
+  (c-name "gtk_action_is_sensitive")
+  (return-type "gboolean")
+)
+
+(define-method get_sensitive
+  (of-object "GtkAction")
+  (c-name "gtk_action_get_sensitive")
+  (return-type "gboolean")
+)
+
+(define-method is_visible
+  (of-object "GtkAction")
+  (c-name "gtk_action_is_visible")
+  (return-type "gboolean")
+)
+
+(define-method get_visible
+  (of-object "GtkAction")
+  (c-name "gtk_action_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method activate
+  (of-object "GtkAction")
+  (c-name "gtk_action_activate")
+  (return-type "none")
+)
+
+(define-method create_icon
+  (of-object "GtkAction")
+  (c-name "gtk_action_create_icon")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkIconSize" "icon_size")
+  )
+)
+
+(define-method create_menu_item
+  (of-object "GtkAction")
+  (c-name "gtk_action_create_menu_item")
+  (return-type "GtkWidget*")
+)
+
+(define-method create_menu
+  (of-object "GtkAction")
+  (c-name "gtk_action_create_menu")
+  (return-type "GtkWidget*")
+)
+
+(define-method create_tool_item
+  (of-object "GtkAction")
+  (c-name "gtk_action_create_tool_item")
+  (return-type "GtkWidget*")
+)
+
+(define-method connect_accelerator
+  (of-object "GtkAction")
+  (c-name "gtk_action_connect_accelerator")
+  (return-type "none")
+)
+
+(define-method disconnect_accelerator
+  (of-object "GtkAction")
+  (c-name "gtk_action_disconnect_accelerator")
+  (return-type "none")
+)
+
+(define-method get_accel_path
+  (of-object "GtkAction")
+  (c-name "gtk_action_get_accel_path")
+  (return-type "const-gchar*")
+)
+
+(define-method set_accel_path
+  (of-object "GtkAction")
+  (c-name "gtk_action_set_accel_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path")
+  )
+)
+
+(define-method set_accel_group
+  (of-object "GtkAction")
+  (c-name "gtk_action_set_accel_group")
+  (return-type "none")
+  (parameters
+    '("GtkAccelGroup*" "accel_group" (null-ok))
+  )
+)
+
+(define-method set_sensitive
+  (of-object "GtkAction")
+  (c-name "gtk_action_set_sensitive")
+  (return-type "none")
+  (parameters
+    '("gboolean" "sensitive")
+  )
+)
+
+(define-method set_visible
+  (of-object "GtkAction")
+  (c-name "gtk_action_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method set_icon_name
+  (of-object "GtkAction")
+  (c-name "gtk_action_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-method get_always_show_image
+  (of-object "GtkAction")
+  (c-name "gtk_action_get_always_show_image")
+  (return-type "gboolean")
+)
+
+(define-method set_always_show_image
+  (of-object "GtkAction")
+  (c-name "gtk_action_set_always_show_image")
+  (return-type "none")
+  (parameters
+    '("gboolean" "always_show")
+  )
+)
+
+(define-virtual activate
+  (of-object "GtkAction")
+  (return-type "none")
+)
+
+(define-virtual connect_proxy
+  (of-object "GtkAction")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "proxy")
+  )
+)
+
+(define-virtual create_menu_item
+  (of-object "GtkAction")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual create_tool_item
+  (of-object "GtkAction")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual disconnect_proxy
+  (of-object "GtkAction")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "proxy")
+  )
+)
+
+(define-method get_accel_closure
+  (of-object "GtkAction")
+  (c-name "gtk_action_get_accel_closure")
+  (return-type "GClosure*")
+)
+
diff --git a/src/defs/GtkActionGroup.defs b/src/defs/GtkActionGroup.defs
new file mode 100644
index 0000000..5f684f3
--- /dev/null
+++ b/src/defs/GtkActionGroup.defs
@@ -0,0 +1,207 @@
+(define-object ActionGroup
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkActionGroup")
+  (gtype-id "GTK_TYPE_ACTION_GROUP")
+)
+
+(define-function gtk_action_group_new
+  (is-constructor-of "GtkActionGroup")
+  (c-name "gtk_action_group_new")
+  (caller-owns-return #t)
+  (return-type "GtkActionGroup*")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_name
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_sensitive
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_get_sensitive")
+  (return-type "gboolean")
+)
+
+(define-method set_sensitive
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_set_sensitive")
+  (return-type "none")
+  (parameters
+    '("gboolean" "sensitive")
+  )
+)
+
+(define-method get_visible
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method set_visible
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method get_action
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_get_action")
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "action_name")
+  )
+)
+
+(define-method list_actions
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_list_actions")
+  (caller-owns-return #l)
+  (return-type "GList-GtkAction*")
+)
+
+(define-method add_action
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_action")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+(define-method add_action_with_accel
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_action_with_accel")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+    '("const-gchar*" "accelerator" (null-ok))
+  )
+)
+
+(define-method remove_action
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_remove_action")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+(define-method add_actions
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_actions")
+  (return-type "none")
+  (parameters
+    '("GtkActionEntry*" "entries")
+    '("guint" "n_entries")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method add_toggle_actions
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_toggle_actions")
+  (return-type "none")
+  (parameters
+    '("GtkToggleActionEntry*" "entries")
+    '("guint" "n_entries")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method add_radio_actions
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_radio_actions")
+  (return-type "none")
+  (parameters
+    '("GtkRadioActionEntry*" "entries")
+    '("guint" "n_entries")
+    '("gint" "value")
+    '("GCallback" "on_change")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method add_actions_full
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_actions_full")
+  (return-type "none")
+  (parameters
+    '("GtkActionEntry*" "entries")
+    '("guint" "n_entries")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-method add_toggle_actions_full
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_toggle_actions_full")
+  (return-type "none")
+  (parameters
+    '("GtkToggleActionEntry*" "entries")
+    '("guint" "n_entries")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-method add_radio_actions_full
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_add_radio_actions_full")
+  (return-type "none")
+  (parameters
+    '("GtkRadioActionEntry*" "entries")
+    '("guint" "n_entries")
+    '("gint" "value")
+    '("GCallback" "on_change")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_translate_func
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_set_translate_func")
+  (return-type "none")
+  (parameters
+    '("GtkTranslateFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "notify")
+  )
+)
+
+(define-method set_translation_domain
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_set_translation_domain")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "domain")
+  )
+)
+
+(define-method translate_string
+  (of-object "GtkActionGroup")
+  (c-name "gtk_action_group_translate_string")
+  (return-type "const-gchar*")
+  (parameters
+    '("const-gchar*" "string")
+  )
+)
+
+(define-virtual get_action
+  (of-object "GtkActionGroup")
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "action_name")
+  )
+)
+
diff --git a/src/defs/GtkActivatable.defs b/src/defs/GtkActivatable.defs
new file mode 100644
index 0000000..6fbe123
--- /dev/null
+++ b/src/defs/GtkActivatable.defs
@@ -0,0 +1,71 @@
+(define-interface Activatable
+  (in-module "Gtk")
+  (c-name "GtkActivatable")
+)
+
+(define-method sync_action_properties
+  (of-object "GtkActivatable")
+  (c-name "gtk_activatable_sync_action_properties")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action" (null-ok) (default "NULL"))
+  )
+)
+
+(define-method set_related_action
+  (of-object "GtkActivatable")
+  (c-name "gtk_activatable_set_related_action")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+(define-method get_related_action
+  (of-object "GtkActivatable")
+  (c-name "gtk_activatable_get_related_action")
+  (return-type "GtkAction*")
+)
+
+(define-method set_use_action_appearance
+  (of-object "GtkActivatable")
+  (c-name "gtk_activatable_set_use_action_appearance")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_appearance")
+  )
+)
+
+(define-method get_use_action_appearance
+  (of-object "GtkActivatable")
+  (c-name "gtk_activatable_get_use_action_appearance")
+  (return-type "gboolean")
+)
+
+(define-method do_set_related_action
+  (of-object "GtkActivatable")
+  (c-name "gtk_activatable_do_set_related_action")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+(define-virtual update
+  (of-object "GtkActivatable")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+    '("const-gchar*" "property_name")
+  )
+)
+
+(define-virtual sync_action_properties
+  (of-object "GtkActivatable")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+
diff --git a/src/defs/GtkAdjustment.defs b/src/defs/GtkAdjustment.defs
new file mode 100644
index 0000000..4d620eb
--- /dev/null
+++ b/src/defs/GtkAdjustment.defs
@@ -0,0 +1,167 @@
+(define-object Adjustment
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkAdjustment")
+  (gtype-id "GTK_TYPE_ADJUSTMENT")
+  (fields
+    '("gfloat" "value")
+    '("gfloat" "lower")
+    '("gfloat" "upper")
+    '("gfloat" "step_increment")
+    '("gfloat" "page_increment")
+    '("gfloat" "page_size")
+  )
+)
+
+(define-function gtk_adjustment_new
+  (is-constructor-of "GtkAdjustment")
+  (c-name "gtk_adjustment_new")
+  (caller-owns-return #t)
+  (return-type "GtkAdjustment*")
+  (parameters
+    '("gdouble" "value")
+    '("gdouble" "lower")
+    '("gdouble" "upper")
+    '("gdouble" "step_increment")
+    '("gdouble" "page_increment")
+    '("gdouble" "page_size")
+  )
+)
+
+(define-method configure
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_configure")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+    '("gdouble" "lower")
+    '("gdouble" "upper")
+    '("gdouble" "step_increment")
+    '("gdouble" "page_increment")
+    '("gdouble" "page_size")
+  )
+)
+
+(define-method changed
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_changed")
+  (return-type "none")
+)
+
+(define-method value_changed
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_value_changed")
+  (return-type "none")
+)
+
+(define-method clamp_page
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_clamp_page")
+  (return-type "none")
+  (parameters
+    '("gdouble" "lower")
+    '("gdouble" "upper")
+  )
+)
+
+(define-method get_value
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_get_value")
+  (return-type "gdouble")
+)
+
+(define-method set_value
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_set_value")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_page_increment
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_get_page_increment")
+  (return-type "gdouble")
+)
+
+(define-method set_page_increment
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_set_page_increment")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_step_increment
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_get_step_increment")
+  (return-type "gdouble")
+)
+
+(define-method set_step_increment
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_set_step_increment")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_upper
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_get_upper")
+  (return-type "gdouble")
+)
+
+(define-method set_upper
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_set_upper")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_lower
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_get_lower")
+  (return-type "gdouble")
+)
+
+(define-method set_lower
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_set_lower")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_page_size
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_get_page_size")
+  (return-type "gdouble")
+)
+
+(define-method set_page_size
+  (of-object "GtkAdjustment")
+  (c-name "gtk_adjustment_set_page_size")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+
+(define-virtual changed
+  (of-object "GtkAdjustment")
+  (return-type "none")
+)
+
+(define-virtual value_changed
+  (of-object "GtkAdjustment")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkAlign.defs b/src/defs/GtkAlign.defs
new file mode 100644
index 0000000..5f5da5c
--- /dev/null
+++ b/src/defs/GtkAlign.defs
@@ -0,0 +1,11 @@
+(define-enum Align
+  (in-module "Gtk")
+  (c-name "GtkAlign")
+  (values
+    '("fill" "GTK_ALIGN_FILL")
+    '("start" "GTK_ALIGN_START")
+    '("end" "GTK_ALIGN_END")
+    '("center" "GTK_ALIGN_CENTER")
+  )
+)
+
diff --git a/src/defs/GtkAlignment.defs b/src/defs/GtkAlignment.defs
new file mode 100644
index 0000000..549f2ed
--- /dev/null
+++ b/src/defs/GtkAlignment.defs
@@ -0,0 +1,56 @@
+(define-object Alignment
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkAlignment")
+  (gtype-id "GTK_TYPE_ALIGNMENT")
+)
+
+(define-function gtk_alignment_new
+  (is-constructor-of "GtkAlignment")
+  (c-name "gtk_alignment_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+    '("gfloat" "xscale")
+    '("gfloat" "yscale")
+  )
+)
+
+(define-method set
+  (of-object "GtkAlignment")
+  (c-name "gtk_alignment_set")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+    '("gfloat" "xscale")
+    '("gfloat" "yscale")
+  )
+)
+
+(define-method set_padding
+  (of-object "GtkAlignment")
+  (c-name "gtk_alignment_set_padding")
+  (return-type "none")
+  (parameters
+    '("guint" "padding_top")
+    '("guint" "padding_bottom")
+    '("guint" "padding_left")
+    '("guint" "padding_right")
+  )
+)
+
+(define-method get_padding
+  (of-object "GtkAlignment")
+  (c-name "gtk_alignment_get_padding")
+  (return-type "none")
+  (parameters
+    '("guint*" "padding_top")
+    '("guint*" "padding_bottom")
+    '("guint*" "padding_left")
+    '("guint*" "padding_right")
+  )
+)
+
diff --git a/src/defs/GtkAllocation.defs b/src/defs/GtkAllocation.defs
new file mode 100644
index 0000000..f00d044
--- /dev/null
+++ b/src/defs/GtkAllocation.defs
@@ -0,0 +1,11 @@
+(define-boxed Allocation
+  (in-module "Gtk")
+  (c-name "GtkAllocation")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
diff --git a/src/defs/GtkAnchorType.defs b/src/defs/GtkAnchorType.defs
new file mode 100644
index 0000000..68b4ca4
--- /dev/null
+++ b/src/defs/GtkAnchorType.defs
@@ -0,0 +1,25 @@
+(define-enum AnchorType
+  (in-module "Gtk")
+  (c-name "GtkAnchorType")
+  (gtype-id "GTK_TYPE_ANCHOR_TYPE")
+  (values
+    '("center" "GTK_ANCHOR_CENTER")
+    '("north" "GTK_ANCHOR_NORTH")
+    '("north-west" "GTK_ANCHOR_NORTH_WEST")
+    '("north-east" "GTK_ANCHOR_NORTH_EAST")
+    '("south" "GTK_ANCHOR_SOUTH")
+    '("south-west" "GTK_ANCHOR_SOUTH_WEST")
+    '("south-east" "GTK_ANCHOR_SOUTH_EAST")
+    '("west" "GTK_ANCHOR_WEST")
+    '("east" "GTK_ANCHOR_EAST")
+    '("n" "GTK_ANCHOR_N")
+    '("nw" "GTK_ANCHOR_NW")
+    '("ne" "GTK_ANCHOR_NE")
+    '("s" "GTK_ANCHOR_S")
+    '("sw" "GTK_ANCHOR_SW")
+    '("se" "GTK_ANCHOR_SE")
+    '("w" "GTK_ANCHOR_W")
+    '("e" "GTK_ANCHOR_E")
+  )
+)
+
diff --git a/src/defs/GtkApplication.defs b/src/defs/GtkApplication.defs
new file mode 100644
index 0000000..f7a1f32
--- /dev/null
+++ b/src/defs/GtkApplication.defs
@@ -0,0 +1,70 @@
+(define-object Application
+  (in-module "Gtk")
+  (parent "GApplication")
+  (c-name "GtkApplication")
+  (gtype-id "GTK_TYPE_APPLICATION")
+)
+
+(define-function gtk_application_new
+  (is-constructor-of "GtkApplication")
+  (c-name "gtk_application_new")
+  (caller-owns-return #t)
+  (return-type "GtkApplication*")
+  (parameters
+    '("const-gchar*" "application_id")
+    '("GApplicationFlags" "flags")
+  )
+)
+
+(define-method add_window
+  (of-object "GtkApplication")
+  (c-name "gtk_application_add_window")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "window")
+  )
+)
+
+(define-method remove_window
+  (of-object "GtkApplication")
+  (c-name "gtk_application_remove_window")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "window")
+  )
+)
+
+(define-method get_windows
+  (of-object "GtkApplication")
+  (c-name "gtk_application_get_windows")
+  (return-type "GList-GtkWindow*")
+)
+
+(define-method inhibit
+  (of-object "GtkApplication")
+  (c-name "gtk_application_inhibit")
+  (return-type "guint")
+  (parameters
+    '("GtkWindow*" "window" (null-ok))
+    '("GtkApplicationInhibitFlags" "flags")
+    '("const-gchar*" "reason")
+  )
+)
+
+(define-method uninhibit
+  (of-object "GtkApplication")
+  (c-name "gtk_application_uninhibit")
+  (return-type "none")
+  (parameters
+    '("guint" "cookie")
+  )
+)
+
+(define-method is_inhibited
+  (of-object "GtkApplication")
+  (c-name "gtk_application_is_inhibited")
+  (return-type "gboolean")
+  (parameters
+    '("GtkApplicationInhibitFlags" "flags")
+  )
+)
diff --git a/src/defs/GtkApplicationInhibitFlags.defs b/src/defs/GtkApplicationInhibitFlags.defs
new file mode 100644
index 0000000..5a30b0e
--- /dev/null
+++ b/src/defs/GtkApplicationInhibitFlags.defs
@@ -0,0 +1,11 @@
+(define-flags ApplicationInhibitFlags
+  (in-module "Gtk")
+  (c-name "GtkApplicationInhibitFlags")
+  (gtype-id "GTK_TYPE_APPLICATION_INHIBIT_FLAGS")
+  (values
+    '("logout" "GTK_APPLICATION_INHIBIT_LOGOUT")
+    '("switch" "GTK_APPLICATION_INHIBIT_SWITCH")
+    '("SUSPEND" "GTK_APPLICATION_INHIBIT_SUSPEND")
+    '("IDLE" "GTK_APPLICATION_INHIBIT_IDLE")
+  )
+)
diff --git a/src/defs/GtkArrow.defs b/src/defs/GtkArrow.defs
new file mode 100644
index 0000000..269db82
--- /dev/null
+++ b/src/defs/GtkArrow.defs
@@ -0,0 +1,28 @@
+(define-object Arrow
+  (in-module "Gtk")
+  (parent "GtkMisc")
+  (c-name "GtkArrow")
+  (gtype-id "GTK_TYPE_ARROW")
+)
+
+(define-function gtk_arrow_new
+  (is-constructor-of "GtkArrow")
+  (c-name "gtk_arrow_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkArrowType" "arrow_type")
+    '("GtkShadowType" "shadow_type")
+  )
+)
+
+(define-method set
+  (of-object "GtkArrow")
+  (c-name "gtk_arrow_set")
+  (return-type "none")
+  (parameters
+    '("GtkArrowType" "arrow_type")
+    '("GtkShadowType" "shadow_type")
+  )
+)
+
diff --git a/src/defs/GtkArrowType.defs b/src/defs/GtkArrowType.defs
new file mode 100644
index 0000000..2ee7a73
--- /dev/null
+++ b/src/defs/GtkArrowType.defs
@@ -0,0 +1,13 @@
+(define-enum ArrowType
+  (in-module "Gtk")
+  (c-name "GtkArrowType")
+  (gtype-id "GTK_TYPE_ARROW_TYPE")
+  (values
+    '("up" "GTK_ARROW_UP")
+    '("down" "GTK_ARROW_DOWN")
+    '("left" "GTK_ARROW_LEFT")
+    '("right" "GTK_ARROW_RIGHT")
+    '("none" "GTK_ARROW_NONE")
+  )
+)
+
diff --git a/src/defs/GtkAspectFrame.defs b/src/defs/GtkAspectFrame.defs
new file mode 100644
index 0000000..a75f3e4
--- /dev/null
+++ b/src/defs/GtkAspectFrame.defs
@@ -0,0 +1,33 @@
+(define-object AspectFrame
+  (in-module "Gtk")
+  (parent "GtkFrame")
+  (c-name "GtkAspectFrame")
+  (gtype-id "GTK_TYPE_ASPECT_FRAME")
+)
+
+(define-function gtk_aspect_frame_new
+  (is-constructor-of "GtkAspectFrame")
+  (c-name "gtk_aspect_frame_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+    '("gfloat" "ratio")
+    '("gboolean" "obey_child")
+  )
+)
+
+(define-method set
+  (of-object "GtkAspectFrame")
+  (c-name "gtk_aspect_frame_set")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign" (default "0.0"))
+    '("gfloat" "yalign" (default "0.0"))
+    '("gfloat" "ratio" (default "1.0"))
+    '("gboolean" "obey_child" (default "1"))
+  )
+)
+
diff --git a/src/defs/GtkAssistant.defs b/src/defs/GtkAssistant.defs
new file mode 100644
index 0000000..fda3eb4
--- /dev/null
+++ b/src/defs/GtkAssistant.defs
@@ -0,0 +1,231 @@
+(define-object Assistant
+  (in-module "Gtk")
+  (parent "GtkWindow")
+  (c-name "GtkAssistant")
+  (gtype-id "GTK_TYPE_ASSISTANT")
+)
+
+(define-function assistant_new
+  (is-constructor-of "GtkAssistant")
+  (c-name "gtk_assistant_new")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_current_page
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_current_page")
+  (return-type "gint")
+)
+
+(define-method set_current_page
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_current_page")
+  (return-type "none")
+  (parameters
+    '("gint" "page_num")
+  )
+)
+
+(define-method get_n_pages
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_n_pages")
+  (return-type "gint")
+)
+
+(define-method get_nth_page
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_nth_page")
+  (return-type "GtkWidget*")
+  (parameters
+    '("gint" "page_num")
+  )
+)
+
+(define-method prepend_page
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_prepend_page")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method append_page
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_append_page")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method insert_page
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_insert_page")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "page")
+    '("gint" "position")
+  )
+)
+
+(define-method set_forward_page_func
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_forward_page_func")
+  (return-type "none")
+  (parameters
+    '("GtkAssistantPageFunc" "page_func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_page_type
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_page_type")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "page")
+    '("GtkAssistantPageType" "type")
+  )
+)
+
+(define-method get_page_type
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_page_type")
+  (return-type "GtkAssistantPageType")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method set_page_title
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_page_title")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "page")
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_page_title
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_page_title")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method set_page_header_image
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_page_header_image")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "page")
+    '("GdkPixbuf*" "pixbuf" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_page_header_image
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_page_header_image")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method set_page_side_image
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_page_side_image")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "page")
+    '("GdkPixbuf*" "pixbuf" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_page_side_image
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_page_side_image")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method set_page_complete
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_set_page_complete")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "page")
+    '("gboolean" "complete")
+  )
+)
+
+(define-method get_page_complete
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_get_page_complete")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-method add_action_widget
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_add_action_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method remove_action_widget
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_remove_action_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method update_buttons_state
+  (of-object "GtkAssistant")
+  (c-name "gtk_assistant_update_buttons_state")
+  (return-type "none")
+)
+
+(define-virtual prepare
+  (of-object "GtkAssistant")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "page")
+  )
+)
+
+(define-virtual apply
+  (of-object "GtkAssistant")
+  (return-type "none")
+)
+
+(define-virtual close
+  (of-object "GtkAssistant")
+  (return-type "none")
+)
+
+(define-virtual cancel
+  (of-object "GtkAssistant")
+  (return-type "none")
+)
+
+(define-virtual forward
+  (of-object "GtkAssistant")
+  (return-type "gint")
+  (parameters
+    '("gint" "current")
+  )
+)
diff --git a/src/defs/GtkAssistantPageType.defs b/src/defs/GtkAssistantPageType.defs
new file mode 100644
index 0000000..1293b7b
--- /dev/null
+++ b/src/defs/GtkAssistantPageType.defs
@@ -0,0 +1,13 @@
+(define-enum AssistantPageType
+  (in-module "Gtk")
+  (c-name "GtkAssistantPageType")
+  (gtype-id "GTK_TYPE_ASSISTANT_PAGE_TYPE")
+  (values
+    '("content" "GTK_ASSISTANT_PAGE_CONTENT")
+    '("intro" "GTK_ASSISTANT_PAGE_INTRO")
+    '("confirm" "GTK_ASSISTANT_PAGE_CONFIRM")
+    '("summary" "GTK_ASSISTANT_PAGE_SUMMARY")
+    '("progress" "GTK_ASSISTANT_PAGE_PROGRESS")
+  )
+)
+
diff --git a/src/defs/GtkAttachOptions.defs b/src/defs/GtkAttachOptions.defs
new file mode 100644
index 0000000..47c8c36
--- /dev/null
+++ b/src/defs/GtkAttachOptions.defs
@@ -0,0 +1,11 @@
+(define-flags AttachOptions
+  (in-module "Gtk")
+  (c-name "GtkAttachOptions")
+  (gtype-id "GTK_TYPE_ATTACH_OPTIONS")
+  (values
+    '("expand" "GTK_EXPAND")
+    '("shrink" "GTK_SHRINK")
+    '("fill" "GTK_FILL")
+  )
+)
+
diff --git a/src/defs/GtkBin.defs b/src/defs/GtkBin.defs
new file mode 100644
index 0000000..1295478
--- /dev/null
+++ b/src/defs/GtkBin.defs
@@ -0,0 +1,16 @@
+(define-object Bin
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkBin")
+  (gtype-id "GTK_TYPE_BIN")
+  (fields
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method get_child
+  (of-object "GtkBin")
+  (c-name "gtk_bin_get_child")
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkBindingSet.defs b/src/defs/GtkBindingSet.defs
new file mode 100644
index 0000000..b259639
--- /dev/null
+++ b/src/defs/GtkBindingSet.defs
@@ -0,0 +1,42 @@
+(define-function binding_set_new
+  (is-constructor-of "GtkBindingSet")
+  (c-name "gtk_binding_set_new")
+  (caller-owns-return #t)
+  (return-type "GtkBindingSet*")
+  (parameters
+    '("const-gchar*" "set_name")
+  )
+)
+
+(define-function binding_set_find
+  (is-constructor-of "GtkBindingSet")
+  (c-name "gtk_binding_set_find")
+  (caller-owns-return #t)
+  (return-type "GtkBindingSet*")
+  (parameters
+    '("const-gchar*" "set_name")
+  )
+)
+
+(define-method set_activate
+  (of-object "GtkBindingSet")
+  (c-name "gtk_binding_set_activate")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+    '("GObject*" "object")
+  )
+)
+
+(define-method add_path
+  (of-object "GtkBindingSet")
+  (c-name "gtk_binding_set_add_path")
+  (return-type "none")
+  (parameters
+    '("GtkPathType" "path_type")
+    '("const-gchar*" "path_pattern")
+    '("GtkPathPriorityType" "priority")
+  )
+)
+
diff --git a/src/defs/GtkBorder.defs b/src/defs/GtkBorder.defs
new file mode 100644
index 0000000..8097233
--- /dev/null
+++ b/src/defs/GtkBorder.defs
@@ -0,0 +1,21 @@
+(define-boxed Border
+  (in-module "Gtk")
+  (c-name "GtkBorder")
+  (gtype-id "GTK_TYPE_BORDER")
+  (copy-func "gtk_border_copy")
+  (release-func "gtk_border_free")
+)
+
+(define-method copy
+  (of-object "GtkBorder")
+  (c-name "gtk_border_copy")
+  (caller-owns-return #t)
+  (return-type "GtkBorder*")
+)
+
+(define-method free
+  (of-object "GtkBorder")
+  (c-name "gtk_border_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkBox.defs b/src/defs/GtkBox.defs
new file mode 100644
index 0000000..7a65544
--- /dev/null
+++ b/src/defs/GtkBox.defs
@@ -0,0 +1,107 @@
+(define-object Box
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkBox")
+)
+
+(define-function gtk_box_new
+  (is-constructor-of "GtkBox")
+  (c-name "gtk_box_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkOrientation" "orientation")
+    '("gint" "spacing")
+  )
+)
+
+(define-method pack_start
+  (of-object "GtkBox")
+  (c-name "gtk_box_pack_start")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "expand" (default "TRUE"))
+    '("gboolean" "fill" (default "TRUE"))
+    '("guint" "padding" (default "0"))
+  )
+)
+
+(define-method pack_end
+  (of-object "GtkBox")
+  (c-name "gtk_box_pack_end")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "expand" (default "TRUE"))
+    '("gboolean" "fill" (default "TRUE"))
+    '("guint" "padding" (default "0"))
+  )
+)
+
+(define-method set_homogeneous
+  (of-object "GtkBox")
+  (c-name "gtk_box_set_homogeneous")
+  (return-type "none")
+  (parameters
+    '("gboolean" "homogeneous")
+  )
+)
+
+(define-method get_homogeneous
+  (of-object "GtkBox")
+  (c-name "gtk_box_get_homogeneous")
+  (return-type "gboolean")
+)
+
+(define-method set_spacing
+  (of-object "GtkBox")
+  (c-name "gtk_box_set_spacing")
+  (return-type "none")
+  (parameters
+    '("gint" "spacing")
+  )
+)
+
+(define-method get_spacing
+  (of-object "GtkBox")
+  (c-name "gtk_box_get_spacing")
+  (return-type "gint")
+)
+
+(define-method reorder_child
+  (of-object "GtkBox")
+  (c-name "gtk_box_reorder_child")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "position")
+  )
+)
+
+(define-method query_child_packing
+  (of-object "GtkBox")
+  (c-name "gtk_box_query_child_packing")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean*" "expand")
+    '("gboolean*" "fill")
+    '("guint*" "padding")
+    '("GtkPackType*" "pack_type")
+  )
+)
+
+(define-method set_child_packing
+  (of-object "GtkBox")
+  (c-name "gtk_box_set_child_packing")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "expand")
+    '("gboolean" "fill")
+    '("guint" "padding")
+    '("GtkPackType" "pack_type")
+  )
+)
+
diff --git a/src/defs/GtkBuilder.defs b/src/defs/GtkBuilder.defs
new file mode 100644
index 0000000..420098d
--- /dev/null
+++ b/src/defs/GtkBuilder.defs
@@ -0,0 +1,43 @@
+(define-object Builder
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkBuilder")
+)
+
+(define-function gtk_builder_new
+  (is-constructor-of "GtkBuilder")
+  (c-name "gtk_builder_new")
+  (caller-owns-return #t)
+  (return-type "GtkBuilder*")
+)
+
+(define-method add_from_file
+  (of-object "GtkBuilder")
+  (c-name "gtk_builder_add_from_file")
+  (return-type "guint")
+  (parameters
+    '("const-char*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-method add_from_string
+  (of-object "GtkBuilder")
+  (c-name "gtk_builder_add_from_string")
+  (return-type "guint")
+  (parameters
+    '("const-char*" "buffer")
+    '("gsize" "length")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_object
+  (of-object "GtkBuilder")
+  (c-name "gtk_builder_get_object")
+  (return-type "GObject*")
+  (parameters
+    '("const-char*" "name")
+  )
+)
+
diff --git a/src/defs/GtkButton.defs b/src/defs/GtkButton.defs
new file mode 100644
index 0000000..fdaae20
--- /dev/null
+++ b/src/defs/GtkButton.defs
@@ -0,0 +1,180 @@
+(define-object Button
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkButton")
+  (gtype-id "GTK_TYPE_BUTTON")
+)
+
+(define-function gtk_button_new
+  (is-constructor-of "GtkButton")
+  (c-name "gtk_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_button_new_with_label
+  (is-constructor-of "GtkButton")
+  (c-name "gtk_button_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_button_new_with_mnemonic
+  (is-constructor-of "GtkButton")
+  (c-name "gtk_button_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_button_new_from_stock
+  (is-constructor-of "GtkButton")
+  (c-name "gtk_button_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method clicked
+  (of-object "GtkButton")
+  (c-name "gtk_button_clicked")
+  (return-type "none")
+)
+
+(define-method set_relief
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_relief")
+  (return-type "none")
+  (parameters
+    '("GtkReliefStyle" "newstyle")
+  )
+)
+
+(define-method get_relief
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_relief")
+  (return-type "GtkReliefStyle")
+)
+
+(define-method set_label
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method get_label
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_use_underline
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_use_underline")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_underline")
+  )
+)
+
+(define-method get_use_underline
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_use_underline")
+  (return-type "gboolean")
+)
+
+(define-method set_use_stock
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_use_stock")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_stock")
+  )
+)
+
+(define-method get_use_stock
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_use_stock")
+  (return-type "gboolean")
+)
+
+(define-method set_focus_on_click
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_focus_on_click")
+  (return-type "none")
+  (parameters
+    '("gboolean" "focus_on_click")
+  )
+)
+
+(define-method get_focus_on_click
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_focus_on_click")
+  (return-type "gboolean")
+)
+
+(define-method set_alignment
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+  )
+)
+
+(define-method get_alignment
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat*" "xalign")
+    '("gfloat*" "yalign")
+  )
+)
+
+(define-method set_image
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_image")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "image" (null-ok))
+  )
+)
+
+(define-method get_image
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_image")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual clicked
+  (of-object "GtkButton")
+  (return-type "none")
+)
+
+(define-method set_image_position
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_image_position")
+  (return-type "none")
+  (parameters
+    '("GtkPositionType" "position")
+  )
+)
+
+(define-method get_image_position
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_image_position")
+  (return-type "GtkPositionType")
+)
+
diff --git a/src/defs/GtkButtonBox.defs b/src/defs/GtkButtonBox.defs
new file mode 100644
index 0000000..94518d8
--- /dev/null
+++ b/src/defs/GtkButtonBox.defs
@@ -0,0 +1,41 @@
+(define-object ButtonBox
+  (in-module "Gtk")
+  (parent "GtkBox")
+  (c-name "GtkButtonBox")
+  (gtype-id "GTK_TYPE_BUTTON_BOX")
+)
+
+(define-method get_layout
+  (of-object "GtkButtonBox")
+  (c-name "gtk_button_box_get_layout")
+  (return-type "GtkButtonBoxStyle")
+)
+
+(define-method set_layout
+  (of-object "GtkButtonBox")
+  (c-name "gtk_button_box_set_layout")
+  (return-type "none")
+  (parameters
+    '("GtkButtonBoxStyle" "layout_style")
+  )
+)
+
+(define-method get_child_secondary
+  (of-object "GtkButtonBox")
+  (c-name "gtk_button_box_get_child_secondary")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method set_child_secondary
+  (of-object "GtkButtonBox")
+  (c-name "gtk_button_box_set_child_secondary")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "is_secondary")
+  )
+)
+
diff --git a/src/defs/GtkButtonBoxStyle.defs b/src/defs/GtkButtonBoxStyle.defs
new file mode 100644
index 0000000..0df2ea0
--- /dev/null
+++ b/src/defs/GtkButtonBoxStyle.defs
@@ -0,0 +1,14 @@
+(define-enum ButtonBoxStyle
+  (in-module "Gtk")
+  (c-name "GtkButtonBoxStyle")
+  (gtype-id "GTK_TYPE_BUTTON_BOX_STYLE")
+  (values
+    '("default-style" "GTK_BUTTONBOX_DEFAULT_STYLE")
+    '("spread" "GTK_BUTTONBOX_SPREAD")
+    '("edge" "GTK_BUTTONBOX_EDGE")
+    '("start" "GTK_BUTTONBOX_START")
+    '("end" "GTK_BUTTONBOX_END")
+    '("center" "GTK_BUTTONBOX_CENTER")
+  )
+)
+
diff --git a/src/defs/GtkButtonsType.defs b/src/defs/GtkButtonsType.defs
new file mode 100644
index 0000000..c87d0ad
--- /dev/null
+++ b/src/defs/GtkButtonsType.defs
@@ -0,0 +1,14 @@
+(define-enum ButtonsType
+  (in-module "Gtk")
+  (c-name "GtkButtonsType")
+  (gtype-id "GTK_TYPE_BUTTONS_TYPE")
+  (values
+    '("none" "GTK_BUTTONS_NONE")
+    '("ok" "GTK_BUTTONS_OK")
+    '("close" "GTK_BUTTONS_CLOSE")
+    '("cancel" "GTK_BUTTONS_CANCEL")
+    '("yes-no" "GTK_BUTTONS_YES_NO")
+    '("ok-cancel" "GTK_BUTTONS_OK_CANCEL")
+  )
+)
+
diff --git a/src/defs/GtkCalendar.defs b/src/defs/GtkCalendar.defs
new file mode 100644
index 0000000..3f8618c
--- /dev/null
+++ b/src/defs/GtkCalendar.defs
@@ -0,0 +1,118 @@
+(define-object Calendar
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkCalendar")
+  (gtype-id "GTK_TYPE_CALENDAR")
+)
+
+(define-function gtk_calendar_new
+  (is-constructor-of "GtkCalendar")
+  (c-name "gtk_calendar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method select_month
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_select_month")
+  (return-type "none")
+  (parameters
+    '("guint" "month")
+    '("guint" "year")
+  )
+)
+
+(define-method select_day
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_select_day")
+  (return-type "none")
+  (parameters
+    '("guint" "day")
+  )
+)
+
+(define-method mark_day
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_mark_day")
+  (return-type "none")
+  (parameters
+    '("guint" "day")
+  )
+)
+
+(define-method unmark_day
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_unmark_day")
+  (return-type "none")
+  (parameters
+    '("guint" "day")
+  )
+)
+
+(define-method clear_marks
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_clear_marks")
+  (return-type "none")
+)
+
+(define-method set_display_options
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_set_display_options")
+  (return-type "none")
+  (parameters
+    '("GtkCalendarDisplayOptions" "flags")
+  )
+)
+
+(define-method get_display_options
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_get_display_options")
+  (return-type "GtkCalendarDisplayOptions")
+)
+
+(define-method get_date
+  (of-object "GtkCalendar")
+  (c-name "gtk_calendar_get_date")
+  (return-type "none")
+  (parameters
+    '("guint*" "year" (null-ok))
+    '("guint*" "month" (null-ok))
+    '("guint*" "day" (null-ok))
+  )
+)
+
+(define-virtual month_changed
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
+(define-virtual day_selected
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
+(define-virtual day_selected_double_click
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
+(define-virtual prev_month
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
+(define-virtual next_month
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
+(define-virtual prev_year
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
+(define-virtual next_year
+  (of-object "GtkCalendar")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkCalendarDisplayOptions.defs b/src/defs/GtkCalendarDisplayOptions.defs
new file mode 100644
index 0000000..baba0ad
--- /dev/null
+++ b/src/defs/GtkCalendarDisplayOptions.defs
@@ -0,0 +1,13 @@
+(define-flags CalendarDisplayOptions
+  (in-module "Gtk")
+  (c-name "GtkCalendarDisplayOptions")
+  (gtype-id "GTK_TYPE_CALENDAR_DISPLAY_OPTIONS")
+  (values
+    '("show-heading" "GTK_CALENDAR_SHOW_HEADING")
+    '("show-day-names" "GTK_CALENDAR_SHOW_DAY_NAMES")
+    '("no-month-change" "GTK_CALENDAR_NO_MONTH_CHANGE")
+    '("show-week-numbers" "GTK_CALENDAR_SHOW_WEEK_NUMBERS")
+    '("show-details" "GTK_CALENDAR_SHOW_DETAILS")
+  )
+)
+
diff --git a/src/defs/GtkCellEditable.defs b/src/defs/GtkCellEditable.defs
new file mode 100644
index 0000000..7571a34
--- /dev/null
+++ b/src/defs/GtkCellEditable.defs
@@ -0,0 +1,45 @@
+(define-interface CellEditable
+  (in-module "Gtk")
+  (c-name "GtkCellEditable")
+  (gtype-id "GTK_TYPE_CELL_EDITABLE")
+)
+
+(define-method start_editing
+  (of-object "GtkCellEditable")
+  (c-name "gtk_cell_editable_start_editing")
+  (return-type "none")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-method editing_done
+  (of-object "GtkCellEditable")
+  (c-name "gtk_cell_editable_editing_done")
+  (return-type "none")
+)
+
+(define-method remove_widget
+  (of-object "GtkCellEditable")
+  (c-name "gtk_cell_editable_remove_widget")
+  (return-type "none")
+)
+
+(define-virtual editing_done
+  (of-object "GtkCellEditable")
+  (return-type "none")
+)
+
+(define-virtual remove_widget
+  (of-object "GtkCellEditable")
+  (return-type "none")
+)
+
+(define-virtual start_editing
+  (of-object "GtkCellEditable")
+  (return-type "none")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
diff --git a/src/defs/GtkCellLayout.defs b/src/defs/GtkCellLayout.defs
new file mode 100644
index 0000000..5905151
--- /dev/null
+++ b/src/defs/GtkCellLayout.defs
@@ -0,0 +1,152 @@
+(define-interface CellLayout
+  (in-module "Gtk")
+  (c-name "GtkCellLayout")
+  (gtype-id "GTK_TYPE_CELL_LAYOUT")
+)
+
+(define-method pack_start
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_pack_start")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("gboolean" "expand" (default "TRUE"))
+  )
+)
+
+(define-method pack_end
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_pack_end")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("gboolean" "expand" (default "TRUE"))
+  )
+)
+
+(define-method clear
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_clear")
+  (return-type "none")
+)
+
+(define-method set_attributes
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_set_attributes")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+  )
+  (varargs #t)
+)
+
+(define-method add_attribute
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_add_attribute")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("const-gchar*" "attribute")
+    '("gint" "column")
+  )
+)
+
+(define-method set_cell_data_func
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_set_cell_data_func")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("GtkCellLayoutDataFunc" "func")
+    '("gpointer" "func_data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-method clear_attributes
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_clear_attributes")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+  )
+)
+
+(define-method reorder
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_reorder")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("gint" "position")
+  )
+)
+
+(define-virtual pack_start
+  (of-object "GtkCellLayout")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("gboolean" "expand")
+  )
+)
+
+(define-virtual pack_end
+  (of-object "GtkCellLayout")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("gboolean" "expand")
+  )
+)
+
+(define-virtual clear
+  (of-object "GtkCellLayout")
+  (return-type "none")
+)
+
+(define-virtual add_attribute
+  (of-object "GtkCellLayout")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("const-gchar*" "attribute")
+    '("gint" "column")
+  )
+)
+
+(define-virtual set_cell_data_func
+  (of-object "GtkCellLayout")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("GtkCellLayoutDataFunc" "func")
+    '("gpointer" "func_data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-virtual clear_attributes
+  (of-object "GtkCellLayout")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+  )
+)
+
+(define-virtual reorder
+  (of-object "GtkCellLayout")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+    '("gint" "position")
+  )
+)
+
+(define-method get_cells
+  (of-object "GtkCellLayout")
+  (c-name "gtk_cell_layout_get_cells")
+  (caller-owns-return #l)
+  (return-type "GList-GtkCellRenderer*")
+)
+
diff --git a/src/defs/GtkCellRenderer.defs b/src/defs/GtkCellRenderer.defs
new file mode 100644
index 0000000..08aa82d
--- /dev/null
+++ b/src/defs/GtkCellRenderer.defs
@@ -0,0 +1,226 @@
+(define-object CellRenderer
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkCellRenderer")
+  (gtype-id "GTK_TYPE_CELL_RENDERER")
+)
+
+(define-method get_size
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_get_size")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("GdkRectangle*" "cell_area")
+    '("gint*" "x_offset")
+    '("gint*" "y_offset")
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method render
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_render")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GtkWidget*" "widget")
+    '("GdkRectangle*" "background_area")
+    '("GdkRectangle*" "cell_area")
+    '("GtkCellRendererState" "flags")
+  )
+)
+
+(define-method activate
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_activate")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+    '("GtkWidget*" "widget")
+    '("const-gchar*" "path")
+    '("GdkRectangle*" "background_area")
+    '("GdkRectangle*" "cell_area")
+    '("GtkCellRendererState" "flags")
+  )
+)
+
+(define-method start_editing
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_start_editing")
+  (return-type "GtkCellEditable*")
+  (parameters
+    '("GdkEvent*" "event")
+    '("GtkWidget*" "widget")
+    '("const-gchar*" "path")
+    '("GdkRectangle*" "background_area")
+    '("GdkRectangle*" "cell_area")
+    '("GtkCellRendererState" "flags")
+  )
+)
+
+(define-method set_fixed_size
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_set_fixed_size")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method get_fixed_size
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_get_fixed_size")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method stop_editing
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_stop_editing")
+  (return-type "none")
+  (parameters
+    '("gboolean" "canceled")
+  )
+)
+
+(define-method set_alignment
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_set_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+  )
+)
+
+(define-method get_alignment
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_get_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat*" "xalign")
+    '("gfloat*" "yalign")
+  )
+)
+
+(define-method set_padding
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_set_padding")
+  (return-type "none")
+  (parameters
+    '("gint" "xpad")
+    '("gint" "ypad")
+  )
+)
+
+(define-method get_padding
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_get_padding")
+  (return-type "none")
+  (parameters
+    '("gint*" "xpad")
+    '("gint*" "ypad")
+  )
+)
+
+(define-method set_visible
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method get_visible
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method set_sensitive
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_set_sensitive")
+  (return-type "none")
+  (parameters
+    '("gboolean" "sensitive")
+  )
+)
+
+(define-method get_sensitive
+  (of-object "GtkCellRenderer")
+  (c-name "gtk_cell_renderer_get_sensitive")
+  (return-type "gboolean")
+)
+
+(define-virtual get_size
+  (of-object "GtkCellRenderer")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("GdkRectangle*" "cell_area")
+    '("gint*" "x_offset")
+    '("gint*" "y_offset")
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-virtual render
+  (of-object "GtkCellRenderer")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GtkWidget*" "widget")
+    '("GdkRectangle*" "background_area")
+    '("GdkRectangle*" "cell_area")
+    '("GtkCellRendererState" "flags")
+  )
+)
+
+(define-virtual activate
+  (of-object "GtkCellRenderer")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+    '("GtkWidget*" "widget")
+    '("const-gchar*" "path")
+    '("GdkRectangle*" "background_area")
+    '("GdkRectangle*" "cell_area")
+    '("GtkCellRendererState" "flags")
+  )
+)
+
+(define-virtual editing_canceled
+  (of-object "GtkCellRenderer")
+  (return-type "none")
+)
+
+(define-virtual editing_started
+  (of-object "GtkCellRenderer")
+  (return-type "none")
+  (parameters
+    '("GtkCellEditable*" "editable")
+    '("const-gchar*" "path")
+  )
+)
+
+(define-virtual start_editing
+  (of-object "GtkCellRenderer")
+  (return-type "GtkCellEditable*")
+  (parameters
+    '("GdkEvent*" "event")
+    '("GtkWidget*" "widget")
+    '("const-gchar*" "path")
+    '("GdkRectangle*" "background_area")
+    '("GdkRectangle*" "cell_area")
+    '("GtkCellRendererState" "flags")
+  )
+)
+
diff --git a/src/defs/GtkCellRendererAccel.defs b/src/defs/GtkCellRendererAccel.defs
new file mode 100644
index 0000000..8b9a174
--- /dev/null
+++ b/src/defs/GtkCellRendererAccel.defs
@@ -0,0 +1,33 @@
+(define-object CellRendererAccel
+  (in-module "Gtk")
+  (parent "GtkCellRendererText")
+  (c-name "GtkCellRendererAccel")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_ACCEL")
+)
+
+(define-function cell_renderer_accel_new
+  (is-constructor-of "GtkCellRendererAccel")
+  (c-name "gtk_cell_renderer_accel_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
+(define-virtual accel_edited
+  (of-object "GtkCellRendererAccel")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path_string")
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("guint" "hardware_keycode")
+  )
+)
+
+(define-virtual accel_cleared
+  (of-object "GtkCellRendererAccel")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path_string")
+  )
+)
+
diff --git a/src/defs/GtkCellRendererAccelMode.defs b/src/defs/GtkCellRendererAccelMode.defs
new file mode 100644
index 0000000..78b1476
--- /dev/null
+++ b/src/defs/GtkCellRendererAccelMode.defs
@@ -0,0 +1,10 @@
+(define-enum CellRendererAccelMode
+  (in-module "Gtk")
+  (c-name "GtkCellRendererAccelMode")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_ACCEL_MODE")
+  (values
+    '("gtk" "GTK_CELL_RENDERER_ACCEL_MODE_GTK")
+    '("other" "GTK_CELL_RENDERER_ACCEL_MODE_OTHER")
+  )
+)
+
diff --git a/src/defs/GtkCellRendererCombo.defs b/src/defs/GtkCellRendererCombo.defs
new file mode 100644
index 0000000..cb9b3e4
--- /dev/null
+++ b/src/defs/GtkCellRendererCombo.defs
@@ -0,0 +1,14 @@
+(define-object CellRendererCombo
+  (in-module "Gtk")
+  (parent "GtkCellRendererText")
+  (c-name "GtkCellRendererCombo")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_COMBO")
+)
+
+(define-function gtk_cell_renderer_combo_new
+  (is-constructor-of "GtkCellRendererCombo")
+  (c-name "gtk_cell_renderer_combo_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
diff --git a/src/defs/GtkCellRendererMode.defs b/src/defs/GtkCellRendererMode.defs
new file mode 100644
index 0000000..62ea514
--- /dev/null
+++ b/src/defs/GtkCellRendererMode.defs
@@ -0,0 +1,11 @@
+(define-enum CellRendererMode
+  (in-module "Gtk")
+  (c-name "GtkCellRendererMode")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_MODE")
+  (values
+    '("inert" "GTK_CELL_RENDERER_MODE_INERT")
+    '("activatable" "GTK_CELL_RENDERER_MODE_ACTIVATABLE")
+    '("editable" "GTK_CELL_RENDERER_MODE_EDITABLE")
+  )
+)
+
diff --git a/src/defs/GtkCellRendererPixbuf.defs b/src/defs/GtkCellRendererPixbuf.defs
new file mode 100644
index 0000000..5c715cf
--- /dev/null
+++ b/src/defs/GtkCellRendererPixbuf.defs
@@ -0,0 +1,14 @@
+(define-object CellRendererPixbuf
+  (in-module "Gtk")
+  (parent "GtkCellRenderer")
+  (c-name "GtkCellRendererPixbuf")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_PIXBUF")
+)
+
+(define-function gtk_cell_renderer_pixbuf_new
+  (is-constructor-of "GtkCellRendererPixbuf")
+  (c-name "gtk_cell_renderer_pixbuf_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
diff --git a/src/defs/GtkCellRendererProgress.defs b/src/defs/GtkCellRendererProgress.defs
new file mode 100644
index 0000000..9a0aab5
--- /dev/null
+++ b/src/defs/GtkCellRendererProgress.defs
@@ -0,0 +1,14 @@
+(define-object CellRendererProgress
+  (in-module "Gtk")
+  (parent "GtkCellRenderer")
+  (c-name "GtkCellRendererProgress")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_PROGRESS")
+)
+
+(define-function gtk_cell_renderer_progress_new
+  (is-constructor-of "GtkCellRendererProgress")
+  (c-name "gtk_cell_renderer_progress_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
diff --git a/src/defs/GtkCellRendererSpin.defs b/src/defs/GtkCellRendererSpin.defs
new file mode 100644
index 0000000..d7d120b
--- /dev/null
+++ b/src/defs/GtkCellRendererSpin.defs
@@ -0,0 +1,14 @@
+(define-object CellRendererSpin
+  (in-module "Gtk")
+  (parent "GtkCellRendererText")
+  (c-name "GtkCellRendererSpin")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_SPIN")
+)
+
+(define-function cell_renderer_spin_new
+  (is-constructor-of "GtkCellRendererSpin")
+  (c-name "gtk_cell_renderer_spin_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
diff --git a/src/defs/GtkCellRendererSpinner.defs b/src/defs/GtkCellRendererSpinner.defs
new file mode 100644
index 0000000..912a9b6
--- /dev/null
+++ b/src/defs/GtkCellRendererSpinner.defs
@@ -0,0 +1,14 @@
+(define-object CellRendererSpinner
+  (in-module "Gtk")
+  (parent "GtkCellRenderer")
+  (c-name "GtkCellRendererSpinner")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_SPINNER")
+)
+
+(define-function gtk_cell_renderer_spinner_new
+  (c-name "gtk_cell_renderer_spinner_new")
+  (is-constructor-of "GtkCellRendererSpinner")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
diff --git a/src/defs/GtkCellRendererState.defs b/src/defs/GtkCellRendererState.defs
new file mode 100644
index 0000000..38677a6
--- /dev/null
+++ b/src/defs/GtkCellRendererState.defs
@@ -0,0 +1,13 @@
+(define-flags CellRendererState
+  (in-module "Gtk")
+  (c-name "GtkCellRendererState")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_STATE")
+  (values
+    '("selected" "GTK_CELL_RENDERER_SELECTED")
+    '("prelit" "GTK_CELL_RENDERER_PRELIT")
+    '("insensitive" "GTK_CELL_RENDERER_INSENSITIVE")
+    '("sorted" "GTK_CELL_RENDERER_SORTED")
+    '("focused" "GTK_CELL_RENDERER_FOCUSED")
+  )
+)
+
diff --git a/src/defs/GtkCellRendererText.defs b/src/defs/GtkCellRendererText.defs
new file mode 100644
index 0000000..4133290
--- /dev/null
+++ b/src/defs/GtkCellRendererText.defs
@@ -0,0 +1,32 @@
+(define-object CellRendererText
+  (in-module "Gtk")
+  (parent "GtkCellRenderer")
+  (c-name "GtkCellRendererText")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_TEXT")
+)
+
+(define-function gtk_cell_renderer_text_new
+  (is-constructor-of "GtkCellRendererText")
+  (c-name "gtk_cell_renderer_text_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
+(define-method set_fixed_height_from_font
+  (of-object "GtkCellRendererText")
+  (c-name "gtk_cell_renderer_text_set_fixed_height_from_font")
+  (return-type "none")
+  (parameters
+    '("gint" "number_of_rows")
+  )
+)
+
+(define-virtual edited
+  (of-object "GtkCellRendererText")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path")
+    '("const-gchar*" "new_text")
+  )
+)
+
diff --git a/src/defs/GtkCellRendererToggle.defs b/src/defs/GtkCellRendererToggle.defs
new file mode 100644
index 0000000..4e4a193
--- /dev/null
+++ b/src/defs/GtkCellRendererToggle.defs
@@ -0,0 +1,67 @@
+(define-object CellRendererToggle
+  (in-module "Gtk")
+  (parent "GtkCellRenderer")
+  (c-name "GtkCellRendererToggle")
+  (gtype-id "GTK_TYPE_CELL_RENDERER_TOGGLE")
+)
+
+(define-function gtk_cell_renderer_toggle_new
+  (is-constructor-of "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_new")
+  (caller-owns-return #t)
+  (return-type "GtkCellRenderer*")
+)
+
+(define-method get_radio
+  (of-object "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_get_radio")
+  (return-type "gboolean")
+)
+
+(define-method set_radio
+  (of-object "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_set_radio")
+  (return-type "none")
+  (parameters
+    '("gboolean" "radio")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_get_active")
+  (return-type "gboolean")
+)
+
+(define-method set_active
+  (of-object "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_set_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_activatable
+  (of-object "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_get_activatable")
+  (return-type "gboolean")
+)
+
+(define-method set_activatable
+  (of-object "GtkCellRendererToggle")
+  (c-name "gtk_cell_renderer_toggle_set_activatable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-virtual toggled
+  (of-object "GtkCellRendererToggle")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
diff --git a/src/defs/GtkCellType.defs b/src/defs/GtkCellType.defs
new file mode 100644
index 0000000..9c364fe
--- /dev/null
+++ b/src/defs/GtkCellType.defs
@@ -0,0 +1,13 @@
+(define-enum CellType
+  (in-module "Gtk")
+  (c-name "GtkCellType")
+  (gtype-id "GTK_TYPE_CELL_TYPE")
+  (values
+    '("empty" "GTK_CELL_EMPTY")
+    '("text" "GTK_CELL_TEXT")
+    '("pixmap" "GTK_CELL_PIXMAP")
+    '("pixtext" "GTK_CELL_PIXTEXT")
+    '("widget" "GTK_CELL_WIDGET")
+  )
+)
+
diff --git a/src/defs/GtkCellView.defs b/src/defs/GtkCellView.defs
new file mode 100644
index 0000000..887359e
--- /dev/null
+++ b/src/defs/GtkCellView.defs
@@ -0,0 +1,58 @@
+(define-object CellView
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (implements "GtkCellLayout")
+  (c-name "GtkCellView")
+  (gtype-id "GTK_TYPE_CELL_VIEW")
+)
+
+(define-function gtk_cell_view_new
+  (is-constructor-of "GtkCellView")
+  (c-name "gtk_cell_view_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method set_model
+  (of-object "GtkCellView")
+  (c-name "gtk_cell_view_set_model")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModel*" "model" (null-ok))
+  )
+)
+
+(define-method set_displayed_row
+  (of-object "GtkCellView")
+  (c-name "gtk_cell_view_set_displayed_row")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path" (null-ok))
+  )
+)
+
+(define-method get_displayed_row
+  (of-object "GtkCellView")
+  (c-name "gtk_cell_view_get_displayed_row")
+  (return-type "GtkTreePath*")
+)
+
+(define-method get_size_of_row
+  (of-object "GtkCellView")
+  (c-name "gtk_cell_view_get_size_of_row")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkRequisition*" "requisition")
+  )
+)
+
+(define-method set_background_rgba
+  (of-object "GtkCellView")
+  (c-name "gtk_cell_view_set_background_rgba")
+  (return-type "none")
+  (parameters
+    '("const-GdkRGBA*" "color")
+  )
+)
+
diff --git a/src/defs/GtkCheckButton.defs b/src/defs/GtkCheckButton.defs
new file mode 100644
index 0000000..7dc90ef
--- /dev/null
+++ b/src/defs/GtkCheckButton.defs
@@ -0,0 +1,42 @@
+(define-object CheckButton
+  (in-module "Gtk")
+  (parent "GtkToggleButton")
+  (c-name "GtkCheckButton")
+  (gtype-id "GTK_TYPE_CHECK_BUTTON")
+)
+
+(define-function gtk_check_button_new
+  (is-constructor-of "GtkCheckButton")
+  (c-name "gtk_check_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_check_button_new_with_label
+  (is-constructor-of "GtkCheckButton")
+  (c-name "gtk_check_button_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_check_button_new_with_mnemonic
+  (is-constructor-of "GtkCheckButton")
+  (c-name "gtk_check_button_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-virtual draw_indicator
+  (of-object "GtkCheckButton")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "area")
+  )
+)
+
diff --git a/src/defs/GtkCheckMenuItem.defs b/src/defs/GtkCheckMenuItem.defs
new file mode 100644
index 0000000..dc98672
--- /dev/null
+++ b/src/defs/GtkCheckMenuItem.defs
@@ -0,0 +1,101 @@
+(define-object CheckMenuItem
+  (in-module "Gtk")
+  (parent "GtkMenuItem")
+  (c-name "GtkCheckMenuItem")
+  (gtype-id "GTK_TYPE_CHECK_MENU_ITEM")
+  (fields
+    '("gboolean" "active")
+  )
+)
+
+(define-function gtk_check_menu_item_new
+  (is-constructor-of "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_check_menu_item_new_with_label
+  (is-constructor-of "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_check_menu_item_new_with_mnemonic
+  (is-constructor-of "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method set_active
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_set_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_active")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_get_active")
+  (return-type "gboolean")
+)
+
+(define-method toggled
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_toggled")
+  (return-type "none")
+)
+
+(define-method set_inconsistent
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_set_inconsistent")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_inconsistent
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_get_inconsistent")
+  (return-type "gboolean")
+)
+
+(define-method set_draw_as_radio
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_set_draw_as_radio")
+  (return-type "none")
+  (parameters
+    '("gboolean" "draw_as_radio")
+  )
+)
+
+(define-method get_draw_as_radio
+  (of-object "GtkCheckMenuItem")
+  (c-name "gtk_check_menu_item_get_draw_as_radio")
+  (return-type "gboolean")
+)
+
+(define-virtual toggled
+  (of-object "GtkCheckMenuItem")
+  (return-type "none")
+)
+
+(define-virtual draw_indicator
+  (of-object "GtkCheckMenuItem")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "area")
+  )
+)
+
diff --git a/src/defs/GtkClipboard.defs b/src/defs/GtkClipboard.defs
new file mode 100644
index 0000000..ff702a2
--- /dev/null
+++ b/src/defs/GtkClipboard.defs
@@ -0,0 +1,228 @@
+(define-object Clipboard
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkClipboard")
+  (gtype-id "GTK_TYPE_CLIPBOARD")
+)
+
+(define-method wait_is_target_available
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_is_target_available")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "target")
+  )
+)
+
+(define-method set_can_store
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_set_can_store")
+  (return-type "none")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+  )
+)
+
+(define-method store
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_store")
+  (return-type "none")
+)
+
+(define-function clipboard_get_for_display
+  (is-constructor-of "GtkClipboard")
+  (c-name "gtk_clipboard_get_for_display")
+  (return-type "GtkClipboard*")
+  (parameters
+    '("GdkDisplay*" "display" (default "gdk_display_get_default()"))
+    '("GdkAtom" "selection" (default "GDK_SELECTION_CLIPBOARD"))
+  )
+)
+
+(define-method get_display
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_get_display")
+  (return-type "GdkDisplay*")
+)
+
+(define-method set_with_data
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_set_with_data")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("guint" "n_targets")
+    '("GtkClipboardGetFunc" "get_func")
+    '("GtkClipboardClearFunc" "clear_func")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method set_with_owner
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_set_with_owner")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("guint" "n_targets")
+    '("GtkClipboardGetFunc" "get_func")
+    '("GtkClipboardClearFunc" "clear_func")
+    '("GObject*" "owner")
+  )
+)
+
+(define-method get_owner
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_get_owner")
+  (return-type "GObject*")
+)
+
+(define-method clear
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_clear")
+  (return-type "none")
+)
+
+(define-method set_text
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_set_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "len" (default "-1"))
+  )
+)
+
+(define-method request_contents
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_request_contents")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "target")
+    '("GtkClipboardReceivedFunc" "callback")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method request_text
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_request_text")
+  (return-type "none")
+  (parameters
+    '("GtkClipboardTextReceivedFunc" "callback")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method request_targets
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_request_targets")
+  (return-type "none")
+  (parameters
+    '("GtkClipboardTargetsReceivedFunc" "callback")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method wait_for_contents
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_for_contents")
+  (return-type "GtkSelectionData*")
+  (parameters
+    '("GdkAtom" "target")
+  )
+)
+
+(define-method wait_for_text
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_for_text")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method wait_is_text_available
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_is_text_available")
+  (return-type "gboolean")
+)
+
+(define-method wait_for_targets
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_for_targets")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom**" "targets")
+    '("gint*" "n_targets")
+  )
+)
+
+(define-method request_image
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_request_image")
+  (return-type "none")
+  (parameters
+    '("GtkClipboardImageReceivedFunc" "callback")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method wait_for_image
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_for_image")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method set_image
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_set_image")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-method wait_is_image_available
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_is_image_available")
+  (return-type "gboolean")
+)
+
+(define-method request_rich_text
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_request_rich_text")
+  (return-type "none")
+  (parameters
+    '("GtkTextBuffer*" "buffer")
+    '("GtkClipboardRichTextReceivedFunc" "callback")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method wait_for_rich_text
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_for_rich_text")
+  (return-type "guint8*")
+  (parameters
+    '("GtkTextBuffer*" "buffer")
+    '("GdkAtom*" "format")
+    '("gsize*" "length")
+  )
+)
+
+(define-method wait_is_rich_text_available
+  (of-object "GtkClipboard")
+  (c-name "gtk_clipboard_wait_is_rich_text_available")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextBuffer*" "buffer")
+  )
+)
+
+(define-virtual owner_change
+  (of-object "GtkClipboard")
+  (return-type "none")
+  (parameters
+    '("GdkEventOwnerChange*" "event")
+  )
+)
diff --git a/src/defs/GtkColorButton.defs b/src/defs/GtkColorButton.defs
new file mode 100644
index 0000000..ad98e17
--- /dev/null
+++ b/src/defs/GtkColorButton.defs
@@ -0,0 +1,92 @@
+(define-object ColorButton
+  (in-module "Gtk")
+  (parent "GtkButton")
+  (c-name "GtkColorButton")
+  (gtype-id "GTK_TYPE_COLOR_BUTTON")
+)
+
+(define-function color_button_new
+  (is-constructor-of "GtkColorButton")
+  (c-name "gtk_color_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function color_button_new_with_rgba
+  (is-constructor-of "GtkColorButton")
+  (c-name "gtk_color_button_new_with_rgba")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-GdkRGBA*" "color")
+  )
+)
+
+(define-method set_rgba
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_set_rgba")
+  (return-type "none")
+  (parameters
+    '("const-GdkRGBA*" "color")
+  )
+)
+
+(define-method set_alpha
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_set_alpha")
+  (return-type "none")
+  (parameters
+    '("guint16" "alpha")
+  )
+)
+
+(define-method get_rgba
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_get_rgba")
+  (return-type "none")
+  (parameters
+    '("GdkRGBA*" "color")
+  )
+)
+
+(define-method get_alpha
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_get_alpha")
+  (return-type "guint16")
+)
+
+(define-method set_use_alpha
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_set_use_alpha")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_alpha")
+  )
+)
+
+(define-method get_use_alpha
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_get_use_alpha")
+  (return-type "gboolean")
+)
+
+(define-method set_title
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_title
+  (of-object "GtkColorButton")
+  (c-name "gtk_color_button_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-virtual color_set
+  (of-object "GtkColorButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkColorSelection.defs b/src/defs/GtkColorSelection.defs
new file mode 100644
index 0000000..ddc3529
--- /dev/null
+++ b/src/defs/GtkColorSelection.defs
@@ -0,0 +1,121 @@
+(define-object ColorSelection
+  (in-module "Gtk")
+  (parent "GtkVBox")
+  (c-name "GtkColorSelection")
+  (gtype-id "GTK_TYPE_COLOR_SELECTION")
+)
+
+(define-function gtk_color_selection_new
+  (is-constructor-of "GtkColorSelection")
+  (c-name "gtk_color_selection_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_has_opacity_control
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_get_has_opacity_control")
+  (return-type "gboolean")
+)
+
+(define-method set_has_opacity_control
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_set_has_opacity_control")
+  (return-type "none")
+  (parameters
+    '("gboolean" "has_opacity")
+  )
+)
+
+(define-method get_has_palette
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_get_has_palette")
+  (return-type "gboolean")
+)
+
+(define-method set_has_palette
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_set_has_palette")
+  (return-type "none")
+  (parameters
+    '("gboolean" "has_palette")
+  )
+)
+
+(define-method set_current_color
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_set_current_color")
+  (return-type "none")
+  (parameters
+    '("GdkColor*" "color")
+  )
+)
+
+(define-method set_current_alpha
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_set_current_alpha")
+  (return-type "none")
+  (parameters
+    '("guint16" "alpha")
+  )
+)
+
+(define-method get_current_color
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_get_current_color")
+  (return-type "none")
+  (parameters
+    '("GdkColor*" "color")
+  )
+)
+
+(define-method get_current_alpha
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_get_current_alpha")
+  (return-type "guint16")
+)
+
+(define-method set_previous_color
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_set_previous_color")
+  (return-type "none")
+  (parameters
+    '("GdkColor*" "color")
+  )
+)
+
+(define-method set_previous_alpha
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_set_previous_alpha")
+  (return-type "none")
+  (parameters
+    '("guint16" "alpha")
+  )
+)
+
+(define-method get_previous_color
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_get_previous_color")
+  (return-type "none")
+  (parameters
+    '("GdkColor*" "color")
+  )
+)
+
+(define-method get_previous_alpha
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_get_previous_alpha")
+  (return-type "guint16")
+)
+
+(define-method is_adjusting
+  (of-object "GtkColorSelection")
+  (c-name "gtk_color_selection_is_adjusting")
+  (return-type "gboolean")
+)
+
+(define-virtual color_changed
+  (of-object "GtkColorSelection")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkColorSelectionDialog.defs b/src/defs/GtkColorSelectionDialog.defs
new file mode 100644
index 0000000..e5ecda2
--- /dev/null
+++ b/src/defs/GtkColorSelectionDialog.defs
@@ -0,0 +1,22 @@
+(define-object ColorSelectionDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (c-name "GtkColorSelectionDialog")
+  (gtype-id "GTK_TYPE_COLOR_SELECTION_DIALOG")
+  (fields
+    '("GtkWidget*" "colorsel")
+    '("GtkWidget*" "ok_button")
+    '("GtkWidget*" "cancel_button")
+    '("GtkWidget*" "help_button")
+  )
+)
+
+(define-function gtk_color_selection_dialog_new
+  (is-constructor-of "GtkColorSelectionDialog")
+  (c-name "gtk_color_selection_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
diff --git a/src/defs/GtkComboBox.defs b/src/defs/GtkComboBox.defs
new file mode 100644
index 0000000..1fde753
--- /dev/null
+++ b/src/defs/GtkComboBox.defs
@@ -0,0 +1,221 @@
+(define-object ComboBox
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (implements "GtkCellEditable")
+  (implements "GtkCellLayout")
+  (c-name "GtkComboBox")
+  (gtype-id "GTK_TYPE_COMBO_BOX")
+)
+
+(define-function gtk_combo_box_new
+  (is-constructor-of "GtkComboBox")
+  (c-name "gtk_combo_box_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_combo_box_new_with_entry
+  (is-constructor-of "GtkComboBox")
+  (c-name "gtk_combo_box_new_with_entry)
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_combo_box_new_with_model
+  (is-constructor-of "GtkComboBox")
+  (c-name "gtk_combo_box_new_with_model")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkTreeModel*" "model")
+  )
+)
+
+(define-function gtk_combo_box_new_with_model_and_entry
+  (is-constructor-of "GtkComboBox")
+  (c-name "gtk_combo_box_new_with_model_and_entry")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkTreeModel*" "model")
+  )
+)
+
+(define-method set_wrap_width
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_wrap_width")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+  )
+)
+
+(define-method set_row_span_column
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_row_span_column")
+  (return-type "none")
+  (parameters
+    '("gint" "row_span")
+  )
+)
+
+(define-method set_column_span_column
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_column_span_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column_span")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_active")
+  (return-type "gint")
+)
+
+(define-method set_active
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_active")
+  (return-type "none")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method get_active_iter
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_active_iter")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method set_active_iter
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_active_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method set_model
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_model")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModel*" "model" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_model
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method popup
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_popup")
+  (return-type "none")
+)
+
+(define-method popdown
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_popdown")
+  (return-type "none")
+)
+
+(define-method get_wrap_width
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_wrap_width")
+  (return-type "gint")
+)
+
+(define-method get_row_span_column
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_row_span_column")
+  (return-type "gint")
+)
+
+(define-method get_column_span_column
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_column_span_column")
+  (return-type "gint")
+)
+
+(define-method get_add_tearoffs
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_add_tearoffs")
+  (return-type "gboolean")
+)
+
+(define-method set_add_tearoffs
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_add_tearoffs")
+  (return-type "none")
+  (parameters
+    '("gboolean" "add_tearoffs")
+  )
+)
+
+(define-method get_focus_on_click
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_focus_on_click")
+  (return-type "gboolean")
+)
+
+(define-method set_focus_on_click
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_focus_on_click")
+  (return-type "none")
+  (parameters
+    '("gboolean" "focus_on_click")
+  )
+)
+
+(define-method set_row_separator_func
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_row_separator_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewRowSeparatorFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method get_row_separator_func
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_row_separator_func")
+  (return-type "GtkTreeViewRowSeparatorFunc")
+)
+
+(define-method get_popup_accessible
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_popup_accessible")
+  (return-type "AtkObject*")
+)
+
+(define-virtual changed
+  (of-object "GtkComboBox")
+  (return-type "none")
+)
+
+(define-method get_title
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method set_title
+  (of-object "GtkComboBox")
+  (c-name "gtk_combo_box_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
diff --git a/src/defs/GtkComboBoxText.defs b/src/defs/GtkComboBoxText.defs
new file mode 100644
index 0000000..3bbe58b
--- /dev/null
+++ b/src/defs/GtkComboBoxText.defs
@@ -0,0 +1,95 @@
+(define-object ComboBoxText
+  (in-module "Gtk")
+  (parent "GtkComboBox")
+  (c-name "GtkComboBoxText")
+  (gtype-id "GTK_TYPE_COMBO_BOX_TEXT")
+)
+
+(define-function gtk_combo_box_text_new
+  (is-constructor-of "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method append_text
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_append_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method insert_text
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_insert_text")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method prepend_text
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_prepend_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method remove
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_remove")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+  )
+)
+
+(define-method remove_all
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_remove_all")
+  (return-type "none")
+)
+
+(define-method get_active_text
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_get_active_text")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method insert
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_insert")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+    '("const-gchar*" "id")
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method append
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_append")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "id")
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method prepend
+  (of-object "GtkComboBoxText")
+  (c-name "gtk_combo_box_text_prepend")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "id")
+    '("const-gchar*" "text")
+  )
+)
+
diff --git a/src/defs/GtkContainer.defs b/src/defs/GtkContainer.defs
new file mode 100644
index 0000000..236d74c
--- /dev/null
+++ b/src/defs/GtkContainer.defs
@@ -0,0 +1,344 @@
+(define-object Container
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkContainer")
+  (gtype-id "GTK_TYPE_CONTAINER")
+  (fields
+    '("GtkWidget*" "focus_child")
+    '("guint" "border_width")
+    '("guint" "need_resize")
+    '("guint" "resize_mode")
+    '("guint" "reallocate_redraws")
+    '("guint" "has_focus_chain")
+  )
+)
+
+(define-method set_border_width
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_border_width")
+  (return-type "none")
+  (parameters
+    '("guint" "border_width")
+  )
+)
+
+(define-method get_border_width
+  (of-object "GtkContainer")
+  (c-name "gtk_container_get_border_width")
+  (return-type "guint")
+)
+
+(define-method add
+  (of-object "GtkContainer")
+  (c-name "gtk_container_add")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-method remove
+  (of-object "GtkContainer")
+  (c-name "gtk_container_remove")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-method set_resize_mode
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_resize_mode")
+  (return-type "none")
+  (parameters
+    '("GtkResizeMode" "resize_mode")
+  )
+)
+
+(define-method get_resize_mode
+  (of-object "GtkContainer")
+  (c-name "gtk_container_get_resize_mode")
+  (return-type "GtkResizeMode")
+)
+
+(define-method check_resize
+  (of-object "GtkContainer")
+  (c-name "gtk_container_check_resize")
+  (return-type "none")
+)
+
+(define-method foreach
+  (of-object "GtkContainer")
+  (c-name "gtk_container_foreach")
+  (return-type "none")
+  (parameters
+    '("GtkCallback" "callback")
+    '("gpointer" "callback_data")
+  )
+)
+
+(define-method foreach_full
+  (of-object "GtkContainer")
+  (c-name "gtk_container_foreach_full")
+  (return-type "none")
+  (parameters
+    '("GtkCallback" "callback")
+    '("GtkCallbackMarshal" "marshal")
+    '("gpointer" "callback_data")
+    '("GtkDestroyNotify" "notify")
+  )
+)
+
+(define-method get_children
+  (of-object "GtkContainer")
+  (c-name "gtk_container_get_children")
+  (caller-owns-return #l)
+  (return-type "GList-GtkWidget*")
+)
+
+(define-method set_focus_chain
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_focus_chain")
+  (return-type "none")
+  (parameters
+    '("GList-GtkWidget*" "focusable_widgets")
+  )
+)
+
+(define-method get_focus_chain
+  (of-object "GtkContainer")
+  (c-name "gtk_container_get_focus_chain")
+  (return-type "gboolean")
+  (parameters
+    '("GList**" "focusable_widgets")
+  )
+)
+
+(define-method unset_focus_chain
+  (of-object "GtkContainer")
+  (c-name "gtk_container_unset_focus_chain")
+  (return-type "none")
+)
+
+(define-method set_reallocate_redraws
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_reallocate_redraws")
+  (return-type "none")
+  (parameters
+    '("gboolean" "needs_redraws")
+  )
+)
+
+(define-method set_focus_child
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_focus_child")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child" (null-ok))
+  )
+)
+
+(define-method set_focus_vadjustment
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_focus_vadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method get_focus_vadjustment
+  (of-object "GtkContainer")
+  (c-name "gtk_container_get_focus_vadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_focus_hadjustment
+  (of-object "GtkContainer")
+  (c-name "gtk_container_set_focus_hadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method get_focus_hadjustment
+  (of-object "GtkContainer")
+  (c-name "gtk_container_get_focus_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method resize_children
+  (of-object "GtkContainer")
+  (c-name "gtk_container_resize_children")
+  (return-type "none")
+)
+
+(define-method child_type
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_type")
+  (return-type "GType")
+)
+
+(define-method add_with_properties
+  (of-object "GtkContainer")
+  (c-name "gtk_container_add_with_properties")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("const-gchar*" "first_prop_name")
+  )
+  (varargs #t)
+)
+
+(define-method child_set
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_set")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "first_prop_name")
+  )
+  (varargs #t)
+)
+
+(define-method child_get
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_get")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "first_prop_name")
+  )
+  (varargs #t)
+)
+
+(define-method child_set_valist
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_set_valist")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "first_property_name")
+    '("va_list" "var_args")
+  )
+)
+
+(define-method child_get_valist
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_get_valist")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "first_property_name")
+    '("va_list" "var_args")
+  )
+)
+
+(define-method child_set_property
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_set_property")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "property_name")
+    '("const-GValue*" "value")
+  )
+)
+
+(define-method child_get_property
+  (of-object "GtkContainer")
+  (c-name "gtk_container_child_get_property")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "property_name")
+    '("GValue*" "value")
+  )
+)
+
+(define-method forall
+  (of-object "GtkContainer")
+  (c-name "gtk_container_forall")
+  (return-type "none")
+  (parameters
+    '("GtkCallback" "callback")
+    '("gpointer" "callback_data")
+  )
+)
+
+(define-virtual add
+  (of-object "GtkContainer")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-virtual remove
+  (of-object "GtkContainer")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-virtual check_resize
+  (of-object "GtkContainer")
+  (return-type "none")
+)
+
+(define-virtual forall
+  (of-object "GtkContainer")
+  (return-type "none")
+  (parameters
+    '("gboolean" "include_internals")
+    '("GtkCallback" "callback")
+    '("gpointer" "callback_data")
+  )
+)
+
+(define-virtual set_focus_child
+  (of-object "GtkContainer")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget" (null-ok))
+  )
+)
+
+(define-virtual child_type
+  (of-object "GtkContainer")
+  (return-type "GType")
+)
+
+(define-virtual composite_name
+  (of-object "GtkContainer")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-virtual set_child_property
+  (of-object "GtkContainer")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("guint" "property_id")
+    '("const-GValue*" "value")
+    '("GParamSpec*" "pspec")
+  )
+)
+
+(define-virtual get_child_property
+  (of-object "GtkContainer")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("guint" "property_id")
+    '("GValue*" "value")
+    '("GParamSpec*" "pspec")
+  )
+)
+
diff --git a/src/defs/GtkCornerType.defs b/src/defs/GtkCornerType.defs
new file mode 100644
index 0000000..19a8d6b
--- /dev/null
+++ b/src/defs/GtkCornerType.defs
@@ -0,0 +1,12 @@
+(define-enum CornerType
+  (in-module "Gtk")
+  (c-name "GtkCornerType")
+  (gtype-id "GTK_TYPE_CORNER_TYPE")
+  (values
+    '("top-left" "GTK_CORNER_TOP_LEFT")
+    '("bottom-left" "GTK_CORNER_BOTTOM_LEFT")
+    '("top-right" "GTK_CORNER_TOP_RIGHT")
+    '("bottom-right" "GTK_CORNER_BOTTOM_RIGHT")
+  )
+)
+
diff --git a/src/defs/GtkDebugFlag.defs b/src/defs/GtkDebugFlag.defs
new file mode 100644
index 0000000..643382d
--- /dev/null
+++ b/src/defs/GtkDebugFlag.defs
@@ -0,0 +1,15 @@
+(define-flags DebugFlag
+  (in-module "Gtk")
+  (c-name "GtkDebugFlag")
+  (gtype-id "GTK_TYPE_DEBUG_FLAG")
+  (values
+    '("misc" "GTK_DEBUG_MISC")
+    '("plugsocket" "GTK_DEBUG_PLUGSOCKET")
+    '("text" "GTK_DEBUG_TEXT")
+    '("tree" "GTK_DEBUG_TREE")
+    '("updates" "GTK_DEBUG_UPDATES")
+    '("keybindings" "GTK_DEBUG_KEYBINDINGS")
+    '("multihead" "GTK_DEBUG_MULTIHEAD")
+  )
+)
+
diff --git a/src/defs/GtkDeleteType.defs b/src/defs/GtkDeleteType.defs
new file mode 100644
index 0000000..a08dc8b
--- /dev/null
+++ b/src/defs/GtkDeleteType.defs
@@ -0,0 +1,16 @@
+(define-enum DeleteType
+  (in-module "Gtk")
+  (c-name "GtkDeleteType")
+  (gtype-id "GTK_TYPE_DELETE_TYPE")
+  (values
+    '("chars" "GTK_DELETE_CHARS")
+    '("word-ends" "GTK_DELETE_WORD_ENDS")
+    '("words" "GTK_DELETE_WORDS")
+    '("display-lines" "GTK_DELETE_DISPLAY_LINES")
+    '("display-line-ends" "GTK_DELETE_DISPLAY_LINE_ENDS")
+    '("paragraph-ends" "GTK_DELETE_PARAGRAPH_ENDS")
+    '("paragraphs" "GTK_DELETE_PARAGRAPHS")
+    '("whitespace" "GTK_DELETE_WHITESPACE")
+  )
+)
+
diff --git a/src/defs/GtkDestDefaults.defs b/src/defs/GtkDestDefaults.defs
new file mode 100644
index 0000000..414fce1
--- /dev/null
+++ b/src/defs/GtkDestDefaults.defs
@@ -0,0 +1,12 @@
+(define-flags DestDefaults
+  (in-module "Gtk")
+  (c-name "GtkDestDefaults")
+  (gtype-id "GTK_TYPE_DEST_DEFAULTS")
+  (values
+    '("motion" "GTK_DEST_DEFAULT_MOTION")
+    '("highlight" "GTK_DEST_DEFAULT_HIGHLIGHT")
+    '("drop" "GTK_DEST_DEFAULT_DROP")
+    '("all" "GTK_DEST_DEFAULT_ALL")
+  )
+)
+
diff --git a/src/defs/GtkDialog.defs b/src/defs/GtkDialog.defs
new file mode 100644
index 0000000..76e5a2c
--- /dev/null
+++ b/src/defs/GtkDialog.defs
@@ -0,0 +1,145 @@
+(define-object Dialog
+  (in-module "Gtk")
+  (parent "GtkWindow")
+  (c-name "GtkDialog")
+  (gtype-id "GTK_TYPE_DIALOG")
+  (fields
+    '("GtkWidget*" "vbox")
+    '("GtkWidget*" "action_area")
+  )
+)
+
+(define-function gtk_dialog_new
+  (is-constructor-of "GtkDialog")
+  (c-name "gtk_dialog_new")
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_dialog_new_with_buttons
+  (is-constructor-of "GtkDialog")
+  (c-name "gtk_dialog_new_with_buttons")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title" (default "NULL") (null-ok))
+    '("GtkWindow*" "parent" (default "NULL") (null-ok))
+    '("GtkDialogFlags" "flags" (default "0"))
+    '("const-gchar*" "first_button_text" (default "NULL") (null-ok))
+  )
+  (varargs #t)
+)
+
+(define-method add_action_widget
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_add_action_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "response_id")
+  )
+)
+
+(define-method add_button
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_add_button")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "button_text")
+    '("gint" "response_id")
+  )
+)
+
+(define-method add_buttons
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_add_buttons")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "first_button_text")
+  )
+  (varargs #t)
+)
+
+(define-method set_response_sensitive
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_set_response_sensitive")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+    '("gboolean" "setting")
+  )
+)
+
+(define-method set_default_response
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_set_default_response")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+  )
+)
+
+(define-method get_response_for_widget
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_get_response_for_widget")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-method get_widget_for_response
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_get_widget_for_response")
+  (return-type "GtkWidget*")
+  (parameters
+    '("gint" "response_id")
+  )
+)
+
+(define-method response
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_response")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+  )
+)
+
+(define-method run
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_run")
+  (return-type "gint")
+)
+
+(define-method set_alternative_button_order
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_set_alternative_button_order")
+  (return-type "none")
+  (parameters
+    '("gint" "first_response_id")
+  )
+  (varargs #t)
+)
+
+(define-method set_alternative_button_order_from_array
+  (of-object "GtkDialog")
+  (c-name "gtk_dialog_set_alternative_button_order_from_array")
+  (return-type "none")
+  (parameters
+    '("gint" "n_params")
+    '("gint*" "new_order")
+  )
+)
+
+(define-virtual response
+  (of-object "GtkDialog")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+  )
+)
+
+(define-virtual close
+  (of-object "GtkDialog")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkDialogFlags.defs b/src/defs/GtkDialogFlags.defs
new file mode 100644
index 0000000..03bf45b
--- /dev/null
+++ b/src/defs/GtkDialogFlags.defs
@@ -0,0 +1,10 @@
+(define-flags DialogFlags
+  (in-module "Gtk")
+  (c-name "GtkDialogFlags")
+  (gtype-id "GTK_TYPE_DIALOG_FLAGS")
+  (values
+    '("modal" "GTK_DIALOG_MODAL")
+    '("destroy-with-parent" "GTK_DIALOG_DESTROY_WITH_PARENT")
+  )
+)
+
diff --git a/src/defs/GtkDirectionType.defs b/src/defs/GtkDirectionType.defs
new file mode 100644
index 0000000..18b86eb
--- /dev/null
+++ b/src/defs/GtkDirectionType.defs
@@ -0,0 +1,14 @@
+(define-enum DirectionType
+  (in-module "Gtk")
+  (c-name "GtkDirectionType")
+  (gtype-id "GTK_TYPE_DIRECTION_TYPE")
+  (values
+    '("tab-forward" "GTK_DIR_TAB_FORWARD")
+    '("tab-backward" "GTK_DIR_TAB_BACKWARD")
+    '("up" "GTK_DIR_UP")
+    '("down" "GTK_DIR_DOWN")
+    '("left" "GTK_DIR_LEFT")
+    '("right" "GTK_DIR_RIGHT")
+  )
+)
+
diff --git a/src/defs/GtkDrawingArea.defs b/src/defs/GtkDrawingArea.defs
new file mode 100644
index 0000000..8b5fc2d
--- /dev/null
+++ b/src/defs/GtkDrawingArea.defs
@@ -0,0 +1,14 @@
+(define-object DrawingArea
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkDrawingArea")
+  (gtype-id "GTK_TYPE_DRAWING_AREA")
+)
+
+(define-function gtk_drawing_area_new
+  (is-constructor-of "GtkDrawingArea")
+  (c-name "gtk_drawing_area_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkEditable.defs b/src/defs/GtkEditable.defs
new file mode 100644
index 0000000..cf3809c
--- /dev/null
+++ b/src/defs/GtkEditable.defs
@@ -0,0 +1,196 @@
+(define-interface Editable
+  (in-module "Gtk")
+  (c-name "GtkEditable")
+  (gtype-id "GTK_TYPE_EDITABLE")
+)
+
+(define-method select_region
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_select_region")
+  (return-type "none")
+  (parameters
+    '("gint" "start")
+    '("gint" "end")
+  )
+)
+
+(define-method get_selection_bounds
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_get_selection_bounds")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "start")
+    '("gint*" "end")
+  )
+)
+
+(define-method insert_text
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_insert_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "new_text")
+    '("gint" "new_text_length")
+    '("gint*" "position" (default "0"))
+  )
+)
+
+(define-method delete_text
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_delete_text")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-method get_chars
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_get_chars")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-method cut_clipboard
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_cut_clipboard")
+  (return-type "none")
+)
+
+(define-method copy_clipboard
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_copy_clipboard")
+  (return-type "none")
+)
+
+(define-method paste_clipboard
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_paste_clipboard")
+  (return-type "none")
+)
+
+(define-method delete_selection
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_delete_selection")
+  (return-type "none")
+)
+
+(define-method set_position
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_set_position")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+  )
+)
+
+(define-method get_position
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_get_position")
+  (return-type "gint")
+)
+
+(define-method set_editable
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_set_editable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_editable")
+  )
+)
+
+(define-method get_editable
+  (of-object "GtkEditable")
+  (c-name "gtk_editable_get_editable")
+  (return-type "gboolean")
+)
+
+(define-virtual insert_text
+  (of-object "GtkEditable")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "length")
+    '("gint*" "position")
+  )
+)
+
+(define-virtual delete_text
+  (of-object "GtkEditable")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual changed
+  (of-object "GtkEditable")
+  (return-type "none")
+)
+
+(define-virtual do_insert_text
+  (of-object "GtkEditable")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "length")
+    '("gint*" "position")
+  )
+)
+
+(define-virtual do_delete_text
+  (of-object "GtkEditable")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual get_chars
+  (of-object "GtkEditable")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual set_selection_bounds
+  (of-object "GtkEditable")
+  (return-type "none")
+  (parameters
+    '("gint" "start_pos")
+    '("gint" "end_pos")
+  )
+)
+
+(define-virtual get_selection_bounds
+  (of-object "GtkEditable")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "start_pos")
+    '("gint*" "end_pos")
+  )
+)
+
+(define-virtual set_position
+  (of-object "GtkEditable")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+  )
+)
+
+(define-virtual get_position
+  (of-object "GtkEditable")
+  (return-type "gint")
+)
+
diff --git a/src/defs/GtkEntry.defs b/src/defs/GtkEntry.defs
new file mode 100644
index 0000000..6229bd8
--- /dev/null
+++ b/src/defs/GtkEntry.defs
@@ -0,0 +1,557 @@
+(define-object Entry
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (implements "GtkEditable")
+  (implements "GtkCellEditable")
+  (c-name "GtkEntry")
+  (gtype-id "GTK_TYPE_ENTRY")
+)
+
+(define-function gtk_entry_new
+  (is-constructor-of "GtkEntry")
+  (c-name "gtk_entry_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function new_with_buffer
+  (is-constructor-of "GtkEntry")
+  (c-name "gtk_entry_new_with_buffer")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkEntryBuffer*" "buffer")
+  )
+)
+
+(define-method set_visibility
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_visibility")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method get_visibility
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_visibility")
+  (return-type "gboolean")
+)
+
+(define-method set_invisible_char
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_invisible_char")
+  (return-type "none")
+  (parameters
+    '("gunichar" "ch")
+  )
+)
+
+(define-method get_invisible_char
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_invisible_char")
+  (return-type "gunichar")
+)
+
+(define-method set_has_frame
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_has_frame")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_has_frame
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_has_frame")
+  (return-type "gboolean")
+)
+
+(define-method set_max_length
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_max_length")
+  (return-type "none")
+  (parameters
+    '("gint" "max")
+  )
+)
+
+(define-method get_max_length
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_max_length")
+  (return-type "gint")
+)
+
+(define-method set_activates_default
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_activates_default")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_activates_default
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_activates_default")
+  (return-type "gboolean")
+)
+
+(define-method set_width_chars
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_width_chars")
+  (return-type "none")
+  (parameters
+    '("gint" "n_chars")
+  )
+)
+
+(define-method get_width_chars
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_width_chars")
+  (return-type "gint")
+)
+
+(define-method set_text
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method get_text
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_text")
+  (return-type "const-gchar*")
+)
+
+(define-method get_text_length
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_text_length")
+  (return-type "guint16")
+)
+
+(define-method get_layout
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_layout")
+  (return-type "PangoLayout*")
+)
+
+(define-method get_layout_offsets
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_layout_offsets")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-method set_alignment
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+  )
+)
+
+(define-method get_alignment
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_alignment")
+  (return-type "gfloat")
+)
+
+(define-method set_completion
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_completion")
+  (return-type "none")
+  (parameters
+    '("GtkEntryCompletion*" "completion" (null-ok))
+  )
+)
+
+(define-method get_completion
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_completion")
+  (return-type "GtkEntryCompletion*")
+)
+
+(define-method set_buffer
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_buffer")
+  (return-type "none")
+  (parameters
+    '("GtkEntryBuffer*" "buffer")
+  )
+)
+
+(define-method get_buffer
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_buffer")
+  (return-type "GtkEntryBuffer*")
+)
+
+(define-method layout_index_to_text_index
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_layout_index_to_text_index")
+  (return-type "gint")
+  (parameters
+    '("gint" "layout_index")
+  )
+)
+
+(define-method text_index_to_layout_index
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_text_index_to_layout_index")
+  (return-type "gint")
+  (parameters
+    '("gint" "text_index")
+  )
+)
+
+(define-method set_overwrite_mode
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_overwrite_mode")
+  (return-type "none")
+  (parameters
+    '("gboolean" "overwrite")
+  )
+)
+
+(define-method get_overwrite_mode
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_overwrite_mode")
+  (return-type "gboolean")
+)
+
+(define-virtual populate_popup
+  (of-object "GtkEntry")
+  (return-type "none")
+  (parameters
+    '("GtkMenu*" "menu")
+  )
+)
+
+(define-virtual activate
+  (of-object "GtkEntry")
+  (return-type "none")
+)
+
+(define-virtual move_cursor
+  (of-object "GtkEntry")
+  (return-type "none")
+  (parameters
+    '("GtkMovementStep" "step")
+    '("gint" "count")
+    '("gboolean" "extend_selection")
+  )
+)
+
+(define-virtual insert_at_cursor
+  (of-object "GtkEntry")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-virtual delete_from_cursor
+  (of-object "GtkEntry")
+  (return-type "none")
+  (parameters
+    '("GtkDeleteType" "type")
+    '("gint" "count")
+  )
+)
+
+(define-virtual backspace
+  (of-object "GtkEntry")
+  (return-type "none")
+)
+
+(define-virtual cut_clipboard
+  (of-object "GtkEntry")
+  (return-type "none")
+)
+
+(define-virtual copy_clipboard
+  (of-object "GtkEntry")
+  (return-type "none")
+)
+
+(define-virtual paste_clipboard
+  (of-object "GtkEntry")
+  (return-type "none")
+)
+
+(define-virtual toggle_overwrite
+  (of-object "GtkEntry")
+  (return-type "none")
+)
+
+(define-method set_inner_border
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_inner_border")
+  (return-type "none")
+  (parameters
+    '("const-GtkBorder*" "border" (null-ok))
+  )
+)
+
+(define-method get_inner_border
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_inner_border")
+  (return-type "const-GtkBorder*")
+)
+
+(define-method set_cursor_hadjustment
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_cursor_hadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
+(define-method get_cursor_hadjustment
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_cursor_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_progress_fraction
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_progress_fraction")
+  (return-type "none")
+  (parameters
+    '("gdouble" "fraction")
+  )
+)
+
+(define-method get_progress_fraction
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_progress_fraction")
+  (return-type "gdouble")
+)
+
+(define-method set_progress_pulse_step
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_progress_pulse_step")
+  (return-type "none")
+  (parameters
+    '("gdouble" "fraction")
+  )
+)
+
+(define-method get_progress_pulse_step
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_progress_pulse_step")
+  (return-type "gdouble")
+)
+
+(define-method progress_pulse
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_progress_pulse")
+  (return-type "none")
+)
+
+(define-method set_icon_from_pixbuf
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_from_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("GdkPixbuf*" "pixbuf" (null-ok))
+  )
+)
+
+(define-method set_icon_from_stock
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_from_stock")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("const-gchar*" "stock_id" (null-ok))
+  )
+)
+
+(define-method set_icon_from_icon_name
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_from_icon_name")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("const-gchar*" "icon_name" (null-ok))
+  )
+)
+
+(define-method set_icon_from_gicon
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_from_gicon")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("GIcon*" "icon" (null-ok))
+  )
+)
+
+(define-method get_icon_storage_type
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_storage_type")
+  (return-type "GtkImageType")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method get_icon_pixbuf
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_pixbuf")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method get_icon_stock
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_stock")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method get_icon_name
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method get_icon_gicon
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_gicon")
+  (return-type "GIcon*")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method set_icon_activatable
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_activatable")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("gboolean" "activatable")
+  )
+)
+
+(define-method get_icon_activatable
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_activatable")
+  (return-type "gboolean")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method set_icon_sensitive
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_sensitive")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("gboolean" "sensitive")
+  )
+)
+
+(define-method get_icon_sensitive
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_sensitive")
+  (return-type "gboolean")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method get_icon_at_pos
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_at_pos")
+  (return-type "gint")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method set_icon_tooltip_text
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_tooltip_text")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("const-gchar*" "tooltip" (null-ok))
+  )
+)
+
+(define-method get_icon_tooltip_text
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_tooltip_text")
+  (return-type "gchar*")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method set_icon_tooltip_markup
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_set_icon_tooltip_markup")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("const-gchar*" "tooltip" (null-ok))
+  )
+)
+
+(define-method get_icon_tooltip_markup
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_get_icon_tooltip_markup")
+  (return-type "gchar*")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+  )
+)
+
+(define-method unset_invisible_char
+  (of-object "GtkEntry")
+  (c-name "gtk_entry_unset_invisible_char")
+  (return-type "none")
+)
+
+(define-virtual icon_press
+  (of-object "GtkEntry")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual icon_release
+  (of-object "GtkEntry")
+  (return-type "none")
+  (parameters
+    '("GtkEntryIconPosition" "icon_pos")
+    '("GdkEvent*" "event")
+  )
+)
+
diff --git a/src/defs/GtkEntryBuffer.defs b/src/defs/GtkEntryBuffer.defs
new file mode 100644
index 0000000..9e598c7
--- /dev/null
+++ b/src/defs/GtkEntryBuffer.defs
@@ -0,0 +1,120 @@
+(define-object EntryBuffer
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkEntryBuffer")
+  (gtype-id "GTK_TYPE_ENTRY_BUFFER")
+)
+
+(define-function gtk_entry_buffer_new
+  (c-name "gtk_entry_buffer_new")
+  (is-constructor-of "GtkEntryBuffer")
+  (return-type "GtkEntryBuffer*")
+  (parameters
+    '("const-gchar*" "initial_chars")
+    '("gint" "n_initial_chars")
+  )
+)
+
+(define-method get_bytes
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_get_bytes")
+  (return-type "gsize")
+)
+
+(define-method get_length
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_get_length")
+  (return-type "guint")
+)
+
+(define-method get_text
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_get_text")
+  (return-type "const-gchar*")
+)
+
+(define-method set_text
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_set_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "chars")
+    '("gint" "n_chars")
+  )
+)
+
+(define-method set_max_length
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_set_max_length")
+  (return-type "none")
+  (parameters
+    '("gint" "max_length")
+  )
+)
+
+(define-method get_max_length
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_get_max_length")
+  (return-type "gint")
+)
+
+(define-method insert_text
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_insert_text")
+  (return-type "guint")
+  (parameters
+    '("guint" "position")
+    '("const-gchar*" "chars")
+    '("gint" "n_chars")
+  )
+)
+
+(define-method delete_text
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_delete_text")
+  (return-type "guint")
+  (parameters
+    '("guint" "position")
+    '("gint" "n_chars")
+  )
+)
+
+(define-method emit_inserted_text
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_emit_inserted_text")
+  (return-type "none")
+  (parameters
+    '("guint" "position")
+    '("const-gchar*" "chars")
+    '("guint" "n_chars")
+  )
+)
+
+(define-method emit_deleted_text
+  (of-object "GtkEntryBuffer")
+  (c-name "gtk_entry_buffer_emit_deleted_text")
+  (return-type "none")
+  (parameters
+    '("guint" "position")
+    '("guint" "n_chars")
+  )
+)
+
+(define-virtual deleted-text
+  (of-object "GtkEntryBuffer")
+  (return-type "none")
+  (parameters
+    '("guint" "position")
+    '("guint" "n_chars")
+  )
+)
+
+(define-method inserted-text
+  (of-object "GtkEntryBuffer")
+  (return-type "none")
+  (parameters
+    '("guint" "position")
+    '("gchar*" "chars")
+    '("guint" "n_chars")
+  )
+)
diff --git a/src/defs/GtkEntryCompletion.defs b/src/defs/GtkEntryCompletion.defs
new file mode 100644
index 0000000..518840a
--- /dev/null
+++ b/src/defs/GtkEntryCompletion.defs
@@ -0,0 +1,242 @@
+(define-object EntryCompletion
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkCellLayout")
+  (c-name "GtkEntryCompletion")
+  (gtype-id "GTK_TYPE_ENTRY_COMPLETION")
+)
+
+(define-function gtk_entry_completion_new
+  (is-constructor-of "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_new")
+  (caller-owns-return #t)
+  (return-type "GtkEntryCompletion*")
+)
+
+(define-method get_entry
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_entry")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_model
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_model")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModel*" "model" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_model
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method set_match_func
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_match_func")
+  (return-type "none")
+  (parameters
+    '("GtkEntryCompletionMatchFunc" "func")
+    '("gpointer" "func_data")
+    '("GDestroyNotify" "func_notify")
+  )
+)
+
+(define-method set_minimum_key_length
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_minimum_key_length")
+  (return-type "none")
+  (parameters
+    '("gint" "length")
+  )
+)
+
+(define-method get_minimum_key_length
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_minimum_key_length")
+  (return-type "gint")
+)
+
+(define-method complete
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_complete")
+  (return-type "none")
+)
+
+(define-method insert_action_text
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_insert_action_text")
+  (return-type "none")
+  (parameters
+    '("gint" "index")
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method insert_action_markup
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_insert_action_markup")
+  (return-type "none")
+  (parameters
+    '("gint" "index")
+    '("const-gchar*" "markup")
+  )
+)
+
+(define-method delete_action
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_delete_action")
+  (return-type "none")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method set_text_column
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_text_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_text_column
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_text_column")
+  (return-type "gint")
+)
+
+(define-method insert_prefix
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_insert_prefix")
+  (return-type "none")
+)
+
+(define-method set_inline_completion
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_inline_completion")
+  (return-type "none")
+  (parameters
+    '("gboolean" "inline_completion")
+  )
+)
+
+(define-method get_inline_completion
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_inline_completion")
+  (return-type "gboolean")
+)
+
+(define-method set_popup_completion
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_popup_completion")
+  (return-type "none")
+  (parameters
+    '("gboolean" "popup_completion")
+  )
+)
+
+(define-method get_popup_completion
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_popup_completion")
+  (return-type "gboolean")
+)
+
+(define-method set_popup_set_width
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_popup_set_width")
+  (return-type "none")
+  (parameters
+    '("gboolean" "popup_set_width")
+  )
+)
+
+(define-method get_popup_set_width
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_popup_set_width")
+  (return-type "gboolean")
+)
+
+(define-method set_popup_single_match
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_popup_single_match")
+  (return-type "none")
+  (parameters
+    '("gboolean" "popup_single_match")
+  )
+)
+
+(define-method get_popup_single_match
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_popup_single_match")
+  (return-type "gboolean")
+)
+
+(define-method get_completion_prefix
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_completion_prefix")
+  (return-type "const-gchar*")
+)
+
+(define-method get_inline_selection
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_get_inline_selection")
+  (return-type "gboolean")
+)
+
+(define-method set_inline_selection
+  (of-object "GtkEntryCompletion")
+  (c-name "gtk_entry_completion_set_inline_selection")
+  (return-type "none")
+  (parameters
+    '("gboolean" "inline_selection")
+  )
+)
+
+(define-virtual match_selected
+  (of-object "GtkEntryCompletion")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeModel*" "model")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual action_activated
+  (of-object "GtkEntryCompletion")
+  (return-type "none")
+  (parameters
+    '("gint" "index_")
+  )
+)
+
+(define-virtual insert_prefix
+  (of-object "GtkEntryCompletion")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "prefix")
+  )
+)
+
+(define-virtual cursor_on_match
+  (of-object "GtkEntryCompletion")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeModel*" "model")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual match
+  (of-object "GtkEntryCompletion")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "key")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
diff --git a/src/defs/GtkEntryIconPosition.defs b/src/defs/GtkEntryIconPosition.defs
new file mode 100644
index 0000000..4094b7e
--- /dev/null
+++ b/src/defs/GtkEntryIconPosition.defs
@@ -0,0 +1,10 @@
+(define-enum EntryIconPosition
+  (in-module "Gtk")
+  (c-name "GtkEntryIconPosition")
+  (gtype-id "GTK_TYPE_ENTRY_ICON_POSITION")
+  (values
+    '("primary" "GTK_ENTRY_ICON_PRIMARY")
+    '("secondary" "GTK_ENTRY_ICON_SECONDARY")
+  )
+)
+ 
diff --git a/src/defs/GtkEventBox.defs b/src/defs/GtkEventBox.defs
new file mode 100644
index 0000000..14e048c
--- /dev/null
+++ b/src/defs/GtkEventBox.defs
@@ -0,0 +1,44 @@
+(define-object EventBox
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkEventBox")
+  (gtype-id "GTK_TYPE_EVENT_BOX")
+)
+
+(define-function gtk_event_box_new
+  (is-constructor-of "GtkEventBox")
+  (c-name "gtk_event_box_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_visible_window
+  (of-object "GtkEventBox")
+  (c-name "gtk_event_box_get_visible_window")
+  (return-type "gboolean")
+)
+
+(define-method set_visible_window
+  (of-object "GtkEventBox")
+  (c-name "gtk_event_box_set_visible_window")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible_window")
+  )
+)
+
+(define-method get_above_child
+  (of-object "GtkEventBox")
+  (c-name "gtk_event_box_get_above_child")
+  (return-type "gboolean")
+)
+
+(define-method set_above_child
+  (of-object "GtkEventBox")
+  (c-name "gtk_event_box_set_above_child")
+  (return-type "none")
+  (parameters
+    '("gboolean" "above_child")
+  )
+)
+
diff --git a/src/defs/GtkExpander.defs b/src/defs/GtkExpander.defs
new file mode 100644
index 0000000..24c18ad
--- /dev/null
+++ b/src/defs/GtkExpander.defs
@@ -0,0 +1,122 @@
+(define-object Expander
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkExpander")
+  (gtype-id "GTK_TYPE_EXPANDER")
+)
+
+(define-function gtk_expander_new
+  (is-constructor-of "GtkExpander")
+  (c-name "gtk_expander_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function expander_new_with_mnemonic
+  (is-constructor-of "GtkExpander")
+  (c-name "gtk_expander_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_expanded
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_set_expanded")
+  (return-type "none")
+  (parameters
+    '("gboolean" "expanded")
+  )
+)
+
+(define-method get_expanded
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_get_expanded")
+  (return-type "gboolean")
+)
+
+(define-method set_spacing
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_set_spacing")
+  (return-type "none")
+  (parameters
+    '("gint" "spacing")
+  )
+)
+
+(define-method get_spacing
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_get_spacing")
+  (return-type "gint")
+)
+
+(define-method set_label
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label" (null-ok))
+  )
+)
+
+(define-method get_label
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_use_underline
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_set_use_underline")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_underline")
+  )
+)
+
+(define-method get_use_underline
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_get_use_underline")
+  (return-type "gboolean")
+)
+
+(define-method set_use_markup
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_set_use_markup")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_markup")
+  )
+)
+
+(define-method get_use_markup
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_get_use_markup")
+  (return-type "gboolean")
+)
+
+(define-method set_label_widget
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_set_label_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "label_widget" (null-ok))
+  )
+)
+
+(define-method get_label_widget
+  (of-object "GtkExpander")
+  (c-name "gtk_expander_get_label_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual activate
+  (of-object "GtkExpander")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkExpanderStyle.defs b/src/defs/GtkExpanderStyle.defs
new file mode 100644
index 0000000..d0b0b4e
--- /dev/null
+++ b/src/defs/GtkExpanderStyle.defs
@@ -0,0 +1,12 @@
+(define-enum ExpanderStyle
+  (in-module "Gtk")
+  (c-name "GtkExpanderStyle")
+  (gtype-id "GTK_TYPE_EXPANDER_STYLE")
+  (values
+    '("collapsed" "GTK_EXPANDER_COLLAPSED")
+    '("semi-collapsed" "GTK_EXPANDER_SEMI_COLLAPSED")
+    '("semi-expanded" "GTK_EXPANDER_SEMI_EXPANDED")
+    '("expanded" "GTK_EXPANDER_EXPANDED")
+  )
+)
+
diff --git a/src/defs/GtkFileChooser.defs b/src/defs/GtkFileChooser.defs
new file mode 100644
index 0000000..c7e818e
--- /dev/null
+++ b/src/defs/GtkFileChooser.defs
@@ -0,0 +1,420 @@
+(define-interface FileChooser
+  (in-module "Gtk")
+  (c-name "GtkFileChooser")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER")
+)
+
+(define-method set_action
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_action")
+  (return-type "none")
+  (parameters
+    '("GtkFileChooserAction" "action")
+  )
+)
+
+(define-method get_action
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_action")
+  (return-type "GtkFileChooserAction")
+)
+
+(define-method set_local_only
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_local_only")
+  (return-type "none")
+  (parameters
+    '("gboolean" "local_only")
+  )
+)
+
+(define-method get_local_only
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_local_only")
+  (return-type "gboolean")
+)
+
+(define-method set_select_multiple
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_select_multiple")
+  (return-type "none")
+  (parameters
+    '("gboolean" "select_multiple")
+  )
+)
+
+(define-method get_select_multiple
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_select_multiple")
+  (return-type "gboolean")
+)
+
+(define-method set_show_hidden
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_show_hidden")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_hidden")
+  )
+)
+
+(define-method get_show_hidden
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_show_hidden")
+  (return-type "gboolean")
+)
+
+(define-method set_do_overwrite_confirmation
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_do_overwrite_confirmation")
+  (return-type "none")
+  (parameters
+    '("gboolean" "do_overwrite_confirmation")
+  )
+)
+
+(define-method get_do_overwrite_confirmation
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_do_overwrite_confirmation")
+  (return-type "gboolean")
+)
+
+(define-method set_current_name
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_current_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_filename
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_filename")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_filename
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_filename")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "filename")
+  )
+)
+
+(define-method select_filename
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_select_filename")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "filename")
+  )
+)
+
+(define-method unselect_filename
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_unselect_filename")
+  (return-type "none")
+  (parameters
+    '("const-char*" "filename")
+  )
+)
+
+(define-method select_all
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_select_all")
+  (return-type "none")
+)
+
+(define-method unselect_all
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_unselect_all")
+  (return-type "none")
+)
+
+(define-method get_filenames
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_filenames")
+  (return-type "GSList*")
+)
+
+(define-method set_current_folder
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_current_folder")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-method get_current_folder
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_current_folder")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_uri")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "uri")
+  )
+)
+
+(define-method select_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_select_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "uri")
+  )
+)
+
+(define-method unselect_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_unselect_uri")
+  (return-type "none")
+  (parameters
+    '("const-char*" "uri")
+  )
+)
+
+(define-method get_uris
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_uris")
+  (return-type "GSList*")
+)
+
+(define-method set_current_folder_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_current_folder_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-method get_current_folder_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_current_folder_uri")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_preview_widget
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_preview_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "preview_widget")
+  )
+)
+
+(define-method get_preview_widget
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_preview_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_preview_widget_active
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_preview_widget_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "active")
+  )
+)
+
+(define-method get_preview_widget_active
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_preview_widget_active")
+  (return-type "gboolean")
+)
+
+(define-method set_use_preview_label
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_use_preview_label")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_label")
+  )
+)
+
+(define-method get_use_preview_label
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_use_preview_label")
+  (return-type "gboolean")
+)
+
+(define-method get_preview_filename
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_preview_filename")
+  (caller-owns-return #t)
+  (return-type "char*")
+)
+
+(define-method get_preview_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_preview_uri")
+  (caller-owns-return #t)
+  (return-type "char*")
+)
+
+(define-method set_extra_widget
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_extra_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "extra_widget")
+  )
+)
+
+(define-method get_extra_widget
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_extra_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method add_filter
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_add_filter")
+  (return-type "none")
+  (parameters
+    '("GtkFileFilter*" "filter")
+  )
+)
+
+(define-method remove_filter
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_remove_filter")
+  (return-type "none")
+  (parameters
+    '("GtkFileFilter*" "filter")
+  )
+)
+
+(define-method list_filters
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_list_filters")
+  (caller-owns-return #l)
+  (return-type "GSList-GtkFileFilter*")
+)
+
+(define-method set_filter
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_filter")
+  (return-type "none")
+  (parameters
+    '("GtkFileFilter*" "filter")
+  )
+)
+
+(define-method get_filter
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_filter")
+  (return-type "GtkFileFilter*")
+)
+
+(define-method add_shortcut_folder
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_add_shortcut_folder")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "folder")
+    '("GError**" "error")
+  )
+)
+
+(define-method remove_shortcut_folder
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_remove_shortcut_folder")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "folder")
+    '("GError**" "error")
+  )
+)
+
+(define-method list_shortcut_folders
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_list_shortcut_folders")
+  (return-type "GSList*")
+)
+
+(define-method add_shortcut_folder_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_add_shortcut_folder_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method remove_shortcut_folder_uri
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_remove_shortcut_folder_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method list_shortcut_folder_uris
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_list_shortcut_folder_uris")
+  (return-type "GSList*")
+)
+
+(define-method set_create_folders
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_set_create_folders")
+  (return-type "none")
+  (parameters
+    '("gboolean" "create_folders")
+  )
+)
+
+(define-method get_create_folders
+  (of-object "GtkFileChooser")
+  (c-name "gtk_file_chooser_get_create_folders")
+  (return-type "gboolean")
+)
+
+(define-signal confirm_overwrite
+  (of-object "GtkFileChooser")
+  (return-type "GtkFileChooserConfirmation")
+)
+
+(define-signal current_folder_changed
+  (of-object "GtkFileChooser")
+  (return-type "none")
+)
+
+(define-signal file_activated
+  (of-object "GtkFileChooser")
+  (return-type "none")
+)
+
+(define-signal selection_changed
+  (of-object "GtkFileChooser")
+  (return-type "none")
+)
+
+(define-signal update_preview
+  (of-object "GtkFileChooser")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkFileChooserAction.defs b/src/defs/GtkFileChooserAction.defs
new file mode 100644
index 0000000..a25129b
--- /dev/null
+++ b/src/defs/GtkFileChooserAction.defs
@@ -0,0 +1,12 @@
+(define-enum FileChooserAction
+  (in-module "Gtk")
+  (c-name "GtkFileChooserAction")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER_ACTION")
+  (values
+    '("open" "GTK_FILE_CHOOSER_ACTION_OPEN")
+    '("save" "GTK_FILE_CHOOSER_ACTION_SAVE")
+    '("select-folder" "GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER")
+    '("create-folder" "GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER")
+  )
+)
+
diff --git a/src/defs/GtkFileChooserButton.defs b/src/defs/GtkFileChooserButton.defs
new file mode 100644
index 0000000..54b678b
--- /dev/null
+++ b/src/defs/GtkFileChooserButton.defs
@@ -0,0 +1,78 @@
+(define-object FileChooserButton
+  (in-module "Gtk")
+  (parent "GtkHBox")
+  (implements "GtkFileChooser")
+  (c-name "GtkFileChooserButton")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER_BUTTON")
+)
+
+(define-function file_chooser_button_new
+  (is-constructor-of "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title")
+    '("GtkFileChooserAction" "action")
+  )
+)
+
+(define-function file_chooser_button_new_with_dialog
+  (is-constructor-of "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_new_with_dialog")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkWidget*" "dialog")
+  )
+)
+
+(define-method get_title
+  (of-object "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method set_title
+  (of-object "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_width_chars
+  (of-object "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_get_width_chars")
+  (return-type "gint")
+)
+
+(define-method set_width_chars
+  (of-object "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_set_width_chars")
+  (return-type "none")
+  (parameters
+    '("gint" "n_chars")
+  )
+)
+
+(define-method get_focus_on_click
+  (of-object "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_get_focus_on_click")
+  (return-type "gboolean")
+)
+
+(define-method set_focus_on_click
+  (of-object "GtkFileChooserButton")
+  (c-name "gtk_file_chooser_button_set_focus_on_click")
+  (return-type "none")
+  (parameters
+    '("gboolean" "focus_on_click")
+  )
+)
+
+(define-virtual file_set
+  (of-object "GtkFileChooserButton")
+  (return-type "none")
+)
diff --git a/src/defs/GtkFileChooserConfirmation.defs b/src/defs/GtkFileChooserConfirmation.defs
new file mode 100644
index 0000000..0b07074
--- /dev/null
+++ b/src/defs/GtkFileChooserConfirmation.defs
@@ -0,0 +1,11 @@
+(define-enum FileChooserConfirmation
+  (in-module "Gtk")
+  (c-name "GtkFileChooserConfirmation")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER_CONFIRMATION")
+  (values
+    '("confirm" "GTK_FILE_CHOOSER_CONFIRMATION_CONFIRM")
+    '("accept-filename" "GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME")
+    '("select-again" "GTK_FILE_CHOOSER_CONFIRMATION_SELECT_AGAIN")
+  )
+)
+
diff --git a/src/defs/GtkFileChooserDialog.defs b/src/defs/GtkFileChooserDialog.defs
new file mode 100644
index 0000000..a84643f
--- /dev/null
+++ b/src/defs/GtkFileChooserDialog.defs
@@ -0,0 +1,21 @@
+(define-object FileChooserDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (implements "GtkFileChooser")
+  (c-name "GtkFileChooserDialog")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER_DIALOG")
+)
+
+(define-function gtk_file_chooser_dialog_new
+  (is-constructor-of "GtkFileChooserDialog")
+  (c-name "gtk_file_chooser_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title" (null-ok))
+    '("GtkWindow*" "parent" (null-ok))
+    '("GtkFileChooserAction" "action")
+    '("const-gchar*" "first_button_text" (null-ok))
+  )
+  (varargs #t)
+)
+
diff --git a/src/defs/GtkFileChooserError.defs b/src/defs/GtkFileChooserError.defs
new file mode 100644
index 0000000..31b121c
--- /dev/null
+++ b/src/defs/GtkFileChooserError.defs
@@ -0,0 +1,10 @@
+(define-enum FileChooserError
+  (in-module "Gtk")
+  (c-name "GtkFileChooserError")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER_ERROR")
+  (values
+    '("nonexistent" "GTK_FILE_CHOOSER_ERROR_NONEXISTENT")
+    '("bad-filename" "GTK_FILE_CHOOSER_ERROR_BAD_FILENAME")
+  )
+)
+
diff --git a/src/defs/GtkFileChooserWidget.defs b/src/defs/GtkFileChooserWidget.defs
new file mode 100644
index 0000000..6dd8886
--- /dev/null
+++ b/src/defs/GtkFileChooserWidget.defs
@@ -0,0 +1,18 @@
+(define-object FileChooserWidget
+  (in-module "Gtk")
+  (parent "GtkVBox")
+  (implements "GtkFileChooser")
+  (c-name "GtkFileChooserWidget")
+  (gtype-id "GTK_TYPE_FILE_CHOOSER_WIDGET")
+)
+
+(define-function gtk_file_chooser_widget_new
+  (is-constructor-of "GtkFileChooserWidget")
+  (c-name "gtk_file_chooser_widget_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkFileChooserAction" "action")
+  )
+)
+
diff --git a/src/defs/GtkFileFilter.defs b/src/defs/GtkFileFilter.defs
new file mode 100644
index 0000000..e10006d
--- /dev/null
+++ b/src/defs/GtkFileFilter.defs
@@ -0,0 +1,80 @@
+(define-object FileFilter
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkFileFilter")
+  (gtype-id "GTK_TYPE_FILE_FILTER")
+)
+
+(define-function gtk_file_filter_new
+  (is-constructor-of "GtkFileFilter")
+  (c-name "gtk_file_filter_new")
+  (caller-owns-return #t)
+  (return-type "GtkFileFilter*")
+)
+
+(define-method set_name
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_set_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_name
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method add_mime_type
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_add_mime_type")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "mime_type")
+  )
+)
+
+(define-method add_pattern
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_add_pattern")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "pattern")
+  )
+)
+
+(define-method add_pixbuf_formats
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_add_pixbuf_formats")
+  (return-type "none")
+)
+
+(define-method add_custom
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_add_custom")
+  (return-type "none")
+  (parameters
+    '("GtkFileFilterFlags" "needed")
+    '("GtkFileFilterFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "notify")
+  )
+)
+
+(define-method get_needed
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_get_needed")
+  (return-type "GtkFileFilterFlags")
+)
+
+(define-method filter
+  (of-object "GtkFileFilter")
+  (c-name "gtk_file_filter_filter")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkFileFilterInfo*" "filter_info")
+  )
+)
+
diff --git a/src/defs/GtkFileFilterFlags.defs b/src/defs/GtkFileFilterFlags.defs
new file mode 100644
index 0000000..59564d9
--- /dev/null
+++ b/src/defs/GtkFileFilterFlags.defs
@@ -0,0 +1,12 @@
+(define-flags FileFilterFlags
+  (in-module "Gtk")
+  (c-name "GtkFileFilterFlags")
+  (gtype-id "GTK_TYPE_FILE_FILTER_FLAGS")
+  (values
+    '("filename" "GTK_FILE_FILTER_FILENAME")
+    '("uri" "GTK_FILE_FILTER_URI")
+    '("display-name" "GTK_FILE_FILTER_DISPLAY_NAME")
+    '("mime-type" "GTK_FILE_FILTER_MIME_TYPE")
+  )
+)
+
diff --git a/src/defs/GtkFilePath.defs b/src/defs/GtkFilePath.defs
new file mode 100644
index 0000000..90ce004
--- /dev/null
+++ b/src/defs/GtkFilePath.defs
@@ -0,0 +1,6 @@
+(define-boxed FilePath
+  (in-module "Gtk")
+  (c-name "GtkFilePath")
+  (gtype-id "GTK_TYPE_FILE_PATH")
+)
+
diff --git a/src/defs/GtkFixed.defs b/src/defs/GtkFixed.defs
new file mode 100644
index 0000000..c256c7d
--- /dev/null
+++ b/src/defs/GtkFixed.defs
@@ -0,0 +1,35 @@
+(define-object Fixed
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkFixed")
+  (gtype-id "GTK_TYPE_FIXED")
+)
+
+(define-function gtk_fixed_new
+  (is-constructor-of "GtkFixed")
+  (c-name "gtk_fixed_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method put
+  (of-object "GtkFixed")
+  (c-name "gtk_fixed_put")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method move
+  (of-object "GtkFixed")
+  (c-name "gtk_fixed_move")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
diff --git a/src/defs/GtkFontButton.defs b/src/defs/GtkFontButton.defs
new file mode 100644
index 0000000..a752f2a
--- /dev/null
+++ b/src/defs/GtkFontButton.defs
@@ -0,0 +1,109 @@
+(define-object FontButton
+  (in-module "Gtk")
+  (parent "GtkButton")
+  (c-name "GtkFontButton")
+  (gtype-id "GTK_TYPE_FONT_BUTTON")
+)
+
+(define-function gtk_font_button_new
+  (is-constructor-of "GtkFontButton")
+  (c-name "gtk_font_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_title
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method set_title
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_use_font
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_get_use_font")
+  (return-type "gboolean")
+)
+
+(define-method set_use_font
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_set_use_font")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_font")
+  )
+)
+
+(define-method get_use_size
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_get_use_size")
+  (return-type "gboolean")
+)
+
+(define-method set_use_size
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_set_use_size")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_size")
+  )
+)
+
+(define-method get_font_name
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_get_font_name")
+  (return-type "const-gchar*")
+)
+
+(define-method set_font_name
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_set_font_name")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "fontname")
+  )
+)
+
+(define-method get_show_style
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_get_show_style")
+  (return-type "gboolean")
+)
+
+(define-method set_show_style
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_set_show_style")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_style")
+  )
+)
+
+(define-method get_show_size
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_get_show_size")
+  (return-type "gboolean")
+)
+
+(define-method set_show_size
+  (of-object "GtkFontButton")
+  (c-name "gtk_font_button_set_show_size")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_size")
+  )
+)
+
+(define-virtual font_set
+  (of-object "GtkFontButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkFontSelection.defs b/src/defs/GtkFontSelection.defs
new file mode 100644
index 0000000..e978efc
--- /dev/null
+++ b/src/defs/GtkFontSelection.defs
@@ -0,0 +1,45 @@
+(define-object FontSelection
+  (in-module "Gtk")
+  (parent "GtkVBox")
+  (c-name "GtkFontSelection")
+  (gtype-id "GTK_TYPE_FONT_SELECTION")
+)
+
+(define-function gtk_font_selection_new
+  (is-constructor-of "GtkFontSelection")
+  (c-name "gtk_font_selection_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_font_name
+  (of-object "GtkFontSelection")
+  (c-name "gtk_font_selection_get_font_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_font_name
+  (of-object "GtkFontSelection")
+  (c-name "gtk_font_selection_set_font_name")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "fontname")
+  )
+)
+
+(define-method get_preview_text
+  (of-object "GtkFontSelection")
+  (c-name "gtk_font_selection_get_preview_text")
+  (return-type "const-gchar*")
+)
+
+(define-method set_preview_text
+  (of-object "GtkFontSelection")
+  (c-name "gtk_font_selection_set_preview_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
diff --git a/src/defs/GtkFontSelectionDialog.defs b/src/defs/GtkFontSelectionDialog.defs
new file mode 100644
index 0000000..500eebb
--- /dev/null
+++ b/src/defs/GtkFontSelectionDialog.defs
@@ -0,0 +1,55 @@
+(define-object FontSelectionDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (c-name "GtkFontSelectionDialog")
+  (gtype-id "GTK_TYPE_FONT_SELECTION_DIALOG")
+  (fields
+    '("GtkWidget*" "fontsel")
+    '("GtkWidget*" "main_vbox")
+    '("GtkWidget*" "action_area")
+    '("GtkWidget*" "ok_button")
+    '("GtkWidget*" "apply_button")
+    '("GtkWidget*" "cancel_button")
+  )
+)
+
+(define-function gtk_font_selection_dialog_new
+  (is-constructor-of "GtkFontSelectionDialog")
+  (c-name "gtk_font_selection_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_font_name
+  (of-object "GtkFontSelectionDialog")
+  (c-name "gtk_font_selection_dialog_get_font_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_font_name
+  (of-object "GtkFontSelectionDialog")
+  (c-name "gtk_font_selection_dialog_set_font_name")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "fontname")
+  )
+)
+
+(define-method get_preview_text
+  (of-object "GtkFontSelectionDialog")
+  (c-name "gtk_font_selection_dialog_get_preview_text")
+  (return-type "const-gchar*")
+)
+
+(define-method set_preview_text
+  (of-object "GtkFontSelectionDialog")
+  (c-name "gtk_font_selection_dialog_set_preview_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
diff --git a/src/defs/GtkFrame.defs b/src/defs/GtkFrame.defs
new file mode 100644
index 0000000..a7beab0
--- /dev/null
+++ b/src/defs/GtkFrame.defs
@@ -0,0 +1,90 @@
+(define-object Frame
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkFrame")
+  (gtype-id "GTK_TYPE_FRAME")
+)
+
+(define-function gtk_frame_new
+  (is-constructor-of "GtkFrame")
+  (c-name "gtk_frame_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label" (null-ok))
+  )
+)
+
+(define-method set_label
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label" (null-ok))
+  )
+)
+
+(define-method get_label
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_label_widget
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_set_label_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "label_widget")
+  )
+)
+
+(define-method get_label_widget
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_get_label_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_label_align
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_set_label_align")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+  )
+)
+
+(define-method get_label_align
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_get_label_align")
+  (return-type "none")
+  (parameters
+    '("gfloat*" "xalign")
+    '("gfloat*" "yalign")
+  )
+)
+
+(define-method set_shadow_type
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_set_shadow_type")
+  (return-type "none")
+  (parameters
+    '("GtkShadowType" "type")
+  )
+)
+
+(define-method get_shadow_type
+  (of-object "GtkFrame")
+  (c-name "gtk_frame_get_shadow_type")
+  (return-type "GtkShadowType")
+)
+
+(define-virtual compute_child_allocation
+  (of-object "GtkFrame")
+  (return-type "none")
+  (parameters
+    '("GtkAllocation*" "allocation")
+  )
+)
+
diff --git a/src/defs/GtkGrid.defs b/src/defs/GtkGrid.defs
new file mode 100644
index 0000000..61affb1
--- /dev/null
+++ b/src/defs/GtkGrid.defs
@@ -0,0 +1,108 @@
+(define-object Grid
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkGrid")
+)
+
+(define-function gtk_grid_new
+  (is-constructor-of "GtkGrid")
+  (c-name "gtk_grid_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method attach
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_attach")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "left")
+    '("gint" "top")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method attach_next_to
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_attach_next_to")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "sibling")
+    '("GtkPositionType" "side")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method set_row_spacing
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_set_row_spacing")
+  (return-type "none")
+  (parameters
+    '("guint" "spacing")
+  )
+)
+
+(define-method get_row_spacing
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_get_row_spacing")
+  (return-type "guint")
+)
+
+(define-method set_column_spacing
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_set_column_spacing")
+  (return-type "none")
+  (parameters
+    '("guint" "spacing")
+  )
+)
+
+(define-method get_column_spacing
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_get_column_spacing")
+  (return-type "guint")
+)
+
+(define-method set_row_homogeneous
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_set_row_homogeneous")
+  (return-type "none")
+  (parameters
+    '("gboolean" "homogeneous")
+  )
+)
+
+(define-method get_row_homogeneous
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_get_row_homogeneous")
+  (return-type "gboolean")
+)
+
+(define-method set_column_homogeneous
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_set_column_homogeneous")
+  (return-type "none")
+  (parameters
+    '("gboolean" "homogeneous")
+  )
+)
+
+(define-method get_column_homogeneous
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_get_column_homogeneous")
+  (return-type "gboolean")
+)
+
+(define-method get_child_at
+  (of-object "GtkGrid")
+  (c-name "gtk_grid_get_child_at")
+  (return-type "GtkWidget*")
+  (parameters
+    '("gint" "left")
+    '("gint" "top")
+  )
+)
diff --git a/src/defs/GtkHBox.defs b/src/defs/GtkHBox.defs
new file mode 100644
index 0000000..c785e81
--- /dev/null
+++ b/src/defs/GtkHBox.defs
@@ -0,0 +1,18 @@
+(define-object HBox
+  (in-module "Gtk")
+  (parent "GtkBox")
+  (c-name "GtkHBox")
+  (gtype-id "GTK_TYPE_HBOX")
+)
+
+(define-function gtk_hbox_new
+  (is-constructor-of "GtkHBox")
+  (c-name "gtk_hbox_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("gboolean" "homogeneous")
+    '("gint" "spacing")
+  )
+)
+
diff --git a/src/defs/GtkHButtonBox.defs b/src/defs/GtkHButtonBox.defs
new file mode 100644
index 0000000..1fb624a
--- /dev/null
+++ b/src/defs/GtkHButtonBox.defs
@@ -0,0 +1,14 @@
+(define-object HButtonBox
+  (in-module "Gtk")
+  (parent "GtkButtonBox")
+  (c-name "GtkHButtonBox")
+  (gtype-id "GTK_TYPE_HBUTTON_BOX")
+)
+
+(define-function gtk_hbutton_box_new
+  (is-constructor-of "GtkHButtonBox")
+  (c-name "gtk_hbutton_box_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkHPaned.defs b/src/defs/GtkHPaned.defs
new file mode 100644
index 0000000..b9f54da
--- /dev/null
+++ b/src/defs/GtkHPaned.defs
@@ -0,0 +1,14 @@
+(define-object HPaned
+  (in-module "Gtk")
+  (parent "GtkPaned")
+  (c-name "GtkHPaned")
+  (gtype-id "GTK_TYPE_HPANED")
+)
+
+(define-function gtk_hpaned_new
+  (is-constructor-of "GtkHPaned")
+  (c-name "gtk_hpaned_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkHScale.defs b/src/defs/GtkHScale.defs
new file mode 100644
index 0000000..70e57c0
--- /dev/null
+++ b/src/defs/GtkHScale.defs
@@ -0,0 +1,29 @@
+(define-object HScale
+  (in-module "Gtk")
+  (parent "GtkScale")
+  (c-name "GtkHScale")
+  (gtype-id "GTK_TYPE_HSCALE")
+)
+
+(define-function gtk_hscale_new
+  (is-constructor-of "GtkHScale")
+  (c-name "gtk_hscale_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-function gtk_hscale_new_with_range
+  (is-constructor-of "GtkHScale")
+  (c-name "gtk_hscale_new_with_range")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("gdouble" "min")
+    '("gdouble" "max")
+    '("gdouble" "step")
+  )
+)
+
diff --git a/src/defs/GtkHScrollbar.defs b/src/defs/GtkHScrollbar.defs
new file mode 100644
index 0000000..74ba9f7
--- /dev/null
+++ b/src/defs/GtkHScrollbar.defs
@@ -0,0 +1,17 @@
+(define-object HScrollbar
+  (in-module "Gtk")
+  (parent "GtkScrollbar")
+  (c-name "GtkHScrollbar")
+  (gtype-id "GTK_TYPE_HSCROLLBAR")
+)
+
+(define-function gtk_hscrollbar_new
+  (is-constructor-of "GtkHScrollbar")
+  (c-name "gtk_hscrollbar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
diff --git a/src/defs/GtkHSeparator.defs b/src/defs/GtkHSeparator.defs
new file mode 100644
index 0000000..b722d9d
--- /dev/null
+++ b/src/defs/GtkHSeparator.defs
@@ -0,0 +1,14 @@
+(define-object HSeparator
+  (in-module "Gtk")
+  (parent "GtkSeparator")
+  (c-name "GtkHSeparator")
+  (gtype-id "GTK_TYPE_HSEPARATOR")
+)
+
+(define-function gtk_hseparator_new
+  (is-constructor-of "GtkHSeparator")
+  (c-name "gtk_hseparator_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkHandleBox.defs b/src/defs/GtkHandleBox.defs
new file mode 100644
index 0000000..03c7488
--- /dev/null
+++ b/src/defs/GtkHandleBox.defs
@@ -0,0 +1,75 @@
+(define-object HandleBox
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkHandleBox")
+  (gtype-id "GTK_TYPE_HANDLE_BOX")
+)
+
+(define-function gtk_handle_box_new
+  (is-constructor-of "GtkHandleBox")
+  (c-name "gtk_handle_box_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method set_shadow_type
+  (of-object "GtkHandleBox")
+  (c-name "gtk_handle_box_set_shadow_type")
+  (return-type "none")
+  (parameters
+    '("GtkShadowType" "type")
+  )
+)
+
+(define-method get_shadow_type
+  (of-object "GtkHandleBox")
+  (c-name "gtk_handle_box_get_shadow_type")
+  (return-type "GtkShadowType")
+)
+
+(define-method set_handle_position
+  (of-object "GtkHandleBox")
+  (c-name "gtk_handle_box_set_handle_position")
+  (return-type "none")
+  (parameters
+    '("GtkPositionType" "position")
+  )
+)
+
+(define-method get_handle_position
+  (of-object "GtkHandleBox")
+  (c-name "gtk_handle_box_get_handle_position")
+  (return-type "GtkPositionType")
+)
+
+(define-method set_snap_edge
+  (of-object "GtkHandleBox")
+  (c-name "gtk_handle_box_set_snap_edge")
+  (return-type "none")
+  (parameters
+    '("GtkPositionType" "edge")
+  )
+)
+
+(define-method get_snap_edge
+  (of-object "GtkHandleBox")
+  (c-name "gtk_handle_box_get_snap_edge")
+  (return-type "GtkPositionType")
+)
+
+(define-virtual child_attached
+  (of-object "GtkHandleBox")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-virtual child_detached
+  (of-object "GtkHandleBox")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
diff --git a/src/defs/GtkIMContext.defs b/src/defs/GtkIMContext.defs
new file mode 100644
index 0000000..1d5783f
--- /dev/null
+++ b/src/defs/GtkIMContext.defs
@@ -0,0 +1,216 @@
+(define-object InputMethod
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkIMContext")
+  (gtype-id "GTK_TYPE_IM_CONTEXT")
+)
+
+(define-method set_client_window
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_set_client_window")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "window")
+  )
+)
+
+(define-method get_preedit_string
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_get_preedit_string")
+  (return-type "none")
+  (parameters
+    '("gchar**" "str")
+    '("PangoAttrList**" "attrs")
+    '("gint*" "cursor_pos")
+  )
+)
+
+(define-method filter_keypress
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_filter_keypress")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-method focus_in
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_focus_in")
+  (return-type "none")
+)
+
+(define-method focus_out
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_focus_out")
+  (return-type "none")
+)
+
+(define-method reset
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_reset")
+  (return-type "none")
+)
+
+(define-method set_cursor_location
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_set_cursor_location")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "area")
+  )
+)
+
+(define-method set_use_preedit
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_set_use_preedit")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_preedit")
+  )
+)
+
+(define-method set_surrounding
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_set_surrounding")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "len")
+    '("gint" "cursor_index")
+  )
+)
+
+(define-method get_surrounding
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_get_surrounding")
+  (return-type "gboolean")
+  (parameters
+    '("gchar**" "text")
+    '("gint*" "cursor_index")
+  )
+)
+
+(define-method delete_surrounding
+  (of-object "GtkIMContext")
+  (c-name "gtk_im_context_delete_surrounding")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "offset")
+    '("gint" "n_chars")
+  )
+)
+
+(define-virtual preedit_start
+  (of-object "GtkIMContext")
+  (return-type "none")
+)
+
+(define-virtual preedit_end
+  (of-object "GtkIMContext")
+  (return-type "none")
+)
+
+(define-virtual preedit_changed
+  (of-object "GtkIMContext")
+  (return-type "none")
+)
+
+(define-virtual commit
+  (of-object "GtkIMContext")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-virtual retrieve_surrounding
+  (of-object "GtkIMContext")
+  (return-type "gboolean")
+)
+
+(define-virtual delete_surrounding
+  (of-object "GtkIMContext")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "offset")
+    '("gint" "n_chars")
+  )
+)
+
+(define-virtual set_client_window
+  (of-object "GtkIMContext")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "window")
+  )
+)
+
+(define-virtual get_preedit_string
+  (of-object "GtkIMContext")
+  (return-type "none")
+  (parameters
+    '("gchar**" "str")
+    '("PangoAttrList**" "attrs")
+    '("gint*" "cursor_pos")
+  )
+)
+
+(define-virtual filter_keypress
+  (of-object "GtkIMContext")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-virtual focus_in
+  (of-object "GtkIMContext")
+  (return-type "none")
+)
+
+(define-virtual focus_out
+  (of-object "GtkIMContext")
+  (return-type "none")
+)
+
+(define-virtual reset
+  (of-object "GtkIMContext")
+  (return-type "none")
+)
+
+(define-virtual set_cursor_location
+  (of-object "GtkIMContext")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "area")
+  )
+)
+
+(define-virtual set_use_preedit
+  (of-object "GtkIMContext")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_preedit")
+  )
+)
+
+(define-virtual set_surrounding
+  (of-object "GtkIMContext")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "len")
+    '("gint" "cursor_index")
+  )
+)
+
+(define-virtual get_surrounding
+  (of-object "GtkIMContext")
+  (return-type "gboolean")
+  (parameters
+    '("gchar**" "text")
+    '("gint*" "cursor_index")
+  )
+)
+
diff --git a/src/defs/GtkIMContextSimple.defs b/src/defs/GtkIMContextSimple.defs
new file mode 100644
index 0000000..b09aa33
--- /dev/null
+++ b/src/defs/GtkIMContextSimple.defs
@@ -0,0 +1,25 @@
+(define-object SimpleInputMethod
+  (in-module "Gtk")
+  (parent "GtkIMContext")
+  (c-name "GtkIMContextSimple")
+  (gtype-id "GTK_TYPE_IM_CONTEXT_SIMPLE")
+)
+
+(define-function gtk_im_context_simple_new
+  (is-constructor-of "GtkIMContextSimple")
+  (c-name "gtk_im_context_simple_new")
+  (caller-owns-return #t)
+  (return-type "GtkIMContext*")
+)
+
+(define-method add_table
+  (of-object "GtkIMContextSimple")
+  (c-name "gtk_im_context_simple_add_table")
+  (return-type "none")
+  (parameters
+    '("guint16*" "data")
+    '("gint" "max_seq_len")
+    '("gint" "n_seqs")
+  )
+)
+
diff --git a/src/defs/GtkIMMulticontext.defs b/src/defs/GtkIMMulticontext.defs
new file mode 100644
index 0000000..d97c323
--- /dev/null
+++ b/src/defs/GtkIMMulticontext.defs
@@ -0,0 +1,23 @@
+(define-object MulticontextInputMethod
+  (in-module "Gtk")
+  (parent "GtkIMContext")
+  (c-name "GtkIMMulticontext")
+  (gtype-id "GTK_TYPE_IM_MULTICONTEXT")
+)
+
+(define-function gtk_im_multicontext_new
+  (is-constructor-of "GtkIMMulticontext")
+  (c-name "gtk_im_multicontext_new")
+  (caller-owns-return #t)
+  (return-type "GtkIMContext*")
+)
+
+(define-method append_menuitems
+  (of-object "GtkIMMulticontext")
+  (c-name "gtk_im_multicontext_append_menuitems")
+  (return-type "none")
+  (parameters
+    '("GtkMenuShell*" "menushell")
+  )
+)
+
diff --git a/src/defs/GtkIMPreeditStyle.defs b/src/defs/GtkIMPreeditStyle.defs
new file mode 100644
index 0000000..42cfb32
--- /dev/null
+++ b/src/defs/GtkIMPreeditStyle.defs
@@ -0,0 +1,11 @@
+(define-enum IMPreeditStyle
+  (in-module "Gtk")
+  (c-name "GtkIMPreeditStyle")
+  (gtype-id "GTK_TYPE_IM_PREEDIT_STYLE")
+  (values
+    '("nothing" "GTK_IM_PREEDIT_NOTHING")
+    '("callback" "GTK_IM_PREEDIT_CALLBACK")
+    '("none" "GTK_IM_PREEDIT_NONE")
+  )
+)
+
diff --git a/src/defs/GtkIMStatusStyle.defs b/src/defs/GtkIMStatusStyle.defs
new file mode 100644
index 0000000..99e64a7
--- /dev/null
+++ b/src/defs/GtkIMStatusStyle.defs
@@ -0,0 +1,10 @@
+(define-enum IMStatusStyle
+  (in-module "Gtk")
+  (c-name "GtkIMStatusStyle")
+  (gtype-id "GTK_TYPE_IM_STATUS_STYLE")
+  (values
+    '("nothing" "GTK_IM_STATUS_NOTHING")
+    '("callback" "GTK_IM_STATUS_CALLBACK")
+  )
+)
+
diff --git a/src/defs/GtkIconFactory.defs b/src/defs/GtkIconFactory.defs
new file mode 100644
index 0000000..02829a2
--- /dev/null
+++ b/src/defs/GtkIconFactory.defs
@@ -0,0 +1,45 @@
+(define-object IconFactory
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkIconFactory")
+  (gtype-id "GTK_TYPE_ICON_FACTORY")
+)
+
+(define-function gtk_icon_factory_new
+  (is-constructor-of "GtkIconFactory")
+  (c-name "gtk_icon_factory_new")
+  (caller-owns-return #t)
+  (return-type "GtkIconFactory*")
+)
+
+(define-method add
+  (of-object "GtkIconFactory")
+  (c-name "gtk_icon_factory_add")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("GtkIconSet*" "icon_set")
+  )
+)
+
+(define-method lookup
+  (of-object "GtkIconFactory")
+  (c-name "gtk_icon_factory_lookup")
+  (return-type "GtkIconSet*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method add_default
+  (of-object "GtkIconFactory")
+  (c-name "gtk_icon_factory_add_default")
+  (return-type "none")
+)
+
+(define-method remove_default
+  (of-object "GtkIconFactory")
+  (c-name "gtk_icon_factory_remove_default")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkIconInfo.defs b/src/defs/GtkIconInfo.defs
new file mode 100644
index 0000000..c5e21be
--- /dev/null
+++ b/src/defs/GtkIconInfo.defs
@@ -0,0 +1,82 @@
+(define-boxed IconInfo
+  (in-module "Gtk")
+  (c-name "GtkIconInfo")
+  (gtype-id "GTK_TYPE_ICON_INFO")
+  (copy-func "gtk_icon_info_copy")
+  (release-func "gtk_icon_info_free")
+)
+
+(define-method copy
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_copy")
+  (caller-owns-return #t)
+  (return-type "GtkIconInfo*")
+)
+
+(define-method free
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_free")
+  (return-type "none")
+)
+
+(define-method get_base_size
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_get_base_size")
+  (return-type "gint")
+)
+
+(define-method get_filename
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_get_filename")
+  (return-type "const-gchar*")
+)
+
+(define-method get_builtin_pixbuf
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_get_builtin_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method load_icon
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_load_icon")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-method set_raw_coordinates
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_set_raw_coordinates")
+  (return-type "none")
+  (parameters
+    '("gboolean" "raw_coordinates")
+  )
+)
+
+(define-method get_embedded_rect
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_get_embedded_rect")
+  (return-type "gboolean")
+  (parameters
+    '("GdkRectangle*" "rectangle")
+  )
+)
+
+(define-method get_attach_points
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_get_attach_points")
+  (return-type "gboolean")
+  (parameters
+    '("GdkPoint**" "points")
+    '("gint*" "n_points")
+  )
+)
+
+(define-method get_display_name
+  (of-object "GtkIconInfo")
+  (c-name "gtk_icon_info_get_display_name")
+  (return-type "const-gchar*")
+)
+
diff --git a/src/defs/GtkIconLookupFlags.defs b/src/defs/GtkIconLookupFlags.defs
new file mode 100644
index 0000000..c7d41cf
--- /dev/null
+++ b/src/defs/GtkIconLookupFlags.defs
@@ -0,0 +1,11 @@
+(define-flags IconLookupFlags
+  (in-module "Gtk")
+  (c-name "GtkIconLookupFlags")
+  (gtype-id "GTK_TYPE_ICON_LOOKUP_FLAGS")
+  (values
+    '("no-svg" "GTK_ICON_LOOKUP_NO_SVG")
+    '("force-svg" "GTK_ICON_LOOKUP_FORCE_SVG")
+    '("use-builtin" "GTK_ICON_LOOKUP_USE_BUILTIN")
+  )
+)
+
diff --git a/src/defs/GtkIconSet.defs b/src/defs/GtkIconSet.defs
new file mode 100644
index 0000000..0d4ad6e
--- /dev/null
+++ b/src/defs/GtkIconSet.defs
@@ -0,0 +1,54 @@
+(define-boxed IconSet
+  (in-module "Gtk")
+  (c-name "GtkIconSet")
+  (gtype-id "GTK_TYPE_ICON_SET")
+)
+
+(define-function icon_set_new_from_pixbuf
+  (is-constructor-of "GtkIconSet")
+  (c-name "gtk_icon_set_new_from_pixbuf")
+  (caller-owns-return #t)
+  (return-type "GtkIconSet*")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-method ref
+  (of-object "GtkIconSet")
+  (c-name "gtk_icon_set_ref")
+  (return-type "GtkIconSet*")
+)
+
+(define-method unref
+  (of-object "GtkIconSet")
+  (c-name "gtk_icon_set_unref")
+  (return-type "none")
+)
+
+(define-method copy
+  (of-object "GtkIconSet")
+  (c-name "gtk_icon_set_copy")
+  (caller-owns-return #t)
+  (return-type "GtkIconSet*")
+)
+
+(define-method add_source
+  (of-object "GtkIconSet")
+  (c-name "gtk_icon_set_add_source")
+  (return-type "none")
+  (parameters
+    '("const-GtkIconSource*" "source")
+  )
+)
+
+(define-method get_sizes
+  (of-object "GtkIconSet")
+  (c-name "gtk_icon_set_get_sizes")
+  (return-type "none")
+  (parameters
+    '("GtkIconSize**" "sizes")
+    '("gint*" "n_sizes")
+  )
+)
+
diff --git a/src/defs/GtkIconSize.defs b/src/defs/GtkIconSize.defs
new file mode 100644
index 0000000..06e0d08
--- /dev/null
+++ b/src/defs/GtkIconSize.defs
@@ -0,0 +1,15 @@
+(define-enum IconSize
+  (in-module "Gtk")
+  (c-name "GtkIconSize")
+  (gtype-id "GTK_TYPE_ICON_SIZE")
+  (values
+    '("invalid" "GTK_ICON_SIZE_INVALID")
+    '("menu" "GTK_ICON_SIZE_MENU")
+    '("small-toolbar" "GTK_ICON_SIZE_SMALL_TOOLBAR")
+    '("large-toolbar" "GTK_ICON_SIZE_LARGE_TOOLBAR")
+    '("button" "GTK_ICON_SIZE_BUTTON")
+    '("dnd" "GTK_ICON_SIZE_DND")
+    '("dialog" "GTK_ICON_SIZE_DIALOG")
+  )
+)
+
diff --git a/src/defs/GtkIconSource.defs b/src/defs/GtkIconSource.defs
new file mode 100644
index 0000000..aae5cf5
--- /dev/null
+++ b/src/defs/GtkIconSource.defs
@@ -0,0 +1,163 @@
+(define-boxed IconSource
+  (in-module "Gtk")
+  (c-name "GtkIconSource")
+  (gtype-id "GTK_TYPE_ICON_SOURCE")
+  (copy-func "gtk_icon_source_copy")
+  (release-func "gtk_icon_source_free")
+)
+
+(define-function icon_source_new
+  (is-constructor-of "GtkIconSource")
+  (c-name "gtk_icon_source_new")
+  (caller-owns-return #t)
+  (return-type "GtkIconSource*")
+)
+
+(define-method copy
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_copy")
+  (caller-owns-return #t)
+  (return-type "GtkIconSource*")
+)
+
+(define-method free
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_free")
+  (return-type "none")
+)
+
+(define-method set_filename
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_filename")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-method set_icon_name
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name" (null-ok))
+  )
+)
+
+(define-method set_pixbuf
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-method get_filename
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_filename")
+  (return-type "const-gchar*")
+)
+
+(define-method get_icon_name
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_icon_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_pixbuf
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method set_direction_wildcarded
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_direction_wildcarded")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method set_state_wildcarded
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_state_wildcarded")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method set_size_wildcarded
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_size_wildcarded")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_size_wildcarded
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_size_wildcarded")
+  (return-type "gboolean")
+)
+
+(define-method get_state_wildcarded
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_state_wildcarded")
+  (return-type "gboolean")
+)
+
+(define-method get_direction_wildcarded
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_direction_wildcarded")
+  (return-type "gboolean")
+)
+
+(define-method set_direction
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_direction")
+  (return-type "none")
+  (parameters
+    '("GtkTextDirection" "direction")
+  )
+)
+
+(define-method set_state
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_state")
+  (return-type "none")
+  (parameters
+    '("GtkStateType" "state")
+  )
+)
+
+(define-method set_size
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_set_size")
+  (return-type "none")
+  (parameters
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-method get_direction
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_direction")
+  (return-type "GtkTextDirection")
+)
+
+(define-method get_state
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_state")
+  (return-type "GtkStateType")
+)
+
+(define-method get_size
+  (of-object "GtkIconSource")
+  (c-name "gtk_icon_source_get_size")
+  (return-type "GtkIconSize")
+)
+
diff --git a/src/defs/GtkIconTheme.defs b/src/defs/GtkIconTheme.defs
new file mode 100644
index 0000000..d901ce5
--- /dev/null
+++ b/src/defs/GtkIconTheme.defs
@@ -0,0 +1,164 @@
+(define-object IconTheme
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkIconTheme")
+  (gtype-id "GTK_TYPE_ICON_THEME")
+)
+
+(define-function gtk_icon_theme_new
+  (is-constructor-of "GtkIconTheme")
+  (c-name "gtk_icon_theme_new")
+  (caller-owns-return #t)
+  (return-type "GtkIconTheme*")
+)
+
+(define-method set_screen
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_set_screen")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method set_search_path
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_set_search_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*[]" "path")
+    '("gint" "n_elements")
+  )
+)
+
+(define-method get_search_path
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_get_search_path")
+  (return-type "none")
+  (parameters
+    '("gchar**[]" "path")
+    '("gint*" "n_elements")
+  )
+)
+
+(define-method append_search_path
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_append_search_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-method prepend_search_path
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_prepend_search_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-method set_custom_theme
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_set_custom_theme")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "theme_name")
+  )
+)
+
+(define-method has_icon
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_has_icon")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-method lookup_icon
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_lookup_icon")
+  (caller-owns-return #t)
+  (return-type "GtkIconInfo*")
+  (parameters
+    '("const-gchar*" "icon_name")
+    '("gint" "size")
+    '("GtkIconLookupFlags" "flags")
+  )
+)
+
+(define-method load_icon
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_load_icon")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-gchar*" "icon_name")
+    '("gint" "size")
+    '("GtkIconLookupFlags" "flags")
+    '("GError**" "error")
+  )
+)
+
+(define-method list_icons
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_list_icons")
+  (return-type "GList*")
+  (parameters
+    '("const-gchar*" "context")
+  )
+)
+
+(define-method get_example_icon_name
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_get_example_icon_name")
+  (caller-owns-return #t)
+  (return-type "char*")
+)
+
+(define-method rescan_if_needed
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_rescan_if_needed")
+  (return-type "gboolean")
+)
+
+(define-method get_icon_sizes
+  (of-object "GtkIconTheme")
+  (c-name "gtk_icon_theme_get_icon_sizes")
+  (return-type "gint*")
+  (caller-owns-return #l)
+  (parameters
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-virtual changed
+  (of-object "GtkIconTheme")
+  (return-type "none")
+)
+
+(define-function get_default
+  (c-name "gtk_icon_theme_get_default")
+  (return-type "GtkIconTheme*")
+)
+
+(define-function get_for_screen
+  (c-name "gtk_icon_theme_get_for_screen")
+  (return-type "GtkIconTheme*")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-function add_builtin_icon
+  (c-name "gtk_icon_theme_add_builtin_icon")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name")
+    '("gint" "size")
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
diff --git a/src/defs/GtkIconThemeError.defs b/src/defs/GtkIconThemeError.defs
new file mode 100644
index 0000000..f279f04
--- /dev/null
+++ b/src/defs/GtkIconThemeError.defs
@@ -0,0 +1,10 @@
+(define-enum IconThemeError
+  (in-module "Gtk")
+  (c-name "GtkIconThemeError")
+  (gtype-id "GTK_TYPE_ICON_THEME_ERROR")
+  (values
+    '("not-found" "GTK_ICON_THEME_NOT_FOUND")
+    '("failed" "GTK_ICON_THEME_FAILED")
+  )
+)
+
diff --git a/src/defs/GtkIconView.defs b/src/defs/GtkIconView.defs
new file mode 100644
index 0000000..c3e63df
--- /dev/null
+++ b/src/defs/GtkIconView.defs
@@ -0,0 +1,559 @@
+(define-object IconView
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (implements "GtkCellLayout")
+  (c-name "GtkIconView")
+  (gtype-id "GTK_TYPE_ICON_VIEW")
+)
+
+(define-function gtk_icon_view_new
+  (is-constructor-of "GtkIconView")
+  (c-name "gtk_icon_view_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_icon_view_new_with_model
+  (is-constructor-of "GtkIconView")
+  (c-name "gtk_icon_view_new_with_model")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkTreeModel*" "model")
+  )
+)
+
+(define-method set_model
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_model")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModel*" "model" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_model
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method set_text_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_text_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_text_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_text_column")
+  (return-type "gint")
+)
+
+(define-method set_markup_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_markup_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_markup_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_markup_column")
+  (return-type "gint")
+)
+
+(define-method set_pixbuf_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_pixbuf_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_pixbuf_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_pixbuf_column")
+  (return-type "gint")
+)
+
+(define-method set_item_orientation
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_item_orientation")
+  (return-type "none")
+  (parameters
+    '("GtkOrientation" "orientation")
+  )
+)
+
+(define-method get_item_orientation
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_item_orientation")
+  (return-type "GtkOrientation")
+)
+
+(define-method set_columns
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_columns")
+  (return-type "none")
+  (parameters
+    '("gint" "columns")
+  )
+)
+
+(define-method get_columns
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_columns")
+  (return-type "gint")
+)
+
+(define-method set_item_width
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_item_width")
+  (return-type "none")
+  (parameters
+    '("gint" "item_width")
+  )
+)
+
+(define-method get_item_width
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_item_width")
+  (return-type "gint")
+)
+
+(define-method set_spacing
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_spacing")
+  (return-type "none")
+  (parameters
+    '("gint" "spacing")
+  )
+)
+
+(define-method get_spacing
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_spacing")
+  (return-type "gint")
+)
+
+(define-method set_row_spacing
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_row_spacing")
+  (return-type "none")
+  (parameters
+    '("gint" "row_spacing")
+  )
+)
+
+(define-method get_row_spacing
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_row_spacing")
+  (return-type "gint")
+)
+
+(define-method set_column_spacing
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_column_spacing")
+  (return-type "none")
+  (parameters
+    '("gint" "column_spacing")
+  )
+)
+
+(define-method get_column_spacing
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_column_spacing")
+  (return-type "gint")
+)
+
+(define-method set_margin
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_margin")
+  (return-type "none")
+  (parameters
+    '("gint" "margin")
+  )
+)
+
+(define-method get_margin
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_margin")
+  (return-type "gint")
+)
+
+(define-method get_path_at_pos
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_path_at_pos")
+  (return-type "GtkTreePath*")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_item_at_pos
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_item_at_pos")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("GtkTreePath**" "path")
+    '("GtkCellRenderer**" "cell")
+  )
+)
+
+(define-method get_visible_range
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_visible_range")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath**" "start_path")
+    '("GtkTreePath**" "end_path")
+  )
+)
+
+(define-method selected_foreach
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_selected_foreach")
+  (return-type "none")
+  (parameters
+    '("GtkIconViewForeachFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-method set_selection_mode
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_selection_mode")
+  (return-type "none")
+  (parameters
+    '("GtkSelectionMode" "mode")
+  )
+)
+
+(define-method get_selection_mode
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_selection_mode")
+  (return-type "GtkSelectionMode")
+)
+
+(define-method select_path
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_select_path")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method unselect_path
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_unselect_path")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method path_is_selected
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_path_is_selected")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method get_selected_items
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_selected_items")
+  (caller-owns-return #f)
+  (return-type "GList-GtkTreePath*")
+)
+
+(define-method select_all
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_select_all")
+  (return-type "none")
+)
+
+(define-method unselect_all
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_unselect_all")
+  (return-type "none")
+)
+
+(define-method item_activated
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_item_activated")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method set_cursor
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_cursor")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkCellRenderer*" "cell" (default "NULL") (null-ok))
+    '("gboolean" "start_editing" (default "FALSE"))
+  )
+)
+
+(define-method get_cursor
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_cursor")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath**" "path")
+    '("GtkCellRenderer**" "cell")
+  )
+)
+
+(define-method scroll_to_path
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_scroll_to_path")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("gboolean" "use_align")
+    '("gfloat" "row_align")
+    '("gfloat" "col_align")
+  )
+)
+
+(define-method enable_model_drag_source
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_enable_model_drag_source")
+  (return-type "none")
+  (parameters
+    '("GdkModifierType" "start_button_mask")
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method enable_model_drag_dest
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_enable_model_drag_dest")
+  (return-type "none")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method unset_model_drag_source
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_unset_model_drag_source")
+  (return-type "none")
+)
+
+(define-method unset_model_drag_dest
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_unset_model_drag_dest")
+  (return-type "none")
+)
+
+(define-method set_reorderable
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_reorderable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "reorderable")
+  )
+)
+
+(define-method get_reorderable
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_reorderable")
+  (return-type "gboolean")
+)
+
+(define-method set_drag_dest_item
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_drag_dest_item")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path" (null-ok))
+    '("GtkIconViewDropPosition" "pos")
+  )
+)
+
+(define-method get_drag_dest_item
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_drag_dest_item")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath**" "path")
+    '("GtkIconViewDropPosition*" "pos")
+  )
+)
+
+(define-method get_dest_item_at_pos
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_dest_item_at_pos")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "drag_x")
+    '("gint" "drag_y")
+    '("GtkTreePath**" "path")
+    '("GtkIconViewDropPosition*" "pos")
+  )
+)
+
+(define-method create_drag_icon
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_create_drag_icon")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method convert_widget_to_bin_window_coords
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_convert_widget_to_bin_window_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "wx")
+    '("gint" "wy")
+    '("gint*" "bx")
+    '("gint*" "by")
+  )
+)
+
+(define-method get_tooltip_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_tooltip_column")
+  (return-type "gint")
+)
+
+(define-method get_tooltip_context
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_tooltip_context")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gboolean" "keyboard_tip")
+    '("GtkTreeModel**" "model" (null-ok))
+    '("GtkTreePath**" "path" (null-ok))
+    '("GtkTreeIter*" "iter" (null-ok))
+  )
+)
+
+(define-method set_tooltip_cell
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_tooltip_cell")
+  (return-type "none")
+  (parameters
+    '("GtkTooltip*" "tooltip")
+    '("GtkTreePath*" "path")
+    '("GtkCellRenderer*" "cell" (null-ok))
+  )
+)
+
+(define-method set_tooltip_column
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_tooltip_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method set_tooltip_item
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_tooltip_item")
+  (return-type "none")
+  (parameters
+    '("GtkTooltip*" "tooltip")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method set_item_padding
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_set_item_padding")
+  (return-type "none")
+  (parameters
+    '("gint" "item_padding")
+  )
+)
+
+(define-method get_item_padding
+  (of-object "GtkIconView")
+  (c-name "gtk_icon_view_get_item_padding")
+  (return-type "gint")
+)
+
+(define-virtual set_scroll_adjustments
+  (of-object "GtkIconView")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+    '("GtkAdjustment*" "vadjustment")
+  )
+)
+
+(define-virtual item_activated
+  (of-object "GtkIconView")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual selection_changed
+  (of-object "GtkIconView")
+  (return-type "none")
+)
+
+(define-virtual select_all
+  (of-object "GtkIconView")
+  (return-type "none")
+)
+
+(define-virtual unselect_all
+  (of-object "GtkIconView")
+  (return-type "none")
+)
+
+(define-virtual select_cursor_item
+  (of-object "GtkIconView")
+  (return-type "none")
+)
+
+(define-virtual toggle_cursor_item
+  (of-object "GtkIconView")
+  (return-type "none")
+)
+
+(define-virtual move_cursor
+  (of-object "GtkIconView")
+  (return-type "gboolean")
+  (parameters
+    '("GtkMovementStep" "step")
+    '("gint" "count")
+  )
+)
+
+(define-virtual activate_cursor_item
+  (of-object "GtkIconView")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkIconViewDropPosition.defs b/src/defs/GtkIconViewDropPosition.defs
new file mode 100644
index 0000000..4ff3b47
--- /dev/null
+++ b/src/defs/GtkIconViewDropPosition.defs
@@ -0,0 +1,14 @@
+(define-enum IconViewDropPosition
+  (in-module "Gtk")
+  (c-name "GtkIconViewDropPosition")
+  (gtype-id "GTK_TYPE_ICON_VIEW_DROP_POSITION")
+  (values
+    '("no-drop" "GTK_ICON_VIEW_NO_DROP")
+    '("drop-into" "GTK_ICON_VIEW_DROP_INTO")
+    '("drop-left" "GTK_ICON_VIEW_DROP_LEFT")
+    '("drop-right" "GTK_ICON_VIEW_DROP_RIGHT")
+    '("drop-above" "GTK_ICON_VIEW_DROP_ABOVE")
+    '("drop-below" "GTK_ICON_VIEW_DROP_BELOW")
+  )
+)
+
diff --git a/src/defs/GtkImage.defs b/src/defs/GtkImage.defs
new file mode 100644
index 0000000..5d4ef7e
--- /dev/null
+++ b/src/defs/GtkImage.defs
@@ -0,0 +1,234 @@
+(define-object Image
+  (in-module "Gtk")
+  (parent "GtkMisc")
+  (c-name "GtkImage")
+  (gtype-id "GTK_TYPE_IMAGE")
+)
+
+(define-function gtk_image_new
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function image_new_from_pixmap
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_pixmap")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkPixmap*" "pixmap" (null-ok))
+    '("GdkBitmap*" "mask" (null-ok))
+  )
+)
+
+(define-function image_new_from_file
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_file")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-function image_new_from_pixbuf
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_pixbuf")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkPixbuf*" "pixbuf" (null-ok))
+  )
+)
+
+(define-function image_new_from_stock
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-function image_new_from_icon_set
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_icon_set")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkIconSet*" "icon_set")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-function image_new_from_animation
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_animation")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkPixbufAnimation*" "animation")
+  )
+)
+
+(define-function image_new_from_icon_name
+  (is-constructor-of "GtkImage")
+  (c-name "gtk_image_new_from_icon_name")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "icon_name")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-method clear
+  (of-object "GtkImage")
+  (c-name "gtk_image_clear")
+  (return-type "none")
+)
+
+(define-method set_from_pixmap
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_pixmap")
+  (return-type "none")
+  (parameters
+    '("GdkPixmap*" "pixmap")
+    '("GdkBitmap*" "mask" (null-ok))
+  )
+)
+
+(define-method set_from_file
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_file")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename" (null-ok))
+  )
+)
+
+(define-method set_from_pixbuf
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf" (null-ok))
+  )
+)
+
+(define-method set_from_stock
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_stock")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-method set_from_icon_set
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_icon_set")
+  (return-type "none")
+  (parameters
+    '("GtkIconSet*" "icon_set")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-method set_from_animation
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_animation")
+  (return-type "none")
+  (parameters
+    '("GdkPixbufAnimation*" "animation")
+  )
+)
+
+(define-method get_storage_type
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_storage_type")
+  (return-type "GtkImageType")
+)
+
+(define-method get_pixmap
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_pixmap")
+  (return-type "none")
+  (parameters
+    '("GdkPixmap**" "pixmap")
+    '("GdkBitmap**" "mask")
+  )
+)
+
+(define-method get_pixbuf
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method get_stock
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_stock")
+  (return-type "none")
+  (parameters
+    '("gchar**" "stock_id")
+    '("GtkIconSize*" "size")
+  )
+)
+
+(define-method get_icon_set
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_icon_set")
+  (return-type "none")
+  (parameters
+    '("GtkIconSet**" "icon_set")
+    '("GtkIconSize*" "size")
+  )
+)
+
+(define-method get_animation
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_animation")
+  (return-type "GdkPixbufAnimation*")
+)
+
+(define-method set_from_icon_name
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_from_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-method set_pixel_size
+  (of-object "GtkImage")
+  (c-name "gtk_image_set_pixel_size")
+  (return-type "none")
+  (parameters
+    '("gint" "pixel_size")
+  )
+)
+
+(define-method get_icon_name
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar**" "icon_name")
+    '("GtkIconSize*" "size")
+  )
+)
+
+(define-method get_pixel_size
+  (of-object "GtkImage")
+  (c-name "gtk_image_get_pixel_size")
+  (return-type "gint")
+)
+
diff --git a/src/defs/GtkImageMenuItem.defs b/src/defs/GtkImageMenuItem.defs
new file mode 100644
index 0000000..d687743
--- /dev/null
+++ b/src/defs/GtkImageMenuItem.defs
@@ -0,0 +1,77 @@
+(define-object ImageMenuItem
+  (in-module "Gtk")
+  (parent "GtkMenuItem")
+  (c-name "GtkImageMenuItem")
+  (gtype-id "GTK_TYPE_IMAGE_MENU_ITEM")
+)
+
+(define-function gtk_image_menu_item_new
+  (is-constructor-of "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_image_menu_item_new_with_label
+  (is-constructor-of "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_image_menu_item_new_with_mnemonic
+  (is-constructor-of "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_image_menu_item_new_from_stock
+  (is-constructor-of "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("GtkAccelGroup*" "accel_group" (null-ok))
+  )
+)
+
+(define-method set_image
+  (of-object "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_set_image")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "image" (null-ok))
+  )
+)
+
+(define-method get_image
+  (of-object "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_get_image")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_always_show_image
+  (of-object "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_set_always_show_image")
+  (return-type "none")
+  (parameters
+    '("gboolean" "always_show")
+  )
+)
+
+(define-method set_accel_group
+  (of-object "GtkImageMenuItem")
+  (c-name "gtk_image_menu_item_set_accel_group")
+  (return-type "none")
+  (parameters
+    '("GtkAccelGroup*" "accel_group")
+  )
+)
diff --git a/src/defs/GtkImageType.defs b/src/defs/GtkImageType.defs
new file mode 100644
index 0000000..4594da8
--- /dev/null
+++ b/src/defs/GtkImageType.defs
@@ -0,0 +1,15 @@
+(define-enum ImageType
+  (in-module "Gtk")
+  (c-name "GtkImageType")
+  (gtype-id "GTK_TYPE_IMAGE_TYPE")
+  (values
+    '("empty" "GTK_IMAGE_EMPTY")
+    '("pixbuf" "GTK_IMAGE_PIXBUF")
+    '("stock" "GTK_IMAGE_STOCK")
+    '("icon-set" "GTK_IMAGE_ICON_SET")
+    '("animation" "GTK_IMAGE_ANIMATION")
+    '("icon-name" "GTK_IMAGE_ICON_NAME")
+    '("gicon" "GTK_IMAGE_GICON")
+  )
+)
+
diff --git a/src/defs/GtkInfoBar.defs b/src/defs/GtkInfoBar.defs
new file mode 100644
index 0000000..460f66b
--- /dev/null
+++ b/src/defs/GtkInfoBar.defs
@@ -0,0 +1,101 @@
+(define-object InfoBar
+  (in-module "Gtk")
+  (parent "GtkHBox")
+  (c-name "GtkInfoBar")
+  (gtype-id "GTK_TYPE_INFO_BAR")
+)
+
+(define-function gtk_info_bar_new
+  (c-name "gtk_info_bar_new")
+  (is-constructor-of "GtkInfoBar")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_action_area
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_get_action_area")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_content_area
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_get_content_area")
+  (return-type "GtkWidget*")
+)
+
+(define-method add_action_widget
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_add_action_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "response_id")
+  )
+)
+
+(define-method add_button
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_add_button")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "button_text")
+    '("gint" "response_id")
+  )
+)
+
+(define-method set_response_sensitive
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_set_response_sensitive")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+    '("gboolean" "setting")
+  )
+)
+
+(define-method set_default_response
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_set_default_response")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+  )
+)
+
+(define-method response
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_response")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+  )
+)
+
+(define-method set_message_type
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_set_message_type")
+  (return-type "none")
+  (parameters
+    '("GtkMessageType" "message_type")
+  )
+)
+
+(define-method get_message_type
+  (of-object "GtkInfoBar")
+  (c-name "gtk_info_bar_get_message_type")
+  (return-type "GtkMessageType")
+)
+
+(define-virtual close
+  (of-object "GtkInfoBar")
+  (return-type "none")
+)
+
+(define-virtual response
+  (of-object "GtkInfoBar")
+  (return-type "none")
+  (parameters
+    '("gint" "response_id")
+  )
+)
diff --git a/src/defs/GtkInputDialog.defs b/src/defs/GtkInputDialog.defs
new file mode 100644
index 0000000..44745e9
--- /dev/null
+++ b/src/defs/GtkInputDialog.defs
@@ -0,0 +1,31 @@
+(define-object InputDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (c-name "GtkInputDialog")
+  (gtype-id "GTK_TYPE_INPUT_DIALOG")
+  (unnecessary)
+)
+
+(define-function gtk_input_dialog_new
+  (is-constructor-of "GtkInputDialog")
+  (c-name "gtk_input_dialog_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-virtual enable_device
+  (of-object "GtkInputDialog")
+  (return-type "none")
+  (parameters
+    '("GdkDevice*" "device")
+  )
+)
+
+(define-virtual disable_device
+  (of-object "GtkInputDialog")
+  (return-type "none")
+  (parameters
+    '("GdkDevice*" "device")
+  )
+)
+
diff --git a/src/defs/GtkInvisible.defs b/src/defs/GtkInvisible.defs
new file mode 100644
index 0000000..4c9dabe
--- /dev/null
+++ b/src/defs/GtkInvisible.defs
@@ -0,0 +1,40 @@
+(define-object Invisible
+  (unnecessary)
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkInvisible")
+  (gtype-id "GTK_TYPE_INVISIBLE")
+)
+
+(define-function gtk_invisible_new
+  (is-constructor-of "GtkInvisible")
+  (c-name "gtk_invisible_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_invisible_new_for_screen
+  (is-constructor-of "GtkInvisible")
+  (c-name "gtk_invisible_new_for_screen")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method set_screen
+  (of-object "GtkInvisible")
+  (c-name "gtk_invisible_set_screen")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method get_screen
+  (of-object "GtkInvisible")
+  (c-name "gtk_invisible_get_screen")
+  (return-type "GdkScreen*")
+)
+
diff --git a/src/defs/GtkJunctionSides.defs b/src/defs/GtkJunctionSides.defs
new file mode 100644
index 0000000..ec77b6b
--- /dev/null
+++ b/src/defs/GtkJunctionSides.defs
@@ -0,0 +1,16 @@
+(define-enum JunctionSides
+  (in-module "Gtk")
+  (c-name "GtkJunctionSides")
+  (gtype-id "GTK_TYPE_JUNCTION_SIDES")
+  (values
+    '("none" "GTK_JUNCTION_NONE")
+    '("corner-topleft" "GTK_JUNCTION_CORNER_TOPLEFT")
+    '("corner-topright" "GTK_JUNCTION_CORNER_TOPRIGHT")
+    '("corner-bottomleft" "GTK_JUNCTION_CORNER_BOTTOMLEFT")
+    '("corner-bottomright" "GTK_JUNCTION_CORNER_BOTTOMRIGHT")
+    '("top" "GTK_JUNCTION_TOP")
+    '("bottom" "GTK_JUNCTION_BOTTOM")
+    '("left" "GTK_JUNCTION_LEFT")
+    '("right" "GTK_JUNCTION_RIGHT")
+  )
+)
diff --git a/src/defs/GtkJustification.defs b/src/defs/GtkJustification.defs
new file mode 100644
index 0000000..b33899b
--- /dev/null
+++ b/src/defs/GtkJustification.defs
@@ -0,0 +1,12 @@
+(define-enum Justification
+  (in-module "Gtk")
+  (c-name "GtkJustification")
+  (gtype-id "GTK_TYPE_JUSTIFICATION")
+  (values
+    '("left" "GTK_JUSTIFY_LEFT")
+    '("right" "GTK_JUSTIFY_RIGHT")
+    '("center" "GTK_JUSTIFY_CENTER")
+    '("fill" "GTK_JUSTIFY_FILL")
+  )
+)
+
diff --git a/src/defs/GtkLabel.defs b/src/defs/GtkLabel.defs
new file mode 100644
index 0000000..6a7b8c7
--- /dev/null
+++ b/src/defs/GtkLabel.defs
@@ -0,0 +1,386 @@
+(define-object Label
+  (in-module "Gtk")
+  (parent "GtkMisc")
+  (c-name "GtkLabel")
+  (gtype-id "GTK_TYPE_LABEL")
+)
+
+(define-function gtk_label_new
+  (is-constructor-of "GtkLabel")
+  (c-name "gtk_label_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label" (null-ok))
+  )
+)
+
+(define-function gtk_label_new_with_mnemonic
+  (is-constructor-of "GtkLabel")
+  (c-name "gtk_label_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method set_text
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_text")
+  (return-type "none")
+  (parameters
+    '("const-char*" "str")
+  )
+)
+
+(define-method get_text
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_text")
+  (return-type "const-gchar*")
+)
+
+(define-method set_attributes
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_attributes")
+  (return-type "none")
+  (parameters
+    '("PangoAttrList*" "attrs")
+  )
+)
+
+(define-method get_attributes
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_attributes")
+  (return-type "PangoAttrList*")
+)
+
+(define-method set_label
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-method get_label
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_markup
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_markup")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-method set_use_markup
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_use_markup")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_use_markup
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_use_markup")
+  (return-type "gboolean")
+)
+
+(define-method set_use_underline
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_use_underline")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_use_underline
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_use_underline")
+  (return-type "gboolean")
+)
+
+(define-method set_markup_with_mnemonic
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_markup_with_mnemonic")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-method get_mnemonic_keyval
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_mnemonic_keyval")
+  (return-type "guint")
+)
+
+(define-method set_mnemonic_widget
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_mnemonic_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget" (null-ok))
+  )
+)
+
+(define-method get_mnemonic_widget
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_mnemonic_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_text_with_mnemonic
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_text_with_mnemonic")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-method set_justify
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_justify")
+  (return-type "none")
+  (parameters
+    '("GtkJustification" "jtype")
+  )
+)
+
+(define-method get_justify
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_justify")
+  (return-type "GtkJustification")
+)
+
+(define-method set_pattern
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_pattern")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "pattern")
+  )
+)
+
+(define-method set_line_wrap
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_line_wrap")
+  (return-type "none")
+  (parameters
+    '("gboolean" "wrap")
+  )
+)
+
+(define-method get_line_wrap
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_line_wrap")
+  (return-type "gboolean")
+)
+
+(define-method set_selectable
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_selectable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_selectable
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_selectable")
+  (return-type "gboolean")
+)
+
+(define-method select_region
+  (of-object "GtkLabel")
+  (c-name "gtk_label_select_region")
+  (return-type "none")
+  (parameters
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+  )
+)
+
+(define-method get_selection_bounds
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_selection_bounds")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "start")
+    '("gint*" "end")
+  )
+)
+
+(define-method get_layout
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_layout")
+  (return-type "PangoLayout*")
+)
+
+(define-method get_layout_offsets
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_layout_offsets")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-method set_ellipsize
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_ellipsize")
+  (return-type "none")
+  (parameters
+    '("PangoEllipsizeMode" "mode")
+  )
+)
+
+(define-method get_ellipsize
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_ellipsize")
+  (return-type "PangoEllipsizeMode")
+)
+
+(define-method set_angle
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_angle")
+  (return-type "none")
+  (parameters
+    '("gdouble" "angle")
+  )
+)
+
+(define-method get_angle
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_angle")
+  (return-type "gdouble")
+)
+
+(define-method set_width_chars
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_width_chars")
+  (return-type "none")
+  (parameters
+    '("gint" "n_chars")
+  )
+)
+
+(define-method get_width_chars
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_width_chars")
+  (return-type "gint")
+)
+
+(define-method set_max_width_chars
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_max_width_chars")
+  (return-type "none")
+  (parameters
+    '("gint" "n_chars")
+  )
+)
+
+(define-method get_max_width_chars
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_max_width_chars")
+  (return-type "gint")
+)
+
+(define-method set_single_line_mode
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_single_line_mode")
+  (return-type "none")
+  (parameters
+    '("gboolean" "single_line_mode")
+  )
+)
+
+(define-method get_single_line_mode
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_single_line_mode")
+  (return-type "gboolean")
+)
+
+(define-method set_line_wrap_mode
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_line_wrap_mode")
+  (return-type "none")
+  (parameters
+    '("PangoWrapMode" "wrap_mode")
+  )
+)
+
+(define-method get_line_wrap_mode
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_line_wrap_mode")
+  (return-type "PangoWrapMode")
+)
+
+(define-method get_current_uri
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_current_uri")
+  (return-type "const-gchar*")
+)
+
+(define-method set_track_visited_links
+  (of-object "GtkLabel")
+  (c-name "gtk_label_set_track_visited_links")
+  (return-type "none")
+  (parameters
+    '("gboolean" "track_links")
+  )
+)
+
+(define-method get_track_visited_links
+  (of-object "GtkLabel")
+  (c-name "gtk_label_get_track_visited_links")
+  (return-type "gboolean")
+)
+
+(define-virtual move_cursor
+  (of-object "GtkLabel")
+  (return-type "none")
+  (parameters
+    '("GtkMovementStep" "step")
+    '("gint" "count")
+    '("gboolean" "extend_selection")
+  )
+)
+
+(define-virtual copy_clipboard
+  (of-object "GtkLabel")
+  (return-type "none")
+)
+
+(define-virtual populate_popup
+  (of-object "GtkLabel")
+  (return-type "none")
+  (parameters
+    '("GtkMenu*" "menu")
+  )
+)
+
+(define-virtual activate-current-link
+  (of-object "GtkLabel")
+  (return-type "none")
+)
+
+(define-virtual activate-link
+  (of-object "GtkLabel")
+  (return-type "gboolean")
+  (parameters
+    '("gchar*" "menu")
+  )
+)
diff --git a/src/defs/GtkLayout.defs b/src/defs/GtkLayout.defs
new file mode 100644
index 0000000..bb29f1d
--- /dev/null
+++ b/src/defs/GtkLayout.defs
@@ -0,0 +1,102 @@
+(define-object Layout
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkLayout")
+  (gtype-id "GTK_TYPE_LAYOUT")
+  (fields
+    '("GdkWindow*" "bin_window")
+  )
+)
+
+(define-function gtk_layout_new
+  (is-constructor-of "GtkLayout")
+  (c-name "gtk_layout_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "hadjustment" (null-ok))
+    '("GtkAdjustment*" "vadjustment" (null-ok))
+  )
+)
+
+(define-method put
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_put")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child_widget")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method move
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_move")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child_widget")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method set_size
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_set_size")
+  (return-type "none")
+  (parameters
+    '("guint" "width")
+    '("guint" "height")
+  )
+)
+
+(define-method get_size
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_get_size")
+  (return-type "none")
+  (parameters
+    '("guint*" "width")
+    '("guint*" "height")
+  )
+)
+
+(define-method get_hadjustment
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_get_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method get_vadjustment
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_get_vadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_hadjustment
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_set_hadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
+(define-method set_vadjustment
+  (of-object "GtkLayout")
+  (c-name "gtk_layout_set_vadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
+(define-virtual set_scroll_adjustments
+  (of-object "GtkLayout")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+    '("GtkAdjustment*" "vadjustment")
+  )
+)
+
diff --git a/src/defs/GtkLicense.defs b/src/defs/GtkLicense.defs
new file mode 100644
index 0000000..862ced9
--- /dev/null
+++ b/src/defs/GtkLicense.defs
@@ -0,0 +1,16 @@
+(define-flags License
+  (in-module "Gtk")
+  (c-name "GtkLicense")
+  (gtype-id "GTK_TYPE_LICENSE")
+  (values
+    '("unknown" "GTK_LICENSE_UNKNOWN")
+    '("custom" "GTK_LICENSE_CUSTOM")
+    '("gpl-2-0" "GTK_LICENSE_GPL_2_0")
+    '("gpl-3-0" "GTK_LICENSE_GPL_3_0")
+    '("lgpl-2-1" "GTK_LICENSE_LGPL_2_1")
+    '("lgpl-3-0" "GTK_LICENSE_LGPL_3_0")
+    '("bsd" "GTK_LICENSE_BSD")
+    '("mit_x11" "GTK_LICENSE_MIT_X11")
+    '("artistic" "GTK_LICENSE_ARTISTIC")
+  )
+)
\ No newline at end of file
diff --git a/src/defs/GtkLinkButton.defs b/src/defs/GtkLinkButton.defs
new file mode 100644
index 0000000..b43d477
--- /dev/null
+++ b/src/defs/GtkLinkButton.defs
@@ -0,0 +1,66 @@
+(define-object LinkButton
+  (in-module "Gtk")
+  (parent "GtkButton")
+  (c-name "GtkLinkButton")
+  (gtype-id "GTK_TYPE_LINK_BUTTON")
+)
+
+(define-function gtk_link_button_new
+  (is-constructor-of "GtkLinkButton")
+  (c-name "gtk_link_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-function link_button_new_with_label
+  (is-constructor-of "GtkLinkButton")
+  (c-name "gtk_link_button_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "uri")
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method get_uri
+  (of-object "GtkLinkButton")
+  (c-name "gtk_link_button_get_uri")
+  (return-type "const-gchar*")
+)
+
+(define-method set_uri
+  (of-object "GtkLinkButton")
+  (c-name "gtk_link_button_set_uri")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-method get_visited
+  (of-object "GtkLinkButton")
+  (c-name "gtk_link_button_get_visited")
+  (return-type "gboolean")
+)
+
+(define-method set_visited
+  (of-object "GtkLinkButton")
+  (c-name "gtk_link_button_set_visited")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visited")
+  )
+)
+
+(define-virtual uri_clicked
+  (of-object "GtkLinkButton")
+  (return-type "none")
+  (parameters
+    '("gchar*" "link")
+  )
+)
+
diff --git a/src/defs/GtkListStore.defs b/src/defs/GtkListStore.defs
new file mode 100644
index 0000000..7bce87a
--- /dev/null
+++ b/src/defs/GtkListStore.defs
@@ -0,0 +1,214 @@
+(define-object ListStore
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkTreeModel")
+  (implements "GtkTreeDragSource")
+  (implements "GtkTreeDragDest")
+  (implements "GtkTreeSortable")
+  (c-name "GtkListStore")
+  (gtype-id "GTK_TYPE_LIST_STORE")
+)
+
+(define-function gtk_list_store_new
+  (is-constructor-of "GtkListStore")
+  (c-name "gtk_list_store_new")
+  (caller-owns-return #t)
+  (return-type "GtkListStore*")
+  (parameters
+    '("gint" "n_columns")
+  )
+  (varargs #t)
+  (unnecessary "GtkTreeModelOverride")
+)
+
+(define-function gtk_list_store_newv
+  (is-constructor-of "GtkListStore")
+  (c-name "gtk_list_store_newv")
+  (caller-owns-return #t)
+  (return-type "GtkListStore*")
+  (parameters
+    '("gint" "n_columns")
+    '("GType*" "value")
+  )
+  (unnecessary "GtkTreeModelOverride")
+)
+
+(define-method set_column_types
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_set_column_types")
+  (return-type "none")
+  (parameters
+    '("gint" "n_columns")
+    '("GType*" "types")
+  )
+
+(define-method set_value
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_set_value")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "column")
+    '("GValue*" "value")
+  )
+)
+
+(define-method set
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_set")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+  (varargs #t)
+  (unnecessary)
+)
+
+(define-method set_valist
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_set_valist")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("va_list" "var_args")
+  )
+  (unnecessary)
+)
+
+(define-method remove
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_remove")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method insert
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_insert")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "position")
+  )
+)
+
+(define-method insert_before
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_insert_before")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "sibling")
+  )
+)
+
+(define-method insert_after
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_insert_after")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "sibling")
+  )
+)
+
+(define-method insert_with_values
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_insert_with_values")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "position")
+  )
+  (varargs #t)
+  (unnecessary)
+)
+
+(define-method insert_with_valuesv
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_insert_with_valuesv")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "position")
+    '("gint*" "columns")
+    '("GValue*" "values")
+    '("gint" "n_values")
+  )
+  (unnecessary)
+)
+
+(define-method prepend
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_prepend")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method append
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_append")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method clear
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_clear")
+  (return-type "none")
+)
+
+(define-method iter_is_valid
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_iter_is_valid")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method reorder
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_reorder")
+  (return-type "none")
+  (parameters
+    '("gint*" "new_order")
+  )
+)
+
+(define-method swap
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_swap")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "a")
+    '("GtkTreeIter*" "b")
+  )
+)
+
+(define-method move_after
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_move_after")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "position" (null-ok))
+  )
+)
+
+(define-method move_before
+  (of-object "GtkListStore")
+  (c-name "gtk_list_store_move_before")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "position" (null-ok))
+  )
+)
+
diff --git a/src/defs/GtkMenu.defs b/src/defs/GtkMenu.defs
new file mode 100644
index 0000000..1eed552
--- /dev/null
+++ b/src/defs/GtkMenu.defs
@@ -0,0 +1,186 @@
+(define-object Menu
+  (in-module "Gtk")
+  (parent "GtkMenuShell")
+  (c-name "GtkMenu")
+  (gtype-id "GTK_TYPE_MENU")
+)
+
+(define-function gtk_menu_new
+  (is-constructor-of "GtkMenu")
+  (c-name "gtk_menu_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method popup
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_popup")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "parent_menu_shell")
+    '("GtkWidget*" "parent_menu_item")
+    '("GtkMenuPositionFunc" "func")
+    '("gpointer" "data")
+    '("guint" "button")
+    '("guint32" "activate_time")
+  )
+)
+
+(define-method reposition
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_reposition")
+  (return-type "none")
+)
+
+(define-method popdown
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_popdown")
+  (return-type "none")
+)
+
+(define-method get_active
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_get_active")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_active
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_active")
+  (return-type "none")
+  (parameters
+    '("guint" "index")
+  )
+)
+
+(define-method set_accel_group
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_accel_group")
+  (return-type "none")
+  (parameters
+    '("GtkAccelGroup*" "accel_group" (null-ok))
+  )
+)
+
+(define-method get_accel_group
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_get_accel_group")
+  (return-type "GtkAccelGroup*")
+)
+
+(define-method set_accel_path
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_accel_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path" (null-ok))
+  )
+)
+
+(define-method attach_to_widget
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_attach_to_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "attach_widget")
+    '("GtkMenuDetachFunc" "detacher")
+  )
+)
+
+(define-method detach
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_detach")
+  (return-type "none")
+)
+
+(define-method get_attach_widget
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_get_attach_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_tearoff_state
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_tearoff_state")
+  (return-type "none")
+  (parameters
+    '("gboolean" "torn_off")
+  )
+)
+
+(define-method get_tearoff_state
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_get_tearoff_state")
+  (return-type "gboolean")
+)
+
+(define-method set_title
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_title
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method reorder_child
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_reorder_child")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "position")
+  )
+)
+
+(define-method set_screen
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_screen")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen" (null-ok))
+  )
+)
+
+(define-method attach
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_attach")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("guint" "left_attach")
+    '("guint" "right_attach")
+    '("guint" "top_attach")
+    '("guint" "bottom_attach")
+  )
+)
+
+(define-method set_monitor
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_monitor")
+  (return-type "none")
+  (parameters
+    '("gint" "monitor_num")
+  )
+)
+
+(define-method set_reserve_toggle_size
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_set_reserve_toggle_size")
+  (return-type "none")
+  (parameters
+    '("gboolean" "reserve_toggle_size")
+  )
+)
+
+(define-method get_reserve_toggle_size
+  (of-object "GtkMenu")
+  (c-name "gtk_menu_get_reserve_toggle_size")
+  (return-type "gboolean")
+)
diff --git a/src/defs/GtkMenuBar.defs b/src/defs/GtkMenuBar.defs
new file mode 100644
index 0000000..e5b905b
--- /dev/null
+++ b/src/defs/GtkMenuBar.defs
@@ -0,0 +1,44 @@
+(define-object MenuBar
+  (in-module "Gtk")
+  (parent "GtkMenuShell")
+  (c-name "GtkMenuBar")
+  (gtype-id "GTK_TYPE_MENU_BAR")
+)
+
+(define-function gtk_menu_bar_new
+  (is-constructor-of "GtkMenuBar")
+  (c-name "gtk_menu_bar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_pack_direction
+  (of-object "GtkMenuBar")
+  (c-name "gtk_menu_bar_get_pack_direction")
+  (return-type "GtkPackDirection")
+)
+
+(define-method set_pack_direction
+  (of-object "GtkMenuBar")
+  (c-name "gtk_menu_bar_set_pack_direction")
+  (return-type "none")
+  (parameters
+    '("GtkPackDirection" "pack_dir")
+  )
+)
+
+(define-method get_child_pack_direction
+  (of-object "GtkMenuBar")
+  (c-name "gtk_menu_bar_get_child_pack_direction")
+  (return-type "GtkPackDirection")
+)
+
+(define-method set_child_pack_direction
+  (of-object "GtkMenuBar")
+  (c-name "gtk_menu_bar_set_child_pack_direction")
+  (return-type "none")
+  (parameters
+    '("GtkPackDirection" "child_pack_dir")
+  )
+)
+
diff --git a/src/defs/GtkMenuDirectionType.defs b/src/defs/GtkMenuDirectionType.defs
new file mode 100644
index 0000000..9736713
--- /dev/null
+++ b/src/defs/GtkMenuDirectionType.defs
@@ -0,0 +1,12 @@
+(define-enum MenuDirectionType
+  (in-module "Gtk")
+  (c-name "GtkMenuDirectionType")
+  (gtype-id "GTK_TYPE_MENU_DIRECTION_TYPE")
+  (values
+    '("parent" "GTK_MENU_DIR_PARENT")
+    '("child" "GTK_MENU_DIR_CHILD")
+    '("next" "GTK_MENU_DIR_NEXT")
+    '("prev" "GTK_MENU_DIR_PREV")
+  )
+)
+
diff --git a/src/defs/GtkMenuItem.defs b/src/defs/GtkMenuItem.defs
new file mode 100644
index 0000000..9cdc5f8
--- /dev/null
+++ b/src/defs/GtkMenuItem.defs
@@ -0,0 +1,141 @@
+(define-object MenuItem
+  (in-module "Gtk")
+  (parent "GtkItem")
+  (c-name "GtkMenuItem")
+  (gtype-id "GTK_TYPE_MENU_ITEM")
+)
+
+(define-function gtk_menu_item_new
+  (is-constructor-of "GtkMenuItem")
+  (c-name "gtk_menu_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_menu_item_new_with_label
+  (is-constructor-of "GtkMenuItem")
+  (c-name "gtk_menu_item_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_menu_item_new_with_mnemonic
+  (is-constructor-of "GtkMenuItem")
+  (c-name "gtk_menu_item_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method set_submenu
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_set_submenu")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "submenu")
+  )
+)
+
+(define-method get_submenu
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_get_submenu")
+  (return-type "GtkWidget*")
+)
+
+(define-method select
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_select")
+  (return-type "none")
+)
+
+(define-method deselect
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_deselect")
+  (return-type "none")
+)
+
+(define-method activate
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_activate")
+  (return-type "none")
+)
+
+(define-method toggle_size_request
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_toggle_size_request")
+  (return-type "none")
+  (parameters
+    '("gint*" "requisition")
+  )
+)
+
+(define-method toggle_size_allocate
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_toggle_size_allocate")
+  (return-type "none")
+  (parameters
+    '("gint" "allocation")
+  )
+)
+
+(define-method set_right_justified
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_set_right_justified")
+  (return-type "none")
+  (parameters
+    '("gboolean" "right_justified")
+  )
+)
+
+(define-method get_right_justified
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_get_right_justified")
+  (return-type "gboolean")
+)
+
+(define-method set_accel_path
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_set_accel_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path" (null-ok))
+  )
+)
+
+(define-method get_accel_path
+  (of-object "GtkMenuItem")
+  (c-name "gtk_menu_item_get_accel_path")
+  (return-type "const-gchar*")
+)
+
+(define-virtual activate
+  (of-object "GtkMenuItem")
+  (return-type "none")
+)
+
+(define-virtual activate_item
+  (of-object "GtkMenuItem")
+  (return-type "none")
+)
+
+(define-virtual toggle_size_request
+  (of-object "GtkMenuItem")
+  (return-type "none")
+  (parameters
+    '("gint*" "requisition")
+  )
+)
+
+(define-virtual toggle_size_allocate
+  (of-object "GtkMenuItem")
+  (return-type "none")
+  (parameters
+    '("gint" "allocation")
+  )
+)
+
diff --git a/src/defs/GtkMenuShell.defs b/src/defs/GtkMenuShell.defs
new file mode 100644
index 0000000..beb65ba
--- /dev/null
+++ b/src/defs/GtkMenuShell.defs
@@ -0,0 +1,149 @@
+(define-object MenuShell
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkMenuShell")
+  (gtype-id "GTK_TYPE_MENU_SHELL")
+)
+
+(define-method append
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_append")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method prepend
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_prepend")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method insert
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_insert")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "position")
+  )
+)
+
+(define-method deactivate
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_deactivate")
+  (return-type "none")
+)
+
+(define-method select_item
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_select_item")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "menu_item")
+  )
+)
+
+(define-method deselect
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_deselect")
+  (return-type "none")
+)
+
+(define-method activate_item
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_activate_item")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "menu_item")
+    '("gboolean" "force_deactivate")
+  )
+)
+
+(define-method select_first
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_select_first")
+  (return-type "none")
+  (parameters
+    '("gboolean" "search_sensitive")
+  )
+)
+
+(define-method cancel
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_cancel")
+  (return-type "none")
+)
+
+(define-method get_take_focus
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_get_take_focus")
+  (return-type "gboolean")
+)
+
+(define-method set_take_focus
+  (of-object "GtkMenuShell")
+  (c-name "gtk_menu_shell_set_take_focus")
+  (return-type "none")
+  (parameters
+    '("gboolean" "take_focus")
+  )
+)
+
+(define-virtual deactivate
+  (of-object "GtkMenuShell")
+  (return-type "none")
+)
+
+(define-virtual selection_done
+  (of-object "GtkMenuShell")
+  (return-type "none")
+)
+
+(define-virtual move_current
+  (of-object "GtkMenuShell")
+  (return-type "none")
+  (parameters
+    '("GtkMenuDirectionType" "direction")
+  )
+)
+
+(define-virtual activate_current
+  (of-object "GtkMenuShell")
+  (return-type "none")
+  (parameters
+    '("gboolean" "force_hide")
+  )
+)
+
+(define-virtual cancel
+  (of-object "GtkMenuShell")
+  (return-type "none")
+)
+
+(define-virtual select_item
+  (of-object "GtkMenuShell")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "menu_item")
+  )
+)
+
+(define-virtual insert
+  (of-object "GtkMenuShell")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "position")
+  )
+)
+
+(define-virtual get_popup_delay
+  (of-object "GtkMenuShell")
+  (return-type "gint")
+)
+
diff --git a/src/defs/GtkMenuToolButton.defs b/src/defs/GtkMenuToolButton.defs
new file mode 100644
index 0000000..38c05de
--- /dev/null
+++ b/src/defs/GtkMenuToolButton.defs
@@ -0,0 +1,59 @@
+(define-object MenuToolButton
+  (in-module "Gtk")
+  (parent "GtkToolButton")
+  (c-name "GtkMenuToolButton")
+  (gtype-id "GTK_TYPE_MENU_TOOL_BUTTON")
+)
+
+(define-function gtk_menu_tool_button_new
+  (is-constructor-of "GtkMenuToolButton")
+  (c-name "gtk_menu_tool_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("GtkWidget*" "icon_widget" (null-ok))
+    '("const-gchar*" "label" (null-ok))
+  )
+)
+
+(define-function gtk_menu_tool_button_new_from_stock
+  (is-constructor-of "GtkMenuToolButton")
+  (c-name "gtk_menu_tool_button_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method set_menu
+  (of-object "GtkMenuToolButton")
+  (c-name "gtk_menu_tool_button_set_menu")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "menu" (null-ok))
+  )
+)
+
+(define-method get_menu
+  (of-object "GtkMenuToolButton")
+  (c-name "gtk_menu_tool_button_get_menu")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_arrow_tooltip
+  (of-object "GtkMenuToolButton")
+  (c-name "gtk_menu_tool_button_set_arrow_tooltip")
+  (return-type "none")
+  (parameters
+    '("GtkTooltips*" "tooltips")
+    '("const-gchar*" "tip_text" (null-ok))
+    '("const-gchar*" "tip_private" (default "NULL") (null-ok))
+  )
+)
+
+(define-virtual show_menu
+  (of-object "GtkMenuToolButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkMessageDialog.defs b/src/defs/GtkMessageDialog.defs
new file mode 100644
index 0000000..8ee2ca3
--- /dev/null
+++ b/src/defs/GtkMessageDialog.defs
@@ -0,0 +1,77 @@
+(define-object MessageDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (c-name "GtkMessageDialog")
+  (gtype-id "GTK_TYPE_MESSAGE_DIALOG")
+  (fields
+    '("GtkWidget*" "image")
+    '("GtkWidget*" "label")
+  )
+)
+
+(define-function gtk_message_dialog_new
+  (is-constructor-of "GtkMessageDialog")
+  (c-name "gtk_message_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkWindow*" "parent" (default "NULL") (null-ok))
+    '("GtkDialogFlags" "flags" (default "0"))
+    '("GtkMessageType" "type" (default "GTK_MESSAGE_INFO"))
+    '("GtkButtonsType" "buttons" (default "GTK_BUTTONS_NONE"))
+    '("const-gchar*" "message_format" (default "NULL") (null-ok))
+  )
+  (varargs #t)
+)
+
+(define-function message_dialog_new_with_markup
+  (is-constructor-of "GtkMessageDialog")
+  (c-name "gtk_message_dialog_new_with_markup")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkWindow*" "parent")
+    '("GtkDialogFlags" "flags")
+    '("GtkMessageType" "type")
+    '("GtkButtonsType" "buttons")
+    '("const-gchar*" "message_format")
+  )
+  (varargs #t)
+)
+
+(define-method set_markup
+  (of-object "GtkMessageDialog")
+  (c-name "gtk_message_dialog_set_markup")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-method format_secondary_text
+  (of-object "GtkMessageDialog")
+  (c-name "gtk_message_dialog_format_secondary_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "message_format")
+  )
+  (varargs #t)
+)
+
+(define-method format_secondary_markup
+  (of-object "GtkMessageDialog")
+  (c-name "gtk_message_dialog_format_secondary_markup")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "message_format")
+  )
+  (varargs #t)
+)
+
+(define-method set_image
+  (of-object "GtkMessageDialog")
+  (c-name "gtk_message_dialog_set_image")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "image")
+  )
+)
+
diff --git a/src/defs/GtkMessageType.defs b/src/defs/GtkMessageType.defs
new file mode 100644
index 0000000..c57bddb
--- /dev/null
+++ b/src/defs/GtkMessageType.defs
@@ -0,0 +1,13 @@
+(define-enum MessageType
+  (in-module "Gtk")
+  (c-name "GtkMessageType")
+  (gtype-id "GTK_TYPE_MESSAGE_TYPE")
+  (values
+    '("info" "GTK_MESSAGE_INFO")
+    '("warning" "GTK_MESSAGE_WARNING")
+    '("question" "GTK_MESSAGE_QUESTION")
+    '("error" "GTK_MESSAGE_ERROR")
+    '("other" "GTK_MESSAGE_OTHER")
+  )
+)
+
diff --git a/src/defs/GtkMetricType.defs b/src/defs/GtkMetricType.defs
new file mode 100644
index 0000000..09a31bd
--- /dev/null
+++ b/src/defs/GtkMetricType.defs
@@ -0,0 +1,11 @@
+(define-enum MetricType
+  (in-module "Gtk")
+  (c-name "GtkMetricType")
+  (gtype-id "GTK_TYPE_METRIC_TYPE")
+  (values
+    '("pixels" "GTK_PIXELS")
+    '("inches" "GTK_INCHES")
+    '("centimeters" "GTK_CENTIMETERS")
+  )
+)
+
diff --git a/src/defs/GtkMisc.defs b/src/defs/GtkMisc.defs
new file mode 100644
index 0000000..17bdeda
--- /dev/null
+++ b/src/defs/GtkMisc.defs
@@ -0,0 +1,47 @@
+(define-object Misc
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkMisc")
+  (gtype-id "GTK_TYPE_MISC")
+)
+
+(define-method set_alignment
+  (of-object "GtkMisc")
+  (c-name "gtk_misc_set_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+  )
+)
+
+(define-method get_alignment
+  (of-object "GtkMisc")
+  (c-name "gtk_misc_get_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat*" "xalign")
+    '("gfloat*" "yalign")
+  )
+)
+
+(define-method set_padding
+  (of-object "GtkMisc")
+  (c-name "gtk_misc_set_padding")
+  (return-type "none")
+  (parameters
+    '("gint" "xpad")
+    '("gint" "ypad")
+  )
+)
+
+(define-method get_padding
+  (of-object "GtkMisc")
+  (c-name "gtk_misc_get_padding")
+  (return-type "none")
+  (parameters
+    '("gint*" "xpad")
+    '("gint*" "ypad")
+  )
+)
+
diff --git a/src/defs/GtkMovementStep.defs b/src/defs/GtkMovementStep.defs
new file mode 100644
index 0000000..328e406
--- /dev/null
+++ b/src/defs/GtkMovementStep.defs
@@ -0,0 +1,18 @@
+(define-enum MovementStep
+  (in-module "Gtk")
+  (c-name "GtkMovementStep")
+  (gtype-id "GTK_TYPE_MOVEMENT_STEP")
+  (values
+    '("logical-positions" "GTK_MOVEMENT_LOGICAL_POSITIONS")
+    '("visual-positions" "GTK_MOVEMENT_VISUAL_POSITIONS")
+    '("words" "GTK_MOVEMENT_WORDS")
+    '("display-lines" "GTK_MOVEMENT_DISPLAY_LINES")
+    '("display-line-ends" "GTK_MOVEMENT_DISPLAY_LINE_ENDS")
+    '("paragraphs" "GTK_MOVEMENT_PARAGRAPHS")
+    '("paragraph-ends" "GTK_MOVEMENT_PARAGRAPH_ENDS")
+    '("pages" "GTK_MOVEMENT_PAGES")
+    '("buffer-ends" "GTK_MOVEMENT_BUFFER_ENDS")
+    '("horizontal-pages" "GTK_MOVEMENT_HORIZONTAL_PAGES")
+  )
+)
+
diff --git a/src/defs/GtkNotebook.defs b/src/defs/GtkNotebook.defs
new file mode 100644
index 0000000..435d018
--- /dev/null
+++ b/src/defs/GtkNotebook.defs
@@ -0,0 +1,416 @@
+(define-object Notebook
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkNotebook")
+  (gtype-id "GTK_TYPE_NOTEBOOK")
+  (fields
+    '("GtkPositionType" "tab_pos")
+  )
+)
+
+(define-function gtk_notebook_new
+  (is-constructor-of "GtkNotebook")
+  (c-name "gtk_notebook_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method append_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_append_page")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method append_page_menu
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_append_page_menu")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+    '("GtkWidget*" "menu_label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method prepend_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_prepend_page")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method prepend_page_menu
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_prepend_page_menu")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+    '("GtkWidget*" "menu_label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method insert_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_insert_page")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+    '("gint" "position" (default "-1"))
+  )
+)
+
+(define-method insert_page_menu
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_insert_page_menu")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+    '("GtkWidget*" "menu_label" (default "NULL") (null-ok))
+    '("gint" "position" (default "-1"))
+  )
+)
+
+(define-method remove_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_remove_page")
+  (return-type "none")
+  (parameters
+    '("gint" "page_num")
+  )
+)
+
+(define-method get_current_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_current_page")
+  (return-type "gint")
+)
+
+(define-method get_nth_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_nth_page")
+  (return-type "GtkWidget*")
+  (parameters
+    '("gint" "page_num")
+  )
+)
+
+(define-method get_n_pages
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_n_pages")
+  (return-type "gint")
+)
+
+(define-method page_num
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_page_num")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method set_current_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_current_page")
+  (return-type "none")
+  (parameters
+    '("gint" "page_num")
+  )
+)
+
+(define-method next_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_next_page")
+  (return-type "none")
+)
+
+(define-method prev_page
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_prev_page")
+  (return-type "none")
+)
+
+(define-method set_show_border
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_show_border")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_border")
+  )
+)
+
+(define-method get_show_border
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_show_border")
+  (return-type "gboolean")
+)
+
+(define-method set_show_tabs
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_show_tabs")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_tabs")
+  )
+)
+
+(define-method get_show_tabs
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_show_tabs")
+  (return-type "gboolean")
+)
+
+(define-method set_tab_pos
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_tab_pos")
+  (return-type "none")
+  (parameters
+    '("GtkPositionType" "pos")
+  )
+)
+
+(define-method get_tab_pos
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_tab_pos")
+  (return-type "GtkPositionType")
+)
+
+(define-method set_scrollable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_scrollable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "scrollable")
+  )
+)
+
+(define-method get_scrollable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_scrollable")
+  (return-type "gboolean")
+)
+
+(define-method popup_enable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_popup_enable")
+  (return-type "none")
+)
+
+(define-method popup_disable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_popup_disable")
+  (return-type "none")
+)
+
+(define-method get_tab_label
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_tab_label")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method set_tab_label
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_tab_label")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_tab_label_text
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_tab_label_text")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "tab_text")
+  )
+)
+
+(define-method get_tab_label_text
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_tab_label_text")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method get_menu_label
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_menu_label")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method set_menu_label
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_menu_label")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "menu_label" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_menu_label_text
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_menu_label_text")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("const-gchar*" "menu_text")
+  )
+)
+
+(define-method get_menu_label_text
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_menu_label_text")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method reorder_child
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_reorder_child")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "position")
+  )
+)
+
+
+;; the first parameter, a GtkNotebookPage*, is actually private and internal
+;; to GTK; worse, it marshalls as a gpointer. Quite inconvenient of them to
+;; have made this publicly visible. Our workaround is to make it a long and
+;; trim in on the Java side.
+
+(define-virtual switch_page
+  (of-object "GtkNotebook")
+  (return-type "none")
+  (parameters
+    '("glong" "page")
+    '("guint" "page_num")
+  )
+)
+
+(define-virtual select_page
+  (of-object "GtkNotebook")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "move_focus")
+  )
+)
+
+(define-virtual focus_tab
+  (of-object "GtkNotebook")
+  (return-type "gboolean")
+  (parameters
+    '("GtkNotebookTab" "type")
+  )
+)
+
+(define-virtual change_current_page
+  (of-object "GtkNotebook")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "offset")
+  )
+)
+
+(define-method get_tab_reorderable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_tab_reorderable")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method set_tab_reorderable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_tab_reorderable")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "reorderable")
+  )
+)
+
+(define-method get_tab_detachable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_tab_detachable")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method set_tab_detachable
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_tab_detachable")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "detachable")
+  )
+)
+
+(define-method get_action_widget
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_get_action_widget")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkPackType" "pack_type")
+  )
+)
+
+(define-method set_action_widget
+  (of-object "GtkNotebook")
+  (c-name "gtk_notebook_set_action_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("GtkPackType" "pack_type")
+  )
+)
+
+(define-virtual reorder_tab
+  (of-object "GtkNotebook")
+  (return-type "none")
+  (parameters
+    '("GtkDirectionType" "direction")
+    '("gboolean" "move_to_last")
+  )
+)
+
+(define-virtual insert_page
+  (of-object "GtkNotebook")
+  (return-type "gint")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label")
+    '("GtkWidget*" "menu_label")
+    '("gint" "position")
+  )
+)
+
diff --git a/src/defs/GtkNotebookTab.defs b/src/defs/GtkNotebookTab.defs
new file mode 100644
index 0000000..8c75e1f
--- /dev/null
+++ b/src/defs/GtkNotebookTab.defs
@@ -0,0 +1,10 @@
+(define-enum NotebookTab
+  (in-module "Gtk")
+  (c-name "GtkNotebookTab")
+  (gtype-id "GTK_TYPE_NOTEBOOK_TAB")
+  (values
+    '("first" "GTK_NOTEBOOK_TAB_FIRST")
+    '("last" "GTK_NOTEBOOK_TAB_LAST")
+  )
+)
+
diff --git a/src/defs/GtkOffscreenWindow.defs b/src/defs/GtkOffscreenWindow.defs
new file mode 100644
index 0000000..2a28c34
--- /dev/null
+++ b/src/defs/GtkOffscreenWindow.defs
@@ -0,0 +1,26 @@
+(define-object OffscreenWindow
+  (in-module "Gtk")
+  (parent "GtkWindow")
+  (c-name "GtkOffscreenWindow")
+  (gtype-id "GTK_TYPE_OFFSCREEN_WINDOW")
+)
+
+(define-function gtk_offscreen_window_new
+  (c-name "gtk_offscreen_window_new")
+  (is-constructor-of "GtkOffscreenWindow")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_pixmap
+  (of-object "GtkOffscreenWindow")
+  (c-name "gtk_offscreen_window_get_pixmap")
+  (return-type "GdkPixmap*")
+)
+
+(define-method get_pixbuf
+  (of-object "GtkOffscreenWindow")
+  (c-name "gtk_offscreen_window_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
diff --git a/src/defs/GtkOrientable.defs b/src/defs/GtkOrientable.defs
new file mode 100644
index 0000000..0322e01
--- /dev/null
+++ b/src/defs/GtkOrientable.defs
@@ -0,0 +1,19 @@
+(define-interface Orientable
+  (in-module "Gtk")
+  (c-name "GtkOrientable")
+)
+
+(define-method set_orientation
+  (of-object "GtkOrientable")
+  (c-name "gtk_orientable_set_orientation")
+  (return-type "none")
+  (parameters
+    '("GtkOrientation" "orientation")
+  )
+)
+
+(define-method get_orientation
+  (of-object "GtkOrientable")
+  (c-name "gtk_orientable_get_orientation")
+  (return-type "GtkOrientation")
+)
diff --git a/src/defs/GtkOrientation.defs b/src/defs/GtkOrientation.defs
new file mode 100644
index 0000000..014af7a
--- /dev/null
+++ b/src/defs/GtkOrientation.defs
@@ -0,0 +1,10 @@
+(define-enum Orientation
+  (in-module "Gtk")
+  (c-name "GtkOrientation")
+  (gtype-id "GTK_TYPE_ORIENTATION")
+  (values
+    '("horizontal" "GTK_ORIENTATION_HORIZONTAL")
+    '("vertical" "GTK_ORIENTATION_VERTICAL")
+  )
+)
+
diff --git a/src/defs/GtkPackDirection.defs b/src/defs/GtkPackDirection.defs
new file mode 100644
index 0000000..6d89029
--- /dev/null
+++ b/src/defs/GtkPackDirection.defs
@@ -0,0 +1,12 @@
+(define-enum PackDirection
+  (in-module "Gtk")
+  (c-name "GtkPackDirection")
+  (gtype-id "GTK_TYPE_PACK_DIRECTION")
+  (values
+    '("ltr" "GTK_PACK_DIRECTION_LTR")
+    '("rtl" "GTK_PACK_DIRECTION_RTL")
+    '("ttb" "GTK_PACK_DIRECTION_TTB")
+    '("btt" "GTK_PACK_DIRECTION_BTT")
+  )
+)
+
diff --git a/src/defs/GtkPackType.defs b/src/defs/GtkPackType.defs
new file mode 100644
index 0000000..b273a64
--- /dev/null
+++ b/src/defs/GtkPackType.defs
@@ -0,0 +1,10 @@
+(define-enum PackType
+  (in-module "Gtk")
+  (c-name "GtkPackType")
+  (gtype-id "GTK_TYPE_PACK_TYPE")
+  (values
+    '("start" "GTK_PACK_START")
+    '("end" "GTK_PACK_END")
+  )
+)
+
diff --git a/src/defs/GtkPageOrientation.defs b/src/defs/GtkPageOrientation.defs
new file mode 100644
index 0000000..45eb9ee
--- /dev/null
+++ b/src/defs/GtkPageOrientation.defs
@@ -0,0 +1,12 @@
+(define-enum PageOrientation
+  (in-module "Gtk")
+  (c-name "GtkPageOrientation")
+  (gtype-id "GTK_TYPE_PAGE_ORIENTATION")
+  (values
+    '("portrait" "GTK_PAGE_ORIENTATION_PORTRAIT")
+    '("landscape" "GTK_PAGE_ORIENTATION_LANDSCAPE")
+    '("reverse-portrait" "GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT")
+    '("reverse-landscape" "GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE")
+  )
+)
+
diff --git a/src/defs/GtkPageSet.defs b/src/defs/GtkPageSet.defs
new file mode 100644
index 0000000..6339329
--- /dev/null
+++ b/src/defs/GtkPageSet.defs
@@ -0,0 +1,11 @@
+(define-enum PageSet
+  (in-module "Gtk")
+  (c-name "GtkPageSet")
+  (gtype-id "GTK_TYPE_PAGE_SET")
+  (values
+    '("all" "GTK_PAGE_SET_ALL")
+    '("even" "GTK_PAGE_SET_EVEN")
+    '("odd" "GTK_PAGE_SET_ODD")
+  )
+)
+
diff --git a/src/defs/GtkPageSetup.defs b/src/defs/GtkPageSetup.defs
new file mode 100644
index 0000000..20d8ec6
--- /dev/null
+++ b/src/defs/GtkPageSetup.defs
@@ -0,0 +1,171 @@
+(define-object PageSetup
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkPageSetup")
+  (gtype-id "GTK_TYPE_PAGE_SETUP")
+)
+
+(define-function page_setup_new
+  (is-constructor-of "GtkPageSetup")
+  (c-name "gtk_page_setup_new")
+  (caller-owns-return #t)
+  (return-type "GtkPageSetup*")
+)
+
+(define-method copy
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_copy")
+  (return-type "GtkPageSetup*")
+)
+
+(define-method get_orientation
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_orientation")
+  (return-type "GtkPageOrientation")
+)
+
+(define-method set_orientation
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_orientation")
+  (return-type "none")
+  (parameters
+    '("GtkPageOrientation" "orientation")
+  )
+)
+
+(define-method get_paper_size
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_paper_size")
+  (return-type "GtkPaperSize*")
+)
+
+(define-method set_paper_size
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_paper_size")
+  (return-type "none")
+  (parameters
+    '("GtkPaperSize*" "size")
+  )
+)
+
+(define-method get_top_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_top_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_top_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_top_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_bottom_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_bottom_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_bottom_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_bottom_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_left_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_left_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_left_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_left_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_right_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_right_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_right_margin
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_right_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_paper_size_and_default_margins
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_set_paper_size_and_default_margins")
+  (return-type "none")
+  (parameters
+    '("GtkPaperSize*" "size")
+  )
+)
+
+(define-method get_paper_width
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_paper_width")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_paper_height
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_paper_height")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_page_width
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_page_width")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_page_height
+  (of-object "GtkPageSetup")
+  (c-name "gtk_page_setup_get_page_height")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
diff --git a/src/defs/GtkPageSetupUnixDialog.defs b/src/defs/GtkPageSetupUnixDialog.defs
new file mode 100644
index 0000000..af52426
--- /dev/null
+++ b/src/defs/GtkPageSetupUnixDialog.defs
@@ -0,0 +1,48 @@
+(define-object PageSetupUnixDialog
+  (in-module "Unixprint")
+  (parent "GtkDialog")
+  (c-name "GtkPageSetupUnixDialog")
+  (gtype-id "GTK_TYPE_PAGE_SETUP_UNIX_DIALOG")
+  (import-header "gtk/gtkunixprint.h")
+)
+
+(define-function gtk_page_setup_unix_dialog_new
+  (is-constructor-of "GtkPageSetupUnixDialog")
+  (c-name "gtk_page_setup_unix_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title" (default "NULL") (null-ok))
+    '("GtkWindow*" "parent" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_page_setup
+  (of-object "GtkPageSetupUnixDialog")
+  (c-name "gtk_page_setup_unix_dialog_set_page_setup")
+  (return-type "none")
+  (parameters
+    '("GtkPageSetup*" "page_setup")
+  )
+)
+
+(define-method get_page_setup
+  (of-object "GtkPageSetupUnixDialog")
+  (c-name "gtk_page_setup_unix_dialog_get_page_setup")
+  (return-type "GtkPageSetup*")
+)
+
+(define-method set_print_settings
+  (of-object "GtkPageSetupUnixDialog")
+  (c-name "gtk_page_setup_unix_dialog_set_print_settings")
+  (return-type "none")
+  (parameters
+    '("GtkPrintSettings*" "print_settings")
+  )
+)
+
+(define-method get_print_settings
+  (of-object "GtkPageSetupUnixDialog")
+  (c-name "gtk_page_setup_unix_dialog_get_print_settings")
+  (return-type "GtkPrintSettings*")
+)
+
diff --git a/src/defs/GtkPaned.defs b/src/defs/GtkPaned.defs
new file mode 100644
index 0000000..d7224e1
--- /dev/null
+++ b/src/defs/GtkPaned.defs
@@ -0,0 +1,139 @@
+(define-object Paned
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkPaned")
+)
+
+(define-function gtk_paned_new
+  (is-constructor-of "GtkPaned")
+  (c-name "gtk_paned_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkOrientation" "orientation")
+  )
+)
+
+(define-method add1
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_add1")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method add2
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_add2")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-method pack1
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_pack1")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "resize" (default "FALSE"))
+    '("gboolean" "shrink" (default "TRUE"))
+  )
+)
+
+(define-method pack2
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_pack2")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gboolean" "resize" (default "TRUE"))
+    '("gboolean" "shrink" (default "TRUE"))
+  )
+)
+
+(define-method get_position
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_get_position")
+  (return-type "gint")
+)
+
+(define-method set_position
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_set_position")
+  (return-type "none")
+  (parameters
+    '("gint" "position")
+  )
+)
+
+(define-method get_child1
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_get_child1")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_child2
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_get_child2")
+  (return-type "GtkWidget*")
+)
+
+;;(define-method compute_position
+;;  (of-object "GtkPaned")
+;;  (c-name "gtk_paned_compute_position")
+;;  (return-type "none")
+;;  (parameters
+;;    '("gint" "allocation")
+;;    '("gint" "child1_req")
+;;    '("gint" "child2_req")
+;;  )
+;;)
+
+(define-method get_handle_window
+  (of-object "GtkPaned")
+  (c-name "gtk_paned_get_handle_window")
+  (return-type "GdkWindow*")
+)
+
+(define-virtual cycle_child_focus
+  (of-object "GtkPaned")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "reverse")
+  )
+)
+
+(define-virtual toggle_handle_focus
+  (of-object "GtkPaned")
+  (return-type "gboolean")
+)
+
+(define-virtual move_handle
+  (of-object "GtkPaned")
+  (return-type "gboolean")
+  (parameters
+    '("GtkScrollType" "scroll")
+  )
+)
+
+(define-virtual cycle_handle_focus
+  (of-object "GtkPaned")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "reverse")
+  )
+)
+
+(define-virtual accept_position
+  (of-object "GtkPaned")
+  (return-type "gboolean")
+)
+
+(define-virtual cancel_position
+  (of-object "GtkPaned")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkPaperSize.defs b/src/defs/GtkPaperSize.defs
new file mode 100644
index 0000000..09359e2
--- /dev/null
+++ b/src/defs/GtkPaperSize.defs
@@ -0,0 +1,140 @@
+(define-boxed PaperSize
+  (in-module "Gtk")
+  (c-name "GtkPaperSize")
+  (gtype-id "GTK_TYPE_PAPER_SIZE")
+)
+
+(define-function paper_size_new
+  (is-constructor-of "GtkPaperSize")
+  (c-name "gtk_paper_size_new")
+  (caller-owns-return #t)
+  (return-type "GtkPaperSize*")
+  (parameters
+    '("const-gchar*" "name" (default "NULL") (null-ok))
+  )
+)
+
+(define-function paper_size_new_custom
+  (is-constructor-of "GtkPaperSize")
+  (c-name "gtk_paper_size_new_custom")
+  (caller-owns-return #t)
+  (return-type "GtkPaperSize*")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "display_name")
+    '("gdouble" "width")
+    '("gdouble" "height")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method copy
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_copy")
+  (return-type "GtkPaperSize*")
+)
+
+(define-method free
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_free")
+  (return-type "none")
+)
+
+(define-method is_equal
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_is_equal")
+  (return-type "gboolean")
+  (parameters
+    '("GtkPaperSize*" "size2")
+  )
+)
+
+(define-method get_name
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_display_name
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_display_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_ppd_name
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_ppd_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_width
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_width")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_height
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_height")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method is_custom
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_is_custom")
+  (return-type "gboolean")
+)
+
+(define-method set_size
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_set_size")
+  (return-type "none")
+  (parameters
+    '("gdouble" "width")
+    '("gdouble" "height")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_default_top_margin
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_default_top_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_default_bottom_margin
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_default_bottom_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_default_left_margin
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_default_left_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_default_right_margin
+  (of-object "GtkPaperSize")
+  (c-name "gtk_paper_size_get_default_right_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
diff --git a/src/defs/GtkPathPriorityType.defs b/src/defs/GtkPathPriorityType.defs
new file mode 100644
index 0000000..fe77e04
--- /dev/null
+++ b/src/defs/GtkPathPriorityType.defs
@@ -0,0 +1,14 @@
+(define-enum PathPriorityType
+  (in-module "Gtk")
+  (c-name "GtkPathPriorityType")
+  (gtype-id "GTK_TYPE_PATH_PRIORITY_TYPE")
+  (values
+    '("lowest" "GTK_PATH_PRIO_LOWEST")
+    '("gtk" "GTK_PATH_PRIO_GTK")
+    '("application" "GTK_PATH_PRIO_APPLICATION")
+    '("theme" "GTK_PATH_PRIO_THEME")
+    '("rc" "GTK_PATH_PRIO_RC")
+    '("highest" "GTK_PATH_PRIO_HIGHEST")
+  )
+)
+
diff --git a/src/defs/GtkPathType.defs b/src/defs/GtkPathType.defs
new file mode 100644
index 0000000..b66801c
--- /dev/null
+++ b/src/defs/GtkPathType.defs
@@ -0,0 +1,11 @@
+(define-enum PathType
+  (in-module "Gtk")
+  (c-name "GtkPathType")
+  (gtype-id "GTK_TYPE_PATH_TYPE")
+  (values
+    '("widget" "GTK_PATH_WIDGET")
+    '("widget-class" "GTK_PATH_WIDGET_CLASS")
+    '("class" "GTK_PATH_CLASS")
+  )
+)
+
diff --git a/src/defs/GtkPlug.defs b/src/defs/GtkPlug.defs
new file mode 100644
index 0000000..e30c917
--- /dev/null
+++ b/src/defs/GtkPlug.defs
@@ -0,0 +1,47 @@
+(define-object Plug
+  (in-module "Gtk")
+  (parent "GtkWindow")
+  (c-name "GtkPlug")
+  (gtype-id "GTK_TYPE_PLUG")
+  (import-header "gtk/gtkx.h")
+)
+
+(define-method construct
+  (of-object "GtkPlug")
+  (c-name "gtk_plug_construct")
+  (return-type "none")
+  (parameters
+    '("Window" "socket_id")
+  )
+)
+
+(define-function gtk_plug_new
+  (is-constructor-of "GtkPlug")
+  (c-name "gtk_plug_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("Window*" "socket_id")
+  )
+)
+
+(define-method construct_for_display
+  (of-object "GtkPlug")
+  (c-name "gtk_plug_construct_for_display")
+  (return-type "none")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("Window" "socket_id")
+  )
+)
+
+(define-method get_id
+  (of-object "GtkPlug")
+  (c-name "gtk_plug_get_id")
+  (return-type "Window")
+)
+
+(define-virtual embedded
+  (of-object "GtkPlug")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkPolicyType.defs b/src/defs/GtkPolicyType.defs
new file mode 100644
index 0000000..872f11e
--- /dev/null
+++ b/src/defs/GtkPolicyType.defs
@@ -0,0 +1,11 @@
+(define-enum PolicyType
+  (in-module "Gtk")
+  (c-name "GtkPolicyType")
+  (gtype-id "GTK_TYPE_POLICY_TYPE")
+  (values
+    '("always" "GTK_POLICY_ALWAYS")
+    '("automatic" "GTK_POLICY_AUTOMATIC")
+    '("never" "GTK_POLICY_NEVER")
+  )
+)
+
diff --git a/src/defs/GtkPositionType.defs b/src/defs/GtkPositionType.defs
new file mode 100644
index 0000000..dfb7f83
--- /dev/null
+++ b/src/defs/GtkPositionType.defs
@@ -0,0 +1,12 @@
+(define-enum PositionType
+  (in-module "Gtk")
+  (c-name "GtkPositionType")
+  (gtype-id "GTK_TYPE_POSITION_TYPE")
+  (values
+    '("left" "GTK_POS_LEFT")
+    '("right" "GTK_POS_RIGHT")
+    '("top" "GTK_POS_TOP")
+    '("bottom" "GTK_POS_BOTTOM")
+  )
+)
+
diff --git a/src/defs/GtkPrintCapabilities.defs b/src/defs/GtkPrintCapabilities.defs
new file mode 100644
index 0000000..df62798
--- /dev/null
+++ b/src/defs/GtkPrintCapabilities.defs
@@ -0,0 +1,17 @@
+(define-flags PrintCapabilities
+  (in-module "Unixprint")
+  (c-name "GtkPrintCapabilities")
+  (gtype-id "GTK_TYPE_PRINT_CAPABILITIES")
+  (import-header "gtk/gtkunixprint.h")
+  (values
+    '("page-set" "GTK_PRINT_CAPABILITY_PAGE_SET")
+    '("copies" "GTK_PRINT_CAPABILITY_COPIES")
+    '("collate" "GTK_PRINT_CAPABILITY_COLLATE")
+    '("reverse" "GTK_PRINT_CAPABILITY_REVERSE")
+    '("scale" "GTK_PRINT_CAPABILITY_SCALE")
+    '("generate-pdf" "GTK_PRINT_CAPABILITY_GENERATE_PDF")
+    '("generate-ps" "GTK_PRINT_CAPABILITY_GENERATE_PS")
+    '("preview" "GTK_PRINT_CAPABILITY_PREVIEW")
+  )
+)
+
diff --git a/src/defs/GtkPrintContext.defs b/src/defs/GtkPrintContext.defs
new file mode 100644
index 0000000..cb7304b
--- /dev/null
+++ b/src/defs/GtkPrintContext.defs
@@ -0,0 +1,84 @@
+(define-object PrintContext
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkPrintContext")
+  (gtype-id "GTK_TYPE_PRINT_CONTEXT")
+)
+
+(define-method get_cairo_context
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_cairo_context")
+  (return-type "cairo_t*")
+)
+
+(define-method get_page_setup
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_page_setup")
+  (return-type "GtkPageSetup*")
+)
+
+(define-method get_width
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_width")
+  (return-type "gdouble")
+)
+
+(define-method get_height
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_height")
+  (return-type "gdouble")
+)
+
+(define-method get_dpi_x
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_dpi_x")
+  (return-type "gdouble")
+)
+
+(define-method get_dpi_y
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_dpi_y")
+  (return-type "gdouble")
+)
+
+(define-method get_pango_fontmap
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_pango_fontmap")
+  (return-type "PangoFontMap*")
+)
+
+(define-method create_pango_context
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_create_pango_context")
+  (return-type "PangoContext*")
+)
+
+(define-method create_pango_layout
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_create_pango_layout")
+  (return-type "PangoLayout*")
+)
+
+(define-method set_cairo_context
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_set_cairo_context")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("double" "dpi_x")
+    '("double" "dpi_y")
+  )
+)
+
+(define-method get_hard_margins
+  (of-object "GtkPrintContext")
+  (c-name "gtk_print_context_get_hard_margins")
+  (return-type "gboolean")
+  (parameters
+    '("gdouble*" "top")
+    '("gdouble*" "bottom")
+    '("gdouble*" "left")
+    '("gdouble*" "right")
+  )
+)
+
diff --git a/src/defs/GtkPrintDuplex.defs b/src/defs/GtkPrintDuplex.defs
new file mode 100644
index 0000000..b7496ea
--- /dev/null
+++ b/src/defs/GtkPrintDuplex.defs
@@ -0,0 +1,11 @@
+(define-enum PrintDuplex
+  (in-module "Gtk")
+  (c-name "GtkPrintDuplex")
+  (gtype-id "GTK_TYPE_PRINT_DUPLEX")
+  (values
+    '("simplex" "GTK_PRINT_DUPLEX_SIMPLEX")
+    '("horizontal" "GTK_PRINT_DUPLEX_HORIZONTAL")
+    '("vertical" "GTK_PRINT_DUPLEX_VERTICAL")
+  )
+)
+
diff --git a/src/defs/GtkPrintError.defs b/src/defs/GtkPrintError.defs
new file mode 100644
index 0000000..5a575a2
--- /dev/null
+++ b/src/defs/GtkPrintError.defs
@@ -0,0 +1,11 @@
+(define-enum PrintError
+  (in-module "Gtk")
+  (c-name "GtkPrintError")
+  (gtype-id "GTK_TYPE_PRINT_ERROR")
+  (values
+    '("general" "GTK_PRINT_ERROR_GENERAL")
+    '("internal-error" "GTK_PRINT_ERROR_INTERNAL_ERROR")
+    '("nomem" "GTK_PRINT_ERROR_NOMEM")
+  )
+)
+
diff --git a/src/defs/GtkPrintJob.defs b/src/defs/GtkPrintJob.defs
new file mode 100644
index 0000000..9c46e08
--- /dev/null
+++ b/src/defs/GtkPrintJob.defs
@@ -0,0 +1,96 @@
+(define-object PrintJob
+  (in-module "Unixprint")
+  (parent "GObject")
+  (c-name "GtkPrintJob")
+  (gtype-id "GTK_TYPE_PRINT_JOB")
+  (import-header "gtk/gtkunixprint.h")
+)
+
+(define-function gtk_print_job_new
+  (is-constructor-of "GtkPrintJob")
+  (c-name "gtk_print_job_new")
+  (caller-owns-return #t)
+  (return-type "GtkPrintJob*")
+  (parameters
+    '("const-gchar*" "title")
+    '("GtkPrinter*" "printer")
+    '("GtkPrintSettings*" "settings")
+    '("GtkPageSetup*" "page_setup")
+  )
+)
+
+(define-method get_settings
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_get_settings")
+  (return-type "GtkPrintSettings*")
+)
+
+(define-method get_printer
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_get_printer")
+  (return-type "GtkPrinter*")
+)
+
+(define-method get_title
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method get_status
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_get_status")
+  (return-type "GtkPrintStatus")
+)
+
+(define-method set_source_file
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_set_source_file")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_surface
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_get_surface")
+  (return-type "cairo_surface_t*")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-method set_track_print_status
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_set_track_print_status")
+  (return-type "none")
+  (parameters
+    '("gboolean" "track_status")
+  )
+)
+
+(define-method get_track_print_status
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_get_track_print_status")
+  (return-type "gboolean")
+)
+
+(define-method send
+  (of-object "GtkPrintJob")
+  (c-name "gtk_print_job_send")
+  (return-type "gboolean")
+  (parameters
+    '("GtkPrintJobCompleteFunc" "callback")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "dnotify")
+    '("GError**" "error")
+  )
+)
+
+(define-virtual status_changed
+  (of-object "GtkPrintJob")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkPrintOperation.defs b/src/defs/GtkPrintOperation.defs
new file mode 100644
index 0000000..3dd4742
--- /dev/null
+++ b/src/defs/GtkPrintOperation.defs
@@ -0,0 +1,309 @@
+(define-object PrintOperation
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkPrintOperationPreview")
+  (c-name "GtkPrintOperation")
+  (gtype-id "GTK_TYPE_PRINT_OPERATION")
+)
+
+(define-function print_operation_new
+  (is-constructor-of "GtkPrintOperation")
+  (c-name "gtk_print_operation_new")
+  (caller-owns-return #t)
+  (return-type "GtkPrintOperation*")
+)
+
+(define-method set_default_page_setup
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_default_page_setup")
+  (return-type "none")
+  (parameters
+    '("GtkPageSetup*" "default_page_setup" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_default_page_setup
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_default_page_setup")
+  (return-type "GtkPageSetup*")
+)
+
+(define-method set_print_settings
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_print_settings")
+  (return-type "none")
+  (parameters
+    '("GtkPrintSettings*" "print_settings" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_print_settings
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_print_settings")
+  (return-type "GtkPrintSettings*")
+)
+
+(define-method set_job_name
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_job_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "job_name")
+  )
+)
+
+(define-method set_n_pages
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_n_pages")
+  (return-type "none")
+  (parameters
+    '("gint" "n_pages")
+  )
+)
+
+(define-method set_current_page
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_current_page")
+  (return-type "none")
+  (parameters
+    '("gint" "current_page")
+  )
+)
+
+(define-method set_use_full_page
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_use_full_page")
+  (return-type "none")
+  (parameters
+    '("gboolean" "full_page")
+  )
+)
+
+(define-method set_unit
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_unit")
+  (return-type "none")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_export_filename
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_export_filename")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-method set_track_print_status
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_track_print_status")
+  (return-type "none")
+  (parameters
+    '("gboolean" "track_status")
+  )
+)
+
+(define-method set_show_progress
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_show_progress")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_progress")
+  )
+)
+
+(define-method set_allow_async
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_allow_async")
+  (return-type "none")
+  (parameters
+    '("gboolean" "allow_async")
+  )
+)
+
+(define-method set_custom_tab_label
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_custom_tab_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method run
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_run")
+  (return-type "GtkPrintOperationResult")
+  (parameters
+    '("GtkPrintOperationAction" "action")
+    '("GtkWindow*" "parent" (default "NULL") (null-ok))
+    '("GError**" "error")
+  )
+)
+
+(define-method get_error
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_error")
+  (return-type "none")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-method get_status
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_status")
+  (return-type "GtkPrintStatus")
+)
+
+(define-method get_status_string
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_status_string")
+  (return-type "const-gchar*")
+)
+
+(define-method is_finished
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_is_finished")
+  (return-type "gboolean")
+)
+
+(define-method cancel
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_cancel")
+  (return-type "none")
+)
+
+(define-virtual done
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+  (parameters
+    '("GtkPrintOperationResult" "result")
+  )
+)
+
+(define-method set_support_selection
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_support_selection")
+  (return-type "none")
+  (parameters
+    '("gboolean" "support_selection")
+  )
+)
+
+(define-method get_support_selection
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_support_selection")
+  (return-type "gboolean")
+)
+
+(define-method set_has_selection
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_has_selection")
+  (return-type "none")
+  (parameters
+    '("gboolean" "has_selection")
+  )
+)
+
+(define-method get_has_selection
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_has_selection")
+  (return-type "gboolean")
+)
+
+(define-method set_embed_page_setup
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_set_embed_page_setup")
+  (return-type "none")
+  (parameters
+    '("gboolean" "embed")
+  )
+)
+
+(define-method get_embed_page_setup
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_embed_page_setup")
+  (return-type "gboolean")
+)
+
+(define-method get_n_pages_to_print
+  (of-object "GtkPrintOperation")
+  (c-name "gtk_print_operation_get_n_pages_to_print")
+  (return-type "gint")
+)
+
+(define-virtual begin_print
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+  )
+)
+
+(define-virtual paginate
+  (of-object "GtkPrintOperation")
+  (return-type "gboolean")
+  (parameters
+    '("GtkPrintContext*" "context")
+  )
+)
+
+(define-virtual request_page_setup
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+    '("gint" "page_nr")
+    '("GtkPageSetup*" "setup")
+  )
+)
+
+(define-virtual draw_page
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+    '("gint" "page_nr")
+  )
+)
+
+(define-virtual end_print
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+  )
+)
+
+(define-virtual status_changed
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+)
+
+(define-virtual create_custom_widget
+  (of-object "GtkPrintOperation")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual custom_widget_apply
+  (of-object "GtkPrintOperation")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-virtual preview
+  (of-object "GtkPrintOperation")
+  (return-type "gboolean")
+  (parameters
+    '("GtkPrintOperationPreview*" "preview")
+    '("GtkPrintContext*" "context")
+    '("GtkWindow*" "parent")
+  )
+)
+
diff --git a/src/defs/GtkPrintOperationAction.defs b/src/defs/GtkPrintOperationAction.defs
new file mode 100644
index 0000000..cb96012
--- /dev/null
+++ b/src/defs/GtkPrintOperationAction.defs
@@ -0,0 +1,12 @@
+(define-enum PrintOperationAction
+  (in-module "Gtk")
+  (c-name "GtkPrintOperationAction")
+  (gtype-id "GTK_TYPE_PRINT_OPERATION_ACTION")
+  (values
+    '("print-dialog" "GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG")
+    '("print" "GTK_PRINT_OPERATION_ACTION_PRINT")
+    '("preview" "GTK_PRINT_OPERATION_ACTION_PREVIEW")
+    '("export" "GTK_PRINT_OPERATION_ACTION_EXPORT")
+  )
+)
+
diff --git a/src/defs/GtkPrintOperationPreview.defs b/src/defs/GtkPrintOperationPreview.defs
new file mode 100644
index 0000000..79ddf0a
--- /dev/null
+++ b/src/defs/GtkPrintOperationPreview.defs
@@ -0,0 +1,68 @@
+(define-interface PrintOperationPreview
+  (in-module "Gtk")
+  (c-name "GtkPrintOperationPreview")
+  (gtype-id "GTK_TYPE_PRINT_OPERATION_PREVIEW")
+)
+
+(define-method render_page
+  (of-object "GtkPrintOperationPreview")
+  (c-name "gtk_print_operation_preview_render_page")
+  (return-type "none")
+  (parameters
+    '("gint" "page_nr")
+  )
+)
+
+(define-method end_preview
+  (of-object "GtkPrintOperationPreview")
+  (c-name "gtk_print_operation_preview_end_preview")
+  (return-type "none")
+)
+
+(define-method is_selected
+  (of-object "GtkPrintOperationPreview")
+  (c-name "gtk_print_operation_preview_is_selected")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "page_nr")
+  )
+)
+
+(define-virtual ready
+  (of-object "GtkPrintOperationPreview")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+  )
+)
+
+(define-virtual got_page_size
+  (of-object "GtkPrintOperationPreview")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+    '("GtkPageSetup*" "page_setup")
+  )
+)
+
+(define-virtual render_page
+  (of-object "GtkPrintOperationPreview")
+  (return-type "none")
+  (parameters
+    '("gint" "page_nr")
+  )
+)
+
+(define-virtual is_selected
+  (of-object "GtkPrintOperationPreview")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "page_nr")
+  )
+)
+
+(define-virtual end_preview
+  (of-object "GtkPrintOperationPreview")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkPrintOperationResult.defs b/src/defs/GtkPrintOperationResult.defs
new file mode 100644
index 0000000..edc08fb
--- /dev/null
+++ b/src/defs/GtkPrintOperationResult.defs
@@ -0,0 +1,12 @@
+(define-enum PrintOperationResult
+  (in-module "Gtk")
+  (c-name "GtkPrintOperationResult")
+  (gtype-id "GTK_TYPE_PRINT_OPERATION_RESULT")
+  (values
+    '("error" "GTK_PRINT_OPERATION_RESULT_ERROR")
+    '("apply" "GTK_PRINT_OPERATION_RESULT_APPLY")
+    '("cancel" "GTK_PRINT_OPERATION_RESULT_CANCEL")
+    '("in-progress" "GTK_PRINT_OPERATION_RESULT_IN_PROGRESS")
+  )
+)
+
diff --git a/src/defs/GtkPrintPages.defs b/src/defs/GtkPrintPages.defs
new file mode 100644
index 0000000..d1b6bf0
--- /dev/null
+++ b/src/defs/GtkPrintPages.defs
@@ -0,0 +1,11 @@
+(define-enum PrintPages
+  (in-module "Gtk")
+  (c-name "GtkPrintPages")
+  (gtype-id "GTK_TYPE_PRINT_PAGES")
+  (values
+    '("all" "GTK_PRINT_PAGES_ALL")
+    '("current" "GTK_PRINT_PAGES_CURRENT")
+    '("ranges" "GTK_PRINT_PAGES_RANGES")
+  )
+)
+
diff --git a/src/defs/GtkPrintQuality.defs b/src/defs/GtkPrintQuality.defs
new file mode 100644
index 0000000..69064f4
--- /dev/null
+++ b/src/defs/GtkPrintQuality.defs
@@ -0,0 +1,12 @@
+(define-enum PrintQuality
+  (in-module "Gtk")
+  (c-name "GtkPrintQuality")
+  (gtype-id "GTK_TYPE_PRINT_QUALITY")
+  (values
+    '("low" "GTK_PRINT_QUALITY_LOW")
+    '("normal" "GTK_PRINT_QUALITY_NORMAL")
+    '("high" "GTK_PRINT_QUALITY_HIGH")
+    '("draft" "GTK_PRINT_QUALITY_DRAFT")
+  )
+)
+
diff --git a/src/defs/GtkPrintSettings.defs b/src/defs/GtkPrintSettings.defs
new file mode 100644
index 0000000..5306449
--- /dev/null
+++ b/src/defs/GtkPrintSettings.defs
@@ -0,0 +1,507 @@
+(define-object PrintSettings
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkPrintSettings")
+  (gtype-id "GTK_TYPE_PRINT_SETTINGS")
+)
+
+(define-function print_settings_new
+  (is-constructor-of "GtkPrintSettings")
+  (c-name "gtk_print_settings_new")
+  (caller-owns-return #t)
+  (return-type "GtkPrintSettings*")
+)
+
+(define-method copy
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_copy")
+  (return-type "GtkPrintSettings*")
+)
+
+(define-method has_key
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_has_key")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "key")
+  )
+)
+
+(define-method get
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get")
+  (return-type "const-gchar*")
+  (parameters
+    '("const-gchar*" "key")
+  )
+)
+
+(define-method set
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("const-gchar*" "value" (null-ok))
+  )
+)
+
+(define-method unset
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_unset")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+  )
+)
+
+(define-method foreach
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_foreach")
+  (return-type "none")
+  (parameters
+    '("GtkPrintSettingsFunc" "func")
+    '("gpointer" "user_data" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_bool
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_bool")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "key")
+  )
+)
+
+(define-method set_bool
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_bool")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("gboolean" "value")
+  )
+)
+
+(define-method get_double
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_double")
+  (return-type "gdouble")
+  (parameters
+    '("const-gchar*" "key")
+  )
+)
+
+(define-method get_double_with_default
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_double_with_default")
+  (return-type "gdouble")
+  (parameters
+    '("const-gchar*" "key")
+    '("gdouble" "def")
+  )
+)
+
+(define-method set_double
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_double")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_length
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_length")
+  (return-type "gdouble")
+  (parameters
+    '("const-gchar*" "key")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_length
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_length")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("gdouble" "value")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_int
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_int")
+  (return-type "gint")
+  (parameters
+    '("const-gchar*" "key")
+  )
+)
+
+(define-method get_int_with_default
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_int_with_default")
+  (return-type "gint")
+  (parameters
+    '("const-gchar*" "key")
+    '("gint" "def")
+  )
+)
+
+(define-method set_int
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_int")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("gint" "value")
+  )
+)
+
+(define-method get_printer
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_printer")
+  (return-type "const-gchar*")
+)
+
+(define-method set_printer
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_printer")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "printer")
+  )
+)
+
+(define-method get_orientation
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_orientation")
+  (return-type "GtkPageOrientation")
+)
+
+(define-method set_orientation
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_orientation")
+  (return-type "none")
+  (parameters
+    '("GtkPageOrientation" "orientation")
+  )
+)
+
+(define-method get_paper_size
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_paper_size")
+  (return-type "GtkPaperSize*")
+)
+
+(define-method set_paper_size
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_paper_size")
+  (return-type "none")
+  (parameters
+    '("GtkPaperSize*" "paper_size")
+  )
+)
+
+(define-method get_paper_width
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_paper_width")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_paper_width
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_paper_width")
+  (return-type "none")
+  (parameters
+    '("gdouble" "width")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_paper_height
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_paper_height")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_paper_height
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_paper_height")
+  (return-type "none")
+  (parameters
+    '("gdouble" "height")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_use_color
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_use_color")
+  (return-type "gboolean")
+)
+
+(define-method set_use_color
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_use_color")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_color")
+  )
+)
+
+(define-method get_collate
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_collate")
+  (return-type "gboolean")
+)
+
+(define-method set_collate
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_collate")
+  (return-type "none")
+  (parameters
+    '("gboolean" "collate")
+  )
+)
+
+(define-method get_reverse
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_reverse")
+  (return-type "gboolean")
+)
+
+(define-method set_reverse
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_reverse")
+  (return-type "none")
+  (parameters
+    '("gboolean" "reverse")
+  )
+)
+
+(define-method get_duplex
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_duplex")
+  (return-type "GtkPrintDuplex")
+)
+
+(define-method set_duplex
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_duplex")
+  (return-type "none")
+  (parameters
+    '("GtkPrintDuplex" "duplex")
+  )
+)
+
+(define-method get_quality
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_quality")
+  (return-type "GtkPrintQuality")
+)
+
+(define-method set_quality
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_quality")
+  (return-type "none")
+  (parameters
+    '("GtkPrintQuality" "quality")
+  )
+)
+
+(define-method get_n_copies
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_n_copies")
+  (return-type "gint")
+)
+
+(define-method set_n_copies
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_n_copies")
+  (return-type "none")
+  (parameters
+    '("gint" "num_copies")
+  )
+)
+
+(define-method get_number_up
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_number_up")
+  (return-type "gint")
+)
+
+(define-method set_number_up
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_number_up")
+  (return-type "none")
+  (parameters
+    '("gint" "number_up")
+  )
+)
+
+(define-method get_resolution
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_resolution")
+  (return-type "gint")
+)
+
+(define-method set_resolution
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_resolution")
+  (return-type "none")
+  (parameters
+    '("gint" "resolution")
+  )
+)
+
+(define-method get_scale
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_scale")
+  (return-type "gdouble")
+)
+
+(define-method set_scale
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_scale")
+  (return-type "none")
+  (parameters
+    '("gdouble" "scale")
+  )
+)
+
+(define-method get_print_pages
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_print_pages")
+  (return-type "GtkPrintPages")
+)
+
+(define-method set_print_pages
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_print_pages")
+  (return-type "none")
+  (parameters
+    '("GtkPrintPages" "pages")
+  )
+)
+
+(define-method get_page_ranges
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_page_ranges")
+  (return-type "GtkPageRange*")
+  (parameters
+    '("gint*" "num_ranges")
+  )
+)
+
+(define-method set_page_ranges
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_page_ranges")
+  (return-type "none")
+  (parameters
+    '("GtkPageRange*" "page_ranges")
+    '("gint" "num_ranges")
+  )
+)
+
+(define-method get_page_set
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_page_set")
+  (return-type "GtkPageSet")
+)
+
+(define-method set_page_set
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_page_set")
+  (return-type "none")
+  (parameters
+    '("GtkPageSet" "page_set")
+  )
+)
+
+(define-method get_default_source
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_default_source")
+  (return-type "const-gchar*")
+)
+
+(define-method set_default_source
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_default_source")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "default_source")
+  )
+)
+
+(define-method get_media_type
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_media_type")
+  (return-type "const-gchar*")
+)
+
+(define-method set_media_type
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_media_type")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "media_type")
+  )
+)
+
+(define-method get_dither
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_dither")
+  (return-type "const-gchar*")
+)
+
+(define-method set_dither
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_dither")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "dither")
+  )
+)
+
+(define-method get_finishings
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_finishings")
+  (return-type "const-gchar*")
+)
+
+(define-method set_finishings
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_finishings")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "finishings")
+  )
+)
+
+(define-method get_output_bin
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_get_output_bin")
+  (return-type "const-gchar*")
+)
+
+(define-method set_output_bin
+  (of-object "GtkPrintSettings")
+  (c-name "gtk_print_settings_set_output_bin")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "output_bin")
+  )
+)
+
diff --git a/src/defs/GtkPrintStatus.defs b/src/defs/GtkPrintStatus.defs
new file mode 100644
index 0000000..9e471c4
--- /dev/null
+++ b/src/defs/GtkPrintStatus.defs
@@ -0,0 +1,17 @@
+(define-enum PrintStatus
+  (in-module "Gtk")
+  (c-name "GtkPrintStatus")
+  (gtype-id "GTK_TYPE_PRINT_STATUS")
+  (values
+    '("initial" "GTK_PRINT_STATUS_INITIAL")
+    '("preparing" "GTK_PRINT_STATUS_PREPARING")
+    '("generating-data" "GTK_PRINT_STATUS_GENERATING_DATA")
+    '("sending-data" "GTK_PRINT_STATUS_SENDING_DATA")
+    '("pending" "GTK_PRINT_STATUS_PENDING")
+    '("pending-issue" "GTK_PRINT_STATUS_PENDING_ISSUE")
+    '("printing" "GTK_PRINT_STATUS_PRINTING")
+    '("finished" "GTK_PRINT_STATUS_FINISHED")
+    '("finished-aborted" "GTK_PRINT_STATUS_FINISHED_ABORTED")
+  )
+)
+
diff --git a/src/defs/GtkPrintUnixDialog.defs b/src/defs/GtkPrintUnixDialog.defs
new file mode 100644
index 0000000..35fbab9
--- /dev/null
+++ b/src/defs/GtkPrintUnixDialog.defs
@@ -0,0 +1,88 @@
+(define-object PrintUnixDialog
+  (in-module "Unixprint")
+  (parent "GtkDialog")
+  (c-name "GtkPrintUnixDialog")
+  (gtype-id "GTK_TYPE_PRINT_UNIX_DIALOG")
+  (import-header "gtk/gtkunixprint.h")
+)
+
+(define-function gtk_print_unix_dialog_new
+  (is-constructor-of "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title" (default "NULL") (null-ok))
+    '("GtkWindow*" "parent" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_page_setup
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_set_page_setup")
+  (return-type "none")
+  (parameters
+    '("GtkPageSetup*" "page_setup")
+  )
+)
+
+(define-method get_page_setup
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_get_page_setup")
+  (return-type "GtkPageSetup*")
+)
+
+(define-method set_current_page
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_set_current_page")
+  (return-type "none")
+  (parameters
+    '("gint" "current_page")
+  )
+)
+
+(define-method get_current_page
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_get_current_page")
+  (return-type "gint")
+)
+
+(define-method set_settings
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_set_settings")
+  (return-type "none")
+  (parameters
+    '("GtkPrintSettings*" "settings" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_settings
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_get_settings")
+  (return-type "GtkPrintSettings*")
+)
+
+(define-method get_selected_printer
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_get_selected_printer")
+  (return-type "GtkPrinter*")
+)
+
+(define-method add_custom_tab
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_add_custom_tab")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkWidget*" "tab_label")
+  )
+)
+
+(define-method set_manual_capabilities
+  (of-object "GtkPrintUnixDialog")
+  (c-name "gtk_print_unix_dialog_set_manual_capabilities")
+  (return-type "none")
+  (parameters
+    '("GtkPrintCapabilities" "capabilities")
+  )
+)
+
diff --git a/src/defs/GtkPrinter.defs b/src/defs/GtkPrinter.defs
new file mode 100644
index 0000000..ff99c1e
--- /dev/null
+++ b/src/defs/GtkPrinter.defs
@@ -0,0 +1,133 @@
+(define-object Printer
+  (in-module "Unixprint")
+  (parent "GObject")
+  (c-name "GtkPrinter")
+  (gtype-id "GTK_TYPE_PRINTER")
+  (import-header "gtk/gtkunixprint.h")
+)
+
+(define-function gtk_printer_new
+  (is-constructor-of "GtkPrinter")
+  (c-name "gtk_printer_new")
+  (caller-owns-return #t)
+  (return-type "GtkPrinter*")
+  (parameters
+    '("const-gchar*" "name")
+    '("GtkPrintBackend*" "backend")
+    '("gboolean" "is_virtual")
+  )
+)
+
+(define-method get_backend
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_backend")
+  (return-type "GtkPrintBackend*")
+)
+
+(define-method get_name
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_state_message
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_state_message")
+  (return-type "const-gchar*")
+)
+
+(define-method get_description
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_description")
+  (return-type "const-gchar*")
+)
+
+(define-method get_location
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_location")
+  (return-type "const-gchar*")
+)
+
+(define-method get_icon_name
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_icon_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_job_count
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_job_count")
+  (return-type "gint")
+)
+
+(define-method is_active
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_is_active")
+  (return-type "gboolean")
+)
+
+(define-method is_virtual
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_is_virtual")
+  (return-type "gboolean")
+)
+
+(define-method is_default
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_is_default")
+  (return-type "gboolean")
+)
+
+(define-method accepts_pdf
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_accepts_pdf")
+  (return-type "gboolean")
+)
+
+(define-method accepts_ps
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_accepts_ps")
+  (return-type "gboolean")
+)
+
+(define-method compare
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_compare")
+  (return-type "gint")
+  (parameters
+    '("GtkPrinter*" "b")
+  )
+)
+
+(define-method get_capabilities
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_get_capabilities")
+  (return-type "GtkPrintCapabilities")
+)
+
+(define-method has_details
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_has_details")
+  (return-type "gboolean")
+)
+
+(define-method list_papers
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_list_papers")
+  (return-type "GList*")
+)
+
+(define-method request_details
+  (of-object "GtkPrinter")
+  (c-name "gtk_printer_request_details")
+  (return-type "none")
+)
+
+(define-virtual details_acquired
+  (of-object "GtkPrinter")
+  (return-type "none")
+  (parameters
+    '("gboolean" "success")
+  )
+)
+
diff --git a/src/defs/GtkProgressBar.defs b/src/defs/GtkProgressBar.defs
new file mode 100644
index 0000000..99980d6
--- /dev/null
+++ b/src/defs/GtkProgressBar.defs
@@ -0,0 +1,95 @@
+(define-object ProgressBar
+  (in-module "Gtk")
+  (parent "GtkProgress")
+  (c-name "GtkProgressBar")
+  (gtype-id "GTK_TYPE_PROGRESS_BAR")
+)
+
+(define-function gtk_progress_bar_new
+  (is-constructor-of "GtkProgressBar")
+  (c-name "gtk_progress_bar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method pulse
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_pulse")
+  (return-type "none")
+)
+
+(define-method set_text
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_set_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method set_show_text
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_set_show_text")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_text")
+  )
+)
+
+(define-method set_fraction
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_set_fraction")
+  (return-type "none")
+  (parameters
+    '("gdouble" "fraction")
+  )
+)
+
+(define-method set_pulse_step
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_set_pulse_step")
+  (return-type "none")
+  (parameters
+    '("gdouble" "fraction")
+  )
+)
+
+(define-method get_text
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_get_text")
+  (return-type "const-gchar*")
+)
+
+(define-method get_show_text
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_get_show_text")
+  (return-type "gboolean")
+)
+
+(define-method get_fraction
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_get_fraction")
+  (return-type "gdouble")
+)
+
+(define-method get_pulse_step
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_get_pulse_step")
+  (return-type "gdouble")
+)
+
+(define-method set_ellipsize
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_set_ellipsize")
+  (return-type "none")
+  (parameters
+    '("PangoEllipsizeMode" "mode")
+  )
+)
+
+(define-method get_ellipsize
+  (of-object "GtkProgressBar")
+  (c-name "gtk_progress_bar_get_ellipsize")
+  (return-type "PangoEllipsizeMode")
+)
+
diff --git a/src/defs/GtkProgressBarOrientation.defs b/src/defs/GtkProgressBarOrientation.defs
new file mode 100644
index 0000000..66ab622
--- /dev/null
+++ b/src/defs/GtkProgressBarOrientation.defs
@@ -0,0 +1,12 @@
+(define-enum ProgressBarOrientation
+  (in-module "Gtk")
+  (c-name "GtkProgressBarOrientation")
+  (gtype-id "GTK_TYPE_PROGRESS_BAR_ORIENTATION")
+  (values
+    '("left-to-right" "GTK_PROGRESS_LEFT_TO_RIGHT")
+    '("right-to-left" "GTK_PROGRESS_RIGHT_TO_LEFT")
+    '("bottom-to-top" "GTK_PROGRESS_BOTTOM_TO_TOP")
+    '("top-to-bottom" "GTK_PROGRESS_TOP_TO_BOTTOM")
+  )
+)
+
diff --git a/src/defs/GtkRCStyle.defs b/src/defs/GtkRCStyle.defs
new file mode 100644
index 0000000..57a43b6
--- /dev/null
+++ b/src/defs/GtkRCStyle.defs
@@ -0,0 +1,7 @@
+(define-function gtk_rc_style_new
+  (is-constructor-of "GtkRCStyle")
+  (c-name "gtk_rc_style_new")
+  (caller-owns-return #t)
+  (return-type "GtkRcStyle*")
+)
+
diff --git a/src/defs/GtkRadioAction.defs b/src/defs/GtkRadioAction.defs
new file mode 100644
index 0000000..fe6590c
--- /dev/null
+++ b/src/defs/GtkRadioAction.defs
@@ -0,0 +1,59 @@
+(define-object RadioAction
+  (in-module "Gtk")
+  (parent "GtkToggleAction")
+  (c-name "GtkRadioAction")
+  (gtype-id "GTK_TYPE_RADIO_ACTION")
+)
+
+(define-function gtk_radio_action_new
+  (is-constructor-of "GtkRadioAction")
+  (c-name "gtk_radio_action_new")
+  (caller-owns-return #t)
+  (return-type "GtkRadioAction*")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "label" (null-ok))
+    '("const-gchar*" "tooltip" (null-ok))
+    '("const-gchar*" "stock_id" (null-ok))
+    '("gint" "value")
+  )
+)
+
+(define-method set_group
+  (of-object "GtkRadioAction")
+  (c-name "gtk_radio_action_set_group")
+  (return-type "none")
+  (parameters
+    '("GSList-GtkRadioAction*" "group" (null-ok))
+  )
+)
+
+(define-method get_group
+  (of-object "GtkRadioAction")
+  (c-name "gtk_radio_action_get_group")
+  (return-type "GSList-GtkRadioAction*")
+)
+
+(define-method get_current_value
+  (of-object "GtkRadioAction")
+  (c-name "gtk_radio_action_get_current_value")
+  (return-type "gint")
+)
+
+(define-virtual changed
+  (of-object "GtkRadioAction")
+  (return-type "none")
+  (parameters
+    '("GtkRadioAction*" "current")
+  )
+)
+
+(define-method set_current_value
+  (of-object "GtkRadioAction")
+  (c-name "gtk_radio_action_set_current_value")
+  (return-type "none")
+  (parameters
+    '("gint" "current_value")
+  )
+)
+
diff --git a/src/defs/GtkRadioButton.defs b/src/defs/GtkRadioButton.defs
new file mode 100644
index 0000000..2646ffd
--- /dev/null
+++ b/src/defs/GtkRadioButton.defs
@@ -0,0 +1,91 @@
+(define-object RadioButton
+  (in-module "Gtk")
+  (parent "GtkCheckButton")
+  (c-name "GtkRadioButton")
+  (gtype-id "GTK_TYPE_RADIO_BUTTON")
+)
+
+(define-function gtk_radio_button_new
+  (is-constructor-of "GtkRadioButton")
+  (c-name "gtk_radio_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GSList-GtkRadioButton*" "group" (null-ok))
+  )
+)
+
+(define-function radio_button_new_from_widget
+  (is-constructor-of "GtkRadioButton")
+  (c-name "gtk_radio_button_new_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRadioButton*" "radio_group_member" (null-ok))
+  )
+)
+
+(define-function radio_button_new_with_label
+  (is-constructor-of "GtkRadioButton")
+  (c-name "gtk_radio_button_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GSList-GtkRadioButton*" "group" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function radio_button_new_with_label_from_widget
+  (is-constructor-of "GtkRadioButton")
+  (c-name "gtk_radio_button_new_with_label_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRadioButton*" "radio_group_member" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function radio_button_new_with_mnemonic
+  (is-constructor-of "GtkRadioButton")
+  (c-name "gtk_radio_button_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GSList-GtkRadioButton*" "group" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function radio_button_new_with_mnemonic_from_widget
+  (is-constructor-of "GtkRadioButton")
+  (c-name "gtk_radio_button_new_with_mnemonic_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRadioButton*" "group" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method get_group
+  (of-object "GtkRadioButton")
+  (c-name "gtk_radio_button_get_group")
+  (return-type "GSList-GtkRadioButton*")
+)
+
+(define-method set_group
+  (of-object "GtkRadioButton")
+  (c-name "gtk_radio_button_set_group")
+  (return-type "none")
+  (parameters
+    '("GSList-GtkRadioButton*" "group")
+  )
+)
+
+(define-virtual group_changed
+  (of-object "GtkRadioButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkRadioMenuItem.defs b/src/defs/GtkRadioMenuItem.defs
new file mode 100644
index 0000000..41f0ec2
--- /dev/null
+++ b/src/defs/GtkRadioMenuItem.defs
@@ -0,0 +1,91 @@
+(define-object RadioMenuItem
+  (in-module "Gtk")
+  (parent "GtkCheckMenuItem")
+  (c-name "GtkRadioMenuItem")
+  (gtype-id "GTK_TYPE_RADIO_MENU_ITEM")
+)
+
+(define-function gtk_radio_menu_item_new
+  (is-constructor-of "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GSList-GtkRadioMenuItem*" "group" (null-ok))
+  )
+)
+
+(define-function gtk_radio_menu_item_new_with_label
+  (is-constructor-of "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GSList-GtkRadioMenuItem*" "group" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_radio_menu_item_new_with_mnemonic
+  (is-constructor-of "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GSList-GtkRadioMenuItem*" "group" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_radio_menu_item_new_from_widget
+  (is-constructor-of "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_new_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRadioMenuItem*" "radio_group_member" (null-ok))
+  )
+)
+
+(define-function gtk_radio_menu_item_new_with_mnemonic_from_widget
+  (is-constructor-of "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_new_with_mnemonic_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRadioMenuItem*" "radio_group_member" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_radio_menu_item_new_with_label_from_widget
+  (is-constructor-of "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_new_with_label_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRadioMenuItem*" "radio_group_member" (null-ok))
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method get_group
+  (of-object "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_get_group")
+  (return-type "GSList-GtkRadioMenuItem*")
+)
+
+(define-method set_group
+  (of-object "GtkRadioMenuItem")
+  (c-name "gtk_radio_menu_item_set_group")
+  (return-type "none")
+  (parameters
+    '("GSList-GtkRadioMenuItem*" "group")
+  )
+)
+
+(define-virtual group_changed
+  (of-object "GtkRadioMenuItem")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkRadioToolButton.defs b/src/defs/GtkRadioToolButton.defs
new file mode 100644
index 0000000..e2c8e69
--- /dev/null
+++ b/src/defs/GtkRadioToolButton.defs
@@ -0,0 +1,64 @@
+(define-object RadioToolButton
+  (in-module "Gtk")
+  (parent "GtkToggleToolButton")
+  (c-name "GtkRadioToolButton")
+  (gtype-id "GTK_TYPE_RADIO_TOOL_BUTTON")
+)
+
+(define-function gtk_radio_tool_button_new
+  (is-constructor-of "GtkRadioToolButton")
+  (c-name "gtk_radio_tool_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("GSList-GtkRadioToolButton*" "group" (null-ok))
+  )
+)
+
+(define-function radio_tool_button_new_from_stock
+  (is-constructor-of "GtkRadioToolButton")
+  (c-name "gtk_radio_tool_button_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("GSList-GtkRadioToolButton*" "group" (null-ok))
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-function radio_tool_button_new_from_widget
+  (is-constructor-of "GtkRadioToolButton")
+  (c-name "gtk_radio_tool_button_new_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("GtkRadioToolButton*" "group" (null-ok))
+  )
+)
+
+(define-function radio_tool_button_new_with_stock_from_widget
+  (is-constructor-of "GtkRadioToolButton")
+  (c-name "gtk_radio_tool_button_new_with_stock_from_widget")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("GtkRadioToolButton*" "group" (null-ok))
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method set_group
+  (of-object "GtkRadioToolButton")
+  (c-name "gtk_radio_tool_button_set_group")
+  (return-type "none")
+  (parameters
+    '("GSList-GtkRadioToolButton*" "group")
+  )
+)
+
+(define-method get_group
+  (of-object "GtkRadioToolButton")
+  (c-name "gtk_radio_tool_button_get_group")
+  (return-type "GSList-GtkRadioToolButton*")
+)
+
diff --git a/src/defs/GtkRange.defs b/src/defs/GtkRange.defs
new file mode 100644
index 0000000..22ddf15
--- /dev/null
+++ b/src/defs/GtkRange.defs
@@ -0,0 +1,196 @@
+(define-object Range
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkRange")
+  (gtype-id "GTK_TYPE_RANGE")
+)
+
+(define-method set_adjustment
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_adjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method get_adjustment
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_adjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_inverted
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_inverted")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_inverted
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_inverted")
+  (return-type "gboolean")
+)
+
+(define-method set_increments
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_increments")
+  (return-type "none")
+  (parameters
+    '("gdouble" "step")
+    '("gdouble" "page")
+  )
+)
+
+(define-method set_range
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_range")
+  (return-type "none")
+  (parameters
+    '("gdouble" "min")
+    '("gdouble" "max")
+  )
+)
+
+(define-method set_value
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_value")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_value
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_value")
+  (return-type "gdouble")
+)
+
+(define-method set_flippable
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_flippable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "flippable")
+  )
+)
+
+(define-method get_flippable
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_flippable")
+  (return-type "gboolean")
+)
+
+(define-method get_min_slider_size
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_min_slider_size")
+  (return-type "gint")
+)
+
+(define-method get_range_rect
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_range_rect")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "range_rect")
+  )
+)
+
+(define-method get_slider_range
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_slider_range")
+  (return-type "none")
+  (parameters
+    '("gint*" "slider_start")
+    '("gint*" "slider_end")
+  )
+)
+
+(define-method get_slider_size_fixed
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_slider_size_fixed")
+  (return-type "gboolean")
+)
+
+(define-method set_min_slider_size
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_min_slider_size")
+  (return-type "none")
+  (parameters
+    '("gboolean" "min_size")
+  )
+)
+
+(define-method set_slider_size_fixed
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_slider_size_fixed")
+  (return-type "none")
+  (parameters
+    '("gboolean" "size_fixed")
+  )
+)
+
+(define-virtual value_changed
+  (of-object "GtkRange")
+  (return-type "none")
+)
+
+(define-virtual adjust_bounds
+  (of-object "GtkRange")
+  (return-type "none")
+  (parameters
+    '("gdouble" "new_value")
+  )
+)
+
+(define-virtual move_slider
+  (of-object "GtkRange")
+  (return-type "none")
+  (parameters
+    '("GtkScrollType" "scroll")
+  )
+)
+
+(define-virtual change_value
+  (of-object "GtkRange")
+  (return-type "gboolean")
+  (parameters
+    '("GtkScrollType" "scroll")
+    '("gdouble" "new_value")
+  )
+)
+
+(define-method set_lower_stepper_sensitivity
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_lower_stepper_sensitivity")
+  (return-type "none")
+  (parameters
+    '("GtkSensitivityType" "sensitivity")
+  )
+)
+
+(define-method get_lower_stepper_sensitivity
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_lower_stepper_sensitivity")
+  (return-type "GtkSensitivityType")
+)
+
+(define-method set_upper_stepper_sensitivity
+  (of-object "GtkRange")
+  (c-name "gtk_range_set_upper_stepper_sensitivity")
+  (return-type "none")
+  (parameters
+    '("GtkSensitivityType" "sensitivity")
+  )
+)
+
+(define-method get_upper_stepper_sensitivity
+  (of-object "GtkRange")
+  (c-name "gtk_range_get_upper_stepper_sensitivity")
+  (return-type "GtkSensitivityType")
+)
+
diff --git a/src/defs/GtkRcFlags.defs b/src/defs/GtkRcFlags.defs
new file mode 100644
index 0000000..f4ae595
--- /dev/null
+++ b/src/defs/GtkRcFlags.defs
@@ -0,0 +1,12 @@
+(define-flags RcFlags
+  (in-module "Gtk")
+  (c-name "GtkRcFlags")
+  (gtype-id "GTK_TYPE_RC_FLAGS")
+  (values
+    '("fg" "GTK_RC_FG")
+    '("bg" "GTK_RC_BG")
+    '("text" "GTK_RC_TEXT")
+    '("base" "GTK_RC_BASE")
+  )
+)
+
diff --git a/src/defs/GtkRcScanner.defs b/src/defs/GtkRcScanner.defs
new file mode 100644
index 0000000..903a8ad
--- /dev/null
+++ b/src/defs/GtkRcScanner.defs
@@ -0,0 +1,7 @@
+(define-function rc_scanner_new
+  (is-constructor-of "GtkRcScanner")
+  (c-name "gtk_rc_scanner_new")
+  (caller-owns-return #t)
+  (return-type "GScanner*")
+)
+
diff --git a/src/defs/GtkRcTokenType.defs b/src/defs/GtkRcTokenType.defs
new file mode 100644
index 0000000..e421daf
--- /dev/null
+++ b/src/defs/GtkRcTokenType.defs
@@ -0,0 +1,46 @@
+(define-enum RcTokenType
+  (in-module "Gtk")
+  (c-name "GtkRcTokenType")
+  (gtype-id "GTK_TYPE_RC_TOKEN_TYPE")
+  (values
+    '("invalid" "GTK_RC_TOKEN_INVALID")
+    '("include" "GTK_RC_TOKEN_INCLUDE")
+    '("normal" "GTK_RC_TOKEN_NORMAL")
+    '("active" "GTK_RC_TOKEN_ACTIVE")
+    '("prelight" "GTK_RC_TOKEN_PRELIGHT")
+    '("selected" "GTK_RC_TOKEN_SELECTED")
+    '("insensitive" "GTK_RC_TOKEN_INSENSITIVE")
+    '("fg" "GTK_RC_TOKEN_FG")
+    '("bg" "GTK_RC_TOKEN_BG")
+    '("text" "GTK_RC_TOKEN_TEXT")
+    '("base" "GTK_RC_TOKEN_BASE")
+    '("xthickness" "GTK_RC_TOKEN_XTHICKNESS")
+    '("ythickness" "GTK_RC_TOKEN_YTHICKNESS")
+    '("font" "GTK_RC_TOKEN_FONT")
+    '("fontset" "GTK_RC_TOKEN_FONTSET")
+    '("font-name" "GTK_RC_TOKEN_FONT_NAME")
+    '("bg-pixmap" "GTK_RC_TOKEN_BG_PIXMAP")
+    '("pixmap-path" "GTK_RC_TOKEN_PIXMAP_PATH")
+    '("style" "GTK_RC_TOKEN_STYLE")
+    '("binding" "GTK_RC_TOKEN_BINDING")
+    '("bind" "GTK_RC_TOKEN_BIND")
+    '("widget" "GTK_RC_TOKEN_WIDGET")
+    '("widget-class" "GTK_RC_TOKEN_WIDGET_CLASS")
+    '("class" "GTK_RC_TOKEN_CLASS")
+    '("lowest" "GTK_RC_TOKEN_LOWEST")
+    '("gtk" "GTK_RC_TOKEN_GTK")
+    '("application" "GTK_RC_TOKEN_APPLICATION")
+    '("theme" "GTK_RC_TOKEN_THEME")
+    '("rc" "GTK_RC_TOKEN_RC")
+    '("highest" "GTK_RC_TOKEN_HIGHEST")
+    '("engine" "GTK_RC_TOKEN_ENGINE")
+    '("module-path" "GTK_RC_TOKEN_MODULE_PATH")
+    '("im-module-path" "GTK_RC_TOKEN_IM_MODULE_PATH")
+    '("im-module-file" "GTK_RC_TOKEN_IM_MODULE_FILE")
+    '("stock" "GTK_RC_TOKEN_STOCK")
+    '("ltr" "GTK_RC_TOKEN_LTR")
+    '("rtl" "GTK_RC_TOKEN_RTL")
+    '("last" "GTK_RC_TOKEN_LAST")
+  )
+)
+
diff --git a/src/defs/GtkRecentAction.defs b/src/defs/GtkRecentAction.defs
new file mode 100644
index 0000000..71072a0
--- /dev/null
+++ b/src/defs/GtkRecentAction.defs
@@ -0,0 +1,49 @@
+(define-object RecentAction
+  (in-module "Gtk")
+  (parent "GtkAction")
+  (c-name "GtkRecentAction")
+  (gtype-id "GTK_TYPE_RECENT_ACTION")
+)
+
+(define-function gtk_recent_action_new
+  (is-constructor-of "GtkRecentAction")
+  (c-name "gtk_recent_action_new")
+  (caller-owns-return #t)
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "label" (null-ok))
+    '("const-gchar*" "tooltip" (null-ok))
+    '("const-gchar*" "stock_id" (null-ok))
+  )
+)
+
+(define-function gtk_recent_action_new_for_manager
+  (is-constructor-of "GtkRecentAction")
+  (c-name "gtk_recent_action_new_for_manager")
+  (caller-owns-return #t)
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "label" (null-ok))
+    '("const-gchar*" "tooltip" (null-ok))
+    '("const-gchar*" "stock_id" (null-ok))
+    '("GtkRecentManager*" "manager" (null-ok))
+  )
+)
+
+(define-method get_show_numbers
+  (of-object "GtkRecentAction")
+  (c-name "gtk_recent_action_get_show_numbers")
+  (return-type "gboolean")
+)
+
+(define-method set_show_numbers
+  (of-object "GtkRecentAction")
+  (c-name "gtk_recent_action_set_show_numbers")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_numbers")
+  )
+)
+
diff --git a/src/defs/GtkRecentChooser.defs b/src/defs/GtkRecentChooser.defs
new file mode 100644
index 0000000..6fe36e9
--- /dev/null
+++ b/src/defs/GtkRecentChooser.defs
@@ -0,0 +1,341 @@
+(define-interface RecentChooser
+  (in-module "Gtk")
+  (c-name "GtkRecentChooser")
+  (gtype-id "GTK_TYPE_RECENT_CHOOSER")
+)
+
+(define-method set_show_private
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_show_private")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_private")
+  )
+)
+
+(define-method get_show_private
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_show_private")
+  (return-type "gboolean")
+)
+
+(define-method set_show_not_found
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_show_not_found")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_not_found")
+  )
+)
+
+(define-method get_show_not_found
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_show_not_found")
+  (return-type "gboolean")
+)
+
+(define-method set_select_multiple
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_select_multiple")
+  (return-type "none")
+  (parameters
+    '("gboolean" "select_multiple")
+  )
+)
+
+(define-method get_select_multiple
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_select_multiple")
+  (return-type "gboolean")
+)
+
+(define-method set_limit
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_limit")
+  (return-type "none")
+  (parameters
+    '("gint" "limit")
+  )
+)
+
+(define-method get_limit
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_limit")
+  (return-type "gint")
+)
+
+(define-method set_local_only
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_local_only")
+  (return-type "none")
+  (parameters
+    '("gboolean" "local_only")
+  )
+)
+
+(define-method get_local_only
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_local_only")
+  (return-type "gboolean")
+)
+
+(define-method set_show_tips
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_show_tips")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_tips")
+  )
+)
+
+(define-method get_show_tips
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_show_tips")
+  (return-type "gboolean")
+)
+
+(define-method set_show_icons
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_show_icons")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_icons")
+  )
+)
+
+(define-method get_show_icons
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_show_icons")
+  (return-type "gboolean")
+)
+
+(define-method set_sort_type
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_sort_type")
+  (return-type "none")
+  (parameters
+    '("GtkRecentSortType" "sort_type")
+  )
+)
+
+(define-method get_sort_type
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_sort_type")
+  (return-type "GtkRecentSortType")
+)
+
+(define-method set_sort_func
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_sort_func")
+  (return-type "none")
+  (parameters
+    '("GtkRecentSortFunc" "sort_func")
+    '("gpointer" "sort_data")
+    '("GDestroyNotify" "data_destroy")
+  )
+)
+
+(define-method set_current_uri
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_current_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_current_uri
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_current_uri")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_current_item
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_current_item")
+  (return-type "GtkRecentInfo*")
+)
+
+(define-method select_uri
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_select_uri")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method unselect_uri
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_unselect_uri")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-method select_all
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_select_all")
+  (return-type "none")
+)
+
+(define-method unselect_all
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_unselect_all")
+  (return-type "none")
+)
+
+(define-method get_items
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_items")
+  (caller-owns-return #f)
+  (return-type "GList-GtkRecentInfo*")
+)
+
+(define-method get_uris
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_uris")
+  (caller-owns-return #t)
+  (return-type "gchar**")
+  (parameters
+    '("gsize*" "length")
+  )
+)
+
+(define-method add_filter
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_add_filter")
+  (return-type "none")
+  (parameters
+    '("GtkRecentFilter*" "filter")
+  )
+)
+
+(define-method remove_filter
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_remove_filter")
+  (return-type "none")
+  (parameters
+    '("GtkRecentFilter*" "filter")
+  )
+)
+
+(define-method list_filters
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_list_filters")
+  (caller-owns-return #l)
+  (return-type "GSList-GtkRecentFilter*")
+)
+
+(define-method set_filter
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_set_filter")
+  (return-type "none")
+  (parameters
+    '("GtkRecentFilter*" "filter")
+  )
+)
+
+(define-method get_filter
+  (of-object "GtkRecentChooser")
+  (c-name "gtk_recent_chooser_get_filter")
+  (return-type "GtkRecentFilter*")
+)
+
+(define-virtual set_current_uri
+  (of-object "GtkRecentChooser")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-virtual get_current_uri
+  (of-object "GtkRecentChooser")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-virtual select_uri
+  (of-object "GtkRecentChooser")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-virtual unselect_uri
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-virtual select_all
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+)
+
+(define-virtual unselect_all
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+)
+
+(define-virtual get_items
+  (of-object "GtkRecentChooser")
+  (return-type "GList*")
+)
+
+(define-virtual get_recent_manager
+  (of-object "GtkRecentChooser")
+  (return-type "GtkRecentManager*")
+)
+
+(define-virtual add_filter
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+  (parameters
+    '("GtkRecentFilter*" "filter")
+  )
+)
+
+(define-virtual remove_filter
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+  (parameters
+    '("GtkRecentFilter*" "filter")
+  )
+)
+
+(define-virtual list_filters
+  (of-object "GtkRecentChooser")
+  (return-type "GSList*")
+)
+
+(define-virtual set_sort_func
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+  (parameters
+    '("GtkRecentSortFunc" "sort_func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-virtual item_activated
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+)
+
+(define-virtual selection_changed
+  (of-object "GtkRecentChooser")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkRecentChooserDialog.defs b/src/defs/GtkRecentChooserDialog.defs
new file mode 100644
index 0000000..0db2942
--- /dev/null
+++ b/src/defs/GtkRecentChooserDialog.defs
@@ -0,0 +1,20 @@
+(define-object RecentChooserDialog
+  (in-module "Gtk")
+  (parent "GtkDialog")
+  (implements "GtkRecentChooser")
+  (c-name "GtkRecentChooserDialog")
+  (gtype-id "GTK_TYPE_RECENT_CHOOSER_DIALOG")
+)
+
+(define-function recent_chooser_dialog_new
+  (is-constructor-of "GtkRecentChooserDialog")
+  (c-name "gtk_recent_chooser_dialog_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title")
+    '("GtkWindow*" "parent")
+    '("const-gchar*" "first_button_text")
+  )
+  (varargs #t)
+)
+
diff --git a/src/defs/GtkRecentChooserError.defs b/src/defs/GtkRecentChooserError.defs
new file mode 100644
index 0000000..3502304
--- /dev/null
+++ b/src/defs/GtkRecentChooserError.defs
@@ -0,0 +1,10 @@
+(define-enum RecentChooserError
+  (in-module "Gtk")
+  (c-name "GtkRecentChooserError")
+  (gtype-id "GTK_TYPE_RECENT_CHOOSER_ERROR")
+  (values
+    '("not-found" "GTK_RECENT_CHOOSER_ERROR_NOT_FOUND")
+    '("invalid-uri" "GTK_RECENT_CHOOSER_ERROR_INVALID_URI")
+  )
+)
+
diff --git a/src/defs/GtkRecentChooserMenu.defs b/src/defs/GtkRecentChooserMenu.defs
new file mode 100644
index 0000000..d88065c
--- /dev/null
+++ b/src/defs/GtkRecentChooserMenu.defs
@@ -0,0 +1,33 @@
+(define-object RecentChooserMenu
+  (in-module "Gtk")
+  (parent "GtkMenu")
+  (implements "GtkRecentChooser")
+  (c-name "GtkRecentChooserMenu")
+  (gtype-id "GTK_TYPE_RECENT_CHOOSER_MENU")
+)
+
+(define-function recent_chooser_menu_new_for_manager
+  (is-constructor-of "GtkRecentChooserMenu")
+  (c-name "gtk_recent_chooser_menu_new_for_manager")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRecentManager*" "manager")
+  )
+)
+
+(define-method get_show_numbers
+  (of-object "GtkRecentChooserMenu")
+  (c-name "gtk_recent_chooser_menu_get_show_numbers")
+  (return-type "gboolean")
+)
+
+(define-method set_show_numbers
+  (of-object "GtkRecentChooserMenu")
+  (c-name "gtk_recent_chooser_menu_set_show_numbers")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_numbers")
+  )
+)
+
diff --git a/src/defs/GtkRecentChooserWidget.defs b/src/defs/GtkRecentChooserWidget.defs
new file mode 100644
index 0000000..3542607
--- /dev/null
+++ b/src/defs/GtkRecentChooserWidget.defs
@@ -0,0 +1,18 @@
+(define-object RecentChooserWidget
+  (in-module "Gtk")
+  (parent "GtkVBox")
+  (implements "GtkRecentChooser")
+  (c-name "GtkRecentChooserWidget")
+  (gtype-id "GTK_TYPE_RECENT_CHOOSER_WIDGET")
+)
+
+(define-function recent_chooser_widget_new_for_manager
+  (is-constructor-of "GtkRecentChooserWidget")
+  (c-name "gtk_recent_chooser_widget_new_for_manager")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkRecentManager*" "manager")
+  )
+)
+
diff --git a/src/defs/GtkRecentFilter.defs b/src/defs/GtkRecentFilter.defs
new file mode 100644
index 0000000..155f892
--- /dev/null
+++ b/src/defs/GtkRecentFilter.defs
@@ -0,0 +1,107 @@
+(define-object RecentFilter
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkRecentFilter")
+  (gtype-id "GTK_TYPE_RECENT_FILTER")
+)
+
+(define-function recent_filter_new
+  (is-constructor-of "GtkRecentFilter")
+  (c-name "gtk_recent_filter_new")
+  (caller-owns-return #t)
+  (return-type "GtkRecentFilter*")
+)
+
+(define-method set_name
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_set_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_name
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method add_mime_type
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_mime_type")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "mime_type")
+  )
+)
+
+(define-method add_pattern
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_pattern")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "pattern")
+  )
+)
+
+(define-method add_pixbuf_formats
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_pixbuf_formats")
+  (return-type "none")
+)
+
+(define-method add_application
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_application")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "application")
+  )
+)
+
+(define-method add_group
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_group")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "group")
+  )
+)
+
+(define-method add_age
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_age")
+  (return-type "none")
+  (parameters
+    '("gint" "days")
+  )
+)
+
+(define-method add_custom
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_add_custom")
+  (return-type "none")
+  (parameters
+    '("GtkRecentFilterFlags" "needed")
+    '("GtkRecentFilterFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "data_destroy")
+  )
+)
+
+(define-method get_needed
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_get_needed")
+  (return-type "GtkRecentFilterFlags")
+)
+
+(define-method filter
+  (of-object "GtkRecentFilter")
+  (c-name "gtk_recent_filter_filter")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkRecentFilterInfo*" "filter_info")
+  )
+)
+
diff --git a/src/defs/GtkRecentFilterFlags.defs b/src/defs/GtkRecentFilterFlags.defs
new file mode 100644
index 0000000..e850fb5
--- /dev/null
+++ b/src/defs/GtkRecentFilterFlags.defs
@@ -0,0 +1,14 @@
+(define-flags RecentFilterFlags
+  (in-module "Gtk")
+  (c-name "GtkRecentFilterFlags")
+  (gtype-id "GTK_TYPE_RECENT_FILTER_FLAGS")
+  (values
+    '("uri" "GTK_RECENT_FILTER_URI")
+    '("display-name" "GTK_RECENT_FILTER_DISPLAY_NAME")
+    '("mime-type" "GTK_RECENT_FILTER_MIME_TYPE")
+    '("application" "GTK_RECENT_FILTER_APPLICATION")
+    '("group" "GTK_RECENT_FILTER_GROUP")
+    '("age" "GTK_RECENT_FILTER_AGE")
+  )
+)
+
diff --git a/src/defs/GtkRecentInfo.defs b/src/defs/GtkRecentInfo.defs
new file mode 100644
index 0000000..364070f
--- /dev/null
+++ b/src/defs/GtkRecentInfo.defs
@@ -0,0 +1,173 @@
+(define-boxed RecentInfo
+  (in-module "Gtk")
+  (c-name "GtkRecentInfo")
+  (gtype-id "GTK_TYPE_RECENT_INFO")
+)
+
+(define-method ref
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_ref")
+  (return-type "GtkRecentInfo*")
+)
+
+(define-method unref
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_unref")
+  (return-type "none")
+)
+
+(define-method get_uri
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_uri")
+  (return-type "const-gchar*")
+)
+
+(define-method get_display_name
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_display_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_description
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_description")
+  (return-type "const-gchar*")
+)
+
+(define-method get_mime_type
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_mime_type")
+  (return-type "const-gchar*")
+)
+
+(define-method get_added
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_added")
+  (return-type "time_t")
+)
+
+(define-method get_modified
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_modified")
+  (return-type "time_t")
+)
+
+(define-method get_visited
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_visited")
+  (return-type "time_t")
+)
+
+(define-method get_private_hint
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_private_hint")
+  (return-type "gboolean")
+)
+
+(define-method get_application_info
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_application_info")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "app_name")
+    '("gchar**" "app_exec")
+    '("guint*" "count")
+    '("time_t*" "time_")
+  )
+)
+
+(define-method get_applications
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_applications")
+  (caller-owns-return #t)
+  (return-type "gchar**")
+  (parameters
+    '("gsize*" "length")
+  )
+)
+
+(define-method last_application
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_last_application")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method has_application
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_has_application")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "app_name")
+  )
+)
+
+(define-method get_groups
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_groups")
+  (caller-owns-return #t)
+  (return-type "gchar**")
+  (parameters
+    '("gsize*" "length")
+  )
+)
+
+(define-method has_group
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_has_group")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "group_name")
+  )
+)
+
+(define-method get_icon
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_icon")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("gint" "size")
+  )
+)
+
+(define-method get_short_name
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_short_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_uri_display
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_uri_display")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_age
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_get_age")
+  (return-type "gint")
+)
+
+(define-method is_local
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_is_local")
+  (return-type "gboolean")
+)
+
+(define-method exists
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_exists")
+  (return-type "gboolean")
+)
+
+(define-method match
+  (of-object "GtkRecentInfo")
+  (c-name "gtk_recent_info_match")
+  (return-type "gboolean")
+  (parameters
+    '("GtkRecentInfo*" "info_b")
+  )
+)
+
diff --git a/src/defs/GtkRecentManager.defs b/src/defs/GtkRecentManager.defs
new file mode 100644
index 0000000..6c3577e
--- /dev/null
+++ b/src/defs/GtkRecentManager.defs
@@ -0,0 +1,93 @@
+(define-object RecentManager
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkRecentManager")
+  (gtype-id "GTK_TYPE_RECENT_MANAGER")
+)
+
+(define-function recent_manager_new
+  (is-constructor-of "GtkRecentManager")
+  (c-name "gtk_recent_manager_new")
+  (caller-owns-return #t)
+  (return-type "GtkRecentManager*")
+)
+
+(define-method add_item
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_add_item")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-method add_full
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_add_full")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("const-GtkRecentData*" "recent_data")
+  )
+)
+
+(define-method remove_item
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_remove_item")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method lookup_item
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_lookup_item")
+  (return-type "GtkRecentInfo*")
+  (parameters
+    '("const-gchar*" "uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method has_item
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_has_item")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-method move_item
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_move_item")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "uri")
+    '("const-gchar*" "new_uri")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_items
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_get_items")
+  (return-type "GList*")
+)
+
+(define-method purge_items
+  (of-object "GtkRecentManager")
+  (c-name "gtk_recent_manager_purge_items")
+  (return-type "gint")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-virtual changed
+  (of-object "GtkRecentManager")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkRecentManagerError.defs b/src/defs/GtkRecentManagerError.defs
new file mode 100644
index 0000000..5a9f1ab
--- /dev/null
+++ b/src/defs/GtkRecentManagerError.defs
@@ -0,0 +1,15 @@
+(define-enum RecentManagerError
+  (in-module "Gtk")
+  (c-name "GtkRecentManagerError")
+  (gtype-id "GTK_TYPE_RECENT_MANAGER_ERROR")
+  (values
+    '("not-found" "GTK_RECENT_MANAGER_ERROR_NOT_FOUND")
+    '("invalid-uri" "GTK_RECENT_MANAGER_ERROR_INVALID_URI")
+    '("invalid-encoding" "GTK_RECENT_MANAGER_ERROR_INVALID_ENCODING")
+    '("not-registered" "GTK_RECENT_MANAGER_ERROR_NOT_REGISTERED")
+    '("read" "GTK_RECENT_MANAGER_ERROR_READ")
+    '("write" "GTK_RECENT_MANAGER_ERROR_WRITE")
+    '("unknown" "GTK_RECENT_MANAGER_ERROR_UNKNOWN")
+  )
+)
+
diff --git a/src/defs/GtkRecentSortType.defs b/src/defs/GtkRecentSortType.defs
new file mode 100644
index 0000000..282660e
--- /dev/null
+++ b/src/defs/GtkRecentSortType.defs
@@ -0,0 +1,12 @@
+(define-enum RecentSortType
+  (in-module "Gtk")
+  (c-name "GtkRecentSortType")
+  (gtype-id "GTK_TYPE_RECENT_SORT_TYPE")
+  (values
+    '("none" "GTK_RECENT_SORT_NONE")
+    '("mru" "GTK_RECENT_SORT_MRU")
+    '("lru" "GTK_RECENT_SORT_LRU")
+    '("custom" "GTK_RECENT_SORT_CUSTOM")
+  )
+)
+
diff --git a/src/defs/GtkRegionFlags.defs b/src/defs/GtkRegionFlags.defs
new file mode 100644
index 0000000..7bec8e4
--- /dev/null
+++ b/src/defs/GtkRegionFlags.defs
@@ -0,0 +1,12 @@
+(define-enum RegionFlags
+  (in-module "Gtk")
+  (c-name "GtkRegionFlags")
+  (gtype-id "GTK_TYPE_REGION_FLAGS")
+  (values
+    '("even" "GTK_REGION_EVEN")
+    '("odd" "GTK_REGION_ODD")
+    '("first" "GTK_REGION_FIRST")
+    '("last" "GTK_REGION_LAST")
+    '("sorted" "GTK_REGION_SORTED")
+  )
+)
diff --git a/src/defs/GtkReliefStyle.defs b/src/defs/GtkReliefStyle.defs
new file mode 100644
index 0000000..ccfb0f6
--- /dev/null
+++ b/src/defs/GtkReliefStyle.defs
@@ -0,0 +1,11 @@
+(define-enum ReliefStyle
+  (in-module "Gtk")
+  (c-name "GtkReliefStyle")
+  (gtype-id "GTK_TYPE_RELIEF_STYLE")
+  (values
+    '("normal" "GTK_RELIEF_NORMAL")
+    '("half" "GTK_RELIEF_HALF")
+    '("none" "GTK_RELIEF_NONE")
+  )
+)
+
diff --git a/src/defs/GtkRequisition.defs b/src/defs/GtkRequisition.defs
new file mode 100644
index 0000000..27eea07
--- /dev/null
+++ b/src/defs/GtkRequisition.defs
@@ -0,0 +1,23 @@
+(define-boxed Requisition
+  (in-module "Gtk")
+  (c-name "GtkRequisition")
+  (gtype-id "GTK_TYPE_REQUISITION")
+  (fields
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method copy
+  (of-object "GtkRequisition")
+  (c-name "gtk_requisition_copy")
+  (caller-owns-return #t)
+  (return-type "GtkRequisition*")
+)
+
+(define-method free
+  (of-object "GtkRequisition")
+  (c-name "gtk_requisition_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkResizeMode.defs b/src/defs/GtkResizeMode.defs
new file mode 100644
index 0000000..b393ff1
--- /dev/null
+++ b/src/defs/GtkResizeMode.defs
@@ -0,0 +1,11 @@
+(define-enum ResizeMode
+  (in-module "Gtk")
+  (c-name "GtkResizeMode")
+  (gtype-id "GTK_TYPE_RESIZE_MODE")
+  (values
+    '("parent" "GTK_RESIZE_PARENT")
+    '("queue" "GTK_RESIZE_QUEUE")
+    '("immediate" "GTK_RESIZE_IMMEDIATE")
+  )
+)
+
diff --git a/src/defs/GtkResponseType.defs b/src/defs/GtkResponseType.defs
new file mode 100644
index 0000000..862f37e
--- /dev/null
+++ b/src/defs/GtkResponseType.defs
@@ -0,0 +1,23 @@
+;; note that we have hacked this from (define-enum...) to (define-flags...) in
+;; order that the generated translation code pick up the actual ordinals, not
+;; our hard wired zero origin ones.
+
+(define-flags ResponseType
+  (in-module "Gtk")
+  (c-name "GtkResponseType")
+  (gtype-id "GTK_TYPE_RESPONSE_TYPE")
+  (values
+    '("none" "GTK_RESPONSE_NONE")
+    '("reject" "GTK_RESPONSE_REJECT")
+    '("accept" "GTK_RESPONSE_ACCEPT")
+    '("delete-event" "GTK_RESPONSE_DELETE_EVENT")
+    '("ok" "GTK_RESPONSE_OK")
+    '("cancel" "GTK_RESPONSE_CANCEL")
+    '("close" "GTK_RESPONSE_CLOSE")
+    '("yes" "GTK_RESPONSE_YES")
+    '("no" "GTK_RESPONSE_NO")
+    '("apply" "GTK_RESPONSE_APPLY")
+    '("help" "GTK_RESPONSE_HELP")
+  )
+)
+
diff --git a/src/defs/GtkScale.defs b/src/defs/GtkScale.defs
new file mode 100644
index 0000000..59d08e0
--- /dev/null
+++ b/src/defs/GtkScale.defs
@@ -0,0 +1,101 @@
+(define-object Scale
+  (in-module "Gtk")
+  (parent "GtkRange")
+  (c-name "GtkScale")
+)
+
+(define-function gtk_scale_new
+  (is-constructor-of "GtkScale")
+  (c-name "gtk_scale_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkOrientation" "orientation")
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method set_digits
+  (of-object "GtkScale")
+  (c-name "gtk_scale_set_digits")
+  (return-type "none")
+  (parameters
+    '("gint" "digits")
+  )
+)
+
+(define-method get_digits
+  (of-object "GtkScale")
+  (c-name "gtk_scale_get_digits")
+  (return-type "gint")
+)
+
+(define-method set_draw_value
+  (of-object "GtkScale")
+  (c-name "gtk_scale_set_draw_value")
+  (return-type "none")
+  (parameters
+    '("gboolean" "draw_value")
+  )
+)
+
+(define-method get_draw_value
+  (of-object "GtkScale")
+  (c-name "gtk_scale_get_draw_value")
+  (return-type "gboolean")
+)
+
+(define-method set_value_pos
+  (of-object "GtkScale")
+  (c-name "gtk_scale_set_value_pos")
+  (return-type "none")
+  (parameters
+    '("GtkPositionType" "pos")
+  )
+)
+
+(define-method get_value_pos
+  (of-object "GtkScale")
+  (c-name "gtk_scale_get_value_pos")
+  (return-type "GtkPositionType")
+)
+
+(define-method get_layout
+  (of-object "GtkScale")
+  (c-name "gtk_scale_get_layout")
+  (return-type "PangoLayout*")
+)
+
+(define-method get_layout_offsets
+  (of-object "GtkScale")
+  (c-name "gtk_scale_get_layout_offsets")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-virtual format_value
+  (of-object "GtkScale")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-virtual draw_value
+  (of-object "GtkScale")
+  (return-type "none")
+)
+
+(define-virtual get_layout_offsets
+  (of-object "GtkScale")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
diff --git a/src/defs/GtkScaleButton.defs b/src/defs/GtkScaleButton.defs
new file mode 100644
index 0000000..b2cf21e
--- /dev/null
+++ b/src/defs/GtkScaleButton.defs
@@ -0,0 +1,84 @@
+(define-object ScaleButton
+  (in-module "Gtk")
+  (parent "GtkButton")
+  (c-name "GtkScaleButton")
+  (gtype-id "GTK_TYPE_SCALE_BUTTON")
+  (fields
+    '("GtkAdjustment" "adjustment")
+    '("GStrv" "icons")
+    '("GtkIconSize" "size")
+    '("gdouble" "value")
+  )
+)
+
+(define-function gtk_scale_button_new
+  (is-constructor-of "GtkScaleButton")
+  (c-name "gtk_scale_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkIconSize" "size")
+    '("gdouble" "min")
+    '("gdouble" "max")
+    '("gdouble" "step")
+    '("const-gchar**" "icons")
+  )
+)
+
+(define-method set_adjustment
+  (of-object "GtkScaleButton")
+  (c-name "gtk_scale_button_set_adjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method set_icons
+  (of-object "GtkScaleButton")
+  (c-name "gtk_scale_button_set_icons")
+  (return-type "none")
+  (parameters
+    '("const-gchar**" "icons")
+  )
+)
+
+(define-method set_value
+  (of-object "GtkScaleButton")
+  (c-name "gtk_scale_button_set_value")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method get_adjustment
+  (of-object "GtkScaleButton")
+  (c-name "gtk_scale_button_get_adjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method get_value
+  (of-object "GtkScaleButton")
+  (c-name "gtk_scale_button_get_value")
+  (return-type "gdouble")
+)
+
+(define-virtual popdown
+  (of-object "GtkScaleButton")
+  (return-type "none")
+)
+
+(define-virtual popup
+  (of-object "GtkScaleButton")
+  (return-type "none")
+)
+
+(define-virtual value_changed
+  (of-object "GtkScaleButton")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
diff --git a/src/defs/GtkScrollStep.defs b/src/defs/GtkScrollStep.defs
new file mode 100644
index 0000000..9620b40
--- /dev/null
+++ b/src/defs/GtkScrollStep.defs
@@ -0,0 +1,14 @@
+(define-enum ScrollStep
+  (in-module "Gtk")
+  (c-name "GtkScrollStep")
+  (gtype-id "GTK_TYPE_SCROLL_STEP")
+  (values
+    '("steps" "GTK_SCROLL_STEPS")
+    '("pages" "GTK_SCROLL_PAGES")
+    '("ends" "GTK_SCROLL_ENDS")
+    '("horizontal-steps" "GTK_SCROLL_HORIZONTAL_STEPS")
+    '("horizontal-pages" "GTK_SCROLL_HORIZONTAL_PAGES")
+    '("horizontal-ends" "GTK_SCROLL_HORIZONTAL_ENDS")
+  )
+)
+
diff --git a/src/defs/GtkScrollType.defs b/src/defs/GtkScrollType.defs
new file mode 100644
index 0000000..520a125
--- /dev/null
+++ b/src/defs/GtkScrollType.defs
@@ -0,0 +1,24 @@
+(define-enum ScrollType
+  (in-module "Gtk")
+  (c-name "GtkScrollType")
+  (gtype-id "GTK_TYPE_SCROLL_TYPE")
+  (values
+    '("none" "GTK_SCROLL_NONE")
+    '("jump" "GTK_SCROLL_JUMP")
+    '("step-backward" "GTK_SCROLL_STEP_BACKWARD")
+    '("step-forward" "GTK_SCROLL_STEP_FORWARD")
+    '("page-backward" "GTK_SCROLL_PAGE_BACKWARD")
+    '("page-forward" "GTK_SCROLL_PAGE_FORWARD")
+    '("step-up" "GTK_SCROLL_STEP_UP")
+    '("step-down" "GTK_SCROLL_STEP_DOWN")
+    '("page-up" "GTK_SCROLL_PAGE_UP")
+    '("page-down" "GTK_SCROLL_PAGE_DOWN")
+    '("step-left" "GTK_SCROLL_STEP_LEFT")
+    '("step-right" "GTK_SCROLL_STEP_RIGHT")
+    '("page-left" "GTK_SCROLL_PAGE_LEFT")
+    '("page-right" "GTK_SCROLL_PAGE_RIGHT")
+    '("start" "GTK_SCROLL_START")
+    '("end" "GTK_SCROLL_END")
+  )
+)
+
diff --git a/src/defs/GtkScrollbar.defs b/src/defs/GtkScrollbar.defs
new file mode 100644
index 0000000..51172a7
--- /dev/null
+++ b/src/defs/GtkScrollbar.defs
@@ -0,0 +1,17 @@
+(define-object Scrollbar
+  (in-module "Gtk")
+  (parent "GtkRange")
+  (c-name "GtkScrollbar")
+)
+
+(define-function gtk_scrollbar_new
+  (is-constructor-of "GtkScrollbar")
+  (c-name "gtk_scrollbar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkOrientation" "orientation")
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
diff --git a/src/defs/GtkScrolledWindow.defs b/src/defs/GtkScrolledWindow.defs
new file mode 100644
index 0000000..da4437a
--- /dev/null
+++ b/src/defs/GtkScrolledWindow.defs
@@ -0,0 +1,142 @@
+(define-object ScrolledWindow
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkScrolledWindow")
+  (gtype-id "GTK_TYPE_SCROLLED_WINDOW")
+)
+
+(define-function gtk_scrolled_window_new
+  (is-constructor-of "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "hadjustment" (null-ok))
+    '("GtkAdjustment*" "vadjustment" (null-ok))
+  )
+)
+
+(define-method set_hadjustment
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_set_hadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+  )
+)
+
+(define-method set_vadjustment
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_set_vadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+  )
+)
+
+(define-method get_hadjustment
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method get_vadjustment
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_vadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method get_hscrollbar
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_hscrollbar")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_vscrollbar
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_vscrollbar")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_policy
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_set_policy")
+  (return-type "none")
+  (parameters
+    '("GtkPolicyType" "hscrollbar_policy")
+    '("GtkPolicyType" "vscrollbar_policy")
+  )
+)
+
+(define-method get_policy
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_policy")
+  (return-type "none")
+  (parameters
+    '("GtkPolicyType*" "hscrollbar_policy")
+    '("GtkPolicyType*" "vscrollbar_policy")
+  )
+)
+
+(define-method set_placement
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_set_placement")
+  (return-type "none")
+  (parameters
+    '("GtkCornerType" "window_placement")
+  )
+)
+
+(define-method get_placement
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_placement")
+  (return-type "GtkCornerType")
+)
+
+(define-method set_shadow_type
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_set_shadow_type")
+  (return-type "none")
+  (parameters
+    '("GtkShadowType" "type")
+  )
+)
+
+(define-method get_shadow_type
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_get_shadow_type")
+  (return-type "GtkShadowType")
+)
+
+(define-method add_with_viewport
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_add_with_viewport")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+  )
+)
+
+(define-virtual scroll_child
+  (of-object "GtkScrolledWindow")
+  (return-type "gboolean")
+  (parameters
+    '("GtkScrollType" "scroll")
+    '("gboolean" "horizontal")
+  )
+)
+
+(define-virtual move_focus_out
+  (of-object "GtkScrolledWindow")
+  (return-type "none")
+  (parameters
+    '("GtkDirectionType" "direction")
+  )
+)
+
+(define-method unset_placement
+  (of-object "GtkScrolledWindow")
+  (c-name "gtk_scrolled_window_unset_placement")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkSelectionData.defs b/src/defs/GtkSelectionData.defs
new file mode 100644
index 0000000..017d90d
--- /dev/null
+++ b/src/defs/GtkSelectionData.defs
@@ -0,0 +1,140 @@
+(define-boxed SelectionData
+  (in-module "Gtk")
+  (c-name "GtkSelectionData")
+  (gtype-id "GTK_TYPE_SELECTION_DATA")
+  (copy-func "gtk_selection_data_copy")
+  (release-func "gtk_selection_data_free")
+)
+
+(define-method set
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_set")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "type")
+    '("gint" "format")
+    '("const-guchar*" "data")
+    '("gint" "length")
+  )
+)
+
+(define-method set_text
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_set_text")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "str")
+    '("gint" "len" (default "-1"))
+  )
+)
+
+(define-method get_text
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_get_text")
+  (return-type "guchar*")
+)
+
+(define-method get_targets
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_get_targets")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom**" "targets")
+    '("gint*" "n_atoms")
+  )
+)
+
+(define-method targets_include_text
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_targets_include_text")
+  (return-type "gboolean")
+)
+
+(define-method copy
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_copy")
+  (caller-owns-return #t)
+  (return-type "GtkSelectionData*")
+)
+
+(define-method free
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_free")
+  (return-type "none")
+)
+
+(define-method set_pixbuf
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_set_pixbuf")
+  (return-type "gboolean")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-method get_pixbuf
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method set_uris
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_set_uris")
+  (return-type "gboolean")
+  (parameters
+    '("gchar**" "uris")
+  )
+)
+
+(define-method get_uris
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_get_uris")
+  (caller-owns-return #t)
+  (return-type "gchar**")
+)
+
+(define-method targets_include_image
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_targets_include_image")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "writable")
+  )
+)
+
+(define-method tree_set_row_drag_data
+  (of-object "GtkSelectionData")
+  (c-name "gtk_tree_set_row_drag_data")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeModel*" "tree_model")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method tree_get_row_drag_data
+  (of-object "GtkSelectionData")
+  (c-name "gtk_tree_get_row_drag_data")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeModel**" "tree_model")
+    '("GtkTreePath**" "path")
+  )
+)
+
+(define-method targets_include_rich_text
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_targets_include_rich_text")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextBuffer*" "buffer")
+  )
+)
+
+(define-method targets_include_uri
+  (of-object "GtkSelectionData")
+  (c-name "gtk_selection_data_targets_include_uri")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkSelectionMode.defs b/src/defs/GtkSelectionMode.defs
new file mode 100644
index 0000000..12475be
--- /dev/null
+++ b/src/defs/GtkSelectionMode.defs
@@ -0,0 +1,13 @@
+(define-enum SelectionMode
+  (in-module "Gtk")
+  (c-name "GtkSelectionMode")
+  (gtype-id "GTK_TYPE_SELECTION_MODE")
+  (values
+    '("none" "GTK_SELECTION_NONE")
+    '("single" "GTK_SELECTION_SINGLE")
+    '("browse" "GTK_SELECTION_BROWSE")
+    '("multiple" "GTK_SELECTION_MULTIPLE")
+    '("extended" "GTK_SELECTION_EXTENDED")
+  )
+)
+
diff --git a/src/defs/GtkSensitivityType.defs b/src/defs/GtkSensitivityType.defs
new file mode 100644
index 0000000..dacbfd2
--- /dev/null
+++ b/src/defs/GtkSensitivityType.defs
@@ -0,0 +1,11 @@
+(define-enum SensitivityType
+  (in-module "Gtk")
+  (c-name "GtkSensitivityType")
+  (gtype-id "GTK_TYPE_SENSITIVITY_TYPE")
+  (values
+    '("auto" "GTK_SENSITIVITY_AUTO")
+    '("on" "GTK_SENSITIVITY_ON")
+    '("off" "GTK_SENSITIVITY_OFF")
+  )
+)
+
diff --git a/src/defs/GtkSeparator.defs b/src/defs/GtkSeparator.defs
new file mode 100644
index 0000000..ea83f1f
--- /dev/null
+++ b/src/defs/GtkSeparator.defs
@@ -0,0 +1,16 @@
+(define-object Separator
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkSeparator")
+)
+
+(define-function gtk_separator_new
+  (is-constructor-of "GtkSeparator")
+  (c-name "gtk_separator_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkOrientation" "orientation")
+  )
+)
+
diff --git a/src/defs/GtkSeparatorMenuItem.defs b/src/defs/GtkSeparatorMenuItem.defs
new file mode 100644
index 0000000..193f93f
--- /dev/null
+++ b/src/defs/GtkSeparatorMenuItem.defs
@@ -0,0 +1,14 @@
+(define-object SeparatorMenuItem
+  (in-module "Gtk")
+  (parent "GtkMenuItem")
+  (c-name "GtkSeparatorMenuItem")
+  (gtype-id "GTK_TYPE_SEPARATOR_MENU_ITEM")
+)
+
+(define-function gtk_separator_menu_item_new
+  (is-constructor-of "GtkSeparatorMenuItem")
+  (c-name "gtk_separator_menu_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkSeparatorToolItem.defs b/src/defs/GtkSeparatorToolItem.defs
new file mode 100644
index 0000000..7944107
--- /dev/null
+++ b/src/defs/GtkSeparatorToolItem.defs
@@ -0,0 +1,29 @@
+(define-object SeparatorToolItem
+  (in-module "Gtk")
+  (parent "GtkToolItem")
+  (c-name "GtkSeparatorToolItem")
+  (gtype-id "GTK_TYPE_SEPARATOR_TOOL_ITEM")
+)
+
+(define-function gtk_separator_tool_item_new
+  (is-constructor-of "GtkSeparatorToolItem")
+  (c-name "gtk_separator_tool_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+)
+
+(define-method get_draw
+  (of-object "GtkSeparatorToolItem")
+  (c-name "gtk_separator_tool_item_get_draw")
+  (return-type "gboolean")
+)
+
+(define-method set_draw
+  (of-object "GtkSeparatorToolItem")
+  (c-name "gtk_separator_tool_item_set_draw")
+  (return-type "none")
+  (parameters
+    '("gboolean" "draw")
+  )
+)
+
diff --git a/src/defs/GtkSettings.defs b/src/defs/GtkSettings.defs
new file mode 100644
index 0000000..39aa9c9
--- /dev/null
+++ b/src/defs/GtkSettings.defs
@@ -0,0 +1,65 @@
+(define-object Settings
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkSettings")
+  (gtype-id "GTK_TYPE_SETTINGS")
+)
+
+(define-function get_default
+  (of-object "GtkSettings")
+  (c-name "gtk_settings_get_default")
+  (return-type "GtkSettings*")
+)
+
+(define-function get_for_screen
+  (of-object "GtkSettings")
+  (c-name "gtk_settings_get_for_screen")
+  (return-type "GtkSettings*")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method set_property_value
+  (of-object "GtkSettings")
+  (c-name "gtk_settings_set_property_value")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-GtkSettingsValue*" "svalue")
+  )
+)
+
+(define-method set_string_property
+  (of-object "GtkSettings")
+  (c-name "gtk_settings_set_string_property")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "v_string")
+    '("const-gchar*" "origin")
+  )
+)
+
+(define-method set_long_property
+  (of-object "GtkSettings")
+  (c-name "gtk_settings_set_long_property")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("glong" "v_long")
+    '("const-gchar*" "origin")
+  )
+)
+
+(define-method set_double_property
+  (of-object "GtkSettings")
+  (c-name "gtk_settings_set_double_property")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("gdouble" "v_double")
+    '("const-gchar*" "origin")
+  )
+)
+
diff --git a/src/defs/GtkShadowType.defs b/src/defs/GtkShadowType.defs
new file mode 100644
index 0000000..ca270b4
--- /dev/null
+++ b/src/defs/GtkShadowType.defs
@@ -0,0 +1,13 @@
+(define-enum ShadowType
+  (in-module "Gtk")
+  (c-name "GtkShadowType")
+  (gtype-id "GTK_TYPE_SHADOW_TYPE")
+  (values
+    '("none" "GTK_SHADOW_NONE")
+    '("in" "GTK_SHADOW_IN")
+    '("out" "GTK_SHADOW_OUT")
+    '("etched-in" "GTK_SHADOW_ETCHED_IN")
+    '("etched-out" "GTK_SHADOW_ETCHED_OUT")
+  )
+)
+
diff --git a/src/defs/GtkSignalRunType.defs b/src/defs/GtkSignalRunType.defs
new file mode 100644
index 0000000..ed1a925
--- /dev/null
+++ b/src/defs/GtkSignalRunType.defs
@@ -0,0 +1,14 @@
+(define-enum SignalRunType
+  (in-module "Gtk")
+  (c-name "GtkSignalRunType")
+  (gtype-id "GTK_TYPE_SIGNAL_RUN_TYPE")
+  (values
+    '("first" "GTK_RUN_FIRST")
+    '("last" "GTK_RUN_LAST")
+    '("both" "GTK_RUN_BOTH")
+    '("no-recurse" "GTK_RUN_NO_RECURSE")
+    '("action" "GTK_RUN_ACTION")
+    '("no-hooks" "GTK_RUN_NO_HOOKS")
+  )
+)
+
diff --git a/src/defs/GtkSizeGroup.defs b/src/defs/GtkSizeGroup.defs
new file mode 100644
index 0000000..8fdb53e
--- /dev/null
+++ b/src/defs/GtkSizeGroup.defs
@@ -0,0 +1,71 @@
+(define-object SizeGroup
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkSizeGroup")
+  (gtype-id "GTK_TYPE_SIZE_GROUP")
+)
+
+(define-function size_group_new
+  (is-constructor-of "GtkSizeGroup")
+  (c-name "gtk_size_group_new")
+  (caller-owns-return #t)
+  (return-type "GtkSizeGroup*")
+  (parameters
+    '("GtkSizeGroupMode" "mode")
+  )
+)
+
+(define-method set_mode
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_set_mode")
+  (return-type "none")
+  (parameters
+    '("GtkSizeGroupMode" "mode")
+  )
+)
+
+(define-method get_mode
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_get_mode")
+  (return-type "GtkSizeGroupMode")
+)
+
+(define-method set_ignore_hidden
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_set_ignore_hidden")
+  (return-type "none")
+  (parameters
+    '("gboolean" "ignore_hidden")
+  )
+)
+
+(define-method get_ignore_hidden
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_get_ignore_hidden")
+  (return-type "gboolean")
+)
+
+(define-method add_widget
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_add_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-method remove_widget
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_remove_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-method get_widgets
+  (of-object "GtkSizeGroup")
+  (c-name "gtk_size_group_get_widgets")
+  (return-type "GSList-GtkWidget*")
+)
+
diff --git a/src/defs/GtkSizeGroupMode.defs b/src/defs/GtkSizeGroupMode.defs
new file mode 100644
index 0000000..046fae6
--- /dev/null
+++ b/src/defs/GtkSizeGroupMode.defs
@@ -0,0 +1,12 @@
+(define-enum SizeGroupMode
+  (in-module "Gtk")
+  (c-name "GtkSizeGroupMode")
+  (gtype-id "GTK_TYPE_SIZE_GROUP_MODE")
+  (values
+    '("none" "GTK_SIZE_GROUP_NONE")
+    '("horizontal" "GTK_SIZE_GROUP_HORIZONTAL")
+    '("vertical" "GTK_SIZE_GROUP_VERTICAL")
+    '("both" "GTK_SIZE_GROUP_BOTH")
+  )
+)
+
diff --git a/src/defs/GtkSizeRequestMode.defs b/src/defs/GtkSizeRequestMode.defs
new file mode 100644
index 0000000..36eebff
--- /dev/null
+++ b/src/defs/GtkSizeRequestMode.defs
@@ -0,0 +1,9 @@
+(define-enum SizeRequestMode
+  (in-module "Gtk")
+  (c-name "GtkSizeRequestMode")
+  (values
+    '("height-for-width" "GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH")
+    '("width-for-height" "GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT")
+  )
+)
+
diff --git a/src/defs/GtkSocket.defs b/src/defs/GtkSocket.defs
new file mode 100644
index 0000000..ecefc81
--- /dev/null
+++ b/src/defs/GtkSocket.defs
@@ -0,0 +1,41 @@
+(define-object Socket
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkSocket")
+  (gtype-id "GTK_TYPE_SOCKET")
+  (import-header "gtk/gtkx.h")
+)
+
+(define-function gtk_socket_new
+  (is-constructor-of "GtkSocket")
+  (c-name "gtk_socket_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+;; That's an X Window* there. We have no binding of that.
+(define-method add_id
+  (of-object "GtkSocket")
+  (c-name "gtk_socket_add_id")
+  (return-type "none")
+  (parameters
+    '("Window" "window_id")
+  )
+)
+
+(define-method get_id
+  (of-object "GtkSocket")
+  (c-name "gtk_socket_get_id")
+  (return-type "Window")
+)
+
+(define-virtual plug_added
+  (of-object "GtkSocket")
+  (return-type "none")
+)
+
+(define-virtual plug_removed
+  (of-object "GtkSocket")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkSortType.defs b/src/defs/GtkSortType.defs
new file mode 100644
index 0000000..b15d345
--- /dev/null
+++ b/src/defs/GtkSortType.defs
@@ -0,0 +1,10 @@
+(define-enum SortType
+  (in-module "Gtk")
+  (c-name "GtkSortType")
+  (gtype-id "GTK_TYPE_SORT_TYPE")
+  (values
+    '("ascending" "GTK_SORT_ASCENDING")
+    '("descending" "GTK_SORT_DESCENDING")
+  )
+)
+
diff --git a/src/defs/GtkSourceBuffer.defs b/src/defs/GtkSourceBuffer.defs
new file mode 100644
index 0000000..c4eba35
--- /dev/null
+++ b/src/defs/GtkSourceBuffer.defs
@@ -0,0 +1,211 @@
+(define-object SourceBuffer
+  (in-module "GtkSourceView")
+  (parent "GtkTextBuffer")
+  (c-name "GtkSourceBuffer")
+  (import-header "gtksourceview/gtksourcebuffer.h")
+  (gtype-id "GTK_TYPE_SOURCE_BUFFER")
+)
+
+(define-function gtk_source_buffer_new
+  (is-constructor-of "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_new")
+  (caller-owns-return #t)
+  (return-type "GtkSourceBuffer*")
+  (parameters
+    '("GtkTextTagTable*" "table")
+  )
+)
+
+(define-function gtk_source_buffer_new_with_language
+  (is-constructor-of "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_new_with_language")
+  (caller-owns-return #t)
+  (return-type "GtkSourceBuffer*")
+  (parameters
+    '("GtkSourceLanguage*" "language")
+  )
+)
+
+(define-method get_highlight_syntax
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_highlight_syntax")
+  (return-type "gboolean")
+)
+
+(define-method set_highlight_syntax
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_set_highlight_syntax")
+  (return-type "none")
+  (parameters
+    '("gboolean" "highlight")
+  )
+)
+
+(define-method get_highlight_matching_brackets
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_highlight_matching_brackets")
+  (return-type "gboolean")
+)
+
+(define-method set_highlight_matching_brackets
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_set_highlight_matching_brackets")
+  (return-type "none")
+  (parameters
+    '("gboolean" "highlight")
+  )
+)
+
+(define-method get_max_undo_levels
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_max_undo_levels")
+  (return-type "gint")
+)
+
+(define-method set_max_undo_levels
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_set_max_undo_levels")
+  (return-type "none")
+  (parameters
+    '("gint" "max_undo_levels")
+  )
+)
+
+(define-method get_language
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_language")
+  (return-type "GtkSourceLanguage*")
+)
+
+(define-method set_language
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_set_language")
+  (return-type "none")
+  (parameters
+    '("GtkSourceLanguage*" "language" (null-ok))
+  )
+)
+
+(define-method can_undo
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_can_undo")
+  (return-type "gboolean")
+)
+
+(define-method can_redo
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_can_redo")
+  (return-type "gboolean")
+)
+
+(define-method undo
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_undo")
+  (return-type "none")
+)
+
+(define-method redo
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_redo")
+  (return-type "none")
+)
+
+(define-method begin_not_undoable_action
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_begin_not_undoable_action")
+  (return-type "none")
+)
+
+(define-method end_not_undoable_action
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_end_not_undoable_action")
+  (return-type "none")
+)
+
+(define-method get_style_scheme
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_style_scheme")
+  (return-type "GtkSourceStyleScheme*")
+)
+
+(define-method set_style_scheme
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_set_style_scheme")
+  (return-type "none")
+  (parameters
+    '("GtkSourceStyleScheme*" "scheme" (null-ok))
+  )
+)
+
+(define-method ensure_highlight
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_ensure_highlight")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "start")
+    '("GtkTextIter*" "end")
+  )
+)
+
+(define-method create_source_mark
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_create_source_mark")
+  (return-type "GtkSourceMark*")
+  (parameters
+    '("const-gchar*" "name" (null-ok))
+    '("const-gchar*" "category")
+    '("const-GtkTextIter*" "where")
+  )
+)
+
+(define-method forward_iter_to_source_mark
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_forward_iter_to_source_mark")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "category" (default "NULL") (null-ok))
+  )
+)
+
+(define-method backward_iter_to_source_mark
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_backward_iter_to_source_mark")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "category" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_source_marks_at_iter
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_source_marks_at_iter")
+  (return-type "GSList*")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "category" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_source_marks_at_line
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_get_source_marks_at_line")
+  (return-type "GSList*")
+  (parameters
+    '("gint" "line")
+    '("const-gchar*" "category" (default "NULL") (null-ok))
+  )
+)
+
+(define-method remove_source_marks
+  (of-object "GtkSourceBuffer")
+  (c-name "gtk_source_buffer_remove_source_marks")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "start")
+    '("GtkTextIter*" "end")
+    '("const-gchar*" "category" (default "NULL") (null-ok))
+  )
+)
+
diff --git a/src/defs/GtkSourceDrawSpacesFlags.defs b/src/defs/GtkSourceDrawSpacesFlags.defs
new file mode 100644
index 0000000..9c23165
--- /dev/null
+++ b/src/defs/GtkSourceDrawSpacesFlags.defs
@@ -0,0 +1,15 @@
+(define-flags DrawSpacesFlags
+  (in-module "GtkSourceView")
+  (c-name "GtkSourceDrawSpacesFlags")
+  (import-header "gtksourceview/gtksourceview-typebuiltins.h")
+  (gtype-id "GTK_TYPE_SOURCE_DRAW_SPACES_FLAGS")
+  (values
+    '("space" "GTK_SOURCE_DRAW_SPACES_SPACE")
+    '("tab" "GTK_SOURCE_DRAW_SPACES_TAB")
+    '("newline" "GTK_SOURCE_DRAW_SPACES_NEWLINE")
+; added later?
+;    '("nbsp" "GTK_SOURCE_DRAW_SPACES_NBSP")
+    '("all" "GTK_SOURCE_DRAW_SPACES_ALL")
+  )
+)
+
diff --git a/src/defs/GtkSourceLanguage.defs b/src/defs/GtkSourceLanguage.defs
new file mode 100644
index 0000000..2e1486a
--- /dev/null
+++ b/src/defs/GtkSourceLanguage.defs
@@ -0,0 +1,68 @@
+(define-object Language
+  (in-module "GtkSourceView")
+  (parent "GObject")
+  (c-name "GtkSourceLanguage")
+  (import-header "gtksourceview/gtksourcelanguage.h")
+  (gtype-id "GTK_TYPE_SOURCE_LANGUAGE")
+)
+
+(define-method get_id
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_id")
+  (return-type "const-gchar*")
+)
+
+(define-method get_name
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_section
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_section")
+  (return-type "const-gchar*")
+)
+
+(define-method get_hidden
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_hidden")
+  (return-type "gboolean")
+)
+
+(define-method get_metadata
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_metadata")
+  (return-type "const-gchar*")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_mime_types
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_mime_types")
+  (return-type "gchar**")
+)
+
+(define-method get_globs
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_globs")
+  (return-type "gchar**")
+)
+
+(define-method get_style_ids
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_style_ids")
+  (return-type "gchar**")
+)
+
+(define-method get_style_name
+  (of-object "GtkSourceLanguage")
+  (c-name "gtk_source_language_get_style_name")
+  (return-type "const-char*")
+  (parameters
+    '("const-char*" "style_id")
+  )
+)
+
diff --git a/src/defs/GtkSourceLanguageManager.defs b/src/defs/GtkSourceLanguageManager.defs
new file mode 100644
index 0000000..109a6cd
--- /dev/null
+++ b/src/defs/GtkSourceLanguageManager.defs
@@ -0,0 +1,60 @@
+(define-object LanguageManager
+  (in-module "GtkSourceView")
+  (parent "GObject")
+  (c-name "GtkSourceLanguageManager")
+  (import-header "gtksourceview/gtksourcelanguagemanager.h")
+  (gtype-id "GTK_TYPE_SOURCE_LANGUAGE_MANAGER")
+)
+
+(define-function gtk_source_language_manager_new
+  (is-constructor-of "GtkSourceLanguageManager")
+  (c-name "gtk_source_language_manager_new")
+  (caller-owns-return #t)
+  (return-type "GtkSourceLanguageManager*")
+)
+
+(define-function get_default
+  (c-name "gtk_source_language_manager_get_default")
+  (return-type "GtkSourceLanguageManager*")
+)
+
+(define-method get_language_ids
+  (of-object "GtkSourceLanguageManager")
+  (c-name "gtk_source_language_manager_get_language_ids")
+  (return-type "const-gchar**")
+)
+
+(define-method get_language
+  (of-object "GtkSourceLanguageManager")
+  (c-name "gtk_source_language_manager_get_language")
+  (return-type "GtkSourceLanguage*")
+  (parameters
+    '("const-gchar*" "id")
+  )
+)
+
+(define-method get_search_path
+  (of-object "GtkSourceLanguageManager")
+  (c-name "gtk_source_language_manager_get_search_path")
+  (return-type "const-gchar**")
+)
+
+(define-method set_search_path
+  (of-object "GtkSourceLanguageManager")
+  (c-name "gtk_source_language_manager_set_search_path")
+  (return-type "none")
+  (parameters
+    '("gchar**" "dirs")
+  )
+)
+
+(define-method guess_language
+  (of-object "GtkSourceLanguageManager")
+  (c-name "gtk_source_language_manager_guess_language")
+  (return-type "GtkSourceLanguage*")
+  (parameters
+    '("const-gchar*" "filename" (default "NULL") (null-ok))
+    '("const-gchar*" "content_type" (default "NULL") (null-ok))
+  )
+)
+
diff --git a/src/defs/GtkSourceMark.defs b/src/defs/GtkSourceMark.defs
new file mode 100644
index 0000000..db74034
--- /dev/null
+++ b/src/defs/GtkSourceMark.defs
@@ -0,0 +1,43 @@
+(define-object Mark
+  (in-module "GtkSourceView")
+  (parent "GtkTextMark")
+  (c-name "GtkSourceMark")
+  (import-header "gtksourceview/gtksourcemark.h")
+  (gtype-id "GTK_TYPE_SOURCE_MARK")
+)
+
+(define-function gtk_source_mark_new
+  (is-constructor-of "GtkSourceMark")
+  (c-name "gtk_source_mark_new")
+  (caller-owns-return #t)
+  (return-type "GtkSourceMark*")
+  (parameters
+    '("const-gchar*" "name" (null-ok))
+    '("const-gchar*" "category")
+  )
+)
+
+(define-method get_category
+  (of-object "GtkSourceMark")
+  (c-name "gtk_source_mark_get_category")
+  (return-type "const-gchar*")
+)
+
+(define-method next
+  (of-object "GtkSourceMark")
+  (c-name "gtk_source_mark_next")
+  (return-type "GtkSourceMark*")
+  (parameters
+    '("const-gchar*" "category" (null-ok))
+  )
+)
+
+(define-method prev
+  (of-object "GtkSourceMark")
+  (c-name "gtk_source_mark_prev")
+  (return-type "GtkSourceMark*")
+  (parameters
+    '("const-gchar*" "category" (null-ok))
+  )
+)
+
diff --git a/src/defs/GtkSourcePrintCompositor.defs b/src/defs/GtkSourcePrintCompositor.defs
new file mode 100644
index 0000000..50a03f0
--- /dev/null
+++ b/src/defs/GtkSourcePrintCompositor.defs
@@ -0,0 +1,309 @@
+(define-object PrintCompositor
+  (in-module "GtkSourceView")
+  (parent "GObject")
+  (c-name "GtkSourcePrintCompositor")
+  (import-header "gtksourceview/gtksourceprintcompositor.h")
+  (gtype-id "GTK_TYPE_SOURCE_PRINT_COMPOSITOR")
+)
+
+(define-function gtk_source_print_compositor_new
+  (is-constructor-of "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_new")
+  (caller-owns-return #t)
+  (return-type "GtkSourcePrintCompositor*")
+  (parameters
+    '("GtkSourceBuffer*" "buffer")
+  )
+)
+
+(define-method get_buffer
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_buffer")
+  (return-type "GtkSourceBuffer*")
+)
+
+(define-method set_tab_width
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_tab_width")
+  (return-type "none")
+  (parameters
+    '("guint" "width")
+  )
+)
+
+(define-method get_tab_width
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_tab_width")
+  (return-type "guint")
+)
+
+(define-method set_wrap_mode
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_wrap_mode")
+  (return-type "none")
+  (parameters
+    '("GtkWrapMode" "wrap_mode")
+  )
+)
+
+(define-method get_wrap_mode
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_wrap_mode")
+  (return-type "GtkWrapMode")
+)
+
+(define-method set_highlight_syntax
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_highlight_syntax")
+  (return-type "none")
+  (parameters
+    '("gboolean" "highlight")
+  )
+)
+
+(define-method get_highlight_syntax
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_highlight_syntax")
+  (return-type "gboolean")
+)
+
+(define-method set_print_line_numbers
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_print_line_numbers")
+  (return-type "none")
+  (parameters
+    '("guint" "interval")
+  )
+)
+
+(define-method get_print_line_numbers
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_print_line_numbers")
+  (return-type "guint")
+)
+
+(define-method set_body_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_body_font_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "font_name")
+  )
+)
+
+(define-method get_body_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_body_font_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_line_numbers_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_line_numbers_font_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "font_name" (null-ok))
+  )
+)
+
+(define-method get_line_numbers_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_line_numbers_font_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_header_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_header_font_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "font_name" (null-ok))
+  )
+)
+
+(define-method get_header_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_header_font_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method set_footer_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_footer_font_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "font_name" (null-ok))
+  )
+)
+
+(define-method get_footer_font_name
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_footer_font_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method get_top_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_top_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_top_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_top_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_bottom_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_bottom_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_bottom_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_bottom_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_left_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_left_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_left_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_left_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method get_right_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_right_margin")
+  (return-type "gdouble")
+  (parameters
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_right_margin
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_right_margin")
+  (return-type "none")
+  (parameters
+    '("gdouble" "margin")
+    '("GtkUnit" "unit")
+  )
+)
+
+(define-method set_print_header
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_print_header")
+  (return-type "none")
+  (parameters
+    '("gboolean" "print")
+  )
+)
+
+(define-method get_print_header
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_print_header")
+  (return-type "gboolean")
+)
+
+(define-method set_print_footer
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_print_footer")
+  (return-type "none")
+  (parameters
+    '("gboolean" "print")
+  )
+)
+
+(define-method get_print_footer
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_print_footer")
+  (return-type "gboolean")
+)
+
+(define-method set_header_format
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_header_format")
+  (return-type "none")
+  (parameters
+    '("gboolean" "separator")
+    '("const-gchar*" "left" (null-ok))
+    '("const-gchar*" "center" (null-ok))
+    '("const-gchar*" "right" (null-ok))
+  )
+)
+
+(define-method set_footer_format
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_set_footer_format")
+  (return-type "none")
+  (parameters
+    '("gboolean" "separator")
+    '("const-gchar*" "left" (null-ok))
+    '("const-gchar*" "center" (null-ok))
+    '("const-gchar*" "right" (null-ok))
+  )
+)
+
+(define-method get_n_pages
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_n_pages")
+  (return-type "gint")
+)
+
+(define-method paginate
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_paginate")
+  (return-type "gboolean")
+  (parameters
+    '("GtkPrintContext*" "context")
+  )
+)
+
+(define-method get_pagination_progress
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_get_pagination_progress")
+  (return-type "gdouble")
+)
+
+(define-method draw_page
+  (of-object "GtkSourcePrintCompositor")
+  (c-name "gtk_source_print_compositor_draw_page")
+  (return-type "none")
+  (parameters
+    '("GtkPrintContext*" "context")
+    '("gint" "page_nr")
+  )
+)
+
diff --git a/src/defs/GtkSourceSearchFlags.defs b/src/defs/GtkSourceSearchFlags.defs
new file mode 100644
index 0000000..9977106
--- /dev/null
+++ b/src/defs/GtkSourceSearchFlags.defs
@@ -0,0 +1,6 @@
+(define-flags SearchFlags
+  (in-module "GtkSourceView")
+  (c-name "GtkSourceSearchFlags")
+  (gtype-id "GTK_TYPE_SOURCE_SEARCH_FLAGS")
+)
+
diff --git a/src/defs/GtkSourceSmartHomeEndType.defs b/src/defs/GtkSourceSmartHomeEndType.defs
new file mode 100644
index 0000000..b964ec2
--- /dev/null
+++ b/src/defs/GtkSourceSmartHomeEndType.defs
@@ -0,0 +1,6 @@
+(define-enum SmartHomeEndType
+  (in-module "GtkSourceView")
+  (c-name "GtkSourceSmartHomeEndType")
+  (gtype-id "GTK_TYPE_SOURCE_SMART_HOME_END_TYPE")
+)
+
diff --git a/src/defs/GtkSourceStyle.defs b/src/defs/GtkSourceStyle.defs
new file mode 100644
index 0000000..f0ad8f0
--- /dev/null
+++ b/src/defs/GtkSourceStyle.defs
@@ -0,0 +1,14 @@
+(define-object Style
+  (in-module "GtkSourceView")
+  (parent "GObject")
+  (c-name "GtkSourceStyle")
+  (import-header "gtksourceview/gtksourcestyle.h")
+  (gtype-id "GTK_TYPE_SOURCE_STYLE")
+)
+
+(define-method copy
+  (of-object "GtkSourceStyle")
+  (c-name "gtk_source_style_copy")
+  (return-type "GtkSourceStyle*")
+)
+
diff --git a/src/defs/GtkSourceStyleScheme.defs b/src/defs/GtkSourceStyleScheme.defs
new file mode 100644
index 0000000..f094982
--- /dev/null
+++ b/src/defs/GtkSourceStyleScheme.defs
@@ -0,0 +1,47 @@
+(define-object StyleScheme
+  (in-module "GtkSourceView")
+  (parent "GObject")
+  (c-name "GtkSourceStyleScheme")
+  (import-header "gtksourceview/gtksourcestylescheme.h")
+  (gtype-id "GTK_TYPE_SOURCE_STYLE_SCHEME")
+)
+
+(define-method get_id
+  (of-object "GtkSourceStyleScheme")
+  (c-name "gtk_source_style_scheme_get_id")
+  (return-type "const-gchar*")
+)
+
+(define-method get_name
+  (of-object "GtkSourceStyleScheme")
+  (c-name "gtk_source_style_scheme_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_description
+  (of-object "GtkSourceStyleScheme")
+  (c-name "gtk_source_style_scheme_get_description")
+  (return-type "const-gchar*")
+)
+
+(define-method get_authors
+  (of-object "GtkSourceStyleScheme")
+  (c-name "gtk_source_style_scheme_get_authors")
+  (return-type "const-gchar**")
+)
+
+(define-method get_filename
+  (of-object "GtkSourceStyleScheme")
+  (c-name "gtk_source_style_scheme_get_filename")
+  (return-type "const-gchar*")
+)
+
+(define-method get_style
+  (of-object "GtkSourceStyleScheme")
+  (c-name "gtk_source_style_scheme_get_style")
+  (return-type "GtkSourceStyle*")
+  (parameters
+    '("const-gchar*" "style_id")
+  )
+)
+
diff --git a/src/defs/GtkSourceStyleSchemeManager.defs b/src/defs/GtkSourceStyleSchemeManager.defs
new file mode 100644
index 0000000..251d056
--- /dev/null
+++ b/src/defs/GtkSourceStyleSchemeManager.defs
@@ -0,0 +1,75 @@
+(define-object StyleSchemeManager
+  (in-module "GtkSourceView")
+  (parent "GObject")
+  (c-name "GtkSourceStyleSchemeManager")
+  (import-header "gtksourceview/gtksourcestyleschememanager.h")
+  (gtype-id "GTK_TYPE_SOURCE_STYLE_SCHEME_MANAGER")
+)
+
+(define-function gtk_source_style_scheme_manager_new
+  (is-constructor-of "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_new")
+  (caller-owns-return #t)
+  (return-type "GtkSourceStyleSchemeManager*")
+)
+
+
+(define-function get_default
+  (c-name "gtk_source_style_scheme_manager_get_default")
+  (return-type "GtkSourceStyleSchemeManager*")
+)
+
+(define-method set_search_path
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_set_search_path")
+  (return-type "none")
+  (parameters
+    '("gchar**" "path")
+  )
+)
+
+(define-method get_search_path
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_get_search_path")
+  (return-type "const-gchar**")
+)
+
+(define-method append_search_path
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_append_search_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-method prepend_search_path
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_prepend_search_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-method get_scheme_ids
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_get_scheme_ids")
+  (return-type "const-gchar**")
+)
+
+(define-method get_scheme
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_get_scheme")
+  (return-type "GtkSourceStyleScheme*")
+  (parameters
+    '("const-gchar*" "scheme_id")
+  )
+)
+
+(define-method force_rescan
+  (of-object "GtkSourceStyleSchemeManager")
+  (c-name "gtk_source_style_scheme_manager_force_rescan")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkSourceView.defs b/src/defs/GtkSourceView.defs
new file mode 100644
index 0000000..323f4c3
--- /dev/null
+++ b/src/defs/GtkSourceView.defs
@@ -0,0 +1,215 @@
+(define-object SourceView
+  (in-module "GtkSourceView")
+  (parent "GtkTextView")
+  (import-header "gtksourceview/gtksourceview.h")
+  (c-name "GtkSourceView")
+  (gtype-id "GTK_TYPE_SOURCE_VIEW")
+)
+
+(define-function gtk_source_view_new
+  (is-constructor-of "GtkSourceView")
+  (c-name "gtk_source_view_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_source_view_new_with_buffer
+  (is-constructor-of "GtkSourceView")
+  (c-name "gtk_source_view_new_with_buffer")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkSourceBuffer*" "buffer")
+  )
+)
+
+(define-method set_show_line_numbers
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_show_line_numbers")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show")
+  )
+)
+
+(define-method get_show_line_numbers
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_show_line_numbers")
+  (return-type "gboolean")
+)
+
+(define-method set_indent_width
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_indent_width")
+  (return-type "none")
+  (parameters
+    '("guint" "width")
+  )
+)
+
+(define-method get_indent_width
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_indent_width")
+  (return-type "guint")
+)
+
+(define-method set_tab_width
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_tab_width")
+  (return-type "none")
+  (parameters
+    '("guint" "width")
+  )
+)
+
+(define-method get_tab_width
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_tab_width")
+  (return-type "guint")
+)
+
+(define-method set_auto_indent
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_auto_indent")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enable")
+  )
+)
+
+(define-method get_auto_indent
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_auto_indent")
+  (return-type "gboolean")
+)
+
+(define-method set_insert_spaces_instead_of_tabs
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_insert_spaces_instead_of_tabs")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enable")
+  )
+)
+
+(define-method get_insert_spaces_instead_of_tabs
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_insert_spaces_instead_of_tabs")
+  (return-type "gboolean")
+)
+
+(define-method set_indent_on_tab
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_indent_on_tab")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enable")
+  )
+)
+
+(define-method get_indent_on_tab
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_indent_on_tab")
+  (return-type "gboolean")
+)
+
+(define-method set_highlight_current_line
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_highlight_current_line")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show")
+  )
+)
+
+(define-method get_highlight_current_line
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_highlight_current_line")
+  (return-type "gboolean")
+)
+
+(define-method set_show_right_margin
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_show_right_margin")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show")
+  )
+)
+
+(define-method get_show_right_margin
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_show_right_margin")
+  (return-type "gboolean")
+)
+
+(define-method set_right_margin_position
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_right_margin_position")
+  (return-type "none")
+  (parameters
+    '("guint" "pos")
+  )
+)
+
+(define-method get_right_margin_position
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_right_margin_position")
+  (return-type "guint")
+)
+
+(define-method set_show_line_marks
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_show_line_marks")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show")
+  )
+)
+
+(define-method get_show_line_marks
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_show_line_marks")
+  (return-type "gboolean")
+)
+
+(define-method set_smart_home_end
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_smart_home_end")
+  (return-type "none")
+  (parameters
+    '("GtkSourceSmartHomeEndType" "smart_he")
+  )
+)
+
+(define-method get_smart_home_end
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_smart_home_end")
+  (return-type "GtkSourceSmartHomeEndType")
+)
+
+(define-method set_draw_spaces
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_set_draw_spaces")
+  (return-type "none")
+  (parameters
+    '("GtkSourceDrawSpacesFlags" "flags")
+  )
+)
+
+(define-method get_draw_spaces
+  (of-object "GtkSourceView")
+  (c-name "gtk_source_view_get_draw_spaces")
+  (return-type "GtkSourceDrawSpacesFlags")
+)
+
+(define-virtual undo
+  (of-object "GtkSourceView")
+  (return-type "none")
+)
+
+(define-virtual redo
+  (of-object "GtkSourceView")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkSpell.defs b/src/defs/GtkSpell.defs
new file mode 100644
index 0000000..679a73a
--- /dev/null
+++ b/src/defs/GtkSpell.defs
@@ -0,0 +1,51 @@
+;; This is custom written for our wrapper around the GtkSpell library.
+
+(define-boxed Spell
+  (unnecessary)
+  (in-module "Gtk")
+  (c-name "GtkSpell")
+  (import-header "gtkspell/gtkspell.h")
+)
+
+(define-function spell_new_attach
+  (is-constructor-of "GtkSpell")
+  (c-name "gtkspell_new_attach")
+  (return-type "GtkSpell*")
+  (parameters
+    '("GtkTextView*" "view")
+    '("const-gchar*" "lang" (null-ok))
+    '("GError**" "error")
+  )
+)
+
+(define-method detach
+  (of-object "GtkSpell")
+  (c-name "gtkspell_detach")
+  (return-type "none")
+)
+
+(define-method set_language
+  (of-object "GtkSpell")
+  (c-name "gtkspell_set_language")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "lang" (null-ok))
+    '("GError**" "error")
+  )
+)
+
+(define-method recheck_all
+  (of-object "GtkSpell")
+  (c-name "gtkspell_recheck_all")
+  (return-type "none")
+)
+
+(define-function get_from_text_view
+  (of-object "GtkSpell")
+  (c-name "gtkspell_get_from_text_view")
+  (return-type "GtkSpell*")
+  (parameters
+    '("GtkTextView*" "view")
+  )
+)
+
diff --git a/src/defs/GtkSpinButton.defs b/src/defs/GtkSpinButton.defs
new file mode 100644
index 0000000..fabe734
--- /dev/null
+++ b/src/defs/GtkSpinButton.defs
@@ -0,0 +1,242 @@
+(define-object SpinButton
+  (in-module "Gtk")
+  (parent "GtkEntry")
+  (implements "GtkEditable")
+  (implements "GtkCellEditable")
+  (c-name "GtkSpinButton")
+  (gtype-id "GTK_TYPE_SPIN_BUTTON")
+)
+
+(define-method configure
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_configure")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+    '("gdouble" "climb_rate")
+    '("guint" "digits")
+  )
+)
+
+(define-function gtk_spin_button_new
+  (is-constructor-of "GtkSpinButton")
+  (c-name "gtk_spin_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+    '("gdouble" "climb_rate")
+    '("guint" "digits")
+  )
+)
+
+(define-function gtk_spin_button_new_with_range
+  (is-constructor-of "GtkSpinButton")
+  (c-name "gtk_spin_button_new_with_range")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("gdouble" "min")
+    '("gdouble" "max")
+    '("gdouble" "step")
+  )
+)
+
+(define-method set_adjustment
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_adjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method get_adjustment
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_adjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_digits
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_digits")
+  (return-type "none")
+  (parameters
+    '("guint" "digits")
+  )
+)
+
+(define-method get_digits
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_digits")
+  (return-type "guint")
+)
+
+(define-method set_increments
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_increments")
+  (return-type "none")
+  (parameters
+    '("gdouble" "step")
+    '("gdouble" "page")
+  )
+)
+
+(define-method get_increments
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_increments")
+  (return-type "none")
+  (parameters
+    '("gdouble*" "step")
+    '("gdouble*" "page")
+  )
+)
+
+(define-method set_range
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_range")
+  (return-type "none")
+  (parameters
+    '("gdouble" "min")
+    '("gdouble" "max")
+  )
+)
+
+(define-method get_range
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_range")
+  (return-type "none")
+  (parameters
+    '("gdouble*" "min")
+    '("gdouble*" "max")
+  )
+)
+
+(define-method get_value
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_value")
+  (return-type "gdouble")
+)
+
+(define-method get_value_as_int
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_value_as_int")
+  (return-type "gint")
+)
+
+(define-method set_value
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_value")
+  (return-type "none")
+  (parameters
+    '("gdouble" "value")
+  )
+)
+
+(define-method set_update_policy
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_update_policy")
+  (return-type "none")
+  (parameters
+    '("GtkSpinButtonUpdatePolicy" "policy")
+  )
+)
+
+(define-method get_update_policy
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_update_policy")
+  (return-type "guint")
+)
+
+(define-method set_numeric
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_numeric")
+  (return-type "none")
+  (parameters
+    '("gboolean" "numeric")
+  )
+)
+
+(define-method get_numeric
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_numeric")
+  (return-type "gboolean")
+)
+
+(define-method spin
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_spin")
+  (return-type "none")
+  (parameters
+    '("GtkSpinType" "direction")
+    '("gdouble" "increment" (default "1"))
+  )
+)
+
+(define-method set_wrap
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_wrap")
+  (return-type "none")
+  (parameters
+    '("gboolean" "wrap")
+  )
+)
+
+(define-method get_wrap
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_wrap")
+  (return-type "gboolean")
+)
+
+(define-method set_snap_to_ticks
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_set_snap_to_ticks")
+  (return-type "none")
+  (parameters
+    '("gboolean" "snap_to_ticks")
+  )
+)
+
+(define-method get_snap_to_ticks
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_get_snap_to_ticks")
+  (return-type "gboolean")
+)
+
+(define-method update
+  (of-object "GtkSpinButton")
+  (c-name "gtk_spin_button_update")
+  (return-type "none")
+)
+
+(define-virtual input
+  (of-object "GtkSpinButton")
+  (return-type "gint")
+  (parameters
+    '("gdouble*" "new_value")
+  )
+)
+
+(define-virtual output
+  (of-object "GtkSpinButton")
+  (return-type "gint")
+)
+
+(define-virtual value_changed
+  (of-object "GtkSpinButton")
+  (return-type "none")
+)
+
+(define-virtual change_value
+  (of-object "GtkSpinButton")
+  (return-type "none")
+  (parameters
+    '("GtkScrollType" "scroll")
+  )
+)
+
+(define-virtual wrapped
+  (of-object "GtkSpinButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkSpinButtonUpdatePolicy.defs b/src/defs/GtkSpinButtonUpdatePolicy.defs
new file mode 100644
index 0000000..ce6fe49
--- /dev/null
+++ b/src/defs/GtkSpinButtonUpdatePolicy.defs
@@ -0,0 +1,10 @@
+(define-enum SpinButtonUpdatePolicy
+  (in-module "Gtk")
+  (c-name "GtkSpinButtonUpdatePolicy")
+  (gtype-id "GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY")
+  (values
+    '("always" "GTK_UPDATE_ALWAYS")
+    '("if-valid" "GTK_UPDATE_IF_VALID")
+  )
+)
+
diff --git a/src/defs/GtkSpinType.defs b/src/defs/GtkSpinType.defs
new file mode 100644
index 0000000..5c48d7b
--- /dev/null
+++ b/src/defs/GtkSpinType.defs
@@ -0,0 +1,15 @@
+(define-enum SpinType
+  (in-module "Gtk")
+  (c-name "GtkSpinType")
+  (gtype-id "GTK_TYPE_SPIN_TYPE")
+  (values
+    '("step-forward" "GTK_SPIN_STEP_FORWARD")
+    '("step-backward" "GTK_SPIN_STEP_BACKWARD")
+    '("page-forward" "GTK_SPIN_PAGE_FORWARD")
+    '("page-backward" "GTK_SPIN_PAGE_BACKWARD")
+    '("home" "GTK_SPIN_HOME")
+    '("end" "GTK_SPIN_END")
+    '("user-defined" "GTK_SPIN_USER_DEFINED")
+  )
+)
+
diff --git a/src/defs/GtkSpinner.defs b/src/defs/GtkSpinner.defs
new file mode 100644
index 0000000..fb9dee6
--- /dev/null
+++ b/src/defs/GtkSpinner.defs
@@ -0,0 +1,26 @@
+(define-object Spinner
+  (in-module "Gtk")
+  (parent "GtkDrawingArea")
+  (c-name "GtkSpinner")
+  (gtype-id "GTK_TYPE_SPINNER")
+)
+
+(define-function gtk_spinner_new
+  (c-name "gtk_spinner_new")
+  (is-constructor-of "GtkSpinner")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method start
+  (of-object "GtkSpinner")
+  (c-name "gtk_spinner_start")
+  (return-type "none")
+)
+
+(define-method stop
+  (of-object "GtkSpinner")
+  (c-name "gtk_spinner_stop")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkStateFlags.defs b/src/defs/GtkStateFlags.defs
new file mode 100644
index 0000000..9fc10d3
--- /dev/null
+++ b/src/defs/GtkStateFlags.defs
@@ -0,0 +1,14 @@
+(define-flags StateFlags
+  (in-module "Gtk")
+  (c-name "GtkStateFlags")
+  (values
+    '("normal" "GTK_STATE_NORMAL")
+    '("active" "GTK_STATE_ACTIVE")
+    '("prelight" "GTK_STATE_PRELIGHT")
+    '("selected" "GTK_STATE_SELECTED")
+    '("insensitive" "GTK_STATE_INSENSITIVE")
+    '("inconsistent" "GTK_STATE_INCONSISTENT")
+    '("focused" "GTK_STATE_FOCUSED")
+  )
+)
+
diff --git a/src/defs/GtkStatusIcon.defs b/src/defs/GtkStatusIcon.defs
new file mode 100644
index 0000000..cc91033
--- /dev/null
+++ b/src/defs/GtkStatusIcon.defs
@@ -0,0 +1,207 @@
+(define-object StatusIcon
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkStatusIcon")
+  (gtype-id "GTK_TYPE_STATUS_ICON")
+)
+
+(define-function status_icon_new
+  (is-constructor-of "GtkStatusIcon")
+  (c-name "gtk_status_icon_new")
+  (caller-owns-return #t)
+  (return-type "GtkStatusIcon*")
+)
+
+(define-function status_icon_new_from_pixbuf
+  (is-constructor-of "GtkStatusIcon")
+  (c-name "gtk_status_icon_new_from_pixbuf")
+  (caller-owns-return #t)
+  (return-type "GtkStatusIcon*")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-function status_icon_new_from_file
+  (is-constructor-of "GtkStatusIcon")
+  (c-name "gtk_status_icon_new_from_file")
+  (caller-owns-return #t)
+  (return-type "GtkStatusIcon*")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-function status_icon_new_from_stock
+  (is-constructor-of "GtkStatusIcon")
+  (c-name "gtk_status_icon_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkStatusIcon*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-function status_icon_new_from_icon_name
+  (is-constructor-of "GtkStatusIcon")
+  (c-name "gtk_status_icon_new_from_icon_name")
+  (caller-owns-return #t)
+  (return-type "GtkStatusIcon*")
+  (parameters
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-method set_from_pixbuf
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_from_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf" (null-ok))
+  )
+)
+
+(define-method set_from_file
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_from_file")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-method set_from_stock
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_from_stock")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method set_from_icon_name
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_from_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-method get_storage_type
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_storage_type")
+  (return-type "GtkImageType")
+)
+
+(define-method get_pixbuf
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method get_stock
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_stock")
+  (return-type "const-gchar*")
+)
+
+(define-method get_icon_name
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_icon_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_size
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_size")
+  (return-type "gint")
+)
+
+(define-method set_name
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method set_tooltip_text
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_tooltip_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text" (null-ok))
+  )
+)
+
+(define-method set_visible
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method get_visible
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method is_embedded
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_is_embedded")
+  (return-type "gboolean")
+)
+
+(define-method get_geometry
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_geometry")
+  (return-type "gboolean")
+  (parameters
+    '("GdkScreen**" "screen")
+    '("GdkRectangle*" "area")
+    '("GtkOrientation*" "orientation")
+  )
+)
+
+(define-method set_title
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_title
+  (of-object "GtkStatusIcon")
+  (c-name "gtk_status_icon_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-virtual activate
+  (of-object "GtkStatusIcon")
+  (return-type "none")
+)
+
+(define-virtual popup_menu
+  (of-object "GtkStatusIcon")
+  (return-type "none")
+  (parameters
+    '("guint" "button")
+    '("guint32" "activate_time")
+  )
+)
+
+(define-virtual size_changed
+  (of-object "GtkStatusIcon")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "size")
+  )
+)
+
diff --git a/src/defs/GtkStatusbar.defs b/src/defs/GtkStatusbar.defs
new file mode 100644
index 0000000..dc310b6
--- /dev/null
+++ b/src/defs/GtkStatusbar.defs
@@ -0,0 +1,76 @@
+(define-object Statusbar
+  (in-module "Gtk")
+  (parent "GtkHBox")
+  (c-name "GtkStatusbar")
+  (gtype-id "GTK_TYPE_STATUSBAR")
+)
+
+(define-function gtk_statusbar_new
+  (is-constructor-of "GtkStatusbar")
+  (c-name "gtk_statusbar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method get_context_id
+  (of-object "GtkStatusbar")
+  (c-name "gtk_statusbar_get_context_id")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "context_description")
+  )
+)
+
+(define-method push
+  (of-object "GtkStatusbar")
+  (c-name "gtk_statusbar_push")
+  (return-type "guint")
+  (parameters
+    '("guint" "context_id")
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method pop
+  (of-object "GtkStatusbar")
+  (c-name "gtk_statusbar_pop")
+  (return-type "none")
+  (parameters
+    '("guint" "context_id")
+  )
+)
+
+(define-method remove
+  (of-object "GtkStatusbar")
+  (c-name "gtk_statusbar_remove")
+  (return-type "none")
+  (parameters
+    '("guint" "context_id")
+    '("guint" "message_id")
+  )
+)
+
+(define-method get_message_area
+  (of-object "GtkStatusbar")
+  (c-name "gtk_statusbar_get_message_area")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual text_pushed
+  (of-object "GtkStatusbar")
+  (return-type "none")
+  (parameters
+    '("guint" "context_id")
+    '("const-gchar*" "text")
+  )
+)
+
+(define-virtual text_popped
+  (of-object "GtkStatusbar")
+  (return-type "none")
+  (parameters
+    '("guint" "context_id")
+    '("const-gchar*" "text")
+  )
+)
+
diff --git a/src/defs/GtkStockItem.defs b/src/defs/GtkStockItem.defs
new file mode 100644
index 0000000..0e2791d
--- /dev/null
+++ b/src/defs/GtkStockItem.defs
@@ -0,0 +1,13 @@
+(define-method copy
+  (of-object "GtkStockItem")
+  (c-name "gtk_stock_item_copy")
+  (caller-owns-return #t)
+  (return-type "GtkStockItem*")
+)
+
+(define-method free
+  (of-object "GtkStockItem")
+  (c-name "gtk_stock_item_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkStyleContext.defs b/src/defs/GtkStyleContext.defs
new file mode 100644
index 0000000..e6a6864
--- /dev/null
+++ b/src/defs/GtkStyleContext.defs
@@ -0,0 +1,131 @@
+(define-object StyleContext
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkStyleContext")
+  (gtype-id "GTK_TYPE_STYLE_CONTEXT")
+)
+
+(define-function gtk_style_context_new
+  (is-constructor-of "GtkStyleContext")
+  (c-name "gtk_style_context_new")
+  (caller-owns-return #t)
+  (return-type "GtkStyleContext*")
+)
+
+(define-method get_screen
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_get_screen")
+  (return-type "GdkScreen*")
+)
+
+(define-method set_screen
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_set_screen")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method get_state
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_get_state")
+  (return-type "GtkStateFlags")
+)
+
+(define-method set_state
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_set_state")
+  (return-type "none")
+  (parameters
+    '("GtkStateFlags" "flags")
+  )
+)
+
+(define-method restore
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_restore")
+  (return-type "none")
+)
+
+(define-method save
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_save")
+  (return-type "none")
+)
+
+(define-method add_class
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_add_class")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "class_name")
+  )
+)
+
+(define-method remove_class
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_remove_class")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "class_name")
+  )
+)
+
+(define-method has_class
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_has_class")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "class_name")
+  )
+)
+
+(define-method add_region
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_add_region")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "region_name")
+    '("GtkRegionFlags" "flags")
+  )
+)
+
+(define-method remove_region
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_remove_region")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "region_name")
+  )
+)
+
+(define-method get_junction_sides
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_get_junction_sides")
+  (return-type "GtkJunctionSides")
+)
+
+(define-method set_junction_sides
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_set_junction_sides")
+  (return-type "none")
+  (parameters
+    '("GtkJunctionSides" "sides")
+  )
+)
+
+(define-method get_direction
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_get_direction")
+  (return-type "GtkTextDirection")
+)
+
+(define-method set_direction
+  (of-object "GtkStyleContext")
+  (c-name "gtk_style_context_set_direction")
+  (return-type "none")
+  (parameters
+    '("GtkTextDirection" "direction")
+  )
+)
diff --git a/src/defs/GtkSwitch.defs b/src/defs/GtkSwitch.defs
new file mode 100644
index 0000000..fdb1f3d
--- /dev/null
+++ b/src/defs/GtkSwitch.defs
@@ -0,0 +1,33 @@
+(define-object Switch
+  (in-module "Gtk")
+  (parent "GtkWidget")
+  (c-name "GtkSwitch")
+  (gtype-id "GTK_TYPE_SWITCH")
+)
+
+(define-function gtk_switch_new
+  (is-constructor-of "GtkSwitch")
+  (c-name "gtk_switch_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method set_active
+  (of-object "GtkSwitch")
+  (c-name "gtk_switch_set_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_active")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkSwitch")
+  (c-name "gtk_switch_get_active")
+  (return-type "gboolean")
+)
+
+(define-virtual notify_activated
+  (of-object "GtkSwitch")
+  (return-type "none")
+)
diff --git a/src/defs/GtkTable.defs b/src/defs/GtkTable.defs
new file mode 100644
index 0000000..723fd54
--- /dev/null
+++ b/src/defs/GtkTable.defs
@@ -0,0 +1,142 @@
+(define-object Table
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkTable")
+  (gtype-id "GTK_TYPE_TABLE")
+)
+
+(define-function gtk_table_new
+  (is-constructor-of "GtkTable")
+  (c-name "gtk_table_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("guint" "n_rows")
+    '("guint" "n_columns")
+    '("gboolean" "homogeneous")
+  )
+)
+
+(define-method resize
+  (of-object "GtkTable")
+  (c-name "gtk_table_resize")
+  (return-type "none")
+  (parameters
+    '("guint" "rows")
+    '("guint" "columns")
+  )
+)
+
+(define-method attach
+  (of-object "GtkTable")
+  (c-name "gtk_table_attach")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("guint" "left_attach")
+    '("guint" "right_attach")
+    '("guint" "top_attach")
+    '("guint" "bottom_attach")
+    '("GtkAttachOptions" "xoptions" (default "GTK_EXPAND|GTK_FILL"))
+    '("GtkAttachOptions" "yoptions" (default "GTK_EXPAND|GTK_FILL"))
+    '("guint" "xpadding" (default "0"))
+    '("guint" "ypadding" (default "0"))
+  )
+)
+
+(define-method attach_defaults
+  (of-object "GtkTable")
+  (c-name "gtk_table_attach_defaults")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("guint" "left_attach")
+    '("guint" "right_attach")
+    '("guint" "top_attach")
+    '("guint" "bottom_attach")
+  )
+)
+
+(define-method set_row_spacing
+  (of-object "GtkTable")
+  (c-name "gtk_table_set_row_spacing")
+  (return-type "none")
+  (parameters
+    '("guint" "row")
+    '("guint" "spacing")
+  )
+)
+
+(define-method get_row_spacing
+  (of-object "GtkTable")
+  (c-name "gtk_table_get_row_spacing")
+  (return-type "guint")
+  (parameters
+    '("guint" "row")
+  )
+)
+
+(define-method set_col_spacing
+  (of-object "GtkTable")
+  (c-name "gtk_table_set_col_spacing")
+  (return-type "none")
+  (parameters
+    '("guint" "column")
+    '("guint" "spacing")
+  )
+)
+
+(define-method get_col_spacing
+  (of-object "GtkTable")
+  (c-name "gtk_table_get_col_spacing")
+  (return-type "guint")
+  (parameters
+    '("guint" "column")
+  )
+)
+
+(define-method set_row_spacings
+  (of-object "GtkTable")
+  (c-name "gtk_table_set_row_spacings")
+  (return-type "none")
+  (parameters
+    '("guint" "spacing")
+  )
+)
+
+(define-method get_default_row_spacing
+  (of-object "GtkTable")
+  (c-name "gtk_table_get_default_row_spacing")
+  (return-type "guint")
+)
+
+(define-method set_col_spacings
+  (of-object "GtkTable")
+  (c-name "gtk_table_set_col_spacings")
+  (return-type "none")
+  (parameters
+    '("guint" "spacing")
+  )
+)
+
+(define-method get_default_col_spacing
+  (of-object "GtkTable")
+  (c-name "gtk_table_get_default_col_spacing")
+  (return-type "guint")
+)
+
+(define-method set_homogeneous
+  (of-object "GtkTable")
+  (c-name "gtk_table_set_homogeneous")
+  (return-type "none")
+  (parameters
+    '("gboolean" "homogeneous")
+  )
+)
+
+(define-method get_homogeneous
+  (of-object "GtkTable")
+  (c-name "gtk_table_get_homogeneous")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkTargetFlags.defs b/src/defs/GtkTargetFlags.defs
new file mode 100644
index 0000000..ca15b43
--- /dev/null
+++ b/src/defs/GtkTargetFlags.defs
@@ -0,0 +1,10 @@
+(define-flags TargetFlags
+  (in-module "Gtk")
+  (c-name "GtkTargetFlags")
+  (gtype-id "GTK_TYPE_TARGET_FLAGS")
+  (values
+    '("app" "GTK_TARGET_SAME_APP")
+    '("widget" "GTK_TARGET_SAME_WIDGET")
+  )
+)
+
diff --git a/src/defs/GtkTargetList.defs b/src/defs/GtkTargetList.defs
new file mode 100644
index 0000000..def7837
--- /dev/null
+++ b/src/defs/GtkTargetList.defs
@@ -0,0 +1,69 @@
+(define-function gtk_target_list_new
+  (is-constructor-of "GtkTargetList")
+  (c-name "gtk_target_list_new")
+  (caller-owns-return #t)
+  (return-type "GtkTargetList*")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("guint" "ntargets")
+  )
+)
+
+(define-method ref
+  (of-object "GtkTargetList")
+  (c-name "gtk_target_list_ref")
+  (return-type "none")
+)
+
+(define-method unref
+  (of-object "GtkTargetList")
+  (c-name "gtk_target_list_unref")
+  (return-type "none")
+)
+
+(define-method add
+  (of-object "GtkTargetList")
+  (c-name "gtk_target_list_add")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "target")
+    '("guint" "flags")
+    '("guint" "info")
+  )
+)
+
+(define-method add_table
+  (of-object "GtkTargetList")
+  (c-name "gtk_target_list_add_table")
+  (return-type "none")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("guint" "ntargets")
+  )
+)
+
+(define-method remove
+  (of-object "GtkTargetList")
+  (c-name "gtk_target_list_remove")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "target")
+  )
+)
+
+(define-method find
+  (of-object "GtkTargetList")
+  (c-name "gtk_target_list_find")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "target")
+    '("guint*" "info")
+  )
+)
+
+(define-boxed TargetList
+  (in-module "Gtk")
+  (c-name "GtkTargetList")
+  (gtype-id "GTK_TYPE_TARGET_LIST")
+)
+
diff --git a/src/defs/GtkTearoffMenuItem.defs b/src/defs/GtkTearoffMenuItem.defs
new file mode 100644
index 0000000..086469b
--- /dev/null
+++ b/src/defs/GtkTearoffMenuItem.defs
@@ -0,0 +1,14 @@
+(define-object TearoffMenuItem
+  (in-module "Gtk")
+  (parent "GtkMenuItem")
+  (c-name "GtkTearoffMenuItem")
+  (gtype-id "GTK_TYPE_TEAROFF_MENU_ITEM")
+)
+
+(define-function gtk_tearoff_menu_item_new
+  (is-constructor-of "GtkTearoffMenuItem")
+  (c-name "gtk_tearoff_menu_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkTest.defs b/src/defs/GtkTest.defs
new file mode 100644
index 0000000..a21326a
--- /dev/null
+++ b/src/defs/GtkTest.defs
@@ -0,0 +1,27 @@
+;; another hand written .defs file. GtkTest isn't a GBoxed, in fact, it isn't
+;; anything. No need to declare an Object.
+
+(define-boxed Test
+  (in-module "Gtk")
+  (c-name "GtkTest")
+)
+
+(define-method widget_click
+  (of-object "GtkWidget")
+  (c-name "gtk_test_widget_click")
+  (return-type "gboolean")
+  (parameters
+    '("GdkMouseButton" "button")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-method widget_send_key
+  (of-object "GtkWidget")
+  (c-name "gtk_test_widget_send_key")
+  (return-type "gboolean")
+  (parameters
+    '("GdkKeyval" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
diff --git a/src/defs/GtkTextAppearance.defs b/src/defs/GtkTextAppearance.defs
new file mode 100644
index 0000000..9818bcf
--- /dev/null
+++ b/src/defs/GtkTextAppearance.defs
@@ -0,0 +1,17 @@
+(define-boxed TextAppearance
+  (in-module "Gtk")
+  (c-name "GtkTextAppearance")
+  (fields
+    '("GdkColor" "bg_color")
+    '("GdkColor" "fg_color")
+    '("GdkBitmap*" "bg_stipple")
+    '("GdkBitmap*" "fg_stipple")
+    '("gint" "rise")
+    '("guint" "underline")
+    '("guint" "strikethrough")
+    '("guint" "draw_bg")
+    '("guint" "inside_selection")
+    '("guint" "is_text")
+  )
+)
+
diff --git a/src/defs/GtkTextAttributes.defs b/src/defs/GtkTextAttributes.defs
new file mode 100644
index 0000000..821b511
--- /dev/null
+++ b/src/defs/GtkTextAttributes.defs
@@ -0,0 +1,60 @@
+(define-boxed TextAttributes
+  (in-module "Gtk")
+  (c-name "GtkTextAttributes")
+  (gtype-id "GTK_TYPE_TEXT_ATTRIBUTES")
+  (fields
+    '("GtkTextAppearance" "appearance")
+    '("GtkJustification" "justification")
+    '("GtkTextDirection" "direction")
+    '("PangoFontDescription*" "font")
+    '("gdouble" "font_scale")
+    '("gint" "left_margin")
+    '("gint" "indent")
+    '("gint" "right_margin")
+    '("gint" "pixels_above_lines")
+    '("gint" "pixels_below_lines")
+    '("gint" "pixels_inside_wrap")
+    '("PangoTabArray*" "tabs")
+    '("GtkWrapMode" "wrap_mode")
+    '("PangoLanguage*" "language")
+    '("guint" "invisible")
+    '("guint" "bg_full_height")
+    '("guint" "editable")
+  )
+)
+
+(define-function gtk_text_attributes_new
+  (is-constructor-of "GtkTextAttributes")
+  (c-name "gtk_text_attributes_new")
+  (caller-owns-return #t)
+  (return-type "GtkTextAttributes*")
+)
+
+(define-method copy
+  (of-object "GtkTextAttributes")
+  (c-name "gtk_text_attributes_copy")
+  (caller-owns-return #t)
+  (return-type "GtkTextAttributes*")
+)
+
+(define-method copy_values
+  (of-object "GtkTextAttributes")
+  (c-name "gtk_text_attributes_copy_values")
+  (return-type "none")
+  (parameters
+    '("GtkTextAttributes*" "dest")
+  )
+)
+
+(define-method unref
+  (of-object "GtkTextAttributes")
+  (c-name "gtk_text_attributes_unref")
+  (return-type "none")
+)
+
+(define-method ref
+  (of-object "GtkTextAttributes")
+  (c-name "gtk_text_attributes_ref")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkTextBuffer.defs b/src/defs/GtkTextBuffer.defs
new file mode 100644
index 0000000..f5b04b5
--- /dev/null
+++ b/src/defs/GtkTextBuffer.defs
@@ -0,0 +1,806 @@
+(define-object TextBuffer
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTextBuffer")
+  (gtype-id "GTK_TYPE_TEXT_BUFFER")
+  (fields
+    '("GtkTextTagTable*" "tag_table")
+  )
+)
+
+(define-function gtk_text_buffer_new
+  (is-constructor-of "GtkTextBuffer")
+  (c-name "gtk_text_buffer_new")
+  (caller-owns-return #t)
+  (return-type "GtkTextBuffer*")
+  (parameters
+    '("GtkTextTagTable*" "table")
+  )
+)
+
+(define-method get_line_count
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_line_count")
+  (return-type "gint")
+)
+
+(define-method get_char_count
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_char_count")
+  (return-type "gint")
+)
+
+(define-method get_tag_table
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_tag_table")
+  (return-type "GtkTextTagTable*")
+)
+
+(define-method set_text
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_set_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "len")
+  )
+)
+
+(define-method insert
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "text")
+    '("gint" "len" (default "-1"))
+  )
+)
+
+(define-method insert_at_cursor
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_at_cursor")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "len" (default "-1"))
+  )
+)
+
+(define-method insert_interactive
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_interactive")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "text")
+    '("gint" "len")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method insert_interactive_at_cursor
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_interactive_at_cursor")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "len")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method insert_range
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_range")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method insert_range_interactive
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_range_interactive")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method insert_with_tags
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_with_tags")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "text")
+    '("gint" "len")
+    '("GtkTextTag*" "first_tag" (null-ok))
+  )
+  (varargs #t)
+)
+
+(define-method insert_with_tags_by_name
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_with_tags_by_name")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("const-gchar*" "text")
+    '("gint" "len")
+    '("const-gchar*" "first_tag_name")
+  )
+  (varargs #t)
+)
+
+(define-method delete
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_delete")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "start")
+    '("GtkTextIter*" "end")
+  )
+)
+
+(define-method delete_interactive
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_delete_interactive")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "start_iter")
+    '("GtkTextIter*" "end_iter")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method get_text
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_text")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+    '("gboolean" "include_hidden_chars" (default "TRUE"))
+  )
+)
+
+(define-method get_slice
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_slice")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+    '("gboolean" "include_hidden_chars" (default "TRUE"))
+  )
+)
+
+(define-method insert_pixbuf
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-method insert_child_anchor
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_insert_child_anchor")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("GtkTextChildAnchor*" "anchor")
+  )
+)
+
+(define-method create_child_anchor
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_create_child_anchor")
+  (return-type "GtkTextChildAnchor*")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method create_mark
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_create_mark")
+  (return-type "GtkTextMark*")
+  (parameters
+    '("const-gchar*" "mark_name" (null-ok))
+    '("const-GtkTextIter*" "where")
+    '("gboolean" "left_gravity" (default "FALSE"))
+  )
+)
+
+(define-method move_mark
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_move_mark")
+  (return-type "none")
+  (parameters
+    '("GtkTextMark*" "mark")
+    '("const-GtkTextIter*" "where")
+  )
+)
+
+(define-method delete_mark
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_delete_mark")
+  (return-type "none")
+  (parameters
+    '("GtkTextMark*" "mark")
+  )
+)
+
+(define-method get_mark
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_mark")
+  (return-type "GtkTextMark*")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method move_mark_by_name
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_move_mark_by_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-GtkTextIter*" "where")
+  )
+)
+
+(define-method delete_mark_by_name
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_delete_mark_by_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_insert
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_insert")
+  (return-type "GtkTextMark*")
+)
+
+(define-method get_selection_bound
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_selection_bound")
+  (return-type "GtkTextMark*")
+)
+
+(define-method place_cursor
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_place_cursor")
+  (return-type "none")
+  (parameters
+    '("const-GtkTextIter*" "where")
+  )
+)
+
+(define-method select_range
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_select_range")
+  (return-type "none")
+  (parameters
+    '("const-GtkTextIter*" "ins")
+    '("const-GtkTextIter*" "bound")
+  )
+)
+
+(define-method apply_tag
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_apply_tag")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method remove_tag
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_remove_tag")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method apply_tag_by_name
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_apply_tag_by_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method remove_tag_by_name
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_remove_tag_by_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method remove_all_tags
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_remove_all_tags")
+  (return-type "none")
+  (parameters
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method create_tag
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_create_tag")
+  (return-type "GtkTextTag*")
+  (parameters
+    '("const-gchar*" "tag_name")
+    '("const-gchar*" "first_property_name")
+  )
+  (varargs #t)
+)
+
+(define-method get_iter_at_line_offset
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_iter_at_line_offset")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint" "line_number")
+    '("gint" "char_offset")
+  )
+)
+
+(define-method get_iter_at_line_index
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_iter_at_line_index")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint" "line_number")
+    '("gint" "byte_index")
+  )
+)
+
+(define-method get_iter_at_offset
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_iter_at_offset")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint" "char_offset")
+  )
+)
+
+(define-method get_iter_at_line
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_iter_at_line")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint" "line_number")
+  )
+)
+
+(define-method get_start_iter
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_start_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method get_end_iter
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_end_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method get_bounds
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_bounds")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "start")
+    '("GtkTextIter*" "end")
+  )
+)
+
+(define-method get_iter_at_mark
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_iter_at_mark")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("GtkTextMark*" "mark")
+  )
+)
+
+(define-method get_iter_at_child_anchor
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_iter_at_child_anchor")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("GtkTextChildAnchor*" "anchor")
+  )
+)
+
+(define-method get_modified
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_modified")
+  (return-type "gboolean")
+)
+
+(define-method set_modified
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_set_modified")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method add_selection_clipboard
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_add_selection_clipboard")
+  (return-type "none")
+  (parameters
+    '("GtkClipboard*" "clipboard")
+  )
+)
+
+(define-method remove_selection_clipboard
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_remove_selection_clipboard")
+  (return-type "none")
+  (parameters
+    '("GtkClipboard*" "clipboard")
+  )
+)
+
+(define-method cut_clipboard
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_cut_clipboard")
+  (return-type "none")
+  (parameters
+    '("GtkClipboard*" "clipboard")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method copy_clipboard
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_copy_clipboard")
+  (return-type "none")
+  (parameters
+    '("GtkClipboard*" "clipboard")
+  )
+)
+
+(define-method paste_clipboard
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_paste_clipboard")
+  (return-type "none")
+  (parameters
+    '("GtkClipboard*" "clipboard")
+    '("GtkTextIter*" "override_location" (null-ok))
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method get_selection_bounds
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_selection_bounds")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "start" (null-ok))
+    '("GtkTextIter*" "end" (null-ok))
+  )
+)
+
+(define-method delete_selection
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_delete_selection")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "interactive")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-method begin_user_action
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_begin_user_action")
+  (return-type "none")
+)
+
+(define-method end_user_action
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_end_user_action")
+  (return-type "none")
+)
+
+(define-method backspace
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_backspace")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gboolean" "interactive")
+    '("gboolean" "default_editable")
+  )
+)
+
+(define-virtual insert_text
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "pos")
+    '("const-gchar*" "text")
+    '("gint" "length")
+  )
+)
+
+(define-virtual insert_pixbuf
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "pos")
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+;; As things stand right now we'll never need this. After all, how on earth
+;; could you possibly paste a Widget into a TextBuffer? Text, sure, but a
+;; Widget? Don't think so.
+
+(define-virtual insert_child_anchor
+  (of-object "GtkTextBuffer")
+  (unnecessary)
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "pos")
+    '("GtkTextChildAnchor*" "anchor")
+  )
+)
+
+(define-virtual delete_range
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "start")
+    '("GtkTextIter*" "end")
+  )
+)
+
+(define-virtual changed
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+)
+
+(define-virtual modified_changed
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+)
+
+(define-virtual mark_set
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("const-GtkTextIter*" "location")
+    '("GtkTextMark*" "mark")
+  )
+)
+
+(define-virtual mark_deleted
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextMark*" "mark")
+  )
+)
+
+(define-virtual apply_tag
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+    '("const-GtkTextIter*" "start_char")
+    '("const-GtkTextIter*" "end_char")
+  )
+)
+
+(define-virtual remove_tag
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+    '("const-GtkTextIter*" "start_char")
+    '("const-GtkTextIter*" "end_char")
+  )
+)
+
+(define-virtual begin_user_action
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+)
+
+(define-virtual end_user_action
+  (of-object "GtkTextBuffer")
+  (return-type "none")
+)
+
+(define-method get_has_selection
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_has_selection")
+  (return-type "gboolean")
+)
+
+(define-method get_copy_target_list
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_copy_target_list")
+  (return-type "GtkTargetList*")
+)
+
+(define-method get_paste_target_list
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_paste_target_list")
+  (return-type "GtkTargetList*")
+)
+
+(define-method register_serialize_format
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_register_serialize_format")
+  (return-type "GdkAtom")
+  (parameters
+    '("const-gchar*" "mime_type")
+    '("GtkTextBufferSerializeFunc" "function")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "user_data_destroy")
+  )
+)
+
+(define-method register_serialize_tagset
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_register_serialize_tagset")
+  (return-type "GdkAtom")
+  (parameters
+    '("const-gchar*" "tagset_name" (default "NULL") (null-ok))
+  )
+)
+
+(define-method register_deserialize_format
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_register_deserialize_format")
+  (return-type "GdkAtom")
+  (parameters
+    '("const-gchar*" "mime_type")
+    '("GtkTextBufferDeserializeFunc" "function")
+    '("gpointer" "user_data")
+    '("GDestroyNotify" "user_data_destroy")
+  )
+)
+
+(define-method register_deserialize_tagset
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_register_deserialize_tagset")
+  (return-type "GdkAtom")
+  (parameters
+    '("const-gchar*" "tagset_name" (default "NULL") (null-ok))
+  )
+)
+
+(define-method unregister_serialize_format
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_unregister_serialize_format")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "format")
+  )
+)
+
+(define-method unregister_deserialize_format
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_unregister_deserialize_format")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "format")
+  )
+)
+
+(define-method deserialize_set_can_create_tags
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_deserialize_set_can_create_tags")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "format")
+    '("gboolean" "can_create_tags")
+  )
+)
+
+(define-method deserialize_get_can_create_tags
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_deserialize_get_can_create_tags")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "format")
+  )
+)
+
+(define-method get_serialize_formats
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_serialize_formats")
+  (return-type "GdkAtom*")
+  (parameters
+    '("gint*" "n_formats")
+  )
+)
+
+(define-method get_deserialize_formats
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_get_deserialize_formats")
+  (return-type "GdkAtom*")
+  (parameters
+    '("gint*" "n_formats")
+  )
+)
+
+(define-method serialize
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_serialize")
+  (return-type "guint8*")
+  (parameters
+    '("GtkTextBuffer*" "content_buffer")
+    '("GdkAtom" "format")
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+    '("gsize*" "length")
+  )
+)
+
+(define-method deserialize
+  (of-object "GtkTextBuffer")
+  (c-name "gtk_text_buffer_deserialize")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextBuffer*" "content_buffer")
+    '("GdkAtom" "format")
+    '("GtkTextIter*" "iter")
+    '("const-guint8*" "data")
+    '("gsize" "length")
+    '("GError**" "error")
+  )
+)
+
diff --git a/src/defs/GtkTextBufferTargetInfo.defs b/src/defs/GtkTextBufferTargetInfo.defs
new file mode 100644
index 0000000..cb4050c
--- /dev/null
+++ b/src/defs/GtkTextBufferTargetInfo.defs
@@ -0,0 +1,11 @@
+(define-enum TextBufferTargetInfo
+  (in-module "Gtk")
+  (c-name "GtkTextBufferTargetInfo")
+  (gtype-id "GTK_TYPE_TEXT_BUFFER_TARGET_INFO")
+  (values
+    '("buffer-contents" "GTK_TEXT_BUFFER_TARGET_INFO_BUFFER_CONTENTS")
+    '("rich-text" "GTK_TEXT_BUFFER_TARGET_INFO_RICH_TEXT")
+    '("text" "GTK_TEXT_BUFFER_TARGET_INFO_TEXT")
+  )
+)
+
diff --git a/src/defs/GtkTextChildAnchor.defs b/src/defs/GtkTextChildAnchor.defs
new file mode 100644
index 0000000..175d2fc
--- /dev/null
+++ b/src/defs/GtkTextChildAnchor.defs
@@ -0,0 +1,27 @@
+(define-object TextChildAnchor
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTextChildAnchor")
+  (gtype-id "GTK_TYPE_TEXT_CHILD_ANCHOR")
+)
+
+(define-function gtk_text_child_anchor_new
+  (is-constructor-of "GtkTextChildAnchor")
+  (c-name "gtk_text_child_anchor_new")
+  (caller-owns-return #t)
+  (return-type "GtkTextChildAnchor*")
+)
+
+(define-method get_widgets
+  (of-object "GtkTextChildAnchor")
+  (c-name "gtk_text_child_anchor_get_widgets")
+  (caller-owns-return #l)
+  (return-type "GList-GtkWidget*")
+)
+
+(define-method get_deleted
+  (of-object "GtkTextChildAnchor")
+  (c-name "gtk_text_child_anchor_get_deleted")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkTextDirection.defs b/src/defs/GtkTextDirection.defs
new file mode 100644
index 0000000..866c092
--- /dev/null
+++ b/src/defs/GtkTextDirection.defs
@@ -0,0 +1,11 @@
+(define-enum TextDirection
+  (in-module "Gtk")
+  (c-name "GtkTextDirection")
+  (gtype-id "GTK_TYPE_TEXT_DIRECTION")
+  (values
+    '("none" "GTK_TEXT_DIR_NONE")
+    '("ltr" "GTK_TEXT_DIR_LTR")
+    '("rtl" "GTK_TEXT_DIR_RTL")
+  )
+)
+
diff --git a/src/defs/GtkTextIter.defs b/src/defs/GtkTextIter.defs
new file mode 100644
index 0000000..118b851
--- /dev/null
+++ b/src/defs/GtkTextIter.defs
@@ -0,0 +1,699 @@
+(define-boxed TextIter
+  (in-module "Gtk")
+  (c-name "GtkTextIter")
+  (gtype-id "GTK_TYPE_TEXT_ITER")
+  (copy-func "gtk_text_iter_copy")
+  (release-func "gtk_text_iter_free")
+)
+
+(define-method get_buffer
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_buffer")
+  (return-type "GtkTextBuffer*")
+)
+
+(define-method copy
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_copy")
+  (caller-owns-return #t)
+  (return-type "GtkTextIter*")
+)
+
+(define-method free
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_free")
+  (return-type "none")
+)
+
+(define-method get_offset
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_offset")
+  (return-type "gint")
+)
+
+(define-method get_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_line")
+  (return-type "gint")
+)
+
+(define-method get_line_offset
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_line_offset")
+  (return-type "gint")
+)
+
+(define-method get_line_index
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_line_index")
+  (return-type "gint")
+)
+
+(define-method get_visible_line_offset
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_visible_line_offset")
+  (return-type "gint")
+)
+
+(define-method get_visible_line_index
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_visible_line_index")
+  (return-type "gint")
+)
+
+(define-method get_char
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_char")
+  (return-type "gunichar")
+)
+
+(define-method get_slice
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_slice")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method get_text
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_text")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method get_visible_slice
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_visible_slice")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method get_visible_text
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_visible_text")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method get_pixbuf
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method get_marks
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_marks")
+  (return-type "GSList-GtkTextMark*")
+)
+
+(define-method get_child_anchor
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_child_anchor")
+  (return-type "GtkTextChildAnchor*")
+)
+
+(define-method get_toggled_tags
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_toggled_tags")
+  (return-type "GSList-GtkTextTag*")
+  (parameters
+    '("gboolean" "toggled_on")
+  )
+)
+
+(define-method begins_tag
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_begins_tag")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextTag*" "tag" (default "NULL") (null-ok))
+  )
+)
+
+(define-method ends_tag
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_ends_tag")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextTag*" "tag" (default "NULL") (null-ok))
+  )
+)
+
+(define-method toggles_tag
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_toggles_tag")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextTag*" "tag" (default "NULL") (null-ok))
+  )
+)
+
+(define-method has_tag
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_has_tag")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextTag*" "tag")
+  )
+)
+
+(define-method get_tags
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_tags")
+  (caller-owns-return #l)
+  (return-type "GSList-GtkTextTag*")
+)
+
+(define-method editable
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_editable")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "default_setting")
+  )
+)
+
+(define-method can_insert
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_can_insert")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "default_editability")
+  )
+)
+
+(define-method starts_word
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_starts_word")
+  (return-type "gboolean")
+)
+
+(define-method ends_word
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_ends_word")
+  (return-type "gboolean")
+)
+
+(define-method inside_word
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_inside_word")
+  (return-type "gboolean")
+)
+
+(define-method starts_sentence
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_starts_sentence")
+  (return-type "gboolean")
+)
+
+(define-method ends_sentence
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_ends_sentence")
+  (return-type "gboolean")
+)
+
+(define-method inside_sentence
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_inside_sentence")
+  (return-type "gboolean")
+)
+
+(define-method starts_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_starts_line")
+  (return-type "gboolean")
+)
+
+(define-method ends_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_ends_line")
+  (return-type "gboolean")
+)
+
+(define-method is_cursor_position
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_is_cursor_position")
+  (return-type "gboolean")
+)
+
+(define-method get_chars_in_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_chars_in_line")
+  (return-type "gint")
+)
+
+(define-method get_bytes_in_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_bytes_in_line")
+  (return-type "gint")
+)
+
+(define-method get_attributes
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_attributes")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextAttributes*" "values")
+  )
+)
+
+(define-method get_language
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_get_language")
+  (return-type "PangoLanguage*")
+)
+
+(define-method is_end
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_is_end")
+  (return-type "gboolean")
+)
+
+(define-method is_start
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_is_start")
+  (return-type "gboolean")
+)
+
+(define-method forward_char
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_char")
+  (return-type "gboolean")
+)
+
+(define-method backward_char
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_char")
+  (return-type "gboolean")
+)
+
+(define-method forward_chars
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_chars")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_chars
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_chars")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_line")
+  (return-type "gboolean")
+)
+
+(define-method backward_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_line")
+  (return-type "gboolean")
+)
+
+(define-method forward_lines
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_lines")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_lines
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_lines")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_word_end
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_word_end")
+  (return-type "gboolean")
+)
+
+(define-method backward_word_start
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_word_start")
+  (return-type "gboolean")
+)
+
+(define-method forward_word_ends
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_word_ends")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_word_starts
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_word_starts")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_visible_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_visible_line")
+  (return-type "gboolean")
+)
+
+(define-method backward_visible_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_visible_line")
+  (return-type "gboolean")
+)
+
+(define-method forward_visible_lines
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_visible_lines")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_visible_lines
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_visible_lines")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_visible_word_end
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_visible_word_end")
+  (return-type "gboolean")
+)
+
+(define-method backward_visible_word_start
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_visible_word_start")
+  (return-type "gboolean")
+)
+
+(define-method forward_visible_word_ends
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_visible_word_ends")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_visible_word_starts
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_visible_word_starts")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_sentence_end
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_sentence_end")
+  (return-type "gboolean")
+)
+
+(define-method backward_sentence_start
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_sentence_start")
+  (return-type "gboolean")
+)
+
+(define-method forward_sentence_ends
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_sentence_ends")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_sentence_starts
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_sentence_starts")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_cursor_position
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_cursor_position")
+  (return-type "gboolean")
+)
+
+(define-method backward_cursor_position
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_cursor_position")
+  (return-type "gboolean")
+)
+
+(define-method forward_cursor_positions
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_cursor_positions")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_cursor_positions
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_cursor_positions")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method forward_visible_cursor_position
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_visible_cursor_position")
+  (return-type "gboolean")
+)
+
+(define-method backward_visible_cursor_position
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_visible_cursor_position")
+  (return-type "gboolean")
+)
+
+(define-method forward_visible_cursor_positions
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_visible_cursor_positions")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method backward_visible_cursor_positions
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_visible_cursor_positions")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "count")
+  )
+)
+
+(define-method set_offset
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_set_offset")
+  (return-type "none")
+  (parameters
+    '("gint" "char_offset")
+  )
+)
+
+(define-method set_line
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_set_line")
+  (return-type "none")
+  (parameters
+    '("gint" "line_number")
+  )
+)
+
+(define-method set_line_offset
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_set_line_offset")
+  (return-type "none")
+  (parameters
+    '("gint" "char_on_line")
+  )
+)
+
+(define-method set_line_index
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_set_line_index")
+  (return-type "none")
+  (parameters
+    '("gint" "byte_on_line")
+  )
+)
+
+(define-method forward_to_end
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_to_end")
+  (return-type "none")
+)
+
+(define-method forward_to_line_end
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_to_line_end")
+  (return-type "gboolean")
+)
+
+(define-method set_visible_line_offset
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_set_visible_line_offset")
+  (return-type "none")
+  (parameters
+    '("gint" "char_on_line")
+  )
+)
+
+(define-method set_visible_line_index
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_set_visible_line_index")
+  (return-type "none")
+  (parameters
+    '("gint" "byte_on_line")
+  )
+)
+
+(define-method forward_to_tag_toggle
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_to_tag_toggle")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextTag*" "tag" (null-ok))
+  )
+)
+
+(define-method backward_to_tag_toggle
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_to_tag_toggle")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextTag*" "tag" (null-ok))
+  )
+)
+
+(define-method forward_find_char
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_find_char")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextCharPredicate" "pred")
+    '("gpointer" "user_data")
+    '("const-GtkTextIter*" "limit")
+  )
+)
+
+(define-method backward_find_char
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_find_char")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextCharPredicate" "pred")
+    '("gpointer" "user_data")
+    '("const-GtkTextIter*" "limit")
+  )
+)
+
+(define-method forward_search
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_forward_search")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "str")
+    '("GtkTextSearchFlags" "flags")
+    '("GtkTextIter*" "match_start")
+    '("GtkTextIter*" "match_end")
+    '("const-GtkTextIter*" "limit" (null-ok))
+  )
+)
+
+(define-method backward_search
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_backward_search")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "str")
+    '("GtkTextSearchFlags" "flags")
+    '("GtkTextIter*" "match_start")
+    '("GtkTextIter*" "match_end")
+    '("const-GtkTextIter*" "limit" (null-ok))
+  )
+)
+
+(define-method equal
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_equal")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTextIter*" "rhs")
+  )
+)
+
+(define-method compare
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_compare")
+  (return-type "gint")
+  (parameters
+    '("const-GtkTextIter*" "rhs")
+  )
+)
+
+(define-method in_range
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_in_range")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTextIter*" "start")
+    '("const-GtkTextIter*" "end")
+  )
+)
+
+(define-method order
+  (of-object "GtkTextIter")
+  (c-name "gtk_text_iter_order")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "second")
+  )
+)
+
diff --git a/src/defs/GtkTextMark.defs b/src/defs/GtkTextMark.defs
new file mode 100644
index 0000000..ba3cf83
--- /dev/null
+++ b/src/defs/GtkTextMark.defs
@@ -0,0 +1,46 @@
+(define-object TextMark
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTextMark")
+  (gtype-id "GTK_TYPE_TEXT_MARK")
+)
+
+(define-method set_visible
+  (of-object "GtkTextMark")
+  (c-name "gtk_text_mark_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_visible
+  (of-object "GtkTextMark")
+  (c-name "gtk_text_mark_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method get_name
+  (of-object "GtkTextMark")
+  (c-name "gtk_text_mark_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_deleted
+  (of-object "GtkTextMark")
+  (c-name "gtk_text_mark_get_deleted")
+  (return-type "gboolean")
+)
+
+(define-method get_buffer
+  (of-object "GtkTextMark")
+  (c-name "gtk_text_mark_get_buffer")
+  (return-type "GtkTextBuffer*")
+)
+
+(define-method get_left_gravity
+  (of-object "GtkTextMark")
+  (c-name "gtk_text_mark_get_left_gravity")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkTextSearchFlags.defs b/src/defs/GtkTextSearchFlags.defs
new file mode 100644
index 0000000..6724b06
--- /dev/null
+++ b/src/defs/GtkTextSearchFlags.defs
@@ -0,0 +1,10 @@
+(define-flags TextSearchFlags
+  (in-module "Gtk")
+  (c-name "GtkTextSearchFlags")
+  (gtype-id "GTK_TYPE_TEXT_SEARCH_FLAGS")
+  (values
+    '("visible-only" "GTK_TEXT_SEARCH_VISIBLE_ONLY")
+    '("text-only" "GTK_TEXT_SEARCH_TEXT_ONLY")
+  )
+)
+
diff --git a/src/defs/GtkTextTag.defs b/src/defs/GtkTextTag.defs
new file mode 100644
index 0000000..6972bdd
--- /dev/null
+++ b/src/defs/GtkTextTag.defs
@@ -0,0 +1,53 @@
+(define-object TextTag
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTextTag")
+  (gtype-id "GTK_TYPE_TEXT_TAG")
+)
+
+(define-function gtk_text_tag_new
+  (is-constructor-of "GtkTextTag")
+  (c-name "gtk_text_tag_new")
+  (caller-owns-return #t)
+  (return-type "GtkTextTag*")
+  (parameters
+    '("const-gchar*" "name" (null-ok))
+  )
+)
+
+(define-method get_priority
+  (of-object "GtkTextTag")
+  (c-name "gtk_text_tag_get_priority")
+  (return-type "gint")
+)
+
+(define-method set_priority
+  (of-object "GtkTextTag")
+  (c-name "gtk_text_tag_set_priority")
+  (return-type "none")
+  (parameters
+    '("gint" "priority")
+  )
+)
+
+(define-method event
+  (of-object "GtkTextTag")
+  (c-name "gtk_text_tag_event")
+  (return-type "gboolean")
+  (parameters
+    '("GObject*" "event_object")
+    '("GdkEvent*" "event")
+    '("const-GtkTextIter*" "iter")
+  )
+)
+
+(define-virtual event
+  (of-object "GtkTextTag")
+  (return-type "gboolean")
+  (parameters
+    '("GObject*" "event_object")
+    '("GdkEvent*" "event")
+    '("const-GtkTextIter*" "iter")
+  )
+)
+
diff --git a/src/defs/GtkTextTagTable.defs b/src/defs/GtkTextTagTable.defs
new file mode 100644
index 0000000..a403f8a
--- /dev/null
+++ b/src/defs/GtkTextTagTable.defs
@@ -0,0 +1,82 @@
+(define-object TextTagTable
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTextTagTable")
+  (gtype-id "GTK_TYPE_TEXT_TAG_TABLE")
+)
+
+(define-function gtk_text_tag_table_new
+  (is-constructor-of "GtkTextTagTable")
+  (c-name "gtk_text_tag_table_new")
+  (caller-owns-return #t)
+  (return-type "GtkTextTagTable*")
+)
+
+(define-method add
+  (of-object "GtkTextTagTable")
+  (c-name "gtk_text_tag_table_add")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+  )
+)
+
+(define-method remove
+  (of-object "GtkTextTagTable")
+  (c-name "gtk_text_tag_table_remove")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+  )
+)
+
+(define-method lookup
+  (of-object "GtkTextTagTable")
+  (c-name "gtk_text_tag_table_lookup")
+  (return-type "GtkTextTag*")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method foreach
+  (of-object "GtkTextTagTable")
+  (c-name "gtk_text_tag_table_foreach")
+  (return-type "none")
+  (parameters
+    '("GtkTextTagTableForeach" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-method get_size
+  (of-object "GtkTextTagTable")
+  (c-name "gtk_text_tag_table_get_size")
+  (return-type "gint")
+)
+
+(define-virtual tag_changed
+  (of-object "GtkTextTagTable")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+    '("gboolean" "size_changed")
+  )
+)
+
+(define-virtual tag_added
+  (of-object "GtkTextTagTable")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+  )
+)
+
+(define-virtual tag_removed
+  (of-object "GtkTextTagTable")
+  (return-type "none")
+  (parameters
+    '("GtkTextTag*" "tag")
+  )
+)
+
diff --git a/src/defs/GtkTextView.defs b/src/defs/GtkTextView.defs
new file mode 100644
index 0000000..8d5beb5
--- /dev/null
+++ b/src/defs/GtkTextView.defs
@@ -0,0 +1,609 @@
+(define-object TextView
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkTextView")
+  (gtype-id "GTK_TYPE_TEXT_VIEW")
+)
+
+(define-function gtk_text_view_new
+  (is-constructor-of "GtkTextView")
+  (c-name "gtk_text_view_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_text_view_new_with_buffer
+  (is-constructor-of "GtkTextView")
+  (c-name "gtk_text_view_new_with_buffer")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkTextBuffer*" "buffer")
+  )
+)
+
+(define-method set_buffer
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_buffer")
+  (return-type "none")
+  (parameters
+    '("GtkTextBuffer*" "buffer" (null-ok))
+  )
+)
+
+(define-method get_buffer
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_buffer")
+  (return-type "GtkTextBuffer*")
+)
+
+(define-method scroll_to_iter
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_scroll_to_iter")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gdouble" "within_margin")
+    '("gboolean" "use_align" (default "FALSE"))
+    '("gdouble" "xalign" (default "0.5"))
+    '("gdouble" "yalign" (default "0.5"))
+  )
+)
+
+(define-method scroll_to_mark
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_scroll_to_mark")
+  (return-type "none")
+  (parameters
+    '("GtkTextMark*" "mark")
+    '("gdouble" "within_margin")
+    '("gboolean" "use_align" (default "FALSE"))
+    '("gdouble" "xalign" (default "0.5"))
+    '("gdouble" "yalign" (default "0.5"))
+  )
+)
+
+(define-method scroll_mark_onscreen
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_scroll_mark_onscreen")
+  (return-type "none")
+  (parameters
+    '("GtkTextMark*" "mark")
+  )
+)
+
+(define-method move_mark_onscreen
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_move_mark_onscreen")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextMark*" "mark")
+  )
+)
+
+(define-method place_cursor_onscreen
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_place_cursor_onscreen")
+  (return-type "gboolean")
+)
+
+(define-method get_visible_rect
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_visible_rect")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "visible_rect")
+  )
+)
+
+(define-method set_cursor_visible
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_cursor_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_cursor_visible
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_cursor_visible")
+  (return-type "gboolean")
+)
+
+(define-method get_iter_location
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_iter_location")
+  (return-type "none")
+  (parameters
+    '("const-GtkTextIter*" "iter")
+    '("GdkRectangle*" "location")
+  )
+)
+
+(define-method get_iter_at_location
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_iter_at_location")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_iter_at_position
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_iter_at_position")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint*" "trailing")
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+;; investigation of this code path shows that it calls
+;; gtk_text_layout_get_line_yrange() which accepts NULL for
+;; both y and height parameters.
+
+(define-method get_line_yrange
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_line_yrange")
+  (return-type "none")
+  (parameters
+    '("const-GtkTextIter*" "iter")
+    '("gint*" "y" (null-ok))
+    '("gint*" "height" (null-ok))
+  )
+)
+
+(define-method get_line_at_y
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_line_at_y")
+  (return-type "none")
+  (parameters
+    '("GtkTextIter*" "target_iter")
+    '("gint" "y")
+    '("gint*" "line_top")
+  )
+)
+
+(define-method buffer_to_window_coords
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_buffer_to_window_coords")
+  (return-type "none")
+  (parameters
+    '("GtkTextWindowType" "win")
+    '("gint" "buffer_x")
+    '("gint" "buffer_y")
+    '("gint*" "window_x" (null-ok))
+    '("gint*" "window_y" (null-ok))
+  )
+)
+
+(define-method window_to_buffer_coords
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_window_to_buffer_coords")
+  (return-type "none")
+  (parameters
+    '("GtkTextWindowType" "win")
+    '("gint" "window_x")
+    '("gint" "window_y")
+    '("gint*" "buffer_x" (null-ok))
+    '("gint*" "buffer_y" (null-ok))
+  )
+)
+
+(define-method get_window
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_window")
+  (return-type "GdkWindow*")
+  (parameters
+    '("GtkTextWindowType" "win")
+  )
+)
+
+(define-method get_window_type
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_window_type")
+  (return-type "GtkTextWindowType")
+  (parameters
+    '("GdkWindow*" "window")
+  )
+)
+
+(define-method set_border_window_size
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_border_window_size")
+  (return-type "none")
+  (parameters
+    '("GtkTextWindowType" "type")
+    '("gint" "size")
+  )
+)
+
+(define-method get_border_window_size
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_border_window_size")
+  (return-type "gint")
+  (parameters
+    '("GtkTextWindowType" "type")
+  )
+)
+
+(define-method forward_display_line
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_forward_display_line")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method backward_display_line
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_backward_display_line")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method forward_display_line_end
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_forward_display_line_end")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method backward_display_line_start
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_backward_display_line_start")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+  )
+)
+
+(define-method starts_display_line
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_starts_display_line")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTextIter*" "iter")
+  )
+)
+
+(define-method move_visually
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_move_visually")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTextIter*" "iter")
+    '("gint" "count")
+  )
+)
+
+(define-method add_child_at_anchor
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_add_child_at_anchor")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkTextChildAnchor*" "anchor")
+  )
+)
+
+(define-method add_child_in_window
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_add_child_in_window")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkTextWindowType" "which_window")
+    '("gint" "xpos")
+    '("gint" "ypos")
+  )
+)
+
+(define-method move_child
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_move_child")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("gint" "xpos")
+    '("gint" "ypos")
+  )
+)
+
+(define-method set_wrap_mode
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_wrap_mode")
+  (return-type "none")
+  (parameters
+    '("GtkWrapMode" "wrap_mode")
+  )
+)
+
+(define-method get_wrap_mode
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_wrap_mode")
+  (return-type "GtkWrapMode")
+)
+
+(define-method set_editable
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_editable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_editable
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_editable")
+  (return-type "gboolean")
+)
+
+(define-method set_overwrite
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_overwrite")
+  (return-type "none")
+  (parameters
+    '("gboolean" "overwrite")
+  )
+)
+
+(define-method get_overwrite
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_overwrite")
+  (return-type "gboolean")
+)
+
+(define-method set_accepts_tab
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_accepts_tab")
+  (return-type "none")
+  (parameters
+    '("gboolean" "accepts_tab")
+  )
+)
+
+(define-method get_accepts_tab
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_accepts_tab")
+  (return-type "gboolean")
+)
+
+(define-method set_pixels_above_lines
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_pixels_above_lines")
+  (return-type "none")
+  (parameters
+    '("gint" "pixels_above_lines")
+  )
+)
+
+(define-method get_pixels_above_lines
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_pixels_above_lines")
+  (return-type "gint")
+)
+
+(define-method set_pixels_below_lines
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_pixels_below_lines")
+  (return-type "none")
+  (parameters
+    '("gint" "pixels_below_lines")
+  )
+)
+
+(define-method get_pixels_below_lines
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_pixels_below_lines")
+  (return-type "gint")
+)
+
+(define-method set_pixels_inside_wrap
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_pixels_inside_wrap")
+  (return-type "none")
+  (parameters
+    '("gint" "pixels_inside_wrap")
+  )
+)
+
+(define-method get_pixels_inside_wrap
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_pixels_inside_wrap")
+  (return-type "gint")
+)
+
+(define-method set_justification
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_justification")
+  (return-type "none")
+  (parameters
+    '("GtkJustification" "justification")
+  )
+)
+
+(define-method get_justification
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_justification")
+  (return-type "GtkJustification")
+)
+
+(define-method set_left_margin
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_left_margin")
+  (return-type "none")
+  (parameters
+    '("gint" "left_margin")
+  )
+)
+
+(define-method get_left_margin
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_left_margin")
+  (return-type "gint")
+)
+
+(define-method set_right_margin
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_right_margin")
+  (return-type "none")
+  (parameters
+    '("gint" "right_margin")
+  )
+)
+
+(define-method get_right_margin
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_right_margin")
+  (return-type "gint")
+)
+
+(define-method set_indent
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_indent")
+  (return-type "none")
+  (parameters
+    '("gint" "indent")
+  )
+)
+
+(define-method get_indent
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_indent")
+  (return-type "gint")
+)
+
+(define-method set_tabs
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_set_tabs")
+  (return-type "none")
+  (parameters
+    '("PangoTabArray*" "tabs")
+  )
+)
+
+(define-method get_tabs
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_tabs")
+  (return-type "PangoTabArray*")
+)
+
+(define-method get_default_attributes
+  (of-object "GtkTextView")
+  (c-name "gtk_text_view_get_default_attributes")
+  (return-type "GtkTextAttributes*")
+)
+
+(define-virtual set_scroll_adjustments
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+    '("GtkAdjustment*" "vadjustment")
+  )
+)
+
+(define-virtual populate_popup
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("GtkMenu*" "menu")
+  )
+)
+
+(define-virtual move_cursor
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("GtkMovementStep" "step")
+    '("gint" "count")
+    '("gboolean" "extend_selection")
+  )
+)
+
+(define-virtual move_viewport
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("GtkScrollStep" "step")
+    '("gint" "count")
+  )
+)
+
+(define-virtual page_horizontally
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("gint" "count")
+    '("gboolean" "extend_selection")
+  )
+)
+
+(define-virtual set_anchor
+  (of-object "GtkTextView")
+  (return-type "none")
+)
+
+(define-virtual insert_at_cursor
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-virtual delete_from_cursor
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("GtkDeleteType" "type")
+    '("gint" "count")
+  )
+)
+
+(define-virtual backspace
+  (of-object "GtkTextView")
+  (return-type "none")
+)
+
+(define-virtual cut_clipboard
+  (of-object "GtkTextView")
+  (return-type "none")
+)
+
+(define-virtual copy_clipboard
+  (of-object "GtkTextView")
+  (return-type "none")
+)
+
+(define-virtual paste_clipboard
+  (of-object "GtkTextView")
+  (return-type "none")
+)
+
+(define-virtual toggle_overwrite
+  (of-object "GtkTextView")
+  (return-type "none")
+)
+
+(define-virtual move_focus
+  (of-object "GtkTextView")
+  (return-type "none")
+  (parameters
+    '("GtkDirectionType" "direction")
+  )
+)
+
diff --git a/src/defs/GtkTextWindowType.defs b/src/defs/GtkTextWindowType.defs
new file mode 100644
index 0000000..792066d
--- /dev/null
+++ b/src/defs/GtkTextWindowType.defs
@@ -0,0 +1,15 @@
+(define-enum TextWindowType
+  (in-module "Gtk")
+  (c-name "GtkTextWindowType")
+  (gtype-id "GTK_TYPE_TEXT_WINDOW_TYPE")
+  (values
+    '("private" "GTK_TEXT_WINDOW_PRIVATE")
+    '("widget" "GTK_TEXT_WINDOW_WIDGET")
+    '("text" "GTK_TEXT_WINDOW_TEXT")
+    '("left" "GTK_TEXT_WINDOW_LEFT")
+    '("right" "GTK_TEXT_WINDOW_RIGHT")
+    '("top" "GTK_TEXT_WINDOW_TOP")
+    '("bottom" "GTK_TEXT_WINDOW_BOTTOM")
+  )
+)
+
diff --git a/src/defs/GtkToggleAction.defs b/src/defs/GtkToggleAction.defs
new file mode 100644
index 0000000..1ff7389
--- /dev/null
+++ b/src/defs/GtkToggleAction.defs
@@ -0,0 +1,61 @@
+(define-object ToggleAction
+  (in-module "Gtk")
+  (parent "GtkAction")
+  (c-name "GtkToggleAction")
+  (gtype-id "GTK_TYPE_TOGGLE_ACTION")
+)
+
+(define-function gtk_toggle_action_new
+  (is-constructor-of "GtkToggleAction")
+  (c-name "gtk_toggle_action_new")
+  (caller-owns-return #t)
+  (return-type "GtkToggleAction*")
+  (parameters
+    '("const-gchar*" "name")
+    '("const-gchar*" "label" (null-ok))
+    '("const-gchar*" "tooltip" (null-ok))
+    '("const-gchar*" "stock_id" (null-ok))
+  )
+)
+
+(define-method toggled
+  (of-object "GtkToggleAction")
+  (c-name "gtk_toggle_action_toggled")
+  (return-type "none")
+)
+
+(define-method set_active
+  (of-object "GtkToggleAction")
+  (c-name "gtk_toggle_action_set_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_active")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkToggleAction")
+  (c-name "gtk_toggle_action_get_active")
+  (return-type "gboolean")
+)
+
+(define-method set_draw_as_radio
+  (of-object "GtkToggleAction")
+  (c-name "gtk_toggle_action_set_draw_as_radio")
+  (return-type "none")
+  (parameters
+    '("gboolean" "draw_as_radio")
+  )
+)
+
+(define-method get_draw_as_radio
+  (of-object "GtkToggleAction")
+  (c-name "gtk_toggle_action_get_draw_as_radio")
+  (return-type "gboolean")
+)
+
+(define-virtual toggled
+  (of-object "GtkToggleAction")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkToggleButton.defs b/src/defs/GtkToggleButton.defs
new file mode 100644
index 0000000..a17775b
--- /dev/null
+++ b/src/defs/GtkToggleButton.defs
@@ -0,0 +1,93 @@
+(define-object ToggleButton
+  (in-module "Gtk")
+  (parent "GtkButton")
+  (c-name "GtkToggleButton")
+  (gtype-id "GTK_TYPE_TOGGLE_BUTTON")
+  (fields
+    '("gboolean" "draw_indicator")
+  )
+)
+
+(define-function gtk_toggle_button_new
+  (is-constructor-of "GtkToggleButton")
+  (c-name "gtk_toggle_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_toggle_button_new_with_label
+  (is-constructor-of "GtkToggleButton")
+  (c-name "gtk_toggle_button_new_with_label")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function gtk_toggle_button_new_with_mnemonic
+  (is-constructor-of "GtkToggleButton")
+  (c-name "gtk_toggle_button_new_with_mnemonic")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method set_mode
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_set_mode")
+  (return-type "none")
+  (parameters
+    '("gboolean" "draw_indicator")
+  )
+)
+
+(define-method get_mode
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_get_mode")
+  (return-type "gboolean")
+)
+
+(define-method set_active
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_set_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_active")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_get_active")
+  (return-type "gboolean")
+)
+
+(define-method toggled
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_toggled")
+  (return-type "none")
+)
+
+(define-method set_inconsistent
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_set_inconsistent")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_inconsistent
+  (of-object "GtkToggleButton")
+  (c-name "gtk_toggle_button_get_inconsistent")
+  (return-type "gboolean")
+)
+
+(define-virtual toggled
+  (of-object "GtkToggleButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkToggleToolButton.defs b/src/defs/GtkToggleToolButton.defs
new file mode 100644
index 0000000..a8cec4d
--- /dev/null
+++ b/src/defs/GtkToggleToolButton.defs
@@ -0,0 +1,44 @@
+(define-object ToggleToolButton
+  (in-module "Gtk")
+  (parent "GtkToolButton")
+  (c-name "GtkToggleToolButton")
+  (gtype-id "GTK_TYPE_TOGGLE_TOOL_BUTTON")
+)
+
+(define-function gtk_toggle_tool_button_new
+  (is-constructor-of "GtkToggleToolButton")
+  (c-name "gtk_toggle_tool_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+)
+
+(define-function toggle_tool_button_new_from_stock
+  (is-constructor-of "GtkToggleToolButton")
+  (c-name "gtk_toggle_tool_button_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method set_active
+  (of-object "GtkToggleToolButton")
+  (c-name "gtk_toggle_tool_button_set_active")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_active")
+  )
+)
+
+(define-method get_active
+  (of-object "GtkToggleToolButton")
+  (c-name "gtk_toggle_tool_button_get_active")
+  (return-type "gboolean")
+)
+
+(define-virtual toggled
+  (of-object "GtkToggleToolButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkToolButton.defs b/src/defs/GtkToolButton.defs
new file mode 100644
index 0000000..f0f68ba
--- /dev/null
+++ b/src/defs/GtkToolButton.defs
@@ -0,0 +1,123 @@
+(define-object ToolButton
+  (in-module "Gtk")
+  (parent "GtkToolItem")
+  (c-name "GtkToolButton")
+  (gtype-id "GTK_TYPE_TOOL_BUTTON")
+)
+
+(define-function gtk_tool_button_new
+  (is-constructor-of "GtkToolButton")
+  (c-name "gtk_tool_button_new")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("GtkWidget*" "icon_widget" (default "NULL") (null-ok))
+    '("const-gchar*" "label" (default "NULL") (null-ok))
+  )
+)
+
+(define-function gtk_tool_button_new_from_stock
+  (is-constructor-of "GtkToolButton")
+  (c-name "gtk_tool_button_new_from_stock")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method set_label
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label" (null-ok))
+  )
+)
+
+(define-method get_label
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_use_underline
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_set_use_underline")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_underline")
+  )
+)
+
+(define-method get_use_underline
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_get_use_underline")
+  (return-type "gboolean")
+)
+
+(define-method set_stock_id
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_set_stock_id")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id" (null-ok))
+  )
+)
+
+(define-method set_icon_name
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name" (null-ok))
+  )
+)
+
+(define-method get_icon_name
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_get_icon_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_stock_id
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_get_stock_id")
+  (return-type "const-gchar*")
+)
+
+(define-method set_icon_widget
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_set_icon_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "icon_widget" (null-ok))
+  )
+)
+
+(define-method get_icon_widget
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_get_icon_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_label_widget
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_set_label_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "label_widget" (null-ok))
+  )
+)
+
+(define-method get_label_widget
+  (of-object "GtkToolButton")
+  (c-name "gtk_tool_button_get_label_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual clicked
+  (of-object "GtkToolButton")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkToolItem.defs b/src/defs/GtkToolItem.defs
new file mode 100644
index 0000000..b7ab5d5
--- /dev/null
+++ b/src/defs/GtkToolItem.defs
@@ -0,0 +1,210 @@
+(define-object ToolItem
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkToolItem")
+  (gtype-id "GTK_TYPE_TOOL_ITEM")
+)
+
+(define-function gtk_tool_item_new
+  (is-constructor-of "GtkToolItem")
+  (c-name "gtk_tool_item_new")
+  (caller-owns-return #t)
+  (return-type "GtkToolItem*")
+)
+
+(define-method set_homogeneous
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_homogeneous")
+  (return-type "none")
+  (parameters
+    '("gboolean" "homogeneous")
+  )
+)
+
+(define-method get_homogeneous
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_homogeneous")
+  (return-type "gboolean")
+)
+
+(define-method set_expand
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_expand")
+  (return-type "none")
+  (parameters
+    '("gboolean" "expand")
+  )
+)
+
+(define-method get_expand
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_expand")
+  (return-type "gboolean")
+)
+
+(define-method set_tooltip_text
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_tooltip_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method set_tooltip_markup
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_tooltip_markup")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "markup")
+  )
+)
+
+(define-method set_use_drag_window
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_use_drag_window")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_drag_window")
+  )
+)
+
+(define-method get_use_drag_window
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_use_drag_window")
+  (return-type "gboolean")
+)
+
+(define-method set_visible_horizontal
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_visible_horizontal")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible_horizontal")
+  )
+)
+
+(define-method get_visible_horizontal
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_visible_horizontal")
+  (return-type "gboolean")
+)
+
+(define-method set_visible_vertical
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_visible_vertical")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible_vertical")
+  )
+)
+
+(define-method get_visible_vertical
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_visible_vertical")
+  (return-type "gboolean")
+)
+
+(define-method set_is_important
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_is_important")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_important")
+  )
+)
+
+(define-method get_is_important
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_is_important")
+  (return-type "gboolean")
+)
+
+(define-method get_icon_size
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_icon_size")
+  (return-type "GtkIconSize")
+)
+
+(define-method get_orientation
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_orientation")
+  (return-type "GtkOrientation")
+)
+
+(define-method get_toolbar_style
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_toolbar_style")
+  (return-type "GtkToolbarStyle")
+)
+
+(define-method get_relief_style
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_relief_style")
+  (return-type "GtkReliefStyle")
+)
+
+(define-method retrieve_proxy_menu_item
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_retrieve_proxy_menu_item")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_proxy_menu_item
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_set_proxy_menu_item")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "menu_item_id")
+    '("GtkWidget*" "menu_item" (null-ok))
+  )
+)
+
+(define-method get_proxy_menu_item
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_proxy_menu_item")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "menu_item_id")
+  )
+)
+
+(define-method rebuild_menu
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_rebuild_menu")
+  (return-type "none")
+)
+
+(define-method get_ellipsize_mode
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_ellipsize_mode")
+  (return-type "PangoEllipsizeMode")
+)
+
+(define-method get_text_alignment
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_text_alignment")
+  (return-type "gfloat")
+)
+
+(define-method get_text_orientation
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_text_orientation")
+  (return-type "GtkOrientation")
+)
+
+(define-method get_text_size_group
+  (of-object "GtkToolItem")
+  (c-name "gtk_tool_item_get_text_size_group")
+  (return-type "GtkSizeGroup*")
+)
+
+(define-virtual create_menu_proxy
+  (of-object "GtkToolItem")
+  (return-type "gboolean")
+)
+
+(define-virtual toolbar_reconfigured
+  (of-object "GtkToolItem")
+  (return-type "none")
+)
diff --git a/src/defs/GtkToolItemGroup.defs b/src/defs/GtkToolItemGroup.defs
new file mode 100644
index 0000000..aedb75f
--- /dev/null
+++ b/src/defs/GtkToolItemGroup.defs
@@ -0,0 +1,146 @@
+(define-object ToolItemGroup
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkToolItemGroup")
+  (gtype-id "GTK_TYPE_TOOL_ITEM_GROUP")
+)
+
+(define-function gtk_tool_item_group_new
+  (c-name "gtk_tool_item_group_new")
+  (is-constructor-of "GtkToolItemGroup")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method set_label
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method set_label_widget
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_set_label_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "label_widget")
+  )
+)
+
+(define-method set_collapsed
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_set_collapsed")
+  (return-type "none")
+  (parameters
+    '("gboolean" "collapsed")
+  )
+)
+
+(define-method set_ellipsize
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_set_ellipsize")
+  (return-type "none")
+  (parameters
+    '("PangoEllipsizeMode" "ellipsize")
+  )
+)
+
+(define-method set_header_relief
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_set_header_relief")
+  (return-type "none")
+  (parameters
+    '("GtkReliefStyle" "style")
+  )
+)
+
+(define-method get_label
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method get_label_widget
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_label_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_collapsed
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_collapsed")
+  (return-type "gboolean")
+)
+
+(define-method get_ellipsize
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_ellipsize")
+  (return-type "PangoEllipsizeMode")
+)
+
+(define-method get_header_relief
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_header_relief")
+  (return-type "GtkReliefStyle")
+)
+
+(define-method insert
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_insert")
+  (return-type "none")
+  (parameters
+    '("GtkToolItem*" "item")
+    '("gint" "position")
+  )
+)
+
+(define-method set_item_position
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_set_item_position")
+  (return-type "none")
+  (parameters
+    '("GtkToolItem*" "item")
+    '("gint" "position")
+  )
+)
+
+(define-method get_item_position
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_item_position")
+  (return-type "gint")
+  (parameters
+    '("GtkToolItem*" "item")
+  )
+)
+
+(define-method get_n_items
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_n_items")
+  (return-type "guint")
+)
+
+(define-method get_nth_item
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_nth_item")
+  (return-type "GtkToolItem*")
+  (parameters
+    '("guint" "index")
+  )
+)
+
+(define-method get_drop_item
+  (of-object "GtkToolItemGroup")
+  (c-name "gtk_tool_item_group_get_drop_item")
+  (return-type "GtkToolItem*")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
diff --git a/src/defs/GtkToolPalette.defs b/src/defs/GtkToolPalette.defs
new file mode 100644
index 0000000..0ad4cca
--- /dev/null
+++ b/src/defs/GtkToolPalette.defs
@@ -0,0 +1,185 @@
+(define-object ToolPalette
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkToolPalette")
+  (gtype-id "GTK_TYPE_TOOL_PALETTE")
+)
+
+(define-function gtk_tool_palette_new
+  (c-name "gtk_tool_palette_new")
+  (is-constructor-of "GtkToolPalette")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method set_group_position
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_set_group_position")
+  (return-type "none")
+  (parameters
+    '("GtkToolItemGroup*" "group")
+    '("gint" "position")
+  )
+)
+
+(define-method set_exclusive
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_set_exclusive")
+  (return-type "none")
+  (parameters
+    '("GtkToolItemGroup*" "group")
+    '("gboolean" "exclusive")
+  )
+)
+
+(define-method set_expand
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_set_expand")
+  (return-type "none")
+  (parameters
+    '("GtkToolItemGroup*" "group")
+    '("gboolean" "expand")
+  )
+)
+
+(define-method get_group_position
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_group_position")
+  (return-type "gint")
+  (parameters
+    '("GtkToolItemGroup*" "group")
+  )
+)
+
+(define-method get_exclusive
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_exclusive")
+  (return-type "gboolean")
+  (parameters
+    '("GtkToolItemGroup*" "group")
+  )
+)
+
+(define-method get_expand
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_expand")
+  (return-type "gboolean")
+  (parameters
+    '("GtkToolItemGroup*" "group")
+  )
+)
+
+(define-method set_icon_size
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_set_icon_size")
+  (return-type "none")
+  (parameters
+    '("GtkIconSize" "icon_size")
+  )
+)
+
+(define-method unset_icon_size
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_unset_icon_size")
+  (return-type "none")
+)
+
+(define-method set_style
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_set_style")
+  (return-type "none")
+  (parameters
+    '("GtkToolbarStyle" "style")
+  )
+)
+
+(define-method unset_style
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_unset_style")
+  (return-type "none")
+)
+
+(define-method get_icon_size
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_icon_size")
+  (return-type "GtkIconSize")
+)
+
+(define-method get_style
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_style")
+  (return-type "GtkToolbarStyle")
+)
+
+(define-method get_drop_item
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_drop_item")
+  (return-type "GtkToolItem*")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_drop_group
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_drop_group")
+  (return-type "GtkToolItemGroup*")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_drag_item
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_drag_item")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-GtkSelectionData*" "selection")
+  )
+)
+
+(define-method set_drag_source
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_set_drag_source")
+  (return-type "none")
+  (parameters
+    '("GtkToolPaletteDragTargets" "targets")
+  )
+)
+
+(define-method add_drag_dest
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_add_drag_dest")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("GtkDestDefaults" "flags")
+    '("GtkToolPaletteDragTargets" "targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method get_hadjustment
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method get_vadjustment
+  (of-object "GtkToolPalette")
+  (c-name "gtk_tool_palette_get_vadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-function gtk_tool_palette_get_drag_target_item
+  (c-name "gtk_tool_palette_get_drag_target_item")
+  (return-type "const-GtkTargetEntry*")
+)
+
+(define-function gtk_tool_palette_get_drag_target_group
+  (c-name "gtk_tool_palette_get_drag_target_group")
+  (return-type "const-GtkTargetEntry*")
+)
+
diff --git a/src/defs/GtkToolPaletteDragTargets.defs b/src/defs/GtkToolPaletteDragTargets.defs
new file mode 100644
index 0000000..d28c08b
--- /dev/null
+++ b/src/defs/GtkToolPaletteDragTargets.defs
@@ -0,0 +1,10 @@
+(define-enum ToolPaletteDragTargets
+  (in-module "Gtk")
+  (c-name "GtkToolPaletteDragTargets")
+  (gtype-id "GTK_TYPE_TOOL_PALETTE_DRAG_TARGETS")
+  (values
+    '("items" "GTK_TOOL_PALETTE_DRAG_ITEMS")
+    '("groups" "GTK_TOOL_PALETTE_DRAG_GROUPS")
+  )
+)
+
diff --git a/src/defs/GtkToolbar.defs b/src/defs/GtkToolbar.defs
new file mode 100644
index 0000000..ab10da3
--- /dev/null
+++ b/src/defs/GtkToolbar.defs
@@ -0,0 +1,142 @@
+(define-object Toolbar
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkToolbar")
+  (gtype-id "GTK_TYPE_TOOLBAR")
+)
+
+(define-function gtk_toolbar_new
+  (is-constructor-of "GtkToolbar")
+  (c-name "gtk_toolbar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-method insert
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_insert")
+  (return-type "none")
+  (parameters
+    '("GtkToolItem*" "item")
+    '("gint" "pos")
+  )
+)
+
+(define-method get_item_index
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_item_index")
+  (return-type "gint")
+  (parameters
+    '("GtkToolItem*" "item")
+  )
+)
+
+(define-method get_n_items
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_n_items")
+  (return-type "gint")
+)
+
+(define-method get_nth_item
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_nth_item")
+  (return-type "GtkToolItem*")
+  (parameters
+    '("gint" "n")
+  )
+)
+
+(define-method get_drop_index
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_drop_index")
+  (return-type "gint")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method set_drop_highlight_item
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_set_drop_highlight_item")
+  (return-type "none")
+  (parameters
+    '("GtkToolItem*" "tool_item" (null-ok))
+    '("gint" "index")
+  )
+)
+
+(define-method set_show_arrow
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_set_show_arrow")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_arrow")
+  )
+)
+
+(define-method get_show_arrow
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_show_arrow")
+  (return-type "gboolean")
+)
+
+(define-method get_relief_style
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_relief_style")
+  (return-type "GtkReliefStyle")
+)
+
+(define-method set_style
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_set_style")
+  (return-type "none")
+  (parameters
+    '("GtkToolbarStyle" "style")
+  )
+)
+
+(define-method unset_style
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_unset_style")
+  (return-type "none")
+)
+
+(define-method get_style
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_style")
+  (return-type "GtkToolbarStyle")
+)
+
+(define-method get_icon_size
+  (of-object "GtkToolbar")
+  (c-name "gtk_toolbar_get_icon_size")
+  (return-type "GtkIconSize")
+)
+
+(define-virtual orientation_changed
+  (of-object "GtkToolbar")
+  (return-type "none")
+  (parameters
+    '("GtkOrientation" "orientation")
+  )
+)
+
+(define-virtual style_changed
+  (of-object "GtkToolbar")
+  (return-type "none")
+  (parameters
+    '("GtkToolbarStyle" "style")
+  )
+)
+
+(define-virtual popup_context_menu
+  (of-object "GtkToolbar")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "button_number")
+  )
+)
+
diff --git a/src/defs/GtkToolbarSpaceStyle.defs b/src/defs/GtkToolbarSpaceStyle.defs
new file mode 100644
index 0000000..a38d7bf
--- /dev/null
+++ b/src/defs/GtkToolbarSpaceStyle.defs
@@ -0,0 +1,10 @@
+(define-enum ToolbarSpaceStyle
+  (in-module "Gtk")
+  (c-name "GtkToolbarSpaceStyle")
+  (gtype-id "GTK_TYPE_TOOLBAR_SPACE_STYLE")
+  (values
+    '("empty" "GTK_TOOLBAR_SPACE_EMPTY")
+    '("line" "GTK_TOOLBAR_SPACE_LINE")
+  )
+)
+
diff --git a/src/defs/GtkToolbarStyle.defs b/src/defs/GtkToolbarStyle.defs
new file mode 100644
index 0000000..f5af3d7
--- /dev/null
+++ b/src/defs/GtkToolbarStyle.defs
@@ -0,0 +1,12 @@
+(define-enum ToolbarStyle
+  (in-module "Gtk")
+  (c-name "GtkToolbarStyle")
+  (gtype-id "GTK_TYPE_TOOLBAR_STYLE")
+  (values
+    '("icons" "GTK_TOOLBAR_ICONS")
+    '("text" "GTK_TOOLBAR_TEXT")
+    '("both" "GTK_TOOLBAR_BOTH")
+    '("both-horiz" "GTK_TOOLBAR_BOTH_HORIZ")
+  )
+)
+
diff --git a/src/defs/GtkTooltip.defs b/src/defs/GtkTooltip.defs
new file mode 100644
index 0000000..a0fcfa6
--- /dev/null
+++ b/src/defs/GtkTooltip.defs
@@ -0,0 +1,79 @@
+(define-object Tooltip
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTooltip")
+  (gtype-id "GTK_TYPE_TOOLTIP")
+)
+
+(define-method set_markup
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_markup")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "markup" (null-ok))
+  )
+)
+
+(define-method set_text
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text" (null-ok))
+  )
+)
+
+(define-method set_icon
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_icon")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf" (null-ok))
+  )
+)
+
+(define-method set_icon
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_icon_from_stock")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id" (null-ok))
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-method set_custom
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_custom")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "custom_widget")
+  )
+)
+
+(define-method set_icon_from_gicon
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_icon_from_gicon")
+  (return-type "none")
+  (parameters
+    '("GIcon*" "gicon")
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-function trigger_tooltip_query
+  (c-name "gtk_tooltip_trigger_tooltip_query")
+  (return-type "none")
+  (parameters
+    '("GdkDisplay*" "display")
+  )
+)
+
+(define-method set_tip_area
+  (of-object "GtkTooltip")
+  (c-name "gtk_tooltip_set_tip_area")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "rect")
+  )
+)
diff --git a/src/defs/GtkTreeDragDest.defs b/src/defs/GtkTreeDragDest.defs
new file mode 100644
index 0000000..fe82e86
--- /dev/null
+++ b/src/defs/GtkTreeDragDest.defs
@@ -0,0 +1,44 @@
+(define-interface TreeDragDest
+  (in-module "Gtk")
+  (c-name "GtkTreeDragDest")
+  (gtype-id "GTK_TYPE_TREE_DRAG_DEST")
+)
+
+(define-method drag_data_received
+  (of-object "GtkTreeDragDest")
+  (c-name "gtk_tree_drag_dest_drag_data_received")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "dest")
+    '("GtkSelectionData*" "selection_data")
+  )
+)
+
+(define-method row_drop_possible
+  (of-object "GtkTreeDragDest")
+  (c-name "gtk_tree_drag_dest_row_drop_possible")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "dest_path")
+    '("GtkSelectionData*" "selection_data")
+  )
+)
+
+(define-virtual drag_data_received
+  (of-object "GtkTreeDragDest")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "dest")
+    '("GtkSelectionData*" "selection_data")
+  )
+)
+
+(define-virtual row_drop_possible
+  (of-object "GtkTreeDragDest")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "dest_path")
+    '("GtkSelectionData*" "selection_data")
+  )
+)
+
diff --git a/src/defs/GtkTreeDragSource.defs b/src/defs/GtkTreeDragSource.defs
new file mode 100644
index 0000000..95da0e8
--- /dev/null
+++ b/src/defs/GtkTreeDragSource.defs
@@ -0,0 +1,59 @@
+(define-interface TreeDragSource
+  (in-module "Gtk")
+  (c-name "GtkTreeDragSource")
+  (gtype-id "GTK_TYPE_TREE_DRAG_SOURCE")
+)
+
+(define-method row_draggable
+  (of-object "GtkTreeDragSource")
+  (c-name "gtk_tree_drag_source_row_draggable")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method drag_data_delete
+  (of-object "GtkTreeDragSource")
+  (c-name "gtk_tree_drag_source_drag_data_delete")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method drag_data_get
+  (of-object "GtkTreeDragSource")
+  (c-name "gtk_tree_drag_source_drag_data_get")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkSelectionData*" "selection_data")
+  )
+)
+
+(define-virtual row_draggable
+  (of-object "GtkTreeDragSource")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual drag_data_get
+  (of-object "GtkTreeDragSource")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkSelectionData*" "selection_data")
+  )
+)
+
+(define-virtual drag_data_delete
+  (of-object "GtkTreeDragSource")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
diff --git a/src/defs/GtkTreeIter.defs b/src/defs/GtkTreeIter.defs
new file mode 100644
index 0000000..7789b85
--- /dev/null
+++ b/src/defs/GtkTreeIter.defs
@@ -0,0 +1,21 @@
+(define-boxed TreeIter
+  (in-module "Gtk")
+  (c-name "GtkTreeIter")
+  (gtype-id "GTK_TYPE_TREE_ITER")
+  (copy-func "gtk_tree_iter_copy")
+  (release-func "gtk_tree_iter_free")
+)
+
+(define-method copy
+  (of-object "GtkTreeIter")
+  (c-name "gtk_tree_iter_copy")
+  (caller-owns-return #t)
+  (return-type "GtkTreeIter*")
+)
+
+(define-method free
+  (of-object "GtkTreeIter")
+  (c-name "gtk_tree_iter_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkTreeModel.defs b/src/defs/GtkTreeModel.defs
new file mode 100644
index 0000000..52e785c
--- /dev/null
+++ b/src/defs/GtkTreeModel.defs
@@ -0,0 +1,406 @@
+;; this is actually an interface. We have, however, modelled it in java-gnome
+;; as the abstract parent class of ListStore and TreeStore. Merely as a means
+;; to eliminate unnecessary warnings from our generated code, we change it
+;; here to (define-object ...) from (define-interface ...)
+
+(define-object TreeModel
+  (in-module "Gtk")
+  (c-name "GtkTreeModel")
+  (gtype-id "GTK_TYPE_TREE_MODEL")
+)
+
+(define-method get_flags
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_flags")
+  (return-type "GtkTreeModelFlags")
+)
+
+(define-method get_n_columns
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_n_columns")
+  (return-type "gint")
+)
+
+(define-method get_column_type
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_column_type")
+  (return-type "GType")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method get_iter
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_iter")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method get_iter_from_string
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_iter_from_string")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("const-gchar*" "path_string")
+  )
+)
+
+(define-method get_string_from_iter
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_string_from_iter")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method get_iter_first
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_iter_first")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method get_path
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_path")
+  (caller-owns-return #t)
+  (return-type "GtkTreePath*")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method get_value
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_value")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "column")
+    '("GValue*" "value")
+  )
+)
+
+(define-method iter_next
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_iter_next")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method iter_children
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_iter_children")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent" (null-ok))
+  )
+)
+
+(define-method iter_has_child
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_iter_has_child")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method iter_n_children
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_iter_n_children")
+  (return-type "gint")
+  (parameters
+    '("GtkTreeIter*" "iter" (null-ok))
+  )
+)
+
+(define-method iter_nth_child
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_iter_nth_child")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent" (null-ok))
+    '("gint" "n")
+  )
+)
+
+(define-method iter_parent
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_iter_parent")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "child")
+  )
+)
+
+(define-method ref_node
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_ref_node")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method unref_node
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_unref_node")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method get
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+  (varargs #t)
+)
+
+(define-method get_valist
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_get_valist")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("va_list" "var_args")
+  )
+)
+
+(define-method foreach
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_foreach")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModelForeachFunc" "func")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-method row_changed
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_row_changed")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method row_inserted
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_row_inserted")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method row_has_child_toggled
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_row_has_child_toggled")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method row_deleted
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_row_deleted")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method rows_reordered
+  (of-object "GtkTreeModel")
+  (c-name "gtk_tree_model_rows_reordered")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+    '("gint*" "new_order")
+  )
+)
+
+(define-virtual row_changed
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual row_inserted
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual row_has_child_toggled
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual row_deleted
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual rows_reordered
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+    '("gint*" "new_order")
+  )
+)
+
+(define-virtual get_flags
+  (of-object "GtkTreeModel")
+  (return-type "GtkTreeModelFlags")
+)
+
+(define-virtual get_n_columns
+  (of-object "GtkTreeModel")
+  (return-type "gint")
+)
+
+(define-virtual get_column_type
+  (of-object "GtkTreeModel")
+  (return-type "GType")
+  (parameters
+    '("gint" "index_")
+  )
+)
+
+(define-virtual get_iter
+  (of-object "GtkTreeModel")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual get_path
+  (of-object "GtkTreeModel")
+  (return-type "GtkTreePath*")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual get_value
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "column")
+    '("GValue*" "value")
+  )
+)
+
+(define-virtual iter_next
+  (of-object "GtkTreeModel")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual iter_children
+  (of-object "GtkTreeModel")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent")
+  )
+)
+
+(define-virtual iter_has_child
+  (of-object "GtkTreeModel")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual iter_n_children
+  (of-object "GtkTreeModel")
+  (return-type "gint")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual iter_nth_child
+  (of-object "GtkTreeModel")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent")
+    '("gint" "n")
+  )
+)
+
+(define-virtual iter_parent
+  (of-object "GtkTreeModel")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "child")
+  )
+)
+
+(define-virtual ref_node
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-virtual unref_node
+  (of-object "GtkTreeModel")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
diff --git a/src/defs/GtkTreeModelFilter.defs b/src/defs/GtkTreeModelFilter.defs
new file mode 100644
index 0000000..80effe4
--- /dev/null
+++ b/src/defs/GtkTreeModelFilter.defs
@@ -0,0 +1,116 @@
+(define-object TreeModelFilter
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkTreeModel")
+  (implements "GtkTreeDragSource")
+  (c-name "GtkTreeModelFilter")
+  (gtype-id "GTK_TYPE_TREE_MODEL_FILTER")
+)
+
+(define-function gtk_tree_model_filter_new
+  (is-constructor-of "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_new")
+  (return-type "GtkTreeModel*")
+  (parameters
+    '("GtkTreeModel*" "child_model")
+    '("GtkTreePath*" "root" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_visible_func
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_set_visible_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModelFilterVisibleFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_modify_func
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_set_modify_func")
+  (return-type "none")
+  (parameters
+    '("gint" "n_columns")
+    '("GType*" "types")
+    '("GtkTreeModelFilterModifyFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_visible_column
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_set_visible_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_model
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method convert_child_iter_to_iter
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_convert_child_iter_to_iter")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "filter_iter")
+    '("GtkTreeIter*" "child_iter")
+  )
+)
+
+(define-method convert_iter_to_child_iter
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_convert_iter_to_child_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "child_iter")
+    '("GtkTreeIter*" "filter_iter")
+  )
+)
+
+(define-method convert_child_path_to_path
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_convert_child_path_to_path")
+  (return-type "GtkTreePath*")
+  (parameters
+    '("GtkTreePath*" "child_path")
+  )
+)
+
+(define-method convert_path_to_child_path
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_convert_path_to_child_path")
+  (return-type "GtkTreePath*")
+  (parameters
+    '("GtkTreePath*" "filter_path")
+  )
+)
+
+(define-method refilter
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_refilter")
+  (return-type "none")
+)
+
+(define-method clear_cache
+  (of-object "GtkTreeModelFilter")
+  (c-name "gtk_tree_model_filter_clear_cache")
+  (return-type "none")
+)
+
+(define-virtual visible
+  (of-object "GtkTreeModelFilter")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeModel*" "child")
+    '("GtkTreeIter*" "iter")
+  )
+)
diff --git a/src/defs/GtkTreeModelFlags.defs b/src/defs/GtkTreeModelFlags.defs
new file mode 100644
index 0000000..e783d23
--- /dev/null
+++ b/src/defs/GtkTreeModelFlags.defs
@@ -0,0 +1,10 @@
+(define-flags TreeModelFlags
+  (in-module "Gtk")
+  (c-name "GtkTreeModelFlags")
+  (gtype-id "GTK_TYPE_TREE_MODEL_FLAGS")
+  (values
+    '("iters-persist" "GTK_TREE_MODEL_ITERS_PERSIST")
+    '("list-only" "GTK_TREE_MODEL_LIST_ONLY")
+  )
+)
+
diff --git a/src/defs/GtkTreeModelSort.defs b/src/defs/GtkTreeModelSort.defs
new file mode 100644
index 0000000..a5f30b6
--- /dev/null
+++ b/src/defs/GtkTreeModelSort.defs
@@ -0,0 +1,88 @@
+(define-object TreeModelSort
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkTreeModel")
+  (implements "GtkTreeDragSource")
+  (implements "GtkTreeSortable")
+  (c-name "GtkTreeModelSort")
+  (gtype-id "GTK_TYPE_TREE_MODEL_SORT")
+)
+
+(define-function gtk_tree_model_sort_new_with_model
+  (is-constructor-of "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_new_with_model")
+  (caller-owns-return #t)
+  (return-type "GtkTreeModel*")
+  (parameters
+    '("GtkTreeModel*" "model")
+  )
+)
+
+(define-method get_model
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method convert_child_path_to_path
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_convert_child_path_to_path")
+  (caller-owns-return #t)
+  (return-type "GtkTreePath*")
+  (parameters
+    '("GtkTreePath*" "child_path")
+  )
+)
+
+(define-method convert_child_iter_to_iter
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_convert_child_iter_to_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "sort_iter" (null-ok))
+    '("GtkTreeIter*" "child_iter")
+  )
+)
+
+(define-method convert_path_to_child_path
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_convert_path_to_child_path")
+  (caller-owns-return #t)
+  (return-type "GtkTreePath*")
+  (parameters
+    '("GtkTreePath*" "sorted_path")
+  )
+)
+
+(define-method convert_iter_to_child_iter
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_convert_iter_to_child_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "child_iter" (null-ok))
+    '("GtkTreeIter*" "sorted_iter")
+  )
+)
+
+(define-method reset_default_sort_func
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_reset_default_sort_func")
+  (return-type "none")
+)
+
+(define-method clear_cache
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_clear_cache")
+  (return-type "none")
+  (unnecessary)
+)
+
+(define-method iter_is_valid
+  (of-object "GtkTreeModelSort")
+  (c-name "gtk_tree_model_sort_iter_is_valid")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
diff --git a/src/defs/GtkTreePath.defs b/src/defs/GtkTreePath.defs
new file mode 100644
index 0000000..ad5e814
--- /dev/null
+++ b/src/defs/GtkTreePath.defs
@@ -0,0 +1,123 @@
+(define-boxed TreePath
+  (in-module "Gtk")
+  (c-name "GtkTreePath")
+  (gtype-id "GTK_TYPE_TREE_PATH")
+)
+
+(define-function gtk_tree_path_new
+  (is-constructor-of "GtkTreePath")
+  (c-name "gtk_tree_path_new")
+  (caller-owns-return #t)
+  (return-type "GtkTreePath*")
+)
+
+(define-function tree_path_new_from_string
+  (is-constructor-of "GtkTreePath")
+  (c-name "gtk_tree_path_new_from_string")
+  (return-type "GtkTreePath*")
+  (parameters
+    '("gchar*" "path")
+  )
+)
+
+(define-method to_string
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_to_string")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method append_index
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_append_index")
+  (return-type "none")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method prepend_index
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_prepend_index")
+  (return-type "none")
+  (parameters
+    '("gint" "index")
+  )
+)
+
+(define-method get_depth
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_get_depth")
+  (return-type "gint")
+)
+
+(define-method get_indices
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_get_indices")
+  (return-type "gint*")
+)
+
+(define-method free
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_free")
+  (return-type "none")
+)
+
+(define-method copy
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_copy")
+  (caller-owns-return #t)
+  (return-type "GtkTreePath*")
+)
+
+(define-method compare
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_compare")
+  (return-type "gint")
+  (parameters
+    '("const-GtkTreePath*" "b")
+  )
+)
+
+(define-method next
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_next")
+  (return-type "none")
+)
+
+(define-method prev
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_prev")
+  (return-type "gint")
+)
+
+(define-method up
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_up")
+  (return-type "gint")
+)
+
+(define-method down
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_down")
+  (return-type "none")
+)
+
+(define-method is_ancestor
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_is_ancestor")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "descendant")
+  )
+)
+
+(define-method is_descendant
+  (of-object "GtkTreePath")
+  (c-name "gtk_tree_path_is_descendant")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "ancestor")
+  )
+)
+
diff --git a/src/defs/GtkTreeRowReference.defs b/src/defs/GtkTreeRowReference.defs
new file mode 100644
index 0000000..4ac9e4c
--- /dev/null
+++ b/src/defs/GtkTreeRowReference.defs
@@ -0,0 +1,62 @@
+(define-boxed TreeRowReference
+  (in-module "Gtk")
+  (c-name "GtkTreeRowReference")
+  (gtype-id "GTK_TYPE_TREE_ROW_REFERENCE")
+  (copy-func "gtk_tree_row_reference_copy")
+  (release-func "gtk_tree_row_reference_free")
+)
+
+(define-function gtk_tree_row_reference_new
+  (is-constructor-of "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_new")
+  (caller-owns-return #t)
+  (return-type "GtkTreeRowReference*")
+  (parameters
+    '("GtkTreeModel*" "model")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-function gtk_tree_row_reference_new_proxy
+  (is-constructor-of "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_new_proxy")
+  (caller-owns-return #t)
+  (return-type "GtkTreeRowReference*")
+  (parameters
+    '("GObject*" "proxy")
+    '("GtkTreeModel*" "model")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method get_path
+  (of-object "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_get_path")
+  (caller-owns-return #t)
+  (return-type "GtkTreePath*")
+)
+
+(define-method get_model
+  (of-object "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method valid
+  (of-object "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_valid")
+  (return-type "gboolean")
+)
+
+(define-method copy
+  (of-object "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_copy")
+  (return-type "GtkTreeRowReference*")
+)
+
+(define-method free
+  (of-object "GtkTreeRowReference")
+  (c-name "gtk_tree_row_reference_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkTreeSelection.defs b/src/defs/GtkTreeSelection.defs
new file mode 100644
index 0000000..2bc77f2
--- /dev/null
+++ b/src/defs/GtkTreeSelection.defs
@@ -0,0 +1,172 @@
+(define-object TreeSelection
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkTreeSelection")
+  (gtype-id "GTK_TYPE_TREE_SELECTION")
+)
+
+(define-method set_mode
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_set_mode")
+  (return-type "none")
+  (parameters
+    '("GtkSelectionMode" "type")
+  )
+)
+
+(define-method get_mode
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_get_mode")
+  (return-type "GtkSelectionMode")
+)
+
+(define-method set_select_function
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_set_select_function")
+  (return-type "none")
+  (parameters
+    '("GtkTreeSelectionFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method get_user_data
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_get_user_data")
+  (return-type "gpointer")
+)
+
+(define-method get_tree_view
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_get_tree_view")
+  (return-type "GtkTreeView*")
+)
+
+(define-method get_selected
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_get_selected")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeModel**" "model" (null-ok))
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method get_selected_rows
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_get_selected_rows")
+  (return-type "GList-GtkTreePath*")
+  (caller-owns-return #t)
+  (parameters
+    '("GtkTreeModel**" "model" (null-ok))
+  )
+)
+
+(define-method count_selected_rows
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_count_selected_rows")
+  (return-type "gint")
+)
+
+(define-method selected_foreach
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_selected_foreach")
+  (return-type "none")
+  (parameters
+    '("GtkTreeSelectionForeachFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-method select_path
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_select_path")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method unselect_path
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_unselect_path")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method select_iter
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_select_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method unselect_iter
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_unselect_iter")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method path_is_selected
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_path_is_selected")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method iter_is_selected
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_iter_is_selected")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method select_all
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_select_all")
+  (return-type "none")
+)
+
+(define-method unselect_all
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_unselect_all")
+  (return-type "none")
+)
+
+(define-method select_range
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_select_range")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "start_path")
+    '("GtkTreePath*" "end_path")
+  )
+)
+
+(define-method unselect_range
+  (of-object "GtkTreeSelection")
+  (c-name "gtk_tree_selection_unselect_range")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "start_path")
+    '("GtkTreePath*" "end_path")
+  )
+)
+
+(define-virtual changed
+  (of-object "GtkTreeSelection")
+  (return-type "none")
+)
+
diff --git a/src/defs/GtkTreeSortable.defs b/src/defs/GtkTreeSortable.defs
new file mode 100644
index 0000000..8a27b4e
--- /dev/null
+++ b/src/defs/GtkTreeSortable.defs
@@ -0,0 +1,110 @@
+(define-interface TreeSortable
+  (in-module "Gtk")
+  (c-name "GtkTreeSortable")
+  (gtype-id "GTK_TYPE_TREE_SORTABLE")
+)
+
+(define-method sort_column_changed
+  (of-object "GtkTreeSortable")
+  (c-name "gtk_tree_sortable_sort_column_changed")
+  (return-type "none")
+)
+
+(define-method get_sort_column_id
+  (of-object "GtkTreeSortable")
+  (c-name "gtk_tree_sortable_get_sort_column_id")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "sort_column_id")
+    '("GtkSortType*" "order")
+  )
+)
+
+(define-method set_sort_column_id
+  (of-object "GtkTreeSortable")
+  (c-name "gtk_tree_sortable_set_sort_column_id")
+  (return-type "none")
+  (parameters
+    '("gint" "sort_column_id")
+    '("GtkSortType" "order")
+  )
+)
+
+(define-method set_sort_func
+  (of-object "GtkTreeSortable")
+  (c-name "gtk_tree_sortable_set_sort_func")
+  (return-type "none")
+  (parameters
+    '("gint" "sort_column_id")
+    '("GtkTreeIterCompareFunc" "sort_func")
+    '("gpointer" "user_data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_default_sort_func
+  (of-object "GtkTreeSortable")
+  (c-name "gtk_tree_sortable_set_default_sort_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIterCompareFunc" "sort_func")
+    '("gpointer" "user_data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method has_default_sort_func
+  (of-object "GtkTreeSortable")
+  (c-name "gtk_tree_sortable_has_default_sort_func")
+  (return-type "gboolean")
+)
+
+(define-virtual sort_column_changed
+  (of-object "GtkTreeSortable")
+  (return-type "none")
+)
+
+(define-virtual get_sort_column_id
+  (of-object "GtkTreeSortable")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "sort_column_id")
+    '("GtkSortType*" "order")
+  )
+)
+
+(define-virtual set_sort_column_id
+  (of-object "GtkTreeSortable")
+  (return-type "none")
+  (parameters
+    '("gint" "sort_column_id")
+    '("GtkSortType" "order")
+  )
+)
+
+(define-virtual set_sort_func
+  (of-object "GtkTreeSortable")
+  (return-type "none")
+  (parameters
+    '("gint" "sort_column_id")
+    '("GtkTreeIterCompareFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-virtual set_default_sort_func
+  (of-object "GtkTreeSortable")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIterCompareFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-virtual has_default_sort_func
+  (of-object "GtkTreeSortable")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/GtkTreeStore.defs b/src/defs/GtkTreeStore.defs
new file mode 100644
index 0000000..d598c62
--- /dev/null
+++ b/src/defs/GtkTreeStore.defs
@@ -0,0 +1,242 @@
+(define-object TreeStore
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkTreeModel")
+  (implements "GtkTreeDragSource")
+  (implements "GtkTreeDragDest")
+  (implements "GtkTreeSortable")
+  (c-name "GtkTreeStore")
+  (gtype-id "GTK_TYPE_TREE_STORE")
+)
+
+(define-function gtk_tree_store_new
+  (is-constructor-of "GtkTreeStore")
+  (c-name "gtk_tree_store_new")
+  (caller-owns-return #t)
+  (return-type "GtkTreeStore*")
+  (parameters
+    '("gint" "n_columns")
+  )
+  (varargs #t)
+  (unnecessary "GtkTreeModelOverride")
+)
+
+(define-function gtk_tree_store_newv
+  (is-constructor-of "GtkTreeStore")
+  (c-name "gtk_tree_store_newv")
+  (caller-owns-return #t)
+  (return-type "GtkTreeStore*")
+  (parameters
+    '("gint" "n_columns")
+    '("GType*" "types")
+  )
+  (unnecessary "GtkTreeModelOverride")
+)
+
+(define-method set_column_types
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_set_column_types")
+  (return-type "none")
+  (parameters
+    '("gint" "n_columns")
+    '("GType*" "types")
+  )
+)
+
+(define-method set_value
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_set_value")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("gint" "column")
+    '("GValue*" "value")
+  )
+)
+
+(define-method set
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_set")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+  (varargs #t)
+  (unnecessary)
+)
+
+(define-method set_valist
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_set_valist")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("va_list" "var_args")
+  )
+  (unnecessary)
+)
+
+(define-method remove
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_remove")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method insert
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_insert")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent" (null-ok))
+    '("gint" "position")
+  )
+)
+
+(define-method insert_before
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_insert_before")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent" (null-ok))
+    '("GtkTreeIter*" "sibling")
+  )
+)
+
+(define-method insert_after
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_insert_after")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent")
+    '("GtkTreeIter*" "sibling")
+  )
+)
+
+(define-method prepend
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_prepend")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent")
+  )
+)
+
+(define-method append
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_append")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent" (null-ok))
+  )
+)
+
+(define-method is_ancestor
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_is_ancestor")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "descendant")
+  )
+)
+
+(define-method iter_depth
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_iter_depth")
+  (return-type "gint")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method clear
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_clear")
+  (return-type "none")
+)
+
+(define-method iter_is_valid
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_iter_is_valid")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+  )
+)
+
+(define-method reorder
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_reorder")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "parent")
+    '("gint*" "new_order")
+  )
+)
+
+(define-method swap
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_swap")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "a")
+    '("GtkTreeIter*" "b")
+  )
+)
+
+(define-method move_after
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_move_after")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "position" (null-ok))
+  )
+)
+
+(define-method move_before
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_move_before")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "position" (null-ok))
+  )
+)
+
+(define-method insert_with_values
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_insert_with_values")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent")
+    '("gint" "position")
+  )
+  (varargs #t)
+  (unnecessary)
+)
+
+(define-method insert_with_valuesv
+  (of-object "GtkTreeStore")
+  (c-name "gtk_tree_store_insert_with_valuesv")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreeIter*" "parent")
+    '("gint" "position")
+    '("gint*" "columns")
+    '("GValue*" "values")
+    '("gint" "n_values")
+  )
+  (unnecessary)
+)
+
diff --git a/src/defs/GtkTreeView.defs b/src/defs/GtkTreeView.defs
new file mode 100644
index 0000000..74b7c76
--- /dev/null
+++ b/src/defs/GtkTreeView.defs
@@ -0,0 +1,984 @@
+(define-object TreeView
+  (in-module "Gtk")
+  (parent "GtkContainer")
+  (c-name "GtkTreeView")
+  (gtype-id "GTK_TYPE_TREE_VIEW")
+)
+
+(define-function gtk_tree_view_new
+  (is-constructor-of "GtkTreeView")
+  (c-name "gtk_tree_view_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_tree_view_new_with_model
+  (is-constructor-of "GtkTreeView")
+  (c-name "gtk_tree_view_new_with_model")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkTreeModel*" "model")
+  )
+)
+
+(define-method get_model
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_model")
+  (return-type "GtkTreeModel*")
+)
+
+(define-method set_model
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_model")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModel*" "model" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_selection
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_selection")
+  (return-type "GtkTreeSelection*")
+)
+
+(define-method get_hadjustment
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_hadjustment
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_hadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method get_vadjustment
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_vadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_vadjustment
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_vadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-method get_headers_visible
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_headers_visible")
+  (return-type "gboolean")
+)
+
+(define-method set_headers_visible
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_headers_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "headers_visible")
+  )
+)
+
+(define-method columns_autosize
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_columns_autosize")
+  (return-type "none")
+)
+
+(define-method set_headers_clickable
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_headers_clickable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "active")
+  )
+)
+
+(define-method set_rules_hint
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_rules_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_rules_hint
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_rules_hint")
+  (return-type "gboolean")
+)
+
+(define-method append_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_append_column")
+  (return-type "gint")
+  (parameters
+    '("GtkTreeViewColumn*" "column")
+  )
+)
+
+(define-method remove_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_remove_column")
+  (return-type "gint")
+  (parameters
+    '("GtkTreeViewColumn*" "column")
+  )
+)
+
+(define-method insert_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_insert_column")
+  (return-type "gint")
+  (parameters
+    '("GtkTreeViewColumn*" "column")
+    '("gint" "position")
+  )
+)
+
+(define-method insert_column_with_attributes
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_insert_column_with_attributes")
+  (return-type "gint")
+  (parameters
+    '("gint" "position")
+    '("const-gchar*" "title")
+    '("GtkCellRenderer*" "cell")
+  )
+  (varargs #t)
+)
+
+(define-method insert_column_with_data_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_insert_column_with_data_func")
+  (return-type "gint")
+  (parameters
+    '("gint" "position")
+    '("const-gchar*" "title")
+    '("GtkCellRenderer*" "cell")
+    '("GtkTreeCellDataFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "dnotify")
+  )
+)
+
+(define-method get_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_column")
+  (return-type "GtkTreeViewColumn*")
+  (parameters
+    '("gint" "n")
+  )
+)
+
+(define-method get_columns
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_columns")
+  (caller-owns-return #l)
+  (return-type "GList-GtkTreeViewColumn*")
+)
+
+(define-method move_column_after
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_move_column_after")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewColumn*" "column")
+    '("GtkTreeViewColumn*" "base_column" (null-ok))
+  )
+)
+
+(define-method set_expander_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_expander_column")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewColumn*" "column")
+  )
+)
+
+(define-method get_expander_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_expander_column")
+  (return-type "GtkTreeViewColumn*")
+)
+
+(define-method set_column_drag_function
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_column_drag_function")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewColumnDropFunc" "func")
+    '("gpointer" "user_data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method scroll_to_point
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_scroll_to_point")
+  (return-type "none")
+  (parameters
+    '("gint" "tree_x")
+    '("gint" "tree_y")
+  )
+)
+
+(define-method scroll_to_cell
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_scroll_to_cell")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "column" (default "NULL") (null-ok))
+    '("gboolean" "use_align" (default "FALSE"))
+    '("gfloat" "row_align" (default "0.0"))
+    '("gfloat" "col_align" (default "0.0"))
+  )
+)
+
+;; It is not entirely clear that column being NULL is actually allowed, but
+;; it seems to work.
+
+(define-method row_activated
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_row_activated")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "column" (null-ok))
+  )
+)
+
+(define-method expand_all
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_expand_all")
+  (return-type "none")
+)
+
+(define-method collapse_all
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_collapse_all")
+  (return-type "none")
+)
+
+(define-method expand_to_path
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_expand_to_path")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method expand_row
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_expand_row")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("gboolean" "open_all")
+  )
+)
+
+(define-method collapse_row
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_collapse_row")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method map_expanded_rows
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_map_expanded_rows")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewMappingFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-method row_expanded
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_row_expanded")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method set_reorderable
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_reorderable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "reorderable")
+  )
+)
+
+(define-method get_reorderable
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_reorderable")
+  (return-type "gboolean")
+)
+
+(define-method set_cursor
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_cursor")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "focus_column" (default "NULL") (null-ok))
+    '("gboolean" "start_editing" (default "FALSE"))
+  )
+)
+
+(define-method set_cursor_on_cell
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_cursor_on_cell")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "focus_column" (default "NULL") (null-ok))
+    '("GtkCellRenderer*" "focus_cell" (default "NULL") (null-ok))
+    '("gboolean" "start_editing" (default "FALSE"))
+  )
+)
+
+(define-method get_cursor
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_cursor")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath**" "path")
+    '("GtkTreeViewColumn**" "focus_column")
+  )
+)
+
+(define-method get_bin_window
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_bin_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method get_path_at_pos
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_path_at_pos")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("GtkTreePath**" "path" (null-ok))
+    '("GtkTreeViewColumn**" "column" (null-ok))
+    '("gint*" "cell_x" (null-ok))
+    '("gint*" "cell_y" (null-ok))
+  )
+)
+
+(define-method get_cell_area
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_cell_area")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "column" (null-ok))
+    '("GdkRectangle*" "rect")
+  )
+)
+
+(define-method get_background_area
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_background_area")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "column")
+    '("GdkRectangle*" "rect")
+  )
+)
+
+(define-method get_visible_rect
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_visible_rect")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "visible_rect")
+  )
+)
+
+(define-method enable_model_drag_source
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_enable_model_drag_source")
+  (return-type "none")
+  (parameters
+    '("GdkModifierType" "start_button_mask")
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method enable_model_drag_dest
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_enable_model_drag_dest")
+  (return-type "none")
+  (parameters
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method unset_rows_drag_source
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_unset_rows_drag_source")
+  (return-type "none")
+)
+
+(define-method unset_rows_drag_dest
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_unset_rows_drag_dest")
+  (return-type "none")
+)
+
+(define-method set_drag_dest_row
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_drag_dest_row")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewDropPosition" "pos")
+  )
+)
+
+(define-method get_drag_dest_row
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_drag_dest_row")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath**" "path")
+    '("GtkTreeViewDropPosition*" "pos")
+  )
+)
+
+(define-method get_dest_row_at_pos
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_dest_row_at_pos")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "drag_x")
+    '("gint" "drag_y")
+    '("GtkTreePath**" "path")
+    '("GtkTreeViewDropPosition*" "pos")
+  )
+)
+
+(define-method create_row_drag_icon
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_create_row_drag_icon")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-method set_enable_search
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_enable_search")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enable_search")
+  )
+)
+
+(define-method get_enable_search
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_enable_search")
+  (return-type "gboolean")
+)
+
+(define-method get_search_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_search_column")
+  (return-type "gint")
+)
+
+(define-method set_search_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_search_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_search_equal_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_search_equal_func")
+  (return-type "GtkTreeViewSearchEqualFunc")
+)
+
+(define-method set_search_equal_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_search_equal_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewSearchEqualFunc" "search_equal_func")
+    '("gpointer" "search_user_data")
+    '("GtkDestroyNotify" "search_destroy")
+  )
+)
+
+(define-method set_destroy_count_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_destroy_count_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeDestroyCountFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_fixed_height_mode
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_fixed_height_mode")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enable")
+  )
+)
+
+(define-method get_fixed_height_mode
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_fixed_height_mode")
+  (return-type "gboolean")
+)
+
+(define-method set_hover_selection
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_hover_selection")
+  (return-type "none")
+  (parameters
+    '("gboolean" "hover")
+  )
+)
+
+(define-method get_hover_selection
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_hover_selection")
+  (return-type "gboolean")
+)
+
+(define-method set_hover_expand
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_hover_expand")
+  (return-type "none")
+  (parameters
+    '("gboolean" "expand")
+  )
+)
+
+(define-method get_hover_expand
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_hover_expand")
+  (return-type "gboolean")
+)
+
+(define-method get_row_separator_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_row_separator_func")
+  (return-type "GtkTreeViewRowSeparatorFunc")
+)
+
+(define-method set_row_separator_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_row_separator_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewRowSeparatorFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-method get_visible_range
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_visible_range")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreePath**" "start_path")
+    '("GtkTreePath**" "end_path")
+  )
+)
+
+(define-virtual set_scroll_adjustments
+  (of-object "GtkTreeView")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+    '("GtkAdjustment*" "vadjustment")
+  )
+)
+
+(define-virtual row_activated
+  (of-object "GtkTreeView")
+  (return-type "none")
+  (parameters
+    '("GtkTreePath*" "path")
+    '("GtkTreeViewColumn*" "column")
+  )
+)
+
+(define-virtual test_expand_row
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual test_collapse_row
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual row_expanded
+  (of-object "GtkTreeView")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual row_collapsed
+  (of-object "GtkTreeView")
+  (return-type "none")
+  (parameters
+    '("GtkTreeIter*" "iter")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-virtual columns_changed
+  (of-object "GtkTreeView")
+  (return-type "none")
+)
+
+(define-virtual cursor_changed
+  (of-object "GtkTreeView")
+  (return-type "none")
+)
+
+(define-virtual move_cursor
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+  (parameters
+    '("GtkMovementStep" "step")
+    '("gint" "count")
+  )
+)
+
+(define-virtual select_all
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+)
+
+(define-virtual unselect_all
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+)
+
+(define-virtual select_cursor_row
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "start_editing")
+  )
+)
+
+(define-virtual toggle_cursor_row
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+)
+
+(define-virtual expand_collapse_cursor_row
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "logical")
+    '("gboolean" "expand")
+    '("gboolean" "open_all")
+  )
+)
+
+(define-virtual select_cursor_parent
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+)
+
+(define-virtual start_interactive_search
+  (of-object "GtkTreeView")
+  (return-type "gboolean")
+)
+
+(define-method get_headers_clickable
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_headers_clickable")
+  (return-type "gboolean")
+)
+
+(define-method get_search_entry
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_search_entry")
+  (return-type "GtkEntry*")
+)
+
+(define-method set_search_entry
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_search_entry")
+  (return-type "none")
+  (parameters
+    '("GtkEntry*" "entry" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_search_position_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_search_position_func")
+  (return-type "GtkTreeViewSearchPositionFunc")
+)
+
+(define-method set_search_position_func
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_search_position_func")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewSearchPositionFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-method set_rubber_banding
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_rubber_banding")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enable")
+  )
+)
+
+(define-method get_rubber_banding
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_rubber_banding")
+  (return-type "gboolean")
+)
+
+(define-method get_grid_lines
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_grid_lines")
+  (return-type "GtkTreeViewGridLines")
+)
+
+(define-method set_grid_lines
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_grid_lines")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewGridLines" "grid_lines")
+  )
+)
+
+(define-method get_enable_tree_lines
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_enable_tree_lines")
+  (return-type "gboolean")
+)
+
+(define-method set_enable_tree_lines
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_enable_tree_lines")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enabled")
+  )
+)
+
+(define-method convert_bin_window_to_tree_coords
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_convert_bin_window_to_tree_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "bx")
+    '("gint" "by")
+    '("gint*" "tx")
+    '("gint*" "ty")
+  )
+)
+
+(define-method convert_bin_window_to_widget_coords
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_convert_bin_window_to_widget_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "bx")
+    '("gint" "by")
+    '("gint*" "wx")
+    '("gint*" "wy")
+  )
+)
+
+(define-method convert_tree_to_bin_window_coords
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_convert_tree_to_bin_window_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "tx")
+    '("gint" "ty")
+    '("gint*" "bx")
+    '("gint*" "by")
+  )
+)
+
+(define-method convert_tree_to_widget_coords
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_convert_tree_to_widget_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "tx")
+    '("gint" "ty")
+    '("gint*" "wx")
+    '("gint*" "wy")
+  )
+)
+
+(define-method convert_widget_to_bin_window_coords
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_convert_widget_to_bin_window_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "wx")
+    '("gint" "wy")
+    '("gint*" "bx")
+    '("gint*" "by")
+  )
+)
+
+(define-method convert_widget_to_tree_coords
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_convert_widget_to_tree_coords")
+  (return-type "none")
+  (parameters
+    '("gint" "wx")
+    '("gint" "wy")
+    '("gint*" "tx")
+    '("gint*" "ty")
+  )
+)
+
+(define-method get_level_indentation
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_level_indentation")
+  (return-type "gint")
+)
+
+(define-method set_level_indentation
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_level_indentation")
+  (return-type "none")
+  (parameters
+    '("gint" "indentation")
+  )
+)
+
+(define-method get_show_expanders
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_show_expanders")
+  (return-type "gboolean")
+)
+
+(define-method set_show_expanders
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_show_expanders")
+  (return-type "none")
+  (parameters
+    '("gboolean" "enabled")
+  )
+)
+
+(define-method get_tooltip_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_tooltip_column")
+  (return-type "gint")
+)
+
+(define-method set_tooltip_column
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_tooltip_column")
+  (return-type "none")
+  (parameters
+    '("gint" "column")
+  )
+)
+
+(define-method get_tooltip_context
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_get_tooltip_context")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gboolean" "keyboard_tip")
+    '("GtkTreeModel**" "model" (null-ok))
+    '("GtkTreePath**" "path" (null-ok))
+    '("GtkTreeIter*" "iter" (null-ok))
+  )
+)
+
+(define-method is_rubber_banding_active
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_is_rubber_banding_active")
+  (return-type "gboolean")
+)
+
+(define-method set_tooltip_cell
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_tooltip_cell")
+  (return-type "none")
+  (parameters
+    '("GtkTooltip*" "tooltip")
+    '("GtkTreePath*" "path" (null-ok))
+    '("GtkTreeViewColumn*" "column" (null-ok))
+    '("GtkCellRenderer*" "cell" (null-ok))
+  )
+)
+
+(define-method set_tooltip_row
+  (of-object "GtkTreeView")
+  (c-name "gtk_tree_view_set_tooltip_row")
+  (return-type "none")
+  (parameters
+    '("GtkTooltip*" "tooltip")
+    '("GtkTreePath*" "path")
+  )
+)
+
diff --git a/src/defs/GtkTreeViewColumn.defs b/src/defs/GtkTreeViewColumn.defs
new file mode 100644
index 0000000..f9eabad
--- /dev/null
+++ b/src/defs/GtkTreeViewColumn.defs
@@ -0,0 +1,360 @@
+(define-object TreeViewColumn
+  (in-module "Gtk")
+  (parent "GObject")
+  (implements "GtkCellLayout")
+  (c-name "GtkTreeViewColumn")
+  (gtype-id "GTK_TYPE_TREE_VIEW_COLUMN")
+)
+
+(define-method queue_resize
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_queue_resize")
+  (return-type "none")
+)
+
+(define-function gtk_tree_view_column_new
+  (is-constructor-of "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_new")
+  (caller-owns-return #t)
+  (return-type "GtkTreeViewColumn*")
+)
+
+(define-function gtk_tree_view_column_new_with_attributes
+  (is-constructor-of "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_new_with_attributes")
+  (caller-owns-return #t)
+  (return-type "GtkTreeViewColumn*")
+  (parameters
+    '("gchar*" "title")
+    '("GtkCellRenderer*" "cell")
+  )
+  (varargs #t)
+)
+
+(define-method clear
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_clear")
+  (return-type "none")
+)
+
+(define-method get_cell_renderers
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_cell_renderers")
+  (caller-owns-return #l)
+  (return-type "GList-GtkCellRenderers*")
+)
+
+(define-method set_spacing
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_spacing")
+  (return-type "none")
+  (parameters
+    '("gint" "spacing")
+  )
+)
+
+(define-method get_spacing
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_spacing")
+  (return-type "gint")
+)
+
+(define-method set_visible
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method get_visible
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method set_resizable
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_resizable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "resizable")
+  )
+)
+
+(define-method get_resizable
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_resizable")
+  (return-type "gboolean")
+)
+
+(define-method set_sizing
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_sizing")
+  (return-type "none")
+  (parameters
+    '("GtkTreeViewColumnSizing" "type")
+  )
+)
+
+(define-method get_sizing
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_sizing")
+  (return-type "gint")
+)
+
+(define-method get_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_width")
+  (return-type "gint")
+)
+
+(define-method get_fixed_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_fixed_width")
+  (return-type "gint")
+)
+
+(define-method set_fixed_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_fixed_width")
+  (return-type "none")
+  (parameters
+    '("gint" "fixed_width")
+  )
+)
+
+(define-method set_min_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_min_width")
+  (return-type "none")
+  (parameters
+    '("gint" "min_width")
+  )
+)
+
+(define-method get_min_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_min_width")
+  (return-type "gint")
+)
+
+(define-method set_max_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_max_width")
+  (return-type "none")
+  (parameters
+    '("gint" "max_width")
+  )
+)
+
+(define-method get_max_width
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_max_width")
+  (return-type "gint")
+)
+
+(define-method clicked
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_clicked")
+  (return-type "none")
+)
+
+(define-method set_title
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_title")
+  (return-type "none")
+  (parameters
+    '("gchar*" "title")
+  )
+)
+
+(define-method get_title
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method set_expand
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_expand")
+  (return-type "none")
+  (parameters
+    '("gboolean" "expand")
+  )
+)
+
+(define-method get_expand
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_expand")
+  (return-type "gboolean")
+)
+
+(define-method set_clickable
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_clickable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "active")
+  )
+)
+
+(define-method get_clickable
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_clickable")
+  (return-type "gboolean")
+)
+
+(define-method set_widget
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_widget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget" (null-ok))
+  )
+)
+
+(define-method get_widget
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_widget")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_alignment
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+  )
+)
+
+(define-method get_alignment
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_alignment")
+  (return-type "gfloat")
+)
+
+(define-method set_reorderable
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_reorderable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "reorderable")
+  )
+)
+
+(define-method get_reorderable
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_reorderable")
+  (return-type "gboolean")
+)
+
+(define-method set_sort_column_id
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_sort_column_id")
+  (return-type "none")
+  (parameters
+    '("gint" "sort_column_id")
+  )
+)
+
+(define-method get_sort_column_id
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_sort_column_id")
+  (return-type "gint")
+)
+
+(define-method set_sort_indicator
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_sort_indicator")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_sort_indicator
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_sort_indicator")
+  (return-type "gboolean")
+)
+
+(define-method set_sort_order
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_set_sort_order")
+  (return-type "none")
+  (parameters
+    '("GtkSortType" "order")
+  )
+)
+
+(define-method get_sort_order
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_sort_order")
+  (return-type "GtkSortType")
+)
+
+(define-method cell_set_cell_data
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_cell_set_cell_data")
+  (return-type "none")
+  (parameters
+    '("GtkTreeModel*" "tree_model")
+    '("GtkTreeIter*" "iter")
+    '("gboolean" "is_expander")
+    '("gboolean" "is_expanded")
+  )
+)
+
+(define-method cell_get_size
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_cell_get_size")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "cell_area")
+    '("gint*" "x_offset")
+    '("gint*" "y_offset")
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method cell_is_visible
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_cell_is_visible")
+  (return-type "gboolean")
+)
+
+(define-method focus_cell
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_focus_cell")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell")
+  )
+)
+
+(define-method cell_get_position
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_cell_get_position")
+  (return-type "none")
+  (parameters
+    '("GtkCellRenderer*" "cell_renderer")
+    '("gint*" "start_pos")
+    '("gint*" "width")
+  )
+)
+
+(define-virtual clicked
+  (of-object "GtkTreeViewColumn")
+  (return-type "none")
+)
+
+(define-method get_tree_view
+  (of-object "GtkTreeViewColumn")
+  (c-name "gtk_tree_view_column_get_tree_view")
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkTreeViewColumnSizing.defs b/src/defs/GtkTreeViewColumnSizing.defs
new file mode 100644
index 0000000..b30b6cc
--- /dev/null
+++ b/src/defs/GtkTreeViewColumnSizing.defs
@@ -0,0 +1,11 @@
+(define-enum TreeViewColumnSizing
+  (in-module "Gtk")
+  (c-name "GtkTreeViewColumnSizing")
+  (gtype-id "GTK_TYPE_TREE_VIEW_COLUMN_SIZING")
+  (values
+    '("grow-only" "GTK_TREE_VIEW_COLUMN_GROW_ONLY")
+    '("autosize" "GTK_TREE_VIEW_COLUMN_AUTOSIZE")
+    '("fixed" "GTK_TREE_VIEW_COLUMN_FIXED")
+  )
+)
+
diff --git a/src/defs/GtkTreeViewDropPosition.defs b/src/defs/GtkTreeViewDropPosition.defs
new file mode 100644
index 0000000..c18673c
--- /dev/null
+++ b/src/defs/GtkTreeViewDropPosition.defs
@@ -0,0 +1,12 @@
+(define-enum TreeViewDropPosition
+  (in-module "Gtk")
+  (c-name "GtkTreeViewDropPosition")
+  (gtype-id "GTK_TYPE_TREE_VIEW_DROP_POSITION")
+  (values
+    '("before" "GTK_TREE_VIEW_DROP_BEFORE")
+    '("after" "GTK_TREE_VIEW_DROP_AFTER")
+    '("into-or-before" "GTK_TREE_VIEW_DROP_INTO_OR_BEFORE")
+    '("into-or-after" "GTK_TREE_VIEW_DROP_INTO_OR_AFTER")
+  )
+)
+
diff --git a/src/defs/GtkTreeViewGridLines.defs b/src/defs/GtkTreeViewGridLines.defs
new file mode 100644
index 0000000..8021477
--- /dev/null
+++ b/src/defs/GtkTreeViewGridLines.defs
@@ -0,0 +1,12 @@
+(define-enum TreeViewGridLines
+  (in-module "Gtk")
+  (c-name "GtkTreeViewGridLines")
+  (gtype-id "GTK_TYPE_TREE_VIEW_GRID_LINES")
+  (values
+    '("none" "GTK_TREE_VIEW_GRID_LINES_NONE")
+    '("horizontal" "GTK_TREE_VIEW_GRID_LINES_HORIZONTAL")
+    '("vertical" "GTK_TREE_VIEW_GRID_LINES_VERTICAL")
+    '("both" "GTK_TREE_VIEW_GRID_LINES_BOTH")
+  )
+)
+
diff --git a/src/defs/GtkTreeViewMode.defs b/src/defs/GtkTreeViewMode.defs
new file mode 100644
index 0000000..8a5e959
--- /dev/null
+++ b/src/defs/GtkTreeViewMode.defs
@@ -0,0 +1,10 @@
+(define-enum TreeViewMode
+  (in-module "Gtk")
+  (c-name "GtkTreeViewMode")
+  (gtype-id "GTK_TYPE_TREE_VIEW_MODE")
+  (values
+    '("line" "GTK_TREE_VIEW_LINE")
+    '("item" "GTK_TREE_VIEW_ITEM")
+  )
+)
+
diff --git a/src/defs/GtkUIManager.defs b/src/defs/GtkUIManager.defs
new file mode 100644
index 0000000..80e66c5
--- /dev/null
+++ b/src/defs/GtkUIManager.defs
@@ -0,0 +1,214 @@
+(define-object UIManager
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkUIManager")
+  (gtype-id "GTK_TYPE_UI_MANAGER")
+)
+
+(define-function gtk_ui_manager_new
+  (is-constructor-of "GtkUIManager")
+  (c-name "gtk_ui_manager_new")
+  (caller-owns-return #t)
+  (return-type "GtkUIManager*")
+)
+
+(define-method set_add_tearoffs
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_set_add_tearoffs")
+  (return-type "none")
+  (parameters
+    '("gboolean" "add_tearoffs")
+  )
+)
+
+(define-method get_add_tearoffs
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_add_tearoffs")
+  (return-type "gboolean")
+)
+
+(define-method insert_action_group
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_insert_action_group")
+  (return-type "none")
+  (parameters
+    '("GtkActionGroup*" "action_group")
+    '("gint" "pos")
+  )
+)
+
+(define-method remove_action_group
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_remove_action_group")
+  (return-type "none")
+  (parameters
+    '("GtkActionGroup*" "action_group")
+  )
+)
+
+(define-method get_action_groups
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_action_groups")
+  (return-type "GList-GtkActionGroup*")
+)
+
+(define-method get_accel_group
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_accel_group")
+  (return-type "GtkAccelGroup*")
+)
+
+(define-method get_widget
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_widget")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-method get_toplevels
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_toplevels")
+  (return-type "GSList-GtkWidget*")
+  (caller-owns-return #l)
+  (parameters
+    '("GtkUIManagerItemType" "types")
+  )
+)
+
+(define-method get_action
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_action")
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-method add_ui_from_string
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_add_ui_from_string")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "buffer")
+    '("gssize" "length")
+    '("GError**" "error")
+  )
+)
+
+(define-method add_ui_from_file
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_add_ui_from_file")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-method add_ui
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_add_ui")
+  (return-type "none")
+  (parameters
+    '("guint" "merge_id")
+    '("const-gchar*" "path")
+    '("const-gchar*" "name")
+    '("const-gchar*" "action" (null-ok))
+    '("GtkUIManagerItemType" "type")
+    '("gboolean" "top")
+  )
+)
+
+(define-method remove_ui
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_remove_ui")
+  (return-type "none")
+  (parameters
+    '("guint" "merge_id")
+  )
+)
+
+(define-method get_ui
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_get_ui")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method ensure_update
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_ensure_update")
+  (return-type "none")
+)
+
+(define-method new_merge_id
+  (of-object "GtkUIManager")
+  (c-name "gtk_ui_manager_new_merge_id")
+  (return-type "guint")
+)
+
+(define-virtual add_widget
+  (of-object "GtkUIManager")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-virtual actions_changed
+  (of-object "GtkUIManager")
+  (return-type "none")
+)
+
+(define-virtual connect_proxy
+  (of-object "GtkUIManager")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+    '("GtkWidget*" "proxy")
+  )
+)
+
+(define-virtual disconnect_proxy
+  (of-object "GtkUIManager")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+    '("GtkWidget*" "proxy")
+  )
+)
+
+(define-virtual pre_activate
+  (of-object "GtkUIManager")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+(define-virtual post_activate
+  (of-object "GtkUIManager")
+  (return-type "none")
+  (parameters
+    '("GtkAction*" "action")
+  )
+)
+
+(define-virtual get_widget
+  (of-object "GtkUIManager")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-virtual get_action
+  (of-object "GtkUIManager")
+  (return-type "GtkAction*")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
diff --git a/src/defs/GtkUIManagerItemType.defs b/src/defs/GtkUIManagerItemType.defs
new file mode 100644
index 0000000..c7d525d
--- /dev/null
+++ b/src/defs/GtkUIManagerItemType.defs
@@ -0,0 +1,18 @@
+(define-flags UIManagerItemType
+  (in-module "Gtk")
+  (c-name "GtkUIManagerItemType")
+  (gtype-id "GTK_TYPE_UI_MANAGER_ITEM_TYPE")
+  (values
+    '("auto" "GTK_UI_MANAGER_AUTO")
+    '("menubar" "GTK_UI_MANAGER_MENUBAR")
+    '("menu" "GTK_UI_MANAGER_MENU")
+    '("toolbar" "GTK_UI_MANAGER_TOOLBAR")
+    '("placeholder" "GTK_UI_MANAGER_PLACEHOLDER")
+    '("popup" "GTK_UI_MANAGER_POPUP")
+    '("menuitem" "GTK_UI_MANAGER_MENUITEM")
+    '("toolitem" "GTK_UI_MANAGER_TOOLITEM")
+    '("separator" "GTK_UI_MANAGER_SEPARATOR")
+    '("accelerator" "GTK_UI_MANAGER_ACCELERATOR")
+  )
+)
+
diff --git a/src/defs/GtkUnit.defs b/src/defs/GtkUnit.defs
new file mode 100644
index 0000000..570c9c2
--- /dev/null
+++ b/src/defs/GtkUnit.defs
@@ -0,0 +1,12 @@
+(define-enum Unit
+  (in-module "Gtk")
+  (c-name "GtkUnit")
+  (gtype-id "GTK_TYPE_UNIT")
+  (values
+    '("pixel" "GTK_UNIT_PIXEL")
+    '("points" "GTK_UNIT_POINTS")
+    '("inch" "GTK_UNIT_INCH")
+    '("mm" "GTK_UNIT_MM")
+  )
+)
+
diff --git a/src/defs/GtkVBox.defs b/src/defs/GtkVBox.defs
new file mode 100644
index 0000000..78fbd7e
--- /dev/null
+++ b/src/defs/GtkVBox.defs
@@ -0,0 +1,18 @@
+(define-object VBox
+  (in-module "Gtk")
+  (parent "GtkBox")
+  (c-name "GtkVBox")
+  (gtype-id "GTK_TYPE_VBOX")
+)
+
+(define-function gtk_vbox_new
+  (is-constructor-of "GtkVBox")
+  (c-name "gtk_vbox_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("gboolean" "homogeneous")
+    '("gint" "spacing")
+  )
+)
+
diff --git a/src/defs/GtkVButtonBox.defs b/src/defs/GtkVButtonBox.defs
new file mode 100644
index 0000000..33a6423
--- /dev/null
+++ b/src/defs/GtkVButtonBox.defs
@@ -0,0 +1,14 @@
+(define-object VButtonBox
+  (in-module "Gtk")
+  (parent "GtkButtonBox")
+  (c-name "GtkVButtonBox")
+  (gtype-id "GTK_TYPE_VBUTTON_BOX")
+)
+
+(define-function gtk_vbutton_box_new
+  (is-constructor-of "GtkVButtonBox")
+  (c-name "gtk_vbutton_box_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkVPaned.defs b/src/defs/GtkVPaned.defs
new file mode 100644
index 0000000..f120778
--- /dev/null
+++ b/src/defs/GtkVPaned.defs
@@ -0,0 +1,14 @@
+(define-object VPaned
+  (in-module "Gtk")
+  (parent "GtkPaned")
+  (c-name "GtkVPaned")
+  (gtype-id "GTK_TYPE_VPANED")
+)
+
+(define-function gtk_vpaned_new
+  (is-constructor-of "GtkVPaned")
+  (c-name "gtk_vpaned_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkVScale.defs b/src/defs/GtkVScale.defs
new file mode 100644
index 0000000..bf2f2b9
--- /dev/null
+++ b/src/defs/GtkVScale.defs
@@ -0,0 +1,29 @@
+(define-object VScale
+  (in-module "Gtk")
+  (parent "GtkScale")
+  (c-name "GtkVScale")
+  (gtype-id "GTK_TYPE_VSCALE")
+)
+
+(define-function gtk_vscale_new
+  (is-constructor-of "GtkVScale")
+  (c-name "gtk_vscale_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "adjustment")
+  )
+)
+
+(define-function gtk_vscale_new_with_range
+  (is-constructor-of "GtkVScale")
+  (c-name "gtk_vscale_new_with_range")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("gdouble" "min")
+    '("gdouble" "max")
+    '("gdouble" "step")
+  )
+)
+
diff --git a/src/defs/GtkVScrollbar.defs b/src/defs/GtkVScrollbar.defs
new file mode 100644
index 0000000..baea08d
--- /dev/null
+++ b/src/defs/GtkVScrollbar.defs
@@ -0,0 +1,17 @@
+(define-object VScrollbar
+  (in-module "Gtk")
+  (parent "GtkScrollbar")
+  (c-name "GtkVScrollbar")
+  (gtype-id "GTK_TYPE_VSCROLLBAR")
+)
+
+(define-function gtk_vscrollbar_new
+  (is-constructor-of "GtkVScrollbar")
+  (c-name "gtk_vscrollbar_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
diff --git a/src/defs/GtkVSeparator.defs b/src/defs/GtkVSeparator.defs
new file mode 100644
index 0000000..1464309
--- /dev/null
+++ b/src/defs/GtkVSeparator.defs
@@ -0,0 +1,14 @@
+(define-object VSeparator
+  (in-module "Gtk")
+  (parent "GtkSeparator")
+  (c-name "GtkVSeparator")
+  (gtype-id "GTK_TYPE_VSEPARATOR")
+)
+
+(define-function gtk_vseparator_new
+  (is-constructor-of "GtkVSeparator")
+  (c-name "gtk_vseparator_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
diff --git a/src/defs/GtkViewport.defs b/src/defs/GtkViewport.defs
new file mode 100644
index 0000000..ecfc233
--- /dev/null
+++ b/src/defs/GtkViewport.defs
@@ -0,0 +1,78 @@
+(define-object Viewport
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkViewport")
+  (gtype-id "GTK_TYPE_VIEWPORT")
+)
+
+(define-function gtk_viewport_new
+  (is-constructor-of "GtkViewport")
+  (c-name "gtk_viewport_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+    '("GtkAdjustment*" "vadjustment")
+  )
+)
+
+(define-method get_hadjustment
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_get_hadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method get_vadjustment
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_get_vadjustment")
+  (return-type "GtkAdjustment*")
+)
+
+(define-method set_hadjustment
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_set_hadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
+(define-method set_vadjustment
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_set_vadjustment")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "adjustment" (null-ok))
+  )
+)
+
+(define-method set_shadow_type
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_set_shadow_type")
+  (return-type "none")
+  (parameters
+    '("GtkShadowType" "type")
+  )
+)
+
+(define-method get_shadow_type
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_get_shadow_type")
+  (return-type "GtkShadowType")
+)
+
+(define-method get_bin_window
+  (of-object "GtkViewport")
+  (c-name "gtk_viewport_get_bin_window")
+  (return-type "GdkWindow*")
+)
+
+(define-virtual set_scroll_adjustments
+  (of-object "GtkViewport")
+  (return-type "none")
+  (parameters
+    '("GtkAdjustment*" "hadjustment")
+    '("GtkAdjustment*" "vadjustment")
+  )
+)
+
diff --git a/src/defs/GtkWidget.defs b/src/defs/GtkWidget.defs
new file mode 100644
index 0000000..fc93496
--- /dev/null
+++ b/src/defs/GtkWidget.defs
@@ -0,0 +1,1951 @@
+(define-object Widget
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkWidget")
+)
+
+(define-method get_allocation
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_allocation")
+  (return-type "GtkAllocation")
+)
+
+(define-method drag_check_threshold
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_check_threshold")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "start_x")
+    '("gint" "start_y")
+    '("gint" "current_x")
+    '("gint" "current_y")
+  )
+)
+
+(define-method drag_get_data
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_get_data")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("GdkAtom" "target")
+    '("guint32" "time" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-method drag_highlight
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_highlight")
+  (return-type "none")
+)
+
+(define-method drag_unhighlight
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_unhighlight")
+  (return-type "none")
+)
+
+(define-method drag_dest_set
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_set")
+  (return-type "none")
+  (parameters
+    '("GtkDestDefaults" "flags")
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method drag_dest_set_proxy
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_set_proxy")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "proxy_window")
+    '("GdkDragProtocol" "protocol")
+    '("gboolean" "use_coordinates")
+  )
+)
+
+(define-method drag_dest_unset
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_unset")
+  (return-type "none")
+)
+
+(define-method drag_dest_find_target
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_find_target")
+  (return-type "GdkAtom")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("GtkTargetList*" "target_list")
+  )
+)
+
+(define-method drag_dest_get_target_list
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_get_target_list")
+  (return-type "GtkTargetList*")
+)
+
+(define-method drag_dest_set_target_list
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_set_target_list")
+  (return-type "none")
+  (parameters
+    '("GtkTargetList*" "target_list")
+  )
+)
+
+(define-method drag_source_set
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_set")
+  (return-type "none")
+  (parameters
+    '("GdkModifierType" "start_button_mask")
+    '("const-GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+    '("GdkDragAction" "actions")
+  )
+)
+
+(define-method drag_source_unset
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_unset")
+  (return-type "none")
+)
+
+(define-method drag_source_set_icon_pixbuf
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_set_icon_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-method drag_source_set_icon_stock
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_set_icon_stock")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-method drag_source_set_icon_name
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-method drag_source_get_target_list
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_get_target_list")
+  (return-type "GtkTargetList*")
+)
+
+(define-method drag_source_set_target_list
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_set_target_list")
+  (return-type "none")
+  (parameters
+    '("GtkTargetList*" "target_list")
+  )
+)
+
+(define-method drag_begin
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_begin")
+  (return-type "GdkDragContext*")
+  (parameters
+    '("GtkTargetList*" "targets")
+    '("GdkDragAction" "actions")
+    '("gint" "button")
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-method drag_dest_add_text_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_add_text_targets")
+  (return-type "none")
+)
+
+(define-method drag_dest_add_image_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_add_image_targets")
+  (return-type "none")
+)
+
+(define-method drag_dest_add_uri_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_add_uri_targets")
+  (return-type "none")
+)
+
+(define-method drag_source_add_text_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_add_text_targets")
+  (return-type "none")
+)
+
+(define-method drag_source_add_image_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_add_image_targets")
+  (return-type "none")
+)
+
+(define-method drag_source_add_uri_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_source_add_uri_targets")
+  (return-type "none")
+)
+
+(define-method grab_add
+  (of-object "GtkWidget")
+  (c-name "gtk_grab_add")
+  (return-type "none")
+)
+
+(define-method grab_remove
+  (of-object "GtkWidget")
+  (c-name "gtk_grab_remove")
+  (return-type "none")
+)
+
+(define-method propagate_event
+  (of-object "GtkWidget")
+  (c-name "gtk_propagate_event")
+  (return-type "none")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-method menu_get_for_attach_widget
+  (of-object "GtkWidget")
+  (c-name "gtk_menu_get_for_attach_widget")
+  (return-type "GList-GtkMenu*")
+)
+
+(define-method selection_owner_set
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_owner_set")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "selection")
+    '("guint32" "time" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-method selection_add_target
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_add_target")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "selection")
+    '("GdkAtom" "target")
+    '("guint" "info")
+  )
+)
+
+(define-method selection_add_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_add_targets")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "selection")
+    '("const-GtkTargetEntry*" "targets")
+    '("guint" "ntargets")
+  )
+)
+
+(define-method selection_clear_targets
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_clear_targets")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "selection")
+  )
+)
+
+(define-method selection_convert
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_convert")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom" "selection")
+    '("GdkAtom" "target")
+    '("guint32" "time" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-method selection_remove_all
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_remove_all")
+  (return-type "none")
+)
+
+(define-method selection_clear
+  (of-object "GtkWidget")
+  (c-name "gtk_selection_clear")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventSelection*" "event")
+  )
+)
+
+(define-function gtk_widget_new
+  (is-constructor-of "GtkWidget")
+  (c-name "gtk_widget_new")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GType" "type")
+    '("const-gchar*" "first_property_name")
+  )
+  (varargs #t)
+)
+
+(define-method destroy
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_destroy")
+  (return-type "none")
+)
+
+(define-method destroyed
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_destroyed")
+  (return-type "none")
+  (parameters
+    '("GtkWidget**" "widget_pointer")
+  )
+)
+
+(define-method unparent
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_unparent")
+  (return-type "none")
+)
+
+(define-method show
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_show")
+  (return-type "none")
+)
+
+(define-method show_now
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_show_now")
+  (return-type "none")
+)
+
+(define-method hide
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_hide")
+  (return-type "none")
+)
+
+(define-method show_all
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_show_all")
+  (return-type "none")
+)
+
+(define-method set_no_show_all
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_no_show_all")
+  (return-type "none")
+  (parameters
+    '("gboolean" "no_show_all")
+  )
+)
+
+(define-method get_no_show_all
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_no_show_all")
+  (return-type "gboolean")
+)
+
+(define-method map
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_map")
+  (return-type "none")
+)
+
+(define-method unmap
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_unmap")
+  (return-type "none")
+)
+
+(define-method realize
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_realize")
+  (return-type "none")
+)
+
+(define-method unrealize
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_unrealize")
+  (return-type "none")
+)
+
+(define-method queue_draw
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_queue_draw")
+  (return-type "none")
+)
+
+(define-method queue_draw_area
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_queue_draw_area")
+  (return-type "none")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method queue_draw_region
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_queue_draw_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "region")
+  )
+)
+
+(define-method queue_resize
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_queue_resize")
+  (return-type "none")
+)
+
+(define-method queue_resize_no_redraw
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_queue_resize_no_redraw")
+  (return-type "none")
+)
+
+(define-method size_request
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_size_request")
+  (return-type "none")
+  (parameters
+    '("GtkRequisition*" "requisition")
+  )
+)
+
+(define-method get_request_mode
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_request_mode")
+  (return-type "GtkSizeRequestMode")
+)
+
+(define-method size_allocate
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_size_allocate")
+  (return-type "none")
+  (parameters
+    '("GtkAllocation*" "allocation")
+  )
+)
+
+(define-method get_child_requisition
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_child_requisition")
+  (return-type "none")
+  (parameters
+    '("GtkRequisition*" "requisition")
+  )
+)
+
+(define-method add_accelerator
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_add_accelerator")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_signal")
+    '("GtkAccelGroup*" "accel_group")
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("GtkAccelFlags" "accel_flags")
+  )
+)
+
+(define-method remove_accelerator
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_remove_accelerator")
+  (return-type "gboolean")
+  (parameters
+    '("GtkAccelGroup*" "accel_group")
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+  )
+)
+
+(define-method set_accel_path
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_accel_path")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "accel_path" (null-ok))
+    '("GtkAccelGroup*" "accel_group" (null-ok))
+  )
+)
+
+(define-method list_accel_closures
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_list_accel_closures")
+  (return-type "GList*")
+)
+
+(define-method can_activate_accel
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_can_activate_accel")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "signal_id")
+  )
+)
+
+(define-method mnemonic_activate
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_mnemonic_activate")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "group_cycling")
+  )
+)
+
+(define-method event
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_event")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-method send_expose
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_send_expose")
+  (return-type "gint")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-method activate
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_activate")
+  (return-type "gboolean")
+)
+
+(define-method reparent
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_reparent")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "new_parent")
+  )
+)
+
+(define-method intersect
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_intersect")
+  (return-type "gboolean")
+  (parameters
+    '("GdkRectangle*" "area")
+    '("GdkRectangle*" "intersection")
+  )
+)
+
+(define-method freeze_child_notify
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_freeze_child_notify")
+  (return-type "none")
+)
+
+(define-method child_notify
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_child_notify")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "child_property")
+  )
+)
+
+(define-method thaw_child_notify
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_thaw_child_notify")
+  (return-type "none")
+)
+
+(define-method is_focus
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_is_focus")
+  (return-type "gboolean")
+)
+
+(define-method grab_focus
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_grab_focus")
+  (return-type "none")
+)
+
+(define-method grab_default
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_grab_default")
+  (return-type "none")
+)
+
+(define-method set_name
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_name
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_name")
+  (return-type "const-gchar*")
+)
+
+(define-method get_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method set_state
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_state")
+  (return-type "none")
+  (parameters
+    '("GtkStateType" "state")
+  )
+)
+
+(define-method set_sensitive
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_sensitive")
+  (return-type "none")
+  (parameters
+    '("gboolean" "sensitive")
+  )
+)
+
+(define-method set_app_paintable
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_app_paintable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "app_paintable")
+  )
+)
+
+(define-method set_double_buffered
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_double_buffered")
+  (return-type "none")
+  (parameters
+    '("gboolean" "double_buffered")
+  )
+)
+
+(define-method set_redraw_on_allocate
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_redraw_on_allocate")
+  (return-type "none")
+  (parameters
+    '("gboolean" "redraw_on_allocate")
+  )
+)
+
+(define-method set_parent
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_parent")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "parent")
+  )
+)
+
+(define-method set_parent_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_parent_window")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "parent_window")
+  )
+)
+
+(define-method set_child_visible
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_child_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "is_visible")
+  )
+)
+
+(define-method get_child_visible
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_child_visible")
+  (return-type "gboolean")
+)
+
+(define-method get_parent
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_parent")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_parent_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_parent_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method child_focus
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_child_focus")
+  (return-type "gboolean")
+  (parameters
+    '("GtkDirectionType" "direction")
+  )
+)
+
+(define-method set_size_request
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_size_request")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method get_size_request
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_size_request")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method set_events
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_events")
+  (return-type "none")
+  (parameters
+    '("GdkEventMask" "events")
+  )
+)
+
+(define-method add_events
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_add_events")
+  (return-type "none")
+  (parameters
+    '("GdkEventMask" "events")
+  )
+)
+
+(define-method get_toplevel
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_toplevel")
+  (return-type "GtkWidget*")
+)
+
+(define-method get_ancestor
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_ancestor")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GType" "widget_type")
+  )
+)
+
+(define-method get_visual
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_visual")
+  (return-type "GdkVisual*")
+)
+
+(define-method get_screen
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_screen")
+  (return-type "GdkScreen*")
+)
+
+(define-method has_screen
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_has_screen")
+  (return-type "gboolean")
+)
+
+(define-method get_display
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_display")
+  (return-type "GdkDisplay*")
+)
+
+(define-method get_root_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_root_window")
+  (return-type "GdkWindow*")
+)
+
+(define-method get_settings
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_settings")
+  (return-type "GtkSettings*")
+)
+
+(define-method get_clipboard
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_clipboard")
+  (return-type "GtkClipboard*")
+  (parameters
+    '("GdkAtom" "selection")
+  )
+)
+
+(define-method get_accessible
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_accessible")
+  (return-type "AtkObject*")
+)
+
+(define-method get_events
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_events")
+  (return-type "gint")
+)
+
+(define-method get_pointer
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_pointer")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+  )
+)
+
+(define-method is_ancestor
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_is_ancestor")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "ancestor")
+  )
+)
+
+(define-method translate_coordinates
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_translate_coordinates")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "dest_widget")
+    '("gint" "src_x")
+    '("gint" "src_y")
+    '("gint*" "dest_x")
+    '("gint*" "dest_y")
+  )
+)
+
+(define-method hide_on_delete
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_hide_on_delete")
+  (return-type "gboolean")
+  (unnecessary)
+)
+
+(define-method override_color
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_override_color")
+  (return-type "none")
+  (parameters
+    '("GtkStateFlags" "state")
+    '("GdkRGBA*" "color" (null-ok))
+  )
+)
+
+(define-method override_background_color
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_override_background_color")
+  (return-type "none")
+  (parameters
+    '("GtkStateFlags" "state")
+    '("const-GdkRGBA*" "color" (null-ok))
+  )
+)
+
+(define-method override_font
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_override_font")
+  (return-type "none")
+  (parameters
+    '("const-PangoFontDescription*" "font_desc" (null-ok))
+  )
+)
+
+(define-method create_pango_context
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_create_pango_context")
+  (caller-owns-return #t)
+  (return-type "PangoContext*")
+)
+
+(define-method get_pango_context
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_pango_context")
+  (return-type "PangoContext*")
+)
+
+(define-method create_pango_layout
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_create_pango_layout")
+  (caller-owns-return #t)
+  (return-type "PangoLayout*")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method render_icon
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_render_icon")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("GtkIconSize" "size")
+    '("const-gchar*" "detail" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_composite_name
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_composite_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-method get_composite_name
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_composite_name")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-method style_get_property
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_style_get_property")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "property_name")
+    '("GValue*" "value")
+  )
+)
+
+(define-method set_direction
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_direction")
+  (return-type "none")
+  (parameters
+    '("GtkTextDirection" "dir")
+  )
+)
+
+(define-method get_direction
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_direction")
+  (return-type "GtkTextDirection")
+)
+
+(define-method shape_combine_region
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_shape_combine_region")
+  (return-type "none")
+  (parameters
+    '("cairo_region_t*" "region")
+  )
+)
+
+(define-method list_mnemonic_labels
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_list_mnemonic_labels")
+  (return-type "GList*")
+)
+
+(define-method add_mnemonic_label
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_add_mnemonic_label")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "label")
+  )
+)
+
+(define-method remove_mnemonic_label
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_remove_mnemonic_label")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "label")
+  )
+)
+
+(define-method get_allocation
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_allocation")
+  (return-type "none")
+  (parameters
+    '("GtkAllocation*" "allocation")
+  )
+)
+
+(define-method set_allocation
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_allocation")
+  (return-type "none")
+  (parameters
+    '("const-GtkAllocation*" "allocation")
+  )
+)
+
+(define-method get_app_paintable
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_app_paintable")
+  (return-type "gboolean")
+)
+
+(define-method set_can_default
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_can_default")
+  (return-type "none")
+  (parameters
+    '("gboolean" "can_default")
+  )
+)
+
+(define-method get_can_default
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_can_default")
+  (return-type "gboolean")
+)
+
+(define-method set_can_focus
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_can_focus")
+  (return-type "none")
+  (parameters
+    '("gboolean" "can_focus")
+  )
+)
+
+(define-method get_can_focus
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_can_focus")
+  (return-type "gboolean")
+)
+
+(define-method get_double_buffered
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_double_buffered")
+  (return-type "gboolean")
+)
+
+(define-method set_has_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_has_window")
+  (return-type "none")
+  (parameters
+    '("gboolean" "has_window")
+  )
+)
+
+(define-method get_has_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_has_window")
+  (return-type "gboolean")
+)
+
+(define-method set_receives_default
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_receives_default")
+  (return-type "none")
+  (parameters
+    '("gboolean" "receives_default")
+  )
+)
+
+(define-method get_receives_default
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_receives_default")
+  (return-type "gboolean")
+)
+
+(define-method get_sensitive
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_sensitive")
+  (return-type "gboolean")
+)
+
+(define-method get_state
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_state")
+  (return-type "GtkStateType")
+)
+
+(define-method set_visible
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "visible")
+  )
+)
+
+(define-method get_visible
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_visible")
+  (return-type "gboolean")
+)
+
+(define-method set_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_window")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "window")
+  )
+)
+
+(define-method has_default
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_has_default")
+  (return-type "gboolean")
+)
+
+(define-method has_focus
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_has_focus")
+  (return-type "gboolean")
+)
+
+(define-method has_grab
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_has_grab")
+  (return-type "gboolean")
+)
+
+(define-method is_sensitive
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_is_sensitive")
+  (return-type "gboolean")
+)
+
+(define-method is_toplevel
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_is_toplevel")
+  (return-type "gboolean")
+)
+
+(define-method is_drawable
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_is_drawable")
+  (return-type "gboolean")
+)
+
+(define-method set_realized
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_realized")
+  (return-type "none")
+  (parameters
+    '("gboolean" "realized")
+  )
+)
+
+(define-method get_realized
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_realized")
+  (return-type "gboolean")
+)
+
+(define-method set_mapped
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_mapped")
+  (return-type "none")
+  (parameters
+    '("gboolean" "mapped")
+  )
+)
+
+(define-method get_mapped
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_mapped")
+  (return-type "gboolean")
+)
+
+(define-method get_requisition
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_requisition")
+  (return-type "none")
+  (parameters
+    '("GtkRequisition*" "requisition")
+  )
+)
+
+(define-virtual dispatch_child_properties_changed
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("guint" "n_pspecs")
+    '("GParamSpec**" "pspecs")
+  )
+)
+
+(define-virtual show
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual show_all
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual hide
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual hide_all
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual map
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual unmap
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual realize
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual unrealize
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual size_request
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkRequisition*" "requisition")
+  )
+)
+
+(define-virtual size_allocate
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkRectangle*" "allocation")
+  )
+)
+
+(define-virtual state_changed
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkStateType" "previous_state")
+  )
+)
+
+(define-virtual parent_set
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "previous_parent")
+  )
+)
+
+(define-virtual hierarchy_changed
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "previous_toplevel")
+  )
+)
+
+(define-virtual direction_changed
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkTextDirection" "previous_direction")
+  )
+)
+
+(define-virtual grab_notify
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("gboolean" "was_grabbed")
+  )
+)
+
+(define-virtual child_notify
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GParamSpec*" "pspec")
+  )
+)
+
+(define-virtual mnemonic_activate
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "group_cycling")
+  )
+)
+
+(define-virtual grab_focus
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual focus
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GtkDirectionType" "direction")
+  )
+)
+
+(define-virtual event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual button_press_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventButton*" "event")
+  )
+)
+
+(define-virtual button_release_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventButton*" "event")
+  )
+)
+
+(define-virtual scroll_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventScroll*" "event")
+  )
+)
+
+(define-virtual motion_notify_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventMotion*" "event")
+  )
+)
+
+(define-virtual delete_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual destroy
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-virtual destroy_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual draw
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("cairo_t*" "cr")
+  )
+)
+
+(define-virtual key_press_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-virtual key_release_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-virtual enter_notify_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventCrossing*" "event")
+  )
+)
+
+(define-virtual leave_notify_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventCrossing*" "event")
+  )
+)
+
+(define-virtual configure_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventConfigure*" "event")
+  )
+)
+
+(define-virtual focus_in_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventFocus*" "event")
+  )
+)
+
+(define-virtual focus_out_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventFocus*" "event")
+  )
+)
+
+(define-virtual map_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual unmap_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual property_notify_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventProperty*" "event")
+  )
+)
+
+(define-virtual selection_clear_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventSelection*" "event")
+  )
+)
+
+(define-virtual selection_request_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventSelection*" "event")
+  )
+)
+
+(define-virtual selection_notify_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventSelection*" "event")
+  )
+)
+
+(define-virtual proximity_in_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventProximity*" "event")
+  )
+)
+
+(define-virtual proximity_out_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventProximity*" "event")
+  )
+)
+
+(define-virtual visibility_notify_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventVisibility*" "event")
+  )
+)
+
+(define-virtual client_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventClient*" "event")
+  )
+)
+
+(define-virtual no_expose_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual window_state_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventWindowState*" "event")
+  )
+)
+
+(define-virtual selection_get
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkSelectionData*" "selection_data")
+    '("guint" "info")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual selection_received
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GtkSelectionData*" "selection_data")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual drag_begin
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+  )
+)
+
+(define-virtual drag_end
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+  )
+)
+
+(define-virtual drag_data_get
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("GtkSelectionData*" "selection_data")
+    '("guint" "info")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual drag_data_delete
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+  )
+)
+
+(define-virtual drag_leave
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual drag_motion
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("gint" "x")
+    '("gint" "y")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual drag_drop
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("gint" "x")
+    '("gint" "y")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual drag_data_received
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("gint" "x")
+    '("gint" "y")
+    '("GtkSelectionData*" "selection_data")
+    '("guint" "info")
+    '("guint" "time_")
+  )
+)
+
+(define-virtual popup_menu
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+)
+
+(define-virtual show_help
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidgetHelpType" "help_type")
+  )
+)
+
+(define-virtual get_accessible
+  (of-object "GtkWidget")
+  (return-type "AtkObject*")
+)
+
+(define-virtual screen_changed
+  (of-object "GtkWidget")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "previous_screen")
+  )
+)
+
+(define-virtual can_activate_accel
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "signal_id")
+  )
+)
+
+(define-virtual grab_broken_event
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventGrabBroken*" "event")
+  )
+)
+
+(define-method drag_dest_set_track_motion
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_set_track_motion")
+  (return-type "none")
+  (parameters
+    '("gboolean" "track_motion")
+  )
+)
+
+(define-method drag_dest_get_track_motion
+  (of-object "GtkWidget")
+  (c-name "gtk_drag_dest_get_track_motion")
+  (return-type "gboolean")
+)
+
+(define-method is_composited
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_is_composited")
+  (return-type "gboolean")
+)
+
+(define-method input_shape_combine_mask
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_input_shape_combine_mask")
+  (return-type "none")
+  (parameters
+    '("GdkBitmap*" "shape_mask" (null-ok))
+    '("gint" "offset_x")
+    '("gint" "offset_y")
+  )
+)
+
+(define-method get_tooltip_markup
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_tooltip_markup")
+  (return-type "gchar*")
+  (caller-owns-return #t)
+)
+
+(define-method set_tooltip_markup
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_tooltip_markup")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "markup" (null-ok))
+  )
+)
+
+(define-method get_tooltip_text
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_tooltip_text")
+  (return-type "gchar*")
+  (caller-owns-return #t)
+)
+
+(define-method set_tooltip_text
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_tooltip_text")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-method get_tooltip_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_tooltip_window")
+  (return-type "GtkWindow*")
+)
+
+(define-method set_tooltip_window
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_tooltip_window")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "custom_window" (null-ok))
+  )
+)
+
+(define-method get_has_tooltip
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_has_tooltip")
+  (return-type "gboolean")
+)
+
+(define-method set_has_tooltip
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_has_tooltip")
+  (return-type "none")
+  (parameters
+    '("gboolean" "has_tooltip")
+  )
+)
+
+(define-method trigger_tooltip_query
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_trigger_tooltip_query")
+  (return-type "none")
+)
+
+(define-method error_bell
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_error_bell")
+  (return-type "none")
+)
+
+(define-method keynav_failed
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_keynav_failed")
+  (return-type "gboolean")
+  (parameters
+    '("GtkDirectionType" "direction")
+  )
+)
+
+(define-method modify_cursor
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_modify_cursor")
+  (return-type "none")
+  (parameters
+    '("const-GdkColor*" "primary" (null-ok))
+    '("const-GdkColor*" "secondary" (null-ok))
+  )
+)
+
+(define-virtual query_tooltip
+  (of-object "GtkWidget")
+  (return-type "gboolean")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+    '("gboolean" "keyboard_mode")
+    '("GtkTooltip*" "tooltip")
+  )
+)
+
+(define-virtual composited_changed
+  (of-object "GtkWidget")
+  (return-type "none")
+)
+
+(define-method get_allocated_width
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_allocated_width")
+  (return-type "int")
+)
+
+(define-method get_allocated_height
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_allocated_height")
+  (return-type "int")
+)
+
+(define-method get_preferred_width
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_preferred_width")
+  (return-type "none")
+  (parameters
+    '("gint*" "minimum_width" (null-ok))
+    '("gint*" "natural_width" (null-ok))
+  )
+)
+
+(define-method get_preferred_height
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_preferred_height")
+  (return-type "none")
+  (parameters
+    '("gint*" "minimum_height" (null-ok))
+    '("gint*" "natural_height" (null-ok))
+  )
+)
+
+(define-method get_preferred_height_for_width
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_preferred_height_for_width")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+    '("gint*" "minimum_height" (null-ok))
+    '("gint*" "natural_height" (null-ok))
+  )
+)
+
+(define-method get_preferred_width_for_height
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_preferred_width_for_height")
+  (return-type "none")
+  (parameters
+    '("gint" "height")
+    '("gint*" "minimum_width" (null-ok))
+    '("gint*" "natural_width" (null-ok))
+  )
+)
+
+(define-method set_hexpand
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_hexpand")
+  (return-type "none")
+  (parameters
+    '("gboolean" "expand"))
+  )
+)
+
+(define-method set_vexpand
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_vexpand")
+  (return-type "none")
+  (parameters
+    '("gboolean" "expand"))
+  )
+)
+
+(define-method set_halign
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_halign")
+  (return-type "none")
+  (parameters
+    '("GtkAlign" "align"))
+  )
+)
+
+(define-method set_valign
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_set_valign")
+  (return-type "none")
+  (parameters
+    '("GtkAlign" "align"))
+  )
+)
+
+(define-method get_style_context
+  (of-object "GtkWidget")
+  (c-name "gtk_widget_get_style_context")
+  (return-type "GtkStyleContext*")
+)
+
diff --git a/src/defs/GtkWidgetHelpType.defs b/src/defs/GtkWidgetHelpType.defs
new file mode 100644
index 0000000..937a8c1
--- /dev/null
+++ b/src/defs/GtkWidgetHelpType.defs
@@ -0,0 +1,10 @@
+(define-enum WidgetHelpType
+  (in-module "Gtk")
+  (c-name "GtkWidgetHelpType")
+  (gtype-id "GTK_TYPE_WIDGET_HELP_TYPE")
+  (values
+    '("tooltip" "GTK_WIDGET_HELP_TOOLTIP")
+    '("whats-this" "GTK_WIDGET_HELP_WHATS_THIS")
+  )
+)
+
diff --git a/src/defs/GtkWindow.defs b/src/defs/GtkWindow.defs
new file mode 100644
index 0000000..21e2566
--- /dev/null
+++ b/src/defs/GtkWindow.defs
@@ -0,0 +1,776 @@
+(define-object Window
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkWindow")
+  (gtype-id "GTK_TYPE_WINDOW")
+)
+
+(define-method tooltips_get_info_from_tip_window
+  (of-object "GtkWindow")
+  (c-name "gtk_tooltips_get_info_from_tip_window")
+  (return-type "gboolean")
+  (parameters
+    '("GtkTooltips**" "tooltips")
+    '("GtkWidget**" "current_widget")
+  )
+)
+
+(define-function gtk_window_new
+  (is-constructor-of "GtkWindow")
+  (c-name "gtk_window_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkWindowType" "type")
+  )
+)
+
+(define-method set_title
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_title")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "title")
+  )
+)
+
+(define-method get_title
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_title")
+  (return-type "const-gchar*")
+)
+
+(define-method set_has_resize_grip
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_has_resize_grip")
+  (return-type "none")
+  (parameters
+    '("gboolean" "value")
+  )
+)
+
+(define-method get_has_resize_grip
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_has_resize_grip")
+  (return-type "gboolean")
+)
+
+(define-method set_wmclass
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_wmclass")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "wmclass_name")
+    '("const-gchar*" "wmclass_class")
+  )
+)
+
+(define-method set_role
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_role")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "role")
+  )
+)
+
+(define-method get_role
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_role")
+  (return-type "const-gchar*")
+)
+
+(define-method add_accel_group
+  (of-object "GtkWindow")
+  (c-name "gtk_window_add_accel_group")
+  (return-type "none")
+  (parameters
+    '("GtkAccelGroup*" "accel_group")
+  )
+)
+
+(define-method remove_accel_group
+  (of-object "GtkWindow")
+  (c-name "gtk_window_remove_accel_group")
+  (return-type "none")
+  (parameters
+    '("GtkAccelGroup*" "accel_group")
+  )
+)
+
+(define-method set_position
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_position")
+  (return-type "none")
+  (parameters
+    '("GtkWindowPosition" "position")
+  )
+)
+
+(define-method activate_focus
+  (of-object "GtkWindow")
+  (c-name "gtk_window_activate_focus")
+  (return-type "gboolean")
+)
+
+(define-method set_focus
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_focus")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "focus" (null-ok))
+  )
+)
+
+(define-method get_focus
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_focus")
+  (return-type "GtkWidget*")
+)
+
+(define-method set_default
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_default")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "default_widget" (null-ok))
+  )
+)
+
+(define-method activate_default
+  (of-object "GtkWindow")
+  (c-name "gtk_window_activate_default")
+  (return-type "gboolean")
+)
+
+(define-method set_transient_for
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_transient_for")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "parent" (null-ok))
+  )
+)
+
+(define-method get_transient_for
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_transient_for")
+  (return-type "GtkWindow*")
+)
+
+(define-method set_type_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_type_hint")
+  (return-type "none")
+  (parameters
+    '("GdkWindowTypeHint" "hint")
+  )
+)
+
+(define-method get_type_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_type_hint")
+  (return-type "GdkWindowTypeHint")
+)
+
+(define-method set_skip_taskbar_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_skip_taskbar_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_skip_taskbar_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_skip_taskbar_hint")
+  (return-type "gboolean")
+)
+
+(define-method set_skip_pager_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_skip_pager_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_skip_pager_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_skip_pager_hint")
+  (return-type "gboolean")
+)
+
+(define-method set_urgency_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_urgency_hint")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_urgency_hint
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_urgency_hint")
+  (return-type "gboolean")
+)
+
+(define-method set_accept_focus
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_accept_focus")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_accept_focus
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_accept_focus")
+  (return-type "gboolean")
+)
+
+(define-method set_destroy_with_parent
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_destroy_with_parent")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_destroy_with_parent
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_destroy_with_parent")
+  (return-type "gboolean")
+)
+
+(define-method set_resizable
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_resizable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "resizable")
+  )
+)
+
+(define-method get_resizable
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_resizable")
+  (return-type "gboolean")
+)
+
+(define-method set_gravity
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_gravity")
+  (return-type "none")
+  (parameters
+    '("GdkGravity" "gravity")
+  )
+)
+
+(define-method get_gravity
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_gravity")
+  (return-type "GdkGravity")
+)
+
+(define-method set_geometry_hints
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_geometry_hints")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "geometry_widget")
+    '("GdkGeometry*" "geometry")
+    '("GdkWindowHints" "geom_mask")
+  )
+)
+
+(define-method set_screen
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_screen")
+  (return-type "none")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-method get_screen
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_screen")
+  (return-type "GdkScreen*")
+)
+
+(define-method is_active
+  (of-object "GtkWindow")
+  (c-name "gtk_window_is_active")
+  (return-type "gboolean")
+)
+
+(define-method has_toplevel_focus
+  (of-object "GtkWindow")
+  (c-name "gtk_window_has_toplevel_focus")
+  (return-type "gboolean")
+)
+
+(define-method set_decorated
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_decorated")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_decorated
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_decorated")
+  (return-type "gboolean")
+)
+
+(define-method set_icon_list
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_icon_list")
+  (return-type "none")
+  (parameters
+    '("GList-GdkPixbuf*" "list")
+  )
+)
+
+(define-method get_icon_list
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_icon_list")
+  (caller-owns-return #l)
+  (return-type "GList-GdkPixbuf*")
+)
+
+(define-method set_icon
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_icon")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "icon" (null-ok))
+  )
+)
+
+(define-method set_icon_from_file
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_icon_from_file")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_icon
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_icon")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method set_modal
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_modal")
+  (return-type "none")
+  (parameters
+    '("gboolean" "modal")
+  )
+)
+
+(define-method get_modal
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_modal")
+  (return-type "gboolean")
+)
+
+(define-method add_mnemonic
+  (of-object "GtkWindow")
+  (c-name "gtk_window_add_mnemonic")
+  (return-type "none")
+  (parameters
+    '("guint" "keyval")
+    '("GtkWidget*" "target")
+  )
+)
+
+(define-method remove_mnemonic
+  (of-object "GtkWindow")
+  (c-name "gtk_window_remove_mnemonic")
+  (return-type "none")
+  (parameters
+    '("guint" "keyval")
+    '("GtkWidget*" "target")
+  )
+)
+
+(define-method mnemonic_activate
+  (of-object "GtkWindow")
+  (c-name "gtk_window_mnemonic_activate")
+  (return-type "gboolean")
+  (parameters
+    '("guint" "keyval")
+    '("GdkModifierType" "modifier")
+  )
+)
+
+(define-method set_mnemonic_modifier
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_mnemonic_modifier")
+  (return-type "none")
+  (parameters
+    '("GdkModifierType" "modifier")
+  )
+)
+
+(define-method get_mnemonic_modifier
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_mnemonic_modifier")
+  (return-type "GdkModifierType")
+)
+
+(define-method activate_key
+  (of-object "GtkWindow")
+  (c-name "gtk_window_activate_key")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-method propagate_key_event
+  (of-object "GtkWindow")
+  (c-name "gtk_window_propagate_key_event")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-method present
+  (of-object "GtkWindow")
+  (c-name "gtk_window_present")
+  (return-type "none")
+)
+
+(define-method present_with_time
+  (of-object "GtkWindow")
+  (c-name "gtk_window_present_with_time")
+  (return-type "none")
+  (parameters
+    '("guint32" "timestamp")
+  )
+)
+
+(define-method iconify
+  (of-object "GtkWindow")
+  (c-name "gtk_window_iconify")
+  (return-type "none")
+)
+
+(define-method deiconify
+  (of-object "GtkWindow")
+  (c-name "gtk_window_deiconify")
+  (return-type "none")
+)
+
+(define-method stick
+  (of-object "GtkWindow")
+  (c-name "gtk_window_stick")
+  (return-type "none")
+)
+
+(define-method unstick
+  (of-object "GtkWindow")
+  (c-name "gtk_window_unstick")
+  (return-type "none")
+)
+
+(define-method maximize
+  (of-object "GtkWindow")
+  (c-name "gtk_window_maximize")
+  (return-type "none")
+)
+
+(define-method unmaximize
+  (of-object "GtkWindow")
+  (c-name "gtk_window_unmaximize")
+  (return-type "none")
+)
+
+(define-method fullscreen
+  (of-object "GtkWindow")
+  (c-name "gtk_window_fullscreen")
+  (return-type "none")
+)
+
+(define-method unfullscreen
+  (of-object "GtkWindow")
+  (c-name "gtk_window_unfullscreen")
+  (return-type "none")
+)
+
+(define-method set_keep_above
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_keep_above")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method set_keep_below
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_keep_below")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method begin_resize_drag
+  (of-object "GtkWindow")
+  (c-name "gtk_window_begin_resize_drag")
+  (return-type "none")
+  (parameters
+    '("GdkWindowEdge" "edge")
+    '("gint" "button")
+    '("gint" "root_x")
+    '("gint" "root_y")
+    '("guint32" "timestamp")
+  )
+)
+
+(define-method begin_move_drag
+  (of-object "GtkWindow")
+  (c-name "gtk_window_begin_move_drag")
+  (return-type "none")
+  (parameters
+    '("gint" "button")
+    '("gint" "root_x")
+    '("gint" "root_y")
+    '("guint32" "timestamp")
+  )
+)
+
+(define-method set_default_size
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_default_size")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method get_default_size
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_default_size")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method resize
+  (of-object "GtkWindow")
+  (c-name "gtk_window_resize")
+  (return-type "none")
+  (parameters
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-method get_size
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_size")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method move
+  (of-object "GtkWindow")
+  (c-name "gtk_window_move")
+  (return-type "none")
+  (parameters
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-method get_position
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_position")
+  (return-type "none")
+  (parameters
+    '("gint*" "root_x")
+    '("gint*" "root_y")
+  )
+)
+
+(define-method parse_geometry
+  (of-object "GtkWindow")
+  (c-name "gtk_window_parse_geometry")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "geometry")
+  )
+)
+
+(define-method reshow_with_initial_size
+  (of-object "GtkWindow")
+  (c-name "gtk_window_reshow_with_initial_size")
+  (return-type "none")
+)
+
+(define-method set_focus_on_map
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_focus_on_map")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_focus_on_map
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_focus_on_map")
+  (return-type "gboolean")
+)
+
+(define-method set_icon_name
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name" (null-ok))
+  )
+)
+
+(define-method get_icon_name
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_icon_name")
+  (return-type "const-gchar*")
+)
+
+(define-method set_mnemonics_visible
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_mnemonics_visible")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_mnemonics_visible
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_mnemonics_visible")
+  (return-type "gboolean")
+)
+
+(define-method get_window_type
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_window_type")
+  (return-type "GtkWindowType")
+)
+
+(define-virtual set_focus
+  (of-object "GtkWindow")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "focus" (null-ok))
+  )
+)
+
+(define-virtual frame_event
+  (of-object "GtkWindow")
+  (return-type "gboolean")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-virtual activate_focus
+  (of-object "GtkWindow")
+  (return-type "none")
+)
+
+(define-virtual activate_default
+  (of-object "GtkWindow")
+  (return-type "none")
+)
+
+(define-virtual move_focus
+  (of-object "GtkWindow")
+  (return-type "none")
+  (parameters
+    '("GtkDirectionType" "direction")
+  )
+)
+
+(define-virtual keys_changed
+  (of-object "GtkWindow")
+  (return-type "none")
+)
+
+(define-method set_deletable
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_deletable")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_deletable
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_deletable")
+  (return-type "gboolean")
+)
+
+(define-method get_group
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_group")
+  (return-type "GtkWindowGroup*")
+)
+
+(define-function set_default_icon
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_default_icon")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "icon")
+  )
+)
+
+(define-method get_opacity
+  (of-object "GtkWindow")
+  (c-name "gtk_window_get_opacity")
+  (return-type "gdouble")
+)
+
+(define-method set_opacity
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_opacity")
+  (return-type "none")
+  (parameters
+    '("gdouble" "opacity")
+  )
+)
+
+(define-method set_startup_id
+  (of-object "GtkWindow")
+  (c-name "gtk_window_set_startup_id")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "startup_id")
+  )
+)
+
diff --git a/src/defs/GtkWindowGroup.defs b/src/defs/GtkWindowGroup.defs
new file mode 100644
index 0000000..7a5c82a
--- /dev/null
+++ b/src/defs/GtkWindowGroup.defs
@@ -0,0 +1,32 @@
+(define-object WindowGroup
+  (in-module "Gtk")
+  (parent "GObject")
+  (c-name "GtkWindowGroup")
+  (gtype-id "GTK_TYPE_WINDOW_GROUP")
+)
+
+(define-function window_group_new
+  (is-constructor-of "GtkWindowGroup")
+  (c-name "gtk_window_group_new")
+  (caller-owns-return #t)
+  (return-type "GtkWindowGroup*")
+)
+
+(define-method add_window
+  (of-object "GtkWindowGroup")
+  (c-name "gtk_window_group_add_window")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "window")
+  )
+)
+
+(define-method remove_window
+  (of-object "GtkWindowGroup")
+  (c-name "gtk_window_group_remove_window")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "window")
+  )
+)
+
diff --git a/src/defs/GtkWindowPosition.defs b/src/defs/GtkWindowPosition.defs
new file mode 100644
index 0000000..c369d97
--- /dev/null
+++ b/src/defs/GtkWindowPosition.defs
@@ -0,0 +1,13 @@
+(define-enum WindowPosition
+  (in-module "Gtk")
+  (c-name "GtkWindowPosition")
+  (gtype-id "GTK_TYPE_WINDOW_POSITION")
+  (values
+    '("none" "GTK_WIN_POS_NONE")
+    '("center" "GTK_WIN_POS_CENTER")
+    '("mouse" "GTK_WIN_POS_MOUSE")
+    '("center-always" "GTK_WIN_POS_CENTER_ALWAYS")
+    '("center-on-parent" "GTK_WIN_POS_CENTER_ON_PARENT")
+  )
+)
+
diff --git a/src/defs/GtkWindowType.defs b/src/defs/GtkWindowType.defs
new file mode 100644
index 0000000..d3200b3
--- /dev/null
+++ b/src/defs/GtkWindowType.defs
@@ -0,0 +1,10 @@
+(define-enum WindowType
+  (in-module "Gtk")
+  (c-name "GtkWindowType")
+  (gtype-id "GTK_TYPE_WINDOW_TYPE")
+  (values
+    '("toplevel" "GTK_WINDOW_TOPLEVEL")
+    '("popup" "GTK_WINDOW_POPUP")
+  )
+)
+
diff --git a/src/defs/GtkWrapMode.defs b/src/defs/GtkWrapMode.defs
new file mode 100644
index 0000000..57a9cdb
--- /dev/null
+++ b/src/defs/GtkWrapMode.defs
@@ -0,0 +1,12 @@
+(define-enum WrapMode
+  (in-module "Gtk")
+  (c-name "GtkWrapMode")
+  (gtype-id "GTK_TYPE_WRAP_MODE")
+  (values
+    '("none" "GTK_WRAP_NONE")
+    '("char" "GTK_WRAP_CHAR")
+    '("word" "GTK_WRAP_WORD")
+    '("word_char" "GTK_WRAP_WORD_CHAR")
+  )
+)
+
diff --git a/src/defs/NotifyMain.defs b/src/defs/NotifyMain.defs
new file mode 100644
index 0000000..c3edca3
--- /dev/null
+++ b/src/defs/NotifyMain.defs
@@ -0,0 +1,34 @@
+;; Custom wrapper for notify part of Libnotify.
+
+(define-boxed Main
+  (in-module "Notify")
+  (c-name "NotifyMain")
+  (import-header "libnotify/notify.h")
+)
+
+(define-function notify_init
+  (of-object "NotifyMain")
+  (c-name "notify_init")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "app_name")
+  )
+)
+
+(define-function notify_uninit
+  (of-object "NotifyMain")
+  (c-name "notify_uninit")
+  (return-type "none")
+)
+
+(define-function notify_is_initted
+  (of-object "NotifyMain")
+  (c-name "notify_is_initted")
+  (return-type "gboolean")
+)
+
+(define-function notify_get_app_name
+  (of-object "NotifyMain")
+  (c-name "notify_get_app_name")
+  (return-type "const-gchar*")
+)
\ No newline at end of file
diff --git a/src/defs/NotifyNotification.defs b/src/defs/NotifyNotification.defs
new file mode 100644
index 0000000..2eb600e
--- /dev/null
+++ b/src/defs/NotifyNotification.defs
@@ -0,0 +1,173 @@
+(define-object Notification
+  (in-module "Notify")
+  (parent "GObject")
+  (c-name "NotifyNotification")
+  (gtype-id "NOTIFY_TYPE_NOTIFICATION")
+  (import-header "libnotify/notification.h")
+)
+
+(define-function notify_notification_new
+  (is-constructor-of "NotifyNotification")
+  (c-name "notify_notification_new")
+  (caller-owns-return #t)
+  (return-type "NotifyNotification*")
+  (parameters
+    '("const-gchar*" "summary")
+    '("const-gchar*" "body" (null-ok))
+    '("const-gchar*" "icon" (null-ok))
+  )
+)
+
+(define-method update
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_update")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "summary")
+    '("const-gchar*" "body" (null-ok))
+    '("const-gchar*" "icon" (null-ok))
+  )
+)
+
+(define-method show
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_show")
+  (return-type "gboolean")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-method set_timeout
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_timeout")
+  (return-type "none")
+  (parameters
+    '("gint" "timeout")
+  )
+)
+
+(define-method set_category
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_category")
+  (return-type "none")
+  (parameters
+    '("const-char*" "category")
+  )
+)
+
+(define-method set_urgency
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_urgency")
+  (return-type "none")
+  (parameters
+    '("NotifyUrgency" "urgency")
+  )
+)
+
+(define-method set_icon_from_pixbuf
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_icon_from_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkPixbuf*" "icon")
+  )
+)
+
+(define-method set_hint_int32
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_hint_int32")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("gint" "value")
+  )
+)
+
+(define-method set_hint_double
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_hint_double")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("gdouble" "value")
+  )
+)
+
+(define-method set_hint_string
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_hint_string")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("const-gchar*" "value")
+  )
+)
+
+(define-method set_hint_byte
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_hint_byte")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("guchar" "value")
+  )
+)
+
+(define-method set_hint_byte_array
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_set_hint_byte_array")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "key")
+    '("const-guchar*" "value")
+    '("gsize" "len")
+  )
+)
+
+(define-method clear_hints
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_clear_hints")
+  (return-type "none")
+)
+
+(define-method add_action
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_add_action")
+  (return-type "none")
+  (parameters
+    '("const-char*" "action")
+    '("const-char*" "label")
+    '("NotifyActionCallback" "callback")
+    '("gpointer" "user_data")
+    '("GFreeFunc" "free_func")
+  )
+)
+
+(define-method clear_actions
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_clear_actions")
+  (return-type "none")
+)
+
+(define-method close
+  (of-object "NotifyNotification")
+  (c-name "notify_notification_close")
+  (return-type "gboolean")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-virtual closed
+  (of-object "NotifyNotification")
+  (return-type "none")
+)
+
+(define-virtual action
+  (of-object "NotifyNotification")
+  (return-type "none")
+  (parameters
+    '("gchar*" "action")
+  )
+)
diff --git a/src/defs/NotifyUrgency.defs b/src/defs/NotifyUrgency.defs
new file mode 100644
index 0000000..6720d1d
--- /dev/null
+++ b/src/defs/NotifyUrgency.defs
@@ -0,0 +1,11 @@
+(define-enum Urgency
+  (in-module "Notify")
+  (c-name "NotifyUrgency")
+  (gtype-id "NOTIFY_TYPE_URGENCY")
+  (values
+    '("low" "NOTIFY_URGENCY_LOW")
+    '("normal" "NOTIFY_URGENCY_NORMAL")
+    '("critical" "NOTIFY_URGENCY_CRITICAL")
+  )
+)
+
diff --git a/src/defs/PangoAlignment.defs b/src/defs/PangoAlignment.defs
new file mode 100644
index 0000000..953024f
--- /dev/null
+++ b/src/defs/PangoAlignment.defs
@@ -0,0 +1,11 @@
+(define-enum Alignment
+  (in-module "Pango")
+  (c-name "PangoAlignment")
+  (gtype-id "PANGO_TYPE_ALIGNMENT")
+  (values
+    '("left" "PANGO_ALIGN_LEFT")
+    '("center" "PANGO_ALIGN_CENTER")
+    '("right" "PANGO_ALIGN_RIGHT")
+  )
+)
+
diff --git a/src/defs/PangoAnalysis.defs b/src/defs/PangoAnalysis.defs
new file mode 100644
index 0000000..6dc33ab
--- /dev/null
+++ b/src/defs/PangoAnalysis.defs
@@ -0,0 +1,5 @@
+(define-boxed Analysis
+  (in-module "Pango")
+  (c-name "PangoAnalysis")
+)
+
diff --git a/src/defs/PangoAttrIterator.defs b/src/defs/PangoAttrIterator.defs
new file mode 100644
index 0000000..d7ecf15
--- /dev/null
+++ b/src/defs/PangoAttrIterator.defs
@@ -0,0 +1,62 @@
+(define-boxed AttrIterator
+  (in-module "Pango")
+  (c-name "PangoAttrIterator")
+  (copy-func "pango_attr_iterator_copy")
+  (release-func "pango_attr_iterator_destroy")
+)
+
+(define-method range
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_range")
+  (return-type "none")
+  (parameters
+    '("gint*" "start")
+    '("gint*" "end")
+  )
+)
+
+(define-method next
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_next")
+  (return-type "gboolean")
+)
+
+(define-method copy
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_copy")
+  (return-type "PangoAttrIterator*")
+)
+
+(define-method destroy
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_destroy")
+  (return-type "none")
+)
+
+(define-method get
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_get")
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoAttrType" "type")
+  )
+)
+
+(define-method get_font
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_get_font")
+  (return-type "none")
+  (parameters
+    '("PangoFontDescription*" "desc")
+    '("PangoLanguage**" "language")
+    '("GSList**" "extra_attrs")
+  )
+)
+
+(define-method get_attrs
+  (of-object "PangoAttrIterator")
+  (c-name "pango_attr_iterator_get_attrs")
+  (caller-owns-return #f)
+  (return-type "GSList-PangoAttribute*")
+)
+
diff --git a/src/defs/PangoAttrList.defs b/src/defs/PangoAttrList.defs
new file mode 100644
index 0000000..d0cb6e3
--- /dev/null
+++ b/src/defs/PangoAttrList.defs
@@ -0,0 +1,87 @@
+(define-boxed AttributeList
+  (in-module "Pango")
+  (c-name "PangoAttrList")
+  (gtype-id "PANGO_TYPE_ATTR_LIST")
+  (copy-func "pango_attr_list_ref")
+  (release-func "pango_attr_list_unref")
+)
+
+(define-function pango_attr_list_new
+  (is-constructor-of "PangoAttrList")
+  (c-name "pango_attr_list_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttrList*")
+)
+
+(define-method ref
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_ref")
+  (return-type "none")
+)
+
+(define-method unref
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_unref")
+  (return-type "none")
+)
+
+(define-method copy
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_copy")
+  (return-type "PangoAttrList*")
+)
+
+(define-method insert
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_insert")
+  (return-type "none")
+  (parameters
+    '("PangoAttribute*" "attr")
+  )
+)
+
+(define-method insert_before
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_insert_before")
+  (return-type "none")
+  (parameters
+    '("PangoAttribute*" "attr")
+  )
+)
+
+(define-method change
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_change")
+  (return-type "none")
+  (parameters
+    '("PangoAttribute*" "attr")
+  )
+)
+
+(define-method splice
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_splice")
+  (return-type "none")
+  (parameters
+    '("PangoAttrList*" "other")
+    '("gint" "pos")
+    '("gint" "len")
+  )
+)
+
+(define-method filter
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_filter")
+  (return-type "PangoAttrList*")
+  (parameters
+    '("PangoAttrFilterFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-method get_iterator
+  (of-object "PangoAttrList")
+  (c-name "pango_attr_list_get_iterator")
+  (return-type "PangoAttrIterator*")
+)
+
diff --git a/src/defs/PangoAttrType.defs b/src/defs/PangoAttrType.defs
new file mode 100644
index 0000000..86a4b2b
--- /dev/null
+++ b/src/defs/PangoAttrType.defs
@@ -0,0 +1,29 @@
+(define-enum AttrType
+  (in-module "Pango")
+  (c-name "PangoAttrType")
+  (gtype-id "PANGO_TYPE_ATTR_TYPE")
+  (values
+    '("invalid" "PANGO_ATTR_INVALID")
+    '("language" "PANGO_ATTR_LANGUAGE")
+    '("family" "PANGO_ATTR_FAMILY")
+    '("style" "PANGO_ATTR_STYLE")
+    '("weight" "PANGO_ATTR_WEIGHT")
+    '("variant" "PANGO_ATTR_VARIANT")
+    '("stretch" "PANGO_ATTR_STRETCH")
+    '("size" "PANGO_ATTR_SIZE")
+    '("font-desc" "PANGO_ATTR_FONT_DESC")
+    '("foreground" "PANGO_ATTR_FOREGROUND")
+    '("background" "PANGO_ATTR_BACKGROUND")
+    '("underline" "PANGO_ATTR_UNDERLINE")
+    '("strikethrough" "PANGO_ATTR_STRIKETHROUGH")
+    '("rise" "PANGO_ATTR_RISE")
+    '("shape" "PANGO_ATTR_SHAPE")
+    '("scale" "PANGO_ATTR_SCALE")
+    '("fallback" "PANGO_ATTR_FALLBACK")
+    '("letter-spacing" "PANGO_ATTR_LETTER_SPACING")
+    '("underline-color" "PANGO_ATTR_UNDERLINE_COLOR")
+    '("strikethrough-color" "PANGO_ATTR_STRIKETHROUGH_COLOR")
+    '("absolute-size" "PANGO_ATTR_ABSOLUTE_SIZE")
+  )
+)
+
diff --git a/src/defs/PangoAttribute.defs b/src/defs/PangoAttribute.defs
new file mode 100644
index 0000000..3d0ecff
--- /dev/null
+++ b/src/defs/PangoAttribute.defs
@@ -0,0 +1,258 @@
+(define-boxed Attribute
+  (in-module "Pango")
+  (c-name "PangoAttribute")
+  (copy-func "pango_attribute_copy")
+  (release-func "pango_attribute_destroy")
+  (fields
+    '("guint" "start_index")
+    '("guint" "end_index")
+  )
+)
+
+(define-method copy
+  (of-object "PangoAttribute")
+  (c-name "pango_attribute_copy")
+  (return-type "PangoAttribute*")
+)
+
+(define-method destroy
+  (of-object "PangoAttribute")
+  (c-name "pango_attribute_destroy")
+  (return-type "none")
+)
+
+(define-method equal
+  (of-object "PangoAttribute")
+  (c-name "pango_attribute_equal")
+  (return-type "gboolean")
+  (parameters
+    '("const-PangoAttribute*" "attr2")
+  )
+)
+
+(define-function pango_attribute_new_language
+  (c-name "pango_attr_language_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoLanguage*" "language")
+  )
+)
+
+;;(define-function AttrFamily
+;;  (c-name "pango_attr_family_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("const-char*" "family")
+;;  )
+;;)
+
+(define-function pango_attribute_new_foreground
+  (c-name "pango_attr_foreground_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("guint16" "red")
+    '("guint16" "green")
+    '("guint16" "blue")
+  )
+)
+
+(define-function pango_attribute_new_background
+  (c-name "pango_attr_background_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("guint16" "red")
+    '("guint16" "green")
+    '("guint16" "blue")
+  )
+)
+
+(define-function pango_attribute_new_size
+  (c-name "pango_attr_size_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("int" "size")
+  )
+)
+
+;;(define-function AttrSizeAbsolute
+;;  (c-name "pango_attr_size_new_absolute")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("int" "size")
+;;  )
+;;)
+
+(define-function pango_attribute_new_style
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_style_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoStyle" "style")
+  )
+)
+
+(define-function pango_attribute_new_weight
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_weight_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoWeight" "weight")
+  )
+)
+
+(define-function pango_attribute_new_variant
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_variant_new")
+  (return-type "PangoAttribute*")
+  (caller-owns-return #t)
+  (parameters
+    '("PangoVariant" "variant")
+  )
+)
+
+;;(define-function AttrStretch
+;;  (c-name "pango_attr_stretch_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("PangoStretch" "stretch")
+;;  )
+;;)
+
+(define-function pango_attribute_new_font_description
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_font_desc_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("const-PangoFontDescription*" "desc")
+  )
+)
+
+(define-function pango_attribute_new_underline
+  (c-name "pango_attr_underline_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoUnderline" "underline")
+  )
+)
+
+(define-function pango_attribute_new_underline_color
+  (c-name "pango_attr_underline_color_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("guint16" "red")
+    '("guint16" "green")
+    '("guint16" "blue")
+  )
+)
+
+;;(define-function AttrStrikethrough
+;;  (c-name "pango_attr_strikethrough_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("gboolean" "strikethrough")
+;;  )
+;;)
+;;
+;;(define-function AttrStrikethroughColor
+;;  (c-name "pango_attr_strikethrough_color_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("guint16" "red")
+;;    '("guint16" "green")
+;;    '("guint16" "blue")
+;;  )
+;;)
+;;
+
+(define-function pango_attribute_new_rise
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_rise_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("int" "rise")
+  )
+)
+
+;;(define-function AttrScale
+;;  (c-name "pango_attr_scale_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("double" "scale_factor")
+;;  )
+;;)
+
+(define-function pango_attr_new_fallback
+  (c-name "pango_attr_fallback_new")
+  (is-constructor-of "PangoAttribute")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("gboolean" "fallback")
+  )
+)
+
+;;(define-function AttrLetterSpacing
+;;  (c-name "pango_attr_letter_spacing_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("int" "letter_spacing")
+;;  )
+;;)
+;;
+;;(define-function AttrShape
+;;  (c-name "pango_attr_shape_new")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("const-PangoRectangle*" "ink_rect")
+;;    '("const-PangoRectangle*" "logical_rect")
+;;  )
+;;)
+;;
+;;(define-function attr_shape_new_with_data
+;;  (c-name "pango_attr_shape_new_with_data")
+;;  (return-type "PangoAttribute*")
+;;  (parameters
+;;    '("const-PangoRectangle*" "ink_rect")
+;;    '("const-PangoRectangle*" "logical_rect")
+;;    '("gpointer" "data")
+;;    '("PangoAttrDataCopyFunc" "copy_func")
+;;    '("GDestroyNotify" "destroy_func")
+;;  )
+;;)
+
+(define-function pango_attribute_new_gravity
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_gravity_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoGravity" "gravity")
+  )
+)
+
+(define-function pango_attribute_new_gravity_hint
+  (is-constructor-of "PangoAttribute")
+  (c-name "pango_attr_gravity_hint_new")
+  (caller-owns-return #t)
+  (return-type "PangoAttribute*")
+  (parameters
+    '("PangoGravityHint" "hint")
+  )
+)
+
diff --git a/src/defs/PangoCairoFcFont.defs b/src/defs/PangoCairoFcFont.defs
new file mode 100644
index 0000000..e2d486b
--- /dev/null
+++ b/src/defs/PangoCairoFcFont.defs
@@ -0,0 +1,5 @@
+(define-object CairoFcFont
+  (in-module "Pango")
+  (parent "PangoFcFont")
+  (c-name "PangoCairoFcFont")
+)
diff --git a/src/defs/PangoColor.defs b/src/defs/PangoColor.defs
new file mode 100644
index 0000000..659e6c3
--- /dev/null
+++ b/src/defs/PangoColor.defs
@@ -0,0 +1,41 @@
+(define-boxed Color
+  (in-module "Pango")
+  (c-name "PangoColor")
+  (gtype-id "PANGO_TYPE_COLOR")
+  (copy-func "pango_color_copy")
+  (release-func "pango_color_free")
+  (fields
+    '("guint16" "red")
+    '("guint16" "green")
+    '("guint16" "blue")
+  )
+)
+
+(define-method copy
+  (of-object "PangoColor")
+  (c-name "pango_color_copy")
+  (return-type "PangoColor*")
+)
+
+(define-method free
+  (of-object "PangoColor")
+  (c-name "pango_color_free")
+  (return-type "none")
+)
+
+(define-method color_parse
+  (of-object "PangoColor")
+  (c-name "pango_color_parse")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "spec")
+  )
+)
+
+(define-method to_string
+  (of-object "PangoColor")
+  (c-name "pango_color_to_string")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
diff --git a/src/defs/PangoContext.defs b/src/defs/PangoContext.defs
new file mode 100644
index 0000000..1cb4b52
--- /dev/null
+++ b/src/defs/PangoContext.defs
@@ -0,0 +1,181 @@
+(define-object Context
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoContext")
+  (gtype-id "PANGO_TYPE_CONTEXT")
+)
+
+;;This function is only used when constructing a new Pango backend which
+;;applications shouldn't do, and relies on a special #define to be present in
+;;the C API. This is not planned to be exposed in java-gnome so it is
+;;commented out and fixes bug #528282
+
+;;(define-function pango_context_new
+;;  (is-constructor-of "PangoContext")
+;;  (c-name "pango_context_new")
+;;  (caller-owns-return #t)
+;;  (return-type "PangoContext*")
+;;)
+
+;;(define-method add_font_map
+;;  (of-object "PangoContext")
+;;  (c-name "pango_context_set_font_map")
+;;  (return-type "none")
+;;  (parameters
+;;    '("PangoFontMap*" "font_map")
+;;  )
+;;)
+
+(define-method get_font_map
+  (of-object "PangoContext")
+  (c-name "pango_context_get_font_map")
+  (return-type "PangoFontMap*")
+)
+
+(define-method list_families
+  (of-object "PangoContext")
+  (c-name "pango_context_list_families")
+  (return-type "none")
+  (parameters
+    '("PangoFontFamily***" "families")
+    '("int*" "n_families")
+  )
+)
+
+(define-method load_font
+  (of-object "PangoContext")
+  (c-name "pango_context_load_font")
+  (return-type "PangoFont*")
+  (parameters
+    '("const-PangoFontDescription*" "desc")
+  )
+)
+
+(define-method load_fontset
+  (of-object "PangoContext")
+  (c-name "pango_context_load_fontset")
+  (return-type "PangoFontset*")
+  (parameters
+    '("const-PangoFontDescription*" "desc")
+    '("PangoLanguage*" "language")
+  )
+)
+
+(define-method get_metrics
+  (of-object "PangoContext")
+  (c-name "pango_context_get_metrics")
+  (caller-owns-return #t)
+  (return-type "PangoFontMetrics*")
+  (parameters
+    '("const-PangoFontDescription*" "desc")
+    '("PangoLanguage*" "language" (default "NULL") (null-ok))
+  )
+)
+
+(define-method set_font_description
+  (of-object "PangoContext")
+  (c-name "pango_context_set_font_description")
+  (return-type "none")
+  (parameters
+    '("const-PangoFontDescription*" "desc")
+  )
+)
+
+(define-method get_font_description
+  (of-object "PangoContext")
+  (c-name "pango_context_get_font_description")
+  (return-type "PangoFontDescription*")
+)
+
+(define-method get_language
+  (of-object "PangoContext")
+  (c-name "pango_context_get_language")
+  (return-type "PangoLanguage*")
+)
+
+(define-method set_language
+  (of-object "PangoContext")
+  (c-name "pango_context_set_language")
+  (return-type "none")
+  (parameters
+    '("PangoLanguage*" "language")
+  )
+)
+
+(define-method set_base_dir
+  (of-object "PangoContext")
+  (c-name "pango_context_set_base_dir")
+  (return-type "none")
+  (parameters
+    '("PangoDirection" "direction")
+  )
+)
+
+(define-method get_base_dir
+  (of-object "PangoContext")
+  (c-name "pango_context_get_base_dir")
+  (return-type "PangoDirection")
+)
+
+(define-method set_matrix
+  (of-object "PangoContext")
+  (c-name "pango_context_set_matrix")
+  (return-type "none")
+  (parameters
+    '("const-PangoMatrix*" "matrix")
+  )
+)
+
+(define-method get_matrix
+  (of-object "PangoContext")
+  (c-name "pango_context_get_matrix")
+  (return-type "const-PangoMatrix*")
+)
+
+(define-method set_base_gravity
+  (of-object "PangoContext")
+  (c-name "pango_context_set_base_gravity")
+  (return-type "none")
+  (parameters
+    '("PangoGravity" "gravity")
+  )
+)
+
+(define-method get_base_gravity
+  (of-object "PangoContext")
+  (c-name "pango_context_get_base_gravity")
+  (return-type "PangoGravity")
+)
+
+(define-method get_gravity
+  (of-object "PangoContext")
+  (c-name "pango_context_get_gravity")
+  (return-type "PangoGravity")
+)
+
+(define-method set_gravity_hint
+  (of-object "PangoContext")
+  (c-name "pango_context_set_gravity_hint")
+  (return-type "none")
+  (parameters
+    '("PangoGravityHint" "hint")
+  )
+)
+
+(define-method get_gravity_hint
+  (of-object "PangoContext")
+  (c-name "pango_context_get_gravity_hint")
+  (return-type "PangoGravityHint")
+)
+
+;; add Cairo support!
+;;
+(define-method set_font_options
+  (of-object "PangoContext")
+  (c-name "pango_cairo_context_set_font_options")
+  (return-type "none")
+  (parameters
+    '("cairo_font_options_t*" "options")
+  )
+)
+
diff --git a/src/defs/PangoCoverage.defs b/src/defs/PangoCoverage.defs
new file mode 100644
index 0000000..be6fa6e
--- /dev/null
+++ b/src/defs/PangoCoverage.defs
@@ -0,0 +1,74 @@
+(define-function coverage_new
+  (is-constructor-of "PangoCoverage")
+  (c-name "pango_coverage_new")
+  (caller-owns-return #t)
+  (return-type "PangoCoverage*")
+)
+
+(define-method ref
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_ref")
+  (return-type "PangoCoverage*")
+)
+
+(define-method unref
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_unref")
+  (return-type "none")
+)
+
+(define-method copy
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_copy")
+  (return-type "PangoCoverage*")
+)
+
+(define-method get
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_get")
+  (return-type "PangoCoverageLevel")
+  (parameters
+    '("int" "index")
+  )
+)
+
+(define-method set
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_set")
+  (return-type "none")
+  (parameters
+    '("int" "index")
+    '("PangoCoverageLevel" "level")
+  )
+)
+
+(define-method max
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_max")
+  (return-type "none")
+  (parameters
+    '("PangoCoverage*" "other")
+  )
+)
+
+(define-method to_bytes
+  (of-object "PangoCoverage")
+  (c-name "pango_coverage_to_bytes")
+  (return-type "none")
+  (parameters
+    '("guchar**" "bytes")
+    '("int*" "n_bytes")
+  )
+)
+
+(define-function coverage_from_bytes
+  (is-constructor-of "PangoCoverage")
+  (c-name "pango_coverage_from_bytes")
+  (caller-owns-return #t)
+  (return-type "PangoCoverage*")
+  (parameters
+    '("guchar*" "bytes")
+    '("int" "n_bytes")
+  )
+)
+
diff --git a/src/defs/PangoCoverageLevel.defs b/src/defs/PangoCoverageLevel.defs
new file mode 100644
index 0000000..c942bf2
--- /dev/null
+++ b/src/defs/PangoCoverageLevel.defs
@@ -0,0 +1,12 @@
+(define-enum CoverageLevel
+  (in-module "Pango")
+  (c-name "PangoCoverageLevel")
+  (gtype-id "PANGO_TYPE_COVERAGE_LEVEL")
+  (values
+    '("none" "PANGO_COVERAGE_NONE")
+    '("fallback" "PANGO_COVERAGE_FALLBACK")
+    '("approximate" "PANGO_COVERAGE_APPROXIMATE")
+    '("exact" "PANGO_COVERAGE_EXACT")
+  )
+)
+
diff --git a/src/defs/PangoDirection.defs b/src/defs/PangoDirection.defs
new file mode 100644
index 0000000..e14b3d7
--- /dev/null
+++ b/src/defs/PangoDirection.defs
@@ -0,0 +1,15 @@
+(define-enum Direction
+  (in-module "Pango")
+  (c-name "PangoDirection")
+  (gtype-id "PANGO_TYPE_DIRECTION")
+  (values
+    '("ltr" "PANGO_DIRECTION_LTR")
+    '("rtl" "PANGO_DIRECTION_RTL")
+    '("ttb-ltr" "PANGO_DIRECTION_TTB_LTR")
+    '("ttb-rtl" "PANGO_DIRECTION_TTB_RTL")
+    '("weak-ltr" "PANGO_DIRECTION_WEAK_LTR")
+    '("weak-rtl" "PANGO_DIRECTION_WEAK_RTL")
+    '("neutral" "PANGO_DIRECTION_NEUTRAL")
+  )
+)
+
diff --git a/src/defs/PangoEllipsizeMode.defs b/src/defs/PangoEllipsizeMode.defs
new file mode 100644
index 0000000..c39ed58
--- /dev/null
+++ b/src/defs/PangoEllipsizeMode.defs
@@ -0,0 +1,12 @@
+(define-enum EllipsizeMode
+  (in-module "Pango")
+  (c-name "PangoEllipsizeMode")
+  (gtype-id "PANGO_TYPE_ELLIPSIZE_MODE")
+  (values
+    '("none" "PANGO_ELLIPSIZE_NONE")
+    '("start" "PANGO_ELLIPSIZE_START")
+    '("middle" "PANGO_ELLIPSIZE_MIDDLE")
+    '("end" "PANGO_ELLIPSIZE_END")
+  )
+)
+
diff --git a/src/defs/PangoEngine.defs b/src/defs/PangoEngine.defs
new file mode 100644
index 0000000..a8e9aea
--- /dev/null
+++ b/src/defs/PangoEngine.defs
@@ -0,0 +1,7 @@
+(define-object Engine
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoEngine")
+  (gtype-id "PANGO_TYPE_ENGINE")
+)
+
diff --git a/src/defs/PangoEngineLang.defs b/src/defs/PangoEngineLang.defs
new file mode 100644
index 0000000..82830ce
--- /dev/null
+++ b/src/defs/PangoEngineLang.defs
@@ -0,0 +1,7 @@
+(define-object EngineLang
+  (in-module "Pango")
+  (parent "PangoEngine")
+  (c-name "PangoEngineLang")
+  (gtype-id "PANGO_TYPE_ENGINE_LANG")
+)
+
diff --git a/src/defs/PangoEngineShape.defs b/src/defs/PangoEngineShape.defs
new file mode 100644
index 0000000..3b2ec2a
--- /dev/null
+++ b/src/defs/PangoEngineShape.defs
@@ -0,0 +1,7 @@
+(define-object EngineShape
+  (in-module "Pango")
+  (parent "PangoEngine")
+  (c-name "PangoEngineShape")
+  (gtype-id "PANGO_TYPE_ENGINE_SHAPE")
+)
+
diff --git a/src/defs/PangoFcFont.defs b/src/defs/PangoFcFont.defs
new file mode 100644
index 0000000..d7673f0
--- /dev/null
+++ b/src/defs/PangoFcFont.defs
@@ -0,0 +1,5 @@
+(define-object FcFont
+  (in-module "Pango")
+  (parent "PangoFont")
+  (c-name "PangoFcFont")
+)
diff --git a/src/defs/PangoFont.defs b/src/defs/PangoFont.defs
new file mode 100644
index 0000000..a2b7291
--- /dev/null
+++ b/src/defs/PangoFont.defs
@@ -0,0 +1,115 @@
+(define-object Font
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoFont")
+  (gtype-id "PANGO_TYPE_FONT")
+)
+
+(define-method describe
+  (of-object "PangoFont")
+  (c-name "pango_font_describe")
+  (return-type "PangoFontDescription*")
+)
+
+(define-method describe_with_absolute_size
+  (of-object "PangoFont")
+  (c-name "pango_font_describe_with_absolute_size")
+  (return-type "PangoFontDescription*")
+)
+
+(define-method get_coverage
+  (of-object "PangoFont")
+  (c-name "pango_font_get_coverage")
+  (return-type "PangoCoverage*")
+  (parameters
+    '("PangoLanguage*" "language")
+  )
+)
+
+(define-method find_shaper
+  (of-object "PangoFont")
+  (c-name "pango_font_find_shaper")
+  (return-type "PangoEngineShape*")
+  (parameters
+    '("PangoLanguage*" "language")
+    '("guint32" "ch")
+  )
+)
+
+(define-method get_metrics
+  (of-object "PangoFont")
+  (c-name "pango_font_get_metrics")
+  (return-type "PangoFontMetrics*")
+  (parameters
+    '("PangoLanguage*" "language" (default "NULL") (null-ok))
+  )
+)
+
+(define-method get_glyph_extents
+  (of-object "PangoFont")
+  (c-name "pango_font_get_glyph_extents")
+  (return-type "none")
+  (parameters
+    '("PangoGlyph" "glyph")
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_font_map
+  (of-object "PangoFont")
+  (c-name "pango_font_get_font_map")
+  (return-type "PangoFontMap*")
+)
+
+(define-virtual describe
+  (of-object "PangoFont")
+  (return-type "PangoFontDescription*")
+  (unnecessary)
+)
+
+(define-virtual get_coverage
+  (of-object "PangoFont")
+  (return-type "PangoCoverage*")
+  (parameters
+    '("PangoLanguage*" "lang")
+  )
+  (unnecessary)
+)
+
+(define-virtual find_shaper
+  (of-object "PangoFont")
+  (return-type "PangoEngineShape*")
+  (parameters
+    '("PangoLanguage*" "lang")
+    '("guint32" "ch")
+  )
+  (unnecessary)
+)
+
+(define-virtual get_glyph_extents
+  (of-object "PangoFont")
+  (return-type "none")
+  (parameters
+    '("PangoGlyph" "glyph")
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+  (unnecessary)
+)
+
+(define-virtual get_metrics
+  (of-object "PangoFont")
+  (return-type "PangoFontMetrics*")
+  (parameters
+    '("PangoLanguage*" "language")
+  )
+  (unnecessary)
+)
+
+(define-virtual get_font_map
+  (of-object "PangoFont")
+  (return-type "PangoFontMap*")
+  (unnecessary)
+)
+
diff --git a/src/defs/PangoFontDescription.defs b/src/defs/PangoFontDescription.defs
new file mode 100644
index 0000000..496f50c
--- /dev/null
+++ b/src/defs/PangoFontDescription.defs
@@ -0,0 +1,246 @@
+(define-boxed FontDescription
+  (in-module "Pango")
+  (c-name "PangoFontDescription")
+  (gtype-id "PANGO_TYPE_FONT_DESCRIPTION")
+  (copy-func "pango_font_description_copy")
+  (release-func "pango_font_description_free")
+)
+
+(define-function pango_font_description_new
+  (is-constructor-of "PangoFontDescription")
+  (c-name "pango_font_description_new")
+  (caller-owns-return #t)
+  (return-type "PangoFontDescription*")
+)
+
+(define-method copy
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_copy")
+  (return-type "PangoFontDescription*")
+)
+
+(define-method copy_static
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_copy_static")
+  (return-type "PangoFontDescription*")
+)
+
+(define-method hash
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_hash")
+  (return-type "guint")
+)
+
+(define-method equal
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_equal")
+  (return-type "gboolean")
+  (parameters
+    '("const-PangoFontDescription*" "desc2")
+  )
+)
+
+(define-method free
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_free")
+  (return-type "none")
+)
+
+(define-method set_family
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_family")
+  (return-type "none")
+  (parameters
+    '("const-char*" "family")
+  )
+)
+
+(define-method set_family_static
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_family_static")
+  (return-type "none")
+  (parameters
+    '("const-char*" "family")
+  )
+)
+
+(define-method get_family
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_family")
+  (return-type "const-char*")
+)
+
+(define-method set_style
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_style")
+  (return-type "none")
+  (parameters
+    '("PangoStyle" "style")
+  )
+)
+
+(define-method get_style
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_style")
+  (return-type "PangoStyle")
+)
+
+(define-method set_variant
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_variant")
+  (return-type "none")
+  (parameters
+    '("PangoVariant" "variant")
+  )
+)
+
+(define-method get_variant
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_variant")
+  (return-type "PangoVariant")
+)
+
+(define-method set_weight
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_weight")
+  (return-type "none")
+  (parameters
+    '("PangoWeight" "weight")
+  )
+)
+
+(define-method get_weight
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_weight")
+  (return-type "PangoWeight")
+)
+
+(define-method set_stretch
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_stretch")
+  (return-type "none")
+  (parameters
+    '("PangoStretch" "stretch")
+  )
+)
+
+(define-method get_stretch
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_stretch")
+  (return-type "PangoStretch")
+)
+
+(define-method set_size
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_size")
+  (return-type "none")
+  (parameters
+    '("gint" "size")
+  )
+)
+
+(define-method get_size
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_size")
+  (return-type "gint")
+)
+
+(define-method set_absolute_size
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_absolute_size")
+  (return-type "none")
+  (parameters
+    '("double" "size")
+  )
+)
+
+(define-method get_size_is_absolute
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_size_is_absolute")
+  (return-type "gboolean")
+)
+
+(define-method set_gravity
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_set_gravity")
+  (return-type "none")
+  (parameters
+    '("PangoGravity" "gravity")
+  )
+)
+
+(define-method get_gravity
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_gravity")
+  (return-type "PangoGravity")
+)
+
+(define-method get_set_fields
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_get_set_fields")
+  (return-type "PangoFontMask")
+)
+
+(define-method unset_fields
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_unset_fields")
+  (return-type "none")
+  (parameters
+    '("PangoFontMask" "to_unset")
+  )
+)
+
+(define-method merge
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_merge")
+  (return-type "none")
+  (parameters
+    '("const-PangoFontDescription*" "desc_to_merge")
+    '("gboolean" "replace_existing")
+  )
+)
+
+(define-method merge_static
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_merge_static")
+  (return-type "none")
+  (parameters
+    '("const-PangoFontDescription*" "desc_to_merge")
+    '("gboolean" "replace_existing")
+  )
+)
+
+(define-method better_match
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_better_match")
+  (return-type "gboolean")
+  (parameters
+    '("const-PangoFontDescription*" "old_match" (default "NULL") (null-ok))
+    '("const-PangoFontDescription*" "new_match")
+  )
+)
+
+(define-function font_description_new_from_string
+  (is-constructor-of "PangoFontDescription")
+  (c-name "pango_font_description_from_string")
+  (caller-owns-return #t)
+  (return-type "PangoFontDescription*")
+  (parameters
+    '("const-char*" "str")
+  )
+)
+
+(define-method to_string
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_to_string")
+  (caller-owns-return #t)
+  (return-type "char*")
+)
+
+(define-method to_filename
+  (of-object "PangoFontDescription")
+  (c-name "pango_font_description_to_filename")
+  (caller-owns-return #t)
+  (return-type "char*")
+)
+
diff --git a/src/defs/PangoFontFace.defs b/src/defs/PangoFontFace.defs
new file mode 100644
index 0000000..47fbd5d
--- /dev/null
+++ b/src/defs/PangoFontFace.defs
@@ -0,0 +1,48 @@
+(define-object FontFace
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoFontFace")
+  (gtype-id "PANGO_TYPE_FONT_FACE")
+)
+
+(define-method describe
+  (of-object "PangoFontFace")
+  (c-name "pango_font_face_describe")
+  (return-type "PangoFontDescription*")
+)
+
+(define-method get_face_name
+  (of-object "PangoFontFace")
+  (c-name "pango_font_face_get_face_name")
+  (return-type "const-char*")
+)
+
+(define-method list_sizes
+  (of-object "PangoFontFace")
+  (c-name "pango_font_face_list_sizes")
+  (return-type "none")
+  (parameters
+    '("int**" "sizes")
+    '("int*" "n_sizes")
+  )
+)
+
+(define-virtual get_face_name
+  (of-object "PangoFontFace")
+  (return-type "const-char*")
+)
+
+(define-virtual describe
+  (of-object "PangoFontFace")
+  (return-type "PangoFontDescription*")
+)
+
+(define-virtual list_sizes
+  (of-object "PangoFontFace")
+  (return-type "none")
+  (parameters
+    '("int**" "sizes")
+    '("int*" "n_sizes")
+  )
+)
+
diff --git a/src/defs/PangoFontFamily.defs b/src/defs/PangoFontFamily.defs
new file mode 100644
index 0000000..0510f3e
--- /dev/null
+++ b/src/defs/PangoFontFamily.defs
@@ -0,0 +1,48 @@
+(define-object FontFamily
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoFontFamily")
+  (gtype-id "PANGO_TYPE_FONT_FAMILY")
+)
+
+(define-method list_faces
+  (of-object "PangoFontFamily")
+  (c-name "pango_font_family_list_faces")
+  (return-type "none")
+  (parameters
+    '("PangoFontFace***" "faces")
+    '("int*" "n_faces")
+  )
+)
+
+(define-method get_name
+  (of-object "PangoFontFamily")
+  (c-name "pango_font_family_get_name")
+  (return-type "const-char*")
+)
+
+(define-method is_monospace
+  (of-object "PangoFontFamily")
+  (c-name "pango_font_family_is_monospace")
+  (return-type "gboolean")
+)
+
+(define-virtual list_faces
+  (of-object "PangoFontFamily")
+  (return-type "none")
+  (parameters
+    '("PangoFontFace***" "faces")
+    '("int*" "n_faces")
+  )
+)
+
+(define-virtual get_name
+  (of-object "PangoFontFamily")
+  (return-type "const-char*")
+)
+
+(define-virtual is_monospace
+  (of-object "PangoFontFamily")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/PangoFontMap.defs b/src/defs/PangoFontMap.defs
new file mode 100644
index 0000000..476d58d
--- /dev/null
+++ b/src/defs/PangoFontMap.defs
@@ -0,0 +1,72 @@
+(define-object FontMap
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoFontMap")
+  (gtype-id "PANGO_TYPE_FONT_MAP")
+)
+
+(define-method load_font
+  (of-object "PangoFontMap")
+  (c-name "pango_font_map_load_font")
+  (return-type "PangoFont*")
+  (parameters
+    '("PangoContext*" "context")
+    '("const-PangoFontDescription*" "desc")
+  )
+)
+
+(define-method load_fontset
+  (of-object "PangoFontMap")
+  (c-name "pango_font_map_load_fontset")
+  (return-type "PangoFontset*")
+  (parameters
+    '("PangoContext*" "context")
+    '("const-PangoFontDescription*" "desc")
+    '("PangoLanguage*" "language")
+  )
+)
+
+(define-method list_families
+  (of-object "PangoFontMap")
+  (c-name "pango_font_map_list_families")
+  (return-type "none")
+  (parameters
+    '("PangoFontFamily***" "families")
+    '("int*" "n_families")
+  )
+)
+
+;;(define-method get_shape_engine_type
+;;  (of-object "PangoFontMap")
+;;  (c-name "pango_font_map_get_shape_engine_type")
+;;  (return-type "const-char*")
+;;)
+
+(define-virtual load_font
+  (of-object "PangoFontMap")
+  (return-type "PangoFont*")
+  (parameters
+    '("PangoContext*" "context")
+    '("const-PangoFontDescription*" "desc")
+  )
+)
+
+(define-virtual list_families
+  (of-object "PangoFontMap")
+  (return-type "none")
+  (parameters
+    '("PangoFontFamily***" "families")
+    '("int*" "n_families")
+  )
+)
+
+(define-virtual load_fontset
+  (of-object "PangoFontMap")
+  (return-type "PangoFontset*")
+  (parameters
+    '("PangoContext*" "context")
+    '("const-PangoFontDescription*" "desc")
+    '("PangoLanguage*" "language")
+  )
+)
+
diff --git a/src/defs/PangoFontMask.defs b/src/defs/PangoFontMask.defs
new file mode 100644
index 0000000..0de1711
--- /dev/null
+++ b/src/defs/PangoFontMask.defs
@@ -0,0 +1,14 @@
+(define-flags FontMask
+  (in-module "Pango")
+  (c-name "PangoFontMask")
+  (gtype-id "PANGO_TYPE_FONT_MASK")
+  (values
+    '("family" "PANGO_FONT_MASK_FAMILY")
+    '("style" "PANGO_FONT_MASK_STYLE")
+    '("variant" "PANGO_FONT_MASK_VARIANT")
+    '("weight" "PANGO_FONT_MASK_WEIGHT")
+    '("stretch" "PANGO_FONT_MASK_STRETCH")
+    '("size" "PANGO_FONT_MASK_SIZE")
+  )
+)
+
diff --git a/src/defs/PangoFontMetrics.defs b/src/defs/PangoFontMetrics.defs
new file mode 100644
index 0000000..f1b1beb
--- /dev/null
+++ b/src/defs/PangoFontMetrics.defs
@@ -0,0 +1,68 @@
+(define-boxed FontMetrics
+  (in-module "Pango")
+  (c-name "PangoFontMetrics")
+  (gtype-id "PANGO_TYPE_FONT_METRICS")
+  (copy-func "pango_font_metrics_ref")
+  (release-func "pango_font_metrics_unref")
+)
+
+(define-method ref
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_ref")
+  (return-type "PangoFontMetrics*")
+)
+
+(define-method unref
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_unref")
+  (return-type "none")
+)
+
+(define-method get_ascent
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_ascent")
+  (return-type "int")
+)
+
+(define-method get_descent
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_descent")
+  (return-type "int")
+)
+
+(define-method get_approximate_char_width
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_approximate_char_width")
+  (return-type "int")
+)
+
+(define-method get_approximate_digit_width
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_approximate_digit_width")
+  (return-type "int")
+)
+
+(define-method get_underline_position
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_underline_position")
+  (return-type "int")
+)
+
+(define-method get_underline_thickness
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_underline_thickness")
+  (return-type "int")
+)
+
+(define-method get_strikethrough_position
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_strikethrough_position")
+  (return-type "int")
+)
+
+(define-method get_strikethrough_thickness
+  (of-object "PangoFontMetrics")
+  (c-name "pango_font_metrics_get_strikethrough_thickness")
+  (return-type "int")
+)
+
diff --git a/src/defs/PangoFontset.defs b/src/defs/PangoFontset.defs
new file mode 100644
index 0000000..19773bf
--- /dev/null
+++ b/src/defs/PangoFontset.defs
@@ -0,0 +1,59 @@
+(define-object Fontset
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoFontset")
+  (gtype-id "PANGO_TYPE_FONTSET")
+)
+
+(define-method get_font
+  (of-object "PangoFontset")
+  (c-name "pango_fontset_get_font")
+  (return-type "PangoFont*")
+  (parameters
+    '("guint" "wc")
+  )
+)
+
+(define-method get_metrics
+  (of-object "PangoFontset")
+  (c-name "pango_fontset_get_metrics")
+  (return-type "PangoFontMetrics*")
+)
+
+(define-method foreach
+  (of-object "PangoFontset")
+  (c-name "pango_fontset_foreach")
+  (return-type "none")
+  (parameters
+    '("PangoFontsetForeachFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-virtual get_font
+  (of-object "PangoFontset")
+  (return-type "PangoFont*")
+  (parameters
+    '("guint" "wc")
+  )
+)
+
+(define-virtual get_metrics
+  (of-object "PangoFontset")
+  (return-type "PangoFontMetrics*")
+)
+
+(define-virtual get_language
+  (of-object "PangoFontset")
+  (return-type "PangoLanguage*")
+)
+
+(define-virtual foreach
+  (of-object "PangoFontset")
+  (return-type "none")
+  (parameters
+    '("PangoFontsetForeachFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
diff --git a/src/defs/PangoFontsetSimple.defs b/src/defs/PangoFontsetSimple.defs
new file mode 100644
index 0000000..2b3641e
--- /dev/null
+++ b/src/defs/PangoFontsetSimple.defs
@@ -0,0 +1,33 @@
+;;FIXME
+;;(define-object FontsetSimple
+;;  (in-module "Pango")
+;;  (parent "PangoFontset")
+;;  (c-name "PangoFontsetSimple")
+;;  (gtype-id "PANGO_TYPE_FONTSET_SIMPLE")
+;;)
+;;
+;;(define-function pango_fontset_simple_new
+;;  (is-constructor-of "PangoFontsetSimple")
+;;  (c-name "pango_fontset_simple_new")
+;;  (caller-owns-return #t)
+;;  (return-type "PangoFontsetSimple*")
+;;  (parameters
+;;    '("PangoLanguage*" "language")
+;;  )
+;;)
+;;
+;;(define-method append
+;;  (of-object "PangoFontsetSimple")
+;;  (c-name "pango_fontset_simple_append")
+;;  (return-type "none")
+;;  (parameters
+;;    '("PangoFont*" "font")
+;;  )
+;;)
+;;
+;;(define-method size
+;;  (of-object "PangoFontsetSimple")
+;;  (c-name "pango_fontset_simple_size")
+;;  (return-type "int")
+;;)
+
diff --git a/src/defs/PangoGlyphGeometry.defs b/src/defs/PangoGlyphGeometry.defs
new file mode 100644
index 0000000..da01dca
--- /dev/null
+++ b/src/defs/PangoGlyphGeometry.defs
@@ -0,0 +1,5 @@
+(define-boxed GlyphGeometry
+  (in-module "Pango")
+  (c-name "PangoGlyphGeometry")
+)
+
diff --git a/src/defs/PangoGlyphInfo.defs b/src/defs/PangoGlyphInfo.defs
new file mode 100644
index 0000000..22a3a50
--- /dev/null
+++ b/src/defs/PangoGlyphInfo.defs
@@ -0,0 +1,5 @@
+(define-boxed GlyphInfo
+  (in-module "Pango")
+  (c-name "PangoGlyphInfo")
+)
+
diff --git a/src/defs/PangoGlyphItem.defs b/src/defs/PangoGlyphItem.defs
new file mode 100644
index 0000000..967a284
--- /dev/null
+++ b/src/defs/PangoGlyphItem.defs
@@ -0,0 +1,38 @@
+(define-method split
+  (of-object "PangoGlyphItem")
+  (c-name "pango_glyph_item_split")
+  (return-type "PangoGlyphItem*")
+  (parameters
+    '("const-char*" "text")
+    '("int" "split_index")
+  )
+)
+
+(define-method free
+  (of-object "PangoGlyphItem")
+  (c-name "pango_glyph_item_free")
+  (return-type "none")
+)
+
+(define-method apply_attrs
+  (of-object "PangoGlyphItem")
+  (c-name "pango_glyph_item_apply_attrs")
+  (return-type "GSList-PangoGlyphItem*")
+  (caller-owns-return #f)
+  (parameters
+    '("const-char*" "text")
+    '("PangoAttrList*" "list")
+  )
+)
+
+(define-method letter_space
+  (of-object "PangoGlyphItem")
+  (c-name "pango_glyph_item_letter_space")
+  (return-type "none")
+  (parameters
+    '("const-char*" "text")
+    '("PangoLogAttr*" "log_attrs")
+    '("int" "letter_spacing")
+  )
+)
+
diff --git a/src/defs/PangoGlyphString.defs b/src/defs/PangoGlyphString.defs
new file mode 100644
index 0000000..e26381a
--- /dev/null
+++ b/src/defs/PangoGlyphString.defs
@@ -0,0 +1,105 @@
+(define-boxed GlyphString
+  (in-module "Pango")
+  (c-name "PangoGlyphString")
+  (gtype-id "PANGO_TYPE_GLYPH_STRING")
+  (copy-func "pango_glyph_string_copy")
+  (release-func "pango_glyph_string_free")
+  (fields
+    '("gint" "num_glyphs")
+    '("PangoGlyphInfo*" "glyphs")
+    '("gint*" "log_clusters")
+  )
+)
+
+(define-function pango_glyph_string_new
+  (is-constructor-of "PangoGlyphString")
+  (c-name "pango_glyph_string_new")
+  (caller-owns-return #t)
+  (return-type "PangoGlyphString*")
+)
+
+(define-method set_size
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_set_size")
+  (return-type "none")
+  (parameters
+    '("gint" "new_len")
+  )
+)
+
+(define-method copy
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_copy")
+  (return-type "PangoGlyphString*")
+)
+
+(define-method free
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_free")
+  (return-type "none")
+)
+
+(define-method extents
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_extents")
+  (return-type "none")
+  (parameters
+    '("PangoFont*" "font")
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method extents_range
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_extents_range")
+  (return-type "none")
+  (parameters
+    '("int" "start")
+    '("int" "end")
+    '("PangoFont*" "font")
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_logical_widths
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_get_logical_widths")
+  (return-type "none")
+  (parameters
+    '("const-char*" "text")
+    '("int" "length")
+    '("int" "embedding_level")
+    '("int*" "logical_widths")
+  )
+)
+
+(define-method index_to_x
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_index_to_x")
+  (return-type "none")
+  (parameters
+    '("char*" "text")
+    '("int" "length")
+    '("PangoAnalysis*" "analysis")
+    '("int" "index")
+    '("gboolean" "trailing")
+    '("int*" "x_pos")
+  )
+)
+
+(define-method x_to_index
+  (of-object "PangoGlyphString")
+  (c-name "pango_glyph_string_x_to_index")
+  (return-type "none")
+  (parameters
+    '("char*" "text")
+    '("int" "length")
+    '("PangoAnalysis*" "analysis")
+    '("int" "x_pos")
+    '("int*" "index")
+    '("int*" "trailing")
+  )
+)
+
diff --git a/src/defs/PangoGravity.defs b/src/defs/PangoGravity.defs
new file mode 100644
index 0000000..efc78d6
--- /dev/null
+++ b/src/defs/PangoGravity.defs
@@ -0,0 +1,13 @@
+(define-enum Gravity
+  (in-module "Pango")
+  (c-name "PangoGravity")
+  (gtype-id "PANGO_TYPE_GRAVITY")
+  (values
+    '("south" "PANGO_GRAVITY_SOUTH")
+    '("east" "PANGO_GRAVITY_EAST")
+    '("north" "PANGO_GRAVITY_NORTH")
+    '("west" "PANGO_GRAVITY_WEST")
+    '("auto" "PANGO_GRAVITY_AUTO")
+  )
+)
+
diff --git a/src/defs/PangoGravityHint.defs b/src/defs/PangoGravityHint.defs
new file mode 100644
index 0000000..4fbc261
--- /dev/null
+++ b/src/defs/PangoGravityHint.defs
@@ -0,0 +1,11 @@
+(define-enum GravityHint
+  (in-module "Pango")
+  (c-name "PangoGravityHint")
+  (gtype-id "PANGO_TYPE_GRAVITY_HINT")
+  (values
+    '("natural" "PANGO_GRAVITY_HINT_NATURAL")
+    '("strong" "PANGO_GRAVITY_HINT_STRONG")
+    '("line" "PANGO_GRAVITY_HINT_LINE")
+  )
+)
+
diff --git a/src/defs/PangoItem.defs b/src/defs/PangoItem.defs
new file mode 100644
index 0000000..5477c61
--- /dev/null
+++ b/src/defs/PangoItem.defs
@@ -0,0 +1,46 @@
+(define-boxed Item
+  (in-module "Pango")
+  (c-name "PangoItem")
+  (gtype-id "PANGO_TYPE_ITEM")
+  (fields
+    '("gint" "offset")
+    '("gint" "length")
+    '("gint" "num_chars")
+    '("PangoEngineShape*" "analysis.shape_engine")
+    '("PangoEngineLang*" "analysis.lang_engine")
+    '("PangoFont*" "analysis.font")
+    '("guint8" "analysis.level")
+    '("PangoLanguage*" "analysis.language")
+    '("GSList*" "analysis.extra_attrs")
+  )
+)
+
+(define-function item_new
+  (is-constructor-of "PangoItem")
+  (c-name "pango_item_new")
+  (caller-owns-return #t)
+  (return-type "PangoItem*")
+)
+
+(define-method copy
+  (of-object "PangoItem")
+  (c-name "pango_item_copy")
+  (return-type "PangoItem*")
+)
+
+(define-method free
+  (of-object "PangoItem")
+  (c-name "pango_item_free")
+  (return-type "none")
+)
+
+(define-method split
+  (of-object "PangoItem")
+  (c-name "pango_item_split")
+  (return-type "PangoItem*")
+  (parameters
+    '("int" "split_index")
+    '("int" "split_offset")
+  )
+)
+
diff --git a/src/defs/PangoLanguage.defs b/src/defs/PangoLanguage.defs
new file mode 100644
index 0000000..a23a1ab
--- /dev/null
+++ b/src/defs/PangoLanguage.defs
@@ -0,0 +1,40 @@
+(define-boxed Language
+  (in-module "Pango")
+  (c-name "PangoLanguage")
+  (gtype-id "PANGO_TYPE_LANGUAGE")
+)
+
+(define-method includes_script
+  (of-object "PangoLanguage")
+  (c-name "pango_language_includes_script")
+  (return-type "gboolean")
+  (parameters
+    '("PangoScript" "script")
+  )
+)
+
+(define-function pango_language_from_string
+  (is-constructor-of "PangoLanguage")
+  (c-name "pango_language_from_string")
+  (caller-owns-return #t)
+  (return-type "PangoLanguage*")
+  (parameters
+    '("const-char*" "language")
+  )
+)
+
+(define-method matches
+  (of-object "PangoLanguage")
+  (c-name "pango_language_matches")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "range_list")
+  )
+)
+
+(define-method to_string
+  (of-object "PangoLanguage")
+  (c-name "pango_language_to_string")
+  (return-type "const-char*")
+)
+
diff --git a/src/defs/PangoLayout.defs b/src/defs/PangoLayout.defs
new file mode 100644
index 0000000..cb70590
--- /dev/null
+++ b/src/defs/PangoLayout.defs
@@ -0,0 +1,425 @@
+(define-object Layout
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoLayout")
+)
+
+(define-function pango_layout_new
+  (is-constructor-of "PangoLayout")
+  (c-name "pango_layout_new")
+  (caller-owns-return #t)
+  (return-type "PangoLayout*")
+  (parameters
+    '("PangoContext*" "context")
+  )
+)
+
+(define-function pango_layout_new_from_cairo
+  (is-constructor-of "PangoLayout")
+  (c-name "pango_cairo_create_layout")
+  (caller-owns-return #t)
+  (return-type "PangoLayout*")
+  (parameters
+    '("cairo_t*" "context")
+  )
+)
+
+(define-method copy
+  (of-object "PangoLayout")
+  (c-name "pango_layout_copy")
+  (return-type "PangoLayout*")
+)
+
+(define-method get_context
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_context")
+  (return-type "PangoContext*")
+)
+
+(define-method set_attributes
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_attributes")
+  (return-type "none")
+  (parameters
+    '("PangoAttrList*" "attrs" (null-ok))
+  )
+)
+
+(define-method get_attributes
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_attributes")
+  (return-type "PangoAttrList*")
+)
+
+(define-method set_text
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_text")
+  (return-type "none")
+  (parameters
+    '("const-char*" "text")
+    '("int" "length")
+  )
+)
+
+(define-method get_text
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_text")
+  (return-type "const-char*")
+)
+
+(define-method set_markup
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_markup")
+  (return-type "none")
+  (parameters
+    '("const-char*" "markup")
+    '("int" "length")
+  )
+)
+
+(define-method set_markup_with_accel
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_markup_with_accel")
+  (return-type "none")
+  (parameters
+    '("const-char*" "markup")
+    '("int" "length")
+    '("gunichar" "accel_marker")
+    '("gunichar*" "accel_char")
+  )
+)
+
+(define-method set_font_description
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_font_description")
+  (return-type "none")
+  (parameters
+    '("const-PangoFontDescription*" "desc" (null-ok))
+  )
+)
+
+(define-method get_font_description
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_font_description")
+  (return-type "const-PangoFontDescription*")
+)
+
+(define-method set_width
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_width")
+  (return-type "none")
+  (parameters
+    '("int" "width")
+  )
+)
+
+(define-method get_width
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_width")
+  (return-type "int")
+)
+
+(define-method set_wrap
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_wrap")
+  (return-type "none")
+  (parameters
+    '("PangoWrapMode" "wrap")
+  )
+)
+
+(define-method get_wrap
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_wrap")
+  (return-type "PangoWrapMode")
+)
+
+(define-method is_wrapped
+  (of-object "PangoLayout")
+  (c-name "pango_layout_is_wrapped")
+  (return-type "gboolean")
+)
+
+(define-method set_indent
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_indent")
+  (return-type "none")
+  (parameters
+    '("int" "indent")
+  )
+)
+
+(define-method get_indent
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_indent")
+  (return-type "int")
+)
+
+(define-method set_spacing
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_spacing")
+  (return-type "none")
+  (parameters
+    '("int" "spacing")
+  )
+)
+
+(define-method get_spacing
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_spacing")
+  (return-type "int")
+)
+
+(define-method set_justify
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_justify")
+  (return-type "none")
+  (parameters
+    '("gboolean" "justify")
+  )
+)
+
+(define-method get_justify
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_justify")
+  (return-type "gboolean")
+)
+
+(define-method set_auto_dir
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_auto_dir")
+  (return-type "none")
+  (parameters
+    '("gboolean" "auto_dir")
+  )
+)
+
+(define-method get_auto_dir
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_auto_dir")
+  (return-type "gboolean")
+)
+
+(define-method set_alignment
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_alignment")
+  (return-type "none")
+  (parameters
+    '("PangoAlignment" "alignment")
+  )
+)
+
+(define-method get_alignment
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_alignment")
+  (return-type "PangoAlignment")
+)
+
+(define-method set_tabs
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_tabs")
+  (return-type "none")
+  (parameters
+    '("PangoTabArray*" "tabs" (null-ok))
+  )
+)
+
+(define-method get_tabs
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_tabs")
+  (return-type "PangoTabArray*")
+)
+
+(define-method set_single_paragraph_mode
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_single_paragraph_mode")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-method get_single_paragraph_mode
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_single_paragraph_mode")
+  (return-type "gboolean")
+)
+
+(define-method set_ellipsize
+  (of-object "PangoLayout")
+  (c-name "pango_layout_set_ellipsize")
+  (return-type "none")
+  (parameters
+    '("PangoEllipsizeMode" "ellipsize")
+  )
+)
+
+(define-method get_ellipsize
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_ellipsize")
+  (return-type "PangoEllipsizeMode")
+)
+
+(define-method is_ellipsized
+  (of-object "PangoLayout")
+  (c-name "pango_layout_is_ellipsized")
+  (return-type "gboolean")
+)
+
+(define-method get_unknown_glyphs_count
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_unknown_glyphs_count")
+  (return-type "int")
+)
+
+(define-method context_changed
+  (of-object "PangoLayout")
+  (c-name "pango_layout_context_changed")
+  (return-type "none")
+)
+
+(define-method get_log_attrs
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_log_attrs")
+  (return-type "none")
+  (parameters
+    '("PangoLogAttr**" "attrs")
+    '("gint*" "n_attrs")
+  )
+)
+
+(define-method index_to_pos
+  (of-object "PangoLayout")
+  (c-name "pango_layout_index_to_pos")
+  (return-type "none")
+  (parameters
+    '("int" "index")
+    '("PangoRectangle*" "pos")
+  )
+)
+
+(define-method get_cursor_pos
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_cursor_pos")
+  (return-type "none")
+  (parameters
+    '("int" "index")
+    '("PangoRectangle*" "strong_pos")
+    '("PangoRectangle*" "weak_pos")
+  )
+)
+
+(define-method move_cursor_visually
+  (of-object "PangoLayout")
+  (c-name "pango_layout_move_cursor_visually")
+  (return-type "none")
+  (parameters
+    '("gboolean" "strong")
+    '("int" "old_index")
+    '("int" "old_trailing")
+    '("int" "direction")
+    '("int*" "new_index")
+    '("int*" "new_trailing")
+  )
+)
+
+(define-method xy_to_index
+  (of-object "PangoLayout")
+  (c-name "pango_layout_xy_to_index")
+  (return-type "gboolean")
+  (parameters
+    '("int" "x")
+    '("int" "y")
+    '("int*" "index")
+    '("int*" "trailing")
+  )
+)
+
+(define-method get_extents
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect" (null-ok))
+    '("PangoRectangle*" "logical_rect" (null-ok))
+  )
+)
+
+(define-method get_pixel_extents
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_pixel_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect" (null-ok))
+    '("PangoRectangle*" "logical_rect" (null-ok))
+  )
+)
+
+(define-method get_size
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_size")
+  (return-type "none")
+  (parameters
+    '("int*" "width" (null-ok))
+    '("int*" "height" (null-ok))
+  )
+)
+
+(define-method get_pixel_size
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_pixel_size")
+  (return-type "none")
+  (parameters
+    '("int*" "width" (null-ok))
+    '("int*" "height" (null-ok))
+  )
+)
+
+(define-method get_line_count
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_line_count")
+  (return-type "int")
+)
+
+(define-method get_line
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_line")
+  (return-type "PangoLayoutLine*")
+  (parameters
+    '("int" "line")
+  )
+)
+
+(define-method get_line_readonly
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_line_readonly")
+  (return-type "PangoLayoutLine*")
+  (parameters
+    '("int" "line")
+  )
+)
+
+(define-method get_lines
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_lines")
+  (return-type "GSList-PangoLayoutLine*")
+)
+
+(define-method get_lines_readonly
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_lines_readonly")
+  (return-type "GSList-PangoLayoutLine*")
+)
+
+(define-method get_iter
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_iter")
+  (return-type "PangoLayoutIter*")
+)
+
+(define-method get_baseline
+  (of-object "PangoLayout")
+  (c-name "pango_layout_get_baseline")
+  (return-type "int")
+)
+
diff --git a/src/defs/PangoLayoutIter.defs b/src/defs/PangoLayoutIter.defs
new file mode 100644
index 0000000..d0e74b4
--- /dev/null
+++ b/src/defs/PangoLayoutIter.defs
@@ -0,0 +1,138 @@
+(define-boxed LayoutIter
+  (in-module "Pango")
+  (c-name "PangoLayoutIter")
+  (gtype-id "PANGO_TYPE_LAYOUT_ITER")
+  (release-func "pango_layout_iter_free")
+)
+
+(define-method free
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_free")
+  (return-type "none")
+)
+
+(define-method get_index
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_index")
+  (return-type "int")
+)
+
+(define-method get_run
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_run")
+  (return-type "PangoLayoutRun*")
+)
+
+(define-method get_run_readonly
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_run_readonly")
+  (return-type "PangoLayoutRun*")
+)
+
+(define-method get_line
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_line")
+  (return-type "PangoLayoutLine*")
+)
+
+(define-method get_line_readonly
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_line_readonly")
+  (return-type "PangoLayoutLine*")
+)
+
+(define-method at_last_line
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_at_last_line")
+  (return-type "gboolean")
+)
+
+(define-method next_char
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_next_char")
+  (return-type "gboolean")
+)
+
+(define-method next_cluster
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_next_cluster")
+  (return-type "gboolean")
+)
+
+(define-method next_run
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_next_run")
+  (return-type "gboolean")
+)
+
+(define-method next_line
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_next_line")
+  (return-type "gboolean")
+)
+
+(define-method get_char_extents
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_char_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_cluster_extents
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_cluster_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_run_extents
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_run_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_line_extents
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_line_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_line_yrange
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_line_yrange")
+  (return-type "none")
+  (parameters
+    '("int*" "y0")
+    '("int*" "y1")
+  )
+)
+
+(define-method get_layout_extents
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_layout_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-method get_baseline
+  (of-object "PangoLayoutIter")
+  (c-name "pango_layout_iter_get_baseline")
+  (return-type "int")
+)
+
diff --git a/src/defs/PangoLayoutLine.defs b/src/defs/PangoLayoutLine.defs
new file mode 100644
index 0000000..819237c
--- /dev/null
+++ b/src/defs/PangoLayoutLine.defs
@@ -0,0 +1,80 @@
+(define-boxed LayoutLine
+  (in-module "Pango")
+  (c-name "PangoLayoutLine")
+)
+;; manually remove fields; we have to an override to make sense of these
+;;(fields
+;;  '("gint" "start_index")
+;;  '("gint" "length")
+;;  '("guint" "is_paragraph_start")
+;;  '("GSList*" "runs")
+;;  '("guint" "resolved_dir")
+;;)
+
+;; manually hacked to return void avoid creating lookup loops
+(define-method ref
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_ref")
+  (return-type "none")
+)
+
+(define-method unref
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_unref")
+  (return-type "none")
+)
+
+(define-method x_to_index
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_x_to_index")
+  (return-type "gboolean")
+  (parameters
+    '("int" "x_pos")
+    '("int*" "index")
+    '("int*" "trailing")
+  )
+)
+
+(define-method index_to_x
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_index_to_x")
+  (return-type "none")
+  (parameters
+    '("int" "index")
+    '("gboolean" "trailing")
+    '("int*" "x_pos")
+  )
+)
+
+(define-method get_x_ranges
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_get_x_ranges")
+  (return-type "none")
+  (parameters
+    '("int" "start_index")
+    '("int" "end_index")
+    '("int**" "ranges")
+    '("int*" "n_ranges")
+  )
+)
+
+(define-method get_extents
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_get_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect" (null-ok))
+    '("PangoRectangle*" "logical_rect" (null-ok))
+  )
+)
+
+(define-method get_pixel_extents
+  (of-object "PangoLayoutLine")
+  (c-name "pango_layout_line_get_pixel_extents")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect" (null-ok))
+    '("PangoRectangle*" "logical_rect" (null-ok))
+  )
+)
+
diff --git a/src/defs/PangoMatrix.defs b/src/defs/PangoMatrix.defs
new file mode 100644
index 0000000..8daf117
--- /dev/null
+++ b/src/defs/PangoMatrix.defs
@@ -0,0 +1,94 @@
+(define-boxed Matrix
+  (in-module "Pango")
+  (c-name "PangoMatrix")
+  (gtype-id "PANGO_TYPE_MATRIX")
+)
+
+(define-method copy
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_copy")
+  (return-type "PangoMatrix*")
+)
+
+(define-method free
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_free")
+  (return-type "none")
+)
+
+(define-method translate
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_translate")
+  (return-type "none")
+  (parameters
+    '("double" "tx")
+    '("double" "ty")
+  )
+)
+
+(define-method scale
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_scale")
+  (return-type "none")
+  (parameters
+    '("double" "scale_x")
+    '("double" "scale_y")
+  )
+)
+
+(define-method rotate
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_rotate")
+  (return-type "none")
+  (parameters
+    '("double" "degrees")
+  )
+)
+
+(define-method concat
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_concat")
+  (return-type "none")
+  (parameters
+    '("const-PangoMatrix*" "new_matrix")
+  )
+)
+
+(define-method transform_point
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_transform_point")
+  (return-type "none")
+  (parameters
+    '("double*" "x")
+    '("double*" "y")
+  )
+)
+
+(define-method transform_distance
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_transform_distance")
+  (return-type "none")
+  (parameters
+    '("double*" "dx")
+    '("double*" "dy")
+  )
+)
+
+(define-method transform_rectangle
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_transform_rectangle")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "rect")
+  )
+)
+
+(define-method transform_pixel_rectangle
+  (of-object "PangoMatrix")
+  (c-name "pango_matrix_transform_pixel_rectangle")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "rect")
+  )
+)
+
diff --git a/src/defs/PangoRectangle.defs b/src/defs/PangoRectangle.defs
new file mode 100644
index 0000000..dfc97c9
--- /dev/null
+++ b/src/defs/PangoRectangle.defs
@@ -0,0 +1,11 @@
+(define-boxed Rectangle
+  (in-module "Pango")
+  (c-name "PangoRectangle")
+  (fields
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
diff --git a/src/defs/PangoRenderPart.defs b/src/defs/PangoRenderPart.defs
new file mode 100644
index 0000000..b373c68
--- /dev/null
+++ b/src/defs/PangoRenderPart.defs
@@ -0,0 +1,12 @@
+(define-enum RenderPart
+  (in-module "Pango")
+  (c-name "PangoRenderPart")
+  (gtype-id "PANGO_TYPE_RENDER_PART")
+  (values
+    '("foreground" "PANGO_RENDER_PART_FOREGROUND")
+    '("background" "PANGO_RENDER_PART_BACKGROUND")
+    '("underline" "PANGO_RENDER_PART_UNDERLINE")
+    '("strikethrough" "PANGO_RENDER_PART_STRIKETHROUGH")
+  )
+)
+
diff --git a/src/defs/PangoRenderer.defs b/src/defs/PangoRenderer.defs
new file mode 100644
index 0000000..2f2df00
--- /dev/null
+++ b/src/defs/PangoRenderer.defs
@@ -0,0 +1,243 @@
+(define-object Renderer
+  (in-module "Pango")
+  (parent "GObject")
+  (c-name "PangoRenderer")
+  (gtype-id "PANGO_TYPE_RENDERER")
+)
+
+(define-method draw_layout
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_layout")
+  (return-type "none")
+  (parameters
+    '("PangoLayout*" "layout")
+    '("int" "x")
+    '("int" "y")
+  )
+)
+
+(define-method draw_layout_line
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_layout_line")
+  (return-type "none")
+  (parameters
+    '("PangoLayoutLine*" "line")
+    '("int" "x")
+    '("int" "y")
+  )
+)
+
+(define-method draw_glyphs
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_glyphs")
+  (return-type "none")
+  (parameters
+    '("PangoFont*" "font")
+    '("PangoGlyphString*" "glyphs")
+    '("int" "x")
+    '("int" "y")
+  )
+)
+
+(define-method draw_rectangle
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_rectangle")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-method draw_error_underline
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_error_underline")
+  (return-type "none")
+  (parameters
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-method draw_trapezoid
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_trapezoid")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+    '("double" "y1_")
+    '("double" "x11")
+    '("double" "x21")
+    '("double" "y2")
+    '("double" "x12")
+    '("double" "x22")
+  )
+)
+
+(define-method draw_glyph
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_draw_glyph")
+  (return-type "none")
+  (parameters
+    '("PangoFont*" "font")
+    '("PangoGlyph" "glyph")
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-method activate
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_activate")
+  (return-type "none")
+)
+
+(define-method deactivate
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_deactivate")
+  (return-type "none")
+)
+
+(define-method part_changed
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_part_changed")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+  )
+)
+
+(define-method set_color
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_set_color")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+    '("const-PangoColor*" "color")
+  )
+)
+
+(define-method get_color
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_get_color")
+  (return-type "PangoColor*")
+  (parameters
+    '("PangoRenderPart" "part")
+  )
+)
+
+(define-method set_matrix
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_set_matrix")
+  (return-type "none")
+  (parameters
+    '("const-PangoMatrix*" "matrix")
+  )
+)
+
+(define-method get_matrix
+  (of-object "PangoRenderer")
+  (c-name "pango_renderer_get_matrix")
+  (return-type "const-PangoMatrix*")
+)
+
+(define-virtual draw_glyphs
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoFont*" "font")
+    '("PangoGlyphString*" "glyphs")
+    '("int" "x")
+    '("int" "y")
+  )
+)
+
+(define-virtual draw_rectangle
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-virtual draw_error_underline
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-virtual draw_shape
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoAttrShape*" "attr")
+    '("int" "x")
+    '("int" "y")
+  )
+)
+
+(define-virtual draw_trapezoid
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+    '("double" "y1_")
+    '("double" "x11")
+    '("double" "x21")
+    '("double" "y2")
+    '("double" "x12")
+    '("double" "x22")
+  )
+)
+
+(define-virtual draw_glyph
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoFont*" "font")
+    '("PangoGlyph" "glyph")
+    '("double" "x")
+    '("double" "y")
+  )
+)
+
+(define-virtual part_changed
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoRenderPart" "part")
+  )
+)
+
+(define-virtual begin
+  (of-object "PangoRenderer")
+  (return-type "none")
+)
+
+(define-virtual end
+  (of-object "PangoRenderer")
+  (return-type "none")
+)
+
+(define-virtual prepare_run
+  (of-object "PangoRenderer")
+  (return-type "none")
+  (parameters
+    '("PangoLayoutRun*" "run")
+  )
+)
+
diff --git a/src/defs/PangoScript.defs b/src/defs/PangoScript.defs
new file mode 100644
index 0000000..889025a
--- /dev/null
+++ b/src/defs/PangoScript.defs
@@ -0,0 +1,70 @@
+(define-enum Script
+  (in-module "Pango")
+  (c-name "PangoScript")
+  (gtype-id "PANGO_TYPE_SCRIPT")
+  (values
+    '("invalid-code" "PANGO_SCRIPT_INVALID_CODE")
+    '("common" "PANGO_SCRIPT_COMMON")
+    '("inherited" "PANGO_SCRIPT_INHERITED")
+    '("arabic" "PANGO_SCRIPT_ARABIC")
+    '("armenian" "PANGO_SCRIPT_ARMENIAN")
+    '("bengali" "PANGO_SCRIPT_BENGALI")
+    '("bopomofo" "PANGO_SCRIPT_BOPOMOFO")
+    '("cherokee" "PANGO_SCRIPT_CHEROKEE")
+    '("coptic" "PANGO_SCRIPT_COPTIC")
+    '("cyrillic" "PANGO_SCRIPT_CYRILLIC")
+    '("deseret" "PANGO_SCRIPT_DESERET")
+    '("devanagari" "PANGO_SCRIPT_DEVANAGARI")
+    '("ethiopic" "PANGO_SCRIPT_ETHIOPIC")
+    '("georgian" "PANGO_SCRIPT_GEORGIAN")
+    '("gothic" "PANGO_SCRIPT_GOTHIC")
+    '("greek" "PANGO_SCRIPT_GREEK")
+    '("gujarati" "PANGO_SCRIPT_GUJARATI")
+    '("gurmukhi" "PANGO_SCRIPT_GURMUKHI")
+    '("han" "PANGO_SCRIPT_HAN")
+    '("hangul" "PANGO_SCRIPT_HANGUL")
+    '("hebrew" "PANGO_SCRIPT_HEBREW")
+    '("hiragana" "PANGO_SCRIPT_HIRAGANA")
+    '("kannada" "PANGO_SCRIPT_KANNADA")
+    '("katakana" "PANGO_SCRIPT_KATAKANA")
+    '("khmer" "PANGO_SCRIPT_KHMER")
+    '("lao" "PANGO_SCRIPT_LAO")
+    '("latin" "PANGO_SCRIPT_LATIN")
+    '("malayalam" "PANGO_SCRIPT_MALAYALAM")
+    '("mongolian" "PANGO_SCRIPT_MONGOLIAN")
+    '("myanmar" "PANGO_SCRIPT_MYANMAR")
+    '("ogham" "PANGO_SCRIPT_OGHAM")
+    '("old-italic" "PANGO_SCRIPT_OLD_ITALIC")
+    '("oriya" "PANGO_SCRIPT_ORIYA")
+    '("runic" "PANGO_SCRIPT_RUNIC")
+    '("sinhala" "PANGO_SCRIPT_SINHALA")
+    '("syriac" "PANGO_SCRIPT_SYRIAC")
+    '("tamil" "PANGO_SCRIPT_TAMIL")
+    '("telugu" "PANGO_SCRIPT_TELUGU")
+    '("thaana" "PANGO_SCRIPT_THAANA")
+    '("thai" "PANGO_SCRIPT_THAI")
+    '("tibetan" "PANGO_SCRIPT_TIBETAN")
+    '("canadian-aboriginal" "PANGO_SCRIPT_CANADIAN_ABORIGINAL")
+    '("yi" "PANGO_SCRIPT_YI")
+    '("tagalog" "PANGO_SCRIPT_TAGALOG")
+    '("hanunoo" "PANGO_SCRIPT_HANUNOO")
+    '("buhid" "PANGO_SCRIPT_BUHID")
+    '("tagbanwa" "PANGO_SCRIPT_TAGBANWA")
+    '("braille" "PANGO_SCRIPT_BRAILLE")
+    '("cypriot" "PANGO_SCRIPT_CYPRIOT")
+    '("limbu" "PANGO_SCRIPT_LIMBU")
+    '("osmanya" "PANGO_SCRIPT_OSMANYA")
+    '("shavian" "PANGO_SCRIPT_SHAVIAN")
+    '("linear-b" "PANGO_SCRIPT_LINEAR_B")
+    '("tai-le" "PANGO_SCRIPT_TAI_LE")
+    '("ugaritic" "PANGO_SCRIPT_UGARITIC")
+    '("new-tai-lue" "PANGO_SCRIPT_NEW_TAI_LUE")
+    '("buginese" "PANGO_SCRIPT_BUGINESE")
+    '("glagolitic" "PANGO_SCRIPT_GLAGOLITIC")
+    '("tifinagh" "PANGO_SCRIPT_TIFINAGH")
+    '("syloti-nagri" "PANGO_SCRIPT_SYLOTI_NAGRI")
+    '("old-persian" "PANGO_SCRIPT_OLD_PERSIAN")
+    '("kharoshthi" "PANGO_SCRIPT_KHAROSHTHI")
+  )
+)
+
diff --git a/src/defs/PangoScriptIter.defs b/src/defs/PangoScriptIter.defs
new file mode 100644
index 0000000..f6e4b51
--- /dev/null
+++ b/src/defs/PangoScriptIter.defs
@@ -0,0 +1,34 @@
+(define-function script_iter_new
+  (is-constructor-of "PangoScriptIter")
+  (c-name "pango_script_iter_new")
+  (caller-owns-return #t)
+  (return-type "PangoScriptIter*")
+  (parameters
+    '("const-char*" "text")
+    '("int" "length")
+  )
+)
+
+(define-method get_range
+  (of-object "PangoScriptIter")
+  (c-name "pango_script_iter_get_range")
+  (return-type "none")
+  (parameters
+    '("const-char**" "start")
+    '("const-char**" "end")
+    '("PangoScript*" "script")
+  )
+)
+
+(define-method next
+  (of-object "PangoScriptIter")
+  (c-name "pango_script_iter_next")
+  (return-type "gboolean")
+)
+
+(define-method free
+  (of-object "PangoScriptIter")
+  (c-name "pango_script_iter_free")
+  (return-type "none")
+)
+
diff --git a/src/defs/PangoStretch.defs b/src/defs/PangoStretch.defs
new file mode 100644
index 0000000..1774852
--- /dev/null
+++ b/src/defs/PangoStretch.defs
@@ -0,0 +1,17 @@
+(define-enum Stretch
+  (in-module "Pango")
+  (c-name "PangoStretch")
+  (gtype-id "PANGO_TYPE_STRETCH")
+  (values
+    '("ultra-condensed" "PANGO_STRETCH_ULTRA_CONDENSED")
+    '("extra-condensed" "PANGO_STRETCH_EXTRA_CONDENSED")
+    '("condensed" "PANGO_STRETCH_CONDENSED")
+    '("semi-condensed" "PANGO_STRETCH_SEMI_CONDENSED")
+    '("normal" "PANGO_STRETCH_NORMAL")
+    '("semi-expanded" "PANGO_STRETCH_SEMI_EXPANDED")
+    '("expanded" "PANGO_STRETCH_EXPANDED")
+    '("extra-expanded" "PANGO_STRETCH_EXTRA_EXPANDED")
+    '("ultra-expanded" "PANGO_STRETCH_ULTRA_EXPANDED")
+  )
+)
+
diff --git a/src/defs/PangoStyle.defs b/src/defs/PangoStyle.defs
new file mode 100644
index 0000000..39b5e3d
--- /dev/null
+++ b/src/defs/PangoStyle.defs
@@ -0,0 +1,11 @@
+(define-enum Style
+  (in-module "Pango")
+  (c-name "PangoStyle")
+  (gtype-id "PANGO_TYPE_STYLE")
+  (values
+    '("normal" "PANGO_STYLE_NORMAL")
+    '("oblique" "PANGO_STYLE_OBLIQUE")
+    '("italic" "PANGO_STYLE_ITALIC")
+  )
+)
+
diff --git a/src/defs/PangoTabAlign.defs b/src/defs/PangoTabAlign.defs
new file mode 100644
index 0000000..b06c1cf
--- /dev/null
+++ b/src/defs/PangoTabAlign.defs
@@ -0,0 +1,9 @@
+(define-enum TabAlign
+  (in-module "Pango")
+  (c-name "PangoTabAlign")
+  (gtype-id "PANGO_TYPE_TAB_ALIGN")
+  (values
+    '("left" "PANGO_TAB_LEFT")
+  )
+)
+
diff --git a/src/defs/PangoTabArray.defs b/src/defs/PangoTabArray.defs
new file mode 100644
index 0000000..8a839f6
--- /dev/null
+++ b/src/defs/PangoTabArray.defs
@@ -0,0 +1,98 @@
+(define-boxed TabArray
+  (in-module "Pango")
+  (c-name "PangoTabArray")
+  (gtype-id "PANGO_TYPE_TAB_ARRAY")
+  (copy-func "pango_tab_array_copy")
+  (release-func "pango_tab_array_free")
+)
+
+(define-function pango_tab_array_new
+  (is-constructor-of "PangoTabArray")
+  (c-name "pango_tab_array_new")
+  (caller-owns-return #t)
+  (return-type "PangoTabArray*")
+  (parameters
+    '("gint" "initial_size")
+    '("gboolean" "positions_in_pixels")
+  )
+)
+
+(define-function pango_tab_array_new_with_positions
+  (is-constructor-of "PangoTabArray")
+  (c-name "pango_tab_array_new_with_positions")
+  (caller-owns-return #t)
+  (return-type "PangoTabArray*")
+  (parameters
+    '("gint" "size")
+    '("gboolean" "positions_in_pixels")
+    '("PangoTabAlign" "first_alignment")
+    '("gint" "first_position")
+  )
+  (varargs #t)
+)
+
+(define-method copy
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_copy")
+  (return-type "PangoTabArray*")
+)
+
+(define-method free
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_free")
+  (return-type "none")
+)
+
+(define-method get_size
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_get_size")
+  (return-type "gint")
+)
+
+(define-method resize
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_resize")
+  (return-type "none")
+  (parameters
+    '("gint" "new_size")
+  )
+)
+
+(define-method set_tab
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_set_tab")
+  (return-type "none")
+  (parameters
+    '("gint" "tab_index")
+    '("PangoTabAlign" "alignment")
+    '("gint" "location")
+  )
+)
+
+(define-method get_tab
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_get_tab")
+  (return-type "none")
+  (parameters
+    '("gint" "tab_index")
+    '("PangoTabAlign*" "alignment")
+    '("gint*" "location")
+  )
+)
+
+(define-method get_tabs
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_get_tabs")
+  (return-type "none")
+  (parameters
+    '("PangoTabAlign**" "alignments")
+    '("gint**" "locations")
+  )
+)
+
+(define-method get_positions_in_pixels
+  (of-object "PangoTabArray")
+  (c-name "pango_tab_array_get_positions_in_pixels")
+  (return-type "gboolean")
+)
+
diff --git a/src/defs/PangoUnderline.defs b/src/defs/PangoUnderline.defs
new file mode 100644
index 0000000..c172fab
--- /dev/null
+++ b/src/defs/PangoUnderline.defs
@@ -0,0 +1,13 @@
+(define-enum Underline
+  (in-module "Pango")
+  (c-name "PangoUnderline")
+  (gtype-id "PANGO_TYPE_UNDERLINE")
+  (values
+    '("none" "PANGO_UNDERLINE_NONE")
+    '("single" "PANGO_UNDERLINE_SINGLE")
+    '("double" "PANGO_UNDERLINE_DOUBLE")
+    '("low" "PANGO_UNDERLINE_LOW")
+    '("error" "PANGO_UNDERLINE_ERROR")
+  )
+)
+
diff --git a/src/defs/PangoVariant.defs b/src/defs/PangoVariant.defs
new file mode 100644
index 0000000..064b0a0
--- /dev/null
+++ b/src/defs/PangoVariant.defs
@@ -0,0 +1,10 @@
+(define-enum Variant
+  (in-module "Pango")
+  (c-name "PangoVariant")
+  (gtype-id "PANGO_TYPE_VARIANT")
+  (values
+    '("normal" "PANGO_VARIANT_NORMAL")
+    '("small-caps" "PANGO_VARIANT_SMALL_CAPS")
+  )
+)
+
diff --git a/src/defs/PangoWeight.defs b/src/defs/PangoWeight.defs
new file mode 100644
index 0000000..a2457e9
--- /dev/null
+++ b/src/defs/PangoWeight.defs
@@ -0,0 +1,18 @@
+;; This is actually an enum, but has non-ordinal values. So, declare it as a
+;; Flag so our generated code will get to the real values.
+
+(define-flags Weight
+  (in-module "Pango")
+  (c-name "PangoWeight")
+  (gtype-id "PANGO_TYPE_WEIGHT")
+  (values
+    '("ultralight" "PANGO_WEIGHT_ULTRALIGHT")
+    '("light" "PANGO_WEIGHT_LIGHT")
+    '("normal" "PANGO_WEIGHT_NORMAL")
+    '("semibold" "PANGO_WEIGHT_SEMIBOLD")
+    '("bold" "PANGO_WEIGHT_BOLD")
+    '("ultrabold" "PANGO_WEIGHT_ULTRABOLD")
+    '("heavy" "PANGO_WEIGHT_HEAVY")
+  )
+)
+
diff --git a/src/defs/PangoWrapMode.defs b/src/defs/PangoWrapMode.defs
new file mode 100644
index 0000000..ac57bef
--- /dev/null
+++ b/src/defs/PangoWrapMode.defs
@@ -0,0 +1,11 @@
+(define-enum WrapMode
+  (in-module "Pango")
+  (c-name "PangoWrapMode")
+  (gtype-id "PANGO_TYPE_WRAP_MODE")
+  (values
+    '("word" "PANGO_WRAP_WORD")
+    '("char" "PANGO_WRAP_CHAR")
+    '("word-char" "PANGO_WRAP_WORD_CHAR")
+  )
+)
+
diff --git a/src/defs/RsvgDimensionData.defs b/src/defs/RsvgDimensionData.defs
new file mode 100644
index 0000000..8cbfbe4
--- /dev/null
+++ b/src/defs/RsvgDimensionData.defs
@@ -0,0 +1,12 @@
+(define-boxed DimensionData
+  (in-module "Rsvg")
+  (c-name "RsvgDimensionData")
+  (import-header "librsvg/rsvg.h")
+  (fields
+    '("int" "width")
+    '("int" "height")
+    '("gdouble" "em")
+    '("gdouble" "ex")
+  )
+)
+
diff --git a/src/defs/RsvgHandle.defs b/src/defs/RsvgHandle.defs
new file mode 100644
index 0000000..727c26c
--- /dev/null
+++ b/src/defs/RsvgHandle.defs
@@ -0,0 +1,134 @@
+(define-object Handle
+  (in-module "Rsvg")
+  (parent "GObject")
+  (c-name "RsvgHandle")
+  (import-header "librsvg/rsvg.h")
+  (import-header "librsvg/rsvg-cairo.h")
+)
+
+(define-method set_dpi
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_set_dpi")
+  (return-type "none")
+  (parameters
+    '("double" "dpi")
+  )
+)
+
+(define-method set_dpi_x_y
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_set_dpi_x_y")
+  (return-type "none")
+  (parameters
+    '("double" "dpi_x")
+    '("double" "dpi_y")
+  )
+)
+
+(define-function rsvg_handle_new
+  (c-name "rsvg_handle_new")
+  (is-constructor-of "RsvgHandle")
+  (caller-owns-return #t)
+  (return-type "RsvgHandle*")
+)
+
+(define-function rsvg_handle_new_from_file
+  (is-constructor-of "RsvgHandle")
+  (c-name "rsvg_handle_new_from_file")
+  (return-type "RsvgHandle*")
+  (caller-owns-return #t)
+  (parameters
+    '("const-gchar*" "file_name")
+    '("GError**" "error")
+  )
+)
+
+(define-function rsvg_handle_new_from_data
+  (is-constructor-of "RsvgHandle")
+  (c-name "rsvg_handle_new_from_data")
+  (return-type "RsvgHandle*")
+  (caller-owns-return #t)
+  (parameters
+    '("const-guint8*" "data")
+    '("gsize" "data_len")
+    '("GError**" "error")
+  )
+)
+
+(define-method get_dimensions
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_get_dimensions")
+  (return-type "none")
+  (parameters
+    '("RsvgDimensionData*" "data")
+  )
+)
+
+(define-method get_dimensions_sub
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_get_dimensions_sub")
+  (return-type "none")
+  (parameters
+    '("RsvgDimensionData*" "data")
+    '("const-char*" "id" (null-ok))
+  )
+)
+
+(define-method write
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_write")
+  (return-type "gboolean")
+  (parameters
+    '("const-guchar*" "buf")
+    '("gsize" "count")
+    '("GError**" "error")
+  )
+)
+
+(define-method close
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_close")
+  (return-type "gboolean")
+  (parameters
+    '("GError**" "error")
+  )
+)
+
+(define-method get_pixbuf
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_get_pixbuf")
+  (return-type "GdkPixbuf*")
+)
+
+(define-method get_pixbuf_sub
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_get_pixbuf_sub")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-char*" "id")
+  )
+)
+
+;; these are called from the Cairo .defs file
+
+(define-method render_cairo
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_render_cairo")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+  )
+  (unnecessary)
+)
+
+(define-method render_cairo_sub
+  (of-object "RsvgHandle")
+  (c-name "rsvg_handle_render_cairo_sub")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("const-char*" "id")
+  )
+  (unnecessary)
+)
+
diff --git a/src/defs/RsvgMain.defs b/src/defs/RsvgMain.defs
new file mode 100644
index 0000000..e8fbe52
--- /dev/null
+++ b/src/defs/RsvgMain.defs
@@ -0,0 +1,33 @@
+;; Custom wrapper for functions in librsvg
+
+(define-boxed Main
+  (in-module "Rsvg")
+  (c-name "RsvgMain")
+  (import-header "librsvg/rsvg.h")
+)
+
+(define-function init
+  (of-object "RsvgMain")
+  (c-name "rsvg_init")
+  (return-type "none")
+)
+
+(define-function set_default_dpi
+  (of-object "RsvgMain")
+  (c-name "rsvg_set_default_dpi")
+  (return-type "none")
+  (parameters
+    '("double" "dpi")
+  )
+)
+
+(define-function set_default_dpi_x_y
+  (of-object "RsvgMain")
+  (c-name "rsvg_set_default_dpi_x_y")
+  (return-type "none")
+  (parameters
+    '("double" "dpi_x")
+    '("double" "dpi_y")
+  )
+)
+
diff --git a/src/defs/ScreenshotCapture.defs b/src/defs/ScreenshotCapture.defs
new file mode 100644
index 0000000..fe401ef
--- /dev/null
+++ b/src/defs/ScreenshotCapture.defs
@@ -0,0 +1,20 @@
+;; This is entirely custom for our wrapper around the internals of
+;; gnome-screenshot as was imported into java-gnome. It's not a Boxed. It's
+;; not anything really. In fact, it's so straight forward that I probably
+;; should have just coded it by hand after all.
+
+(define-boxed Capture
+  (in-module "Screenshot")
+  (c-name "ScreenshotCapture")
+)
+
+(define-function capture
+  (of-object "ScreenshotCapture")
+  (c-name "gnome_screenshot_capture")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("gboolean" "window_only")
+    '("gboolean" "include_border")
+    '("const-gchar*" "border_effect")
+  )
+)
diff --git a/src/generator/BindingsGenerator.java b/src/generator/BindingsGenerator.java
new file mode 100644
index 0000000..21dfa06
--- /dev/null
+++ b/src/generator/BindingsGenerator.java
@@ -0,0 +1,229 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.operationaldynamics.defsparser.Block;
+import com.operationaldynamics.defsparser.DefsLineNumberReader;
+import com.operationaldynamics.defsparser.DefsParser;
+import com.operationaldynamics.driver.DefsFile;
+import com.operationaldynamics.driver.ImproperDefsFileException;
+
+/**
+ * The java-gnome code generator.
+ * 
+ * <p>
+ * The biggest problem architecturally is transforming information from the
+ * form that the upstream .defs data provides to one we can do something
+ * useful with in our context. The code generator, then is essentially two
+ * separate pieces that have nothing to do with each other:
+ * 
+ * <ul>
+ * <li>At the front end is the .defs file parser. DefsParser takes an input
+ * stream of GNOME defs metadata s-expressions and turns it into an array of
+ * Block objects. Blocks are Java objects representing the contents of a given
+ * (define-...) stanza.
+ * 
+ * <li>Completely independent of the parser is the code generator. A hierarchy
+ * of Generator objects exist with the code to output the necessary Java and C
+ * code They have constructors which minutely specify the information they
+ * require (and with variables names that means something to the task of
+ * bindings generation, rather than whatever the origin .defs data might have
+ * called it). The types information describing the underlying library is
+ * stored in a hash table of which uses the underlying type (as found in the
+ * source .defs data) as a key, and a Thing object as the value containing all
+ * the necessary mappings of that type to the actual Java or C language type
+ * used at each layer of the bindings.
+ * </ul>
+ * 
+ * <p>
+ * The link between the two sides are the createThing() and createGenerator()
+ * methods in each Block object; this is where we translate from the
+ * characteristic key names in the .defs data to the names we use in the
+ * generator.
+ * 
+ * <p>
+ * To generate the java-gnome bindings, we therefore do several things:
+ * 
+ * <ol>
+ * <li>setup: demultiplex the massive monolithic stream of .defs information
+ * into one .defs file per type. This has been done externally ahead of time
+ * before the BindingsGenerator runs.
+ * 
+ * <li>register all the type information: We load each .defs file and create
+ * arrays of Blocks. We then stash these Blocks in an a class called DefsFile.
+ * Along the way we call each Block's createThing() and then Thing.register()
+ * to store the the resultant in our lookup table [Obviously this only
+ * concerns (define-...) blocks which declare type information (the TypeBlock
+ * subclasses)].
+ * 
+ * <li>with a full database of type information in hand, we can then do an
+ * iteration over the Block arrays to actually generate the code that goes
+ * with each stanza. We get the appropriate Generator object by calling each
+ * Block's createGenerator() method and then run its writeTranslationCode()
+ * and writeJniCode() methods to finally emit the generated translation layer
+ * (Java) and jni layer (C) code.
+ * </ol>
+ * 
+ * <p>
+ * Since the .defs data has already been demuxed into one .defs file per type,
+ * we use the TypeBlock heading each file to identify it and to name the
+ * appropriate output files. That setup, and the driving the passes over the
+ * list of DefsFiles holding the Block arrays, is the task of this class,
+ * which is the [only] public entry point into the code generator.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+/*
+ * This class's name would seem to imply it is a subclass of Generator, which
+ * of course is not the case. It is, however, a good name to have show up when
+ * building the library via `make`, so "BindingsGenerator" it is. If someone
+ * wants to suggest a better name, go ahead.
+ */
+public class BindingsGenerator
+{
+    public static void main(String[] args) throws IOException {
+        runGeneratorOutputToFiles(new File("src/defs/"), new File("generated/bindings/"));
+    }
+
+    /**
+     * This is building towards the main loop that will drive the .defs file
+     * parser and subsequent runs of the bindings code generators, but it is
+     * still an intermediate form.
+     */
+    private static void runGeneratorOutputToFiles(final File sourceDir, final File outputDir) {
+        Block[] blocks;
+        DefsParser parser;
+        File[] files;
+        DefsLineNumberReader in;
+        DefsFile data;
+        List<DefsFile> all;
+        Iterator<DefsFile> iter;
+        PrintWriter typeMapping;
+
+        files = sourceDir.listFiles(new FilenameFilter() {
+            public boolean accept(File dir, String name) {
+                if (name.endsWith(".defs")) {
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        });
+
+        all = new ArrayList<DefsFile>(files.length);
+
+        /*
+         * Load the all the .defs files into DefsFile objects, one per type.
+         * Along the way, this registers the type information.
+         */
+
+        for (int i = 0; i < files.length; i++) {
+            try {
+                in = new DefsLineNumberReader(new FileReader(files[i]), files[i].getName());
+
+                parser = new DefsParser(in);
+                blocks = parser.parseData();
+
+                data = new DefsFile(blocks);
+                all.add(data);
+
+                in.close();
+            } catch (IOException ioe) {
+                System.out.println("I/O problem when trying to parse " + files[i]);
+                System.out.println(ioe.getMessage());
+                System.out.println("[continuing next file]\n");
+                continue;
+            } catch (ImproperDefsFileException idfe) {
+                System.out.println("Couldn't get sufficient information from " + files[i] + ":");
+                System.out.println(idfe.getMessage());
+                System.out.println("[continuing next file]\n");
+                continue;
+            } finally {
+                System.out.flush();
+            }
+        }
+
+        /*
+         * Now, with the meta data completely loaded, we can generate the
+         * bindings code.
+         */
+        try {
+            typeMapping = new PrintWriter(new BufferedWriter(new FileWriter(
+                    "generated/bindings/typeMapping.properties")));
+        } catch (IOException ie) {
+            System.err.println("Can't open typeMapping file for writing!\n" + ie);
+            return;
+        }
+
+        for (iter = all.iterator(); iter.hasNext();) {
+            String packageAndClassName;
+            File transTarget, jniTarget;
+            PrintWriter trans, jni;
+
+            data = iter.next();
+
+            packageAndClassName = data.getType().fullyQualifiedTranslationClassName().replace('.', '/');
+            transTarget = new File(outputDir, packageAndClassName + ".java");
+            jniTarget = new File(outputDir, packageAndClassName + ".c");
+
+            if (!transTarget.getParentFile().isDirectory()) {
+                transTarget.getParentFile().mkdirs();
+            }
+
+            try {
+                trans = new PrintWriter(new BufferedWriter(new FileWriter(transTarget)));
+                jni = new PrintWriter(new BufferedWriter(new FileWriter(jniTarget)));
+            } catch (IOException ioe) {
+                System.err.println("How come we can't open a file for writing?\n" + ioe);
+                return;
+            }
+
+            try {
+                data.generateTranslationLayer(trans);
+            } catch (UnsupportedOperationException uoe) {
+                // act to remove that file? Or close it off, or...
+            }
+
+            try {
+                data.generateJniLayer(jni);
+            } catch (UnsupportedOperationException uoe) {
+                // act to remove the file in the event there was nothing
+                // printed?
+            }
+
+            typeMapping.println(data.getType().bareTranslationClassName() + "="
+                    + data.getType().fullyQualifiedJavaClassName());
+
+            trans.close();
+            jni.close();
+        }
+        typeMapping.close();
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/AccessorGenerator.java b/src/generator/com/operationaldynamics/codegen/AccessorGenerator.java
new file mode 100644
index 0000000..2a24c0e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/AccessorGenerator.java
@@ -0,0 +1,74 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Abstract characteristics common to getter and setter functions. This is
+ * mostly here to finish the translation between the simplistic two-String
+ * data that drives the two subclasses and the parent
+ * {@link FunctionGenerator} which does all the work.
+ * 
+ * @author Andrew Cowie
+ */
+abstract class AccessorGenerator extends FunctionGenerator
+{
+    AccessorGenerator(DefsFile data, String blockName, String gReturnType, String[][] gParameters) {
+        super(data, blockName, gReturnType, toUnderscores(data.getType().bindingsClass) + "_"
+                + blockName, gParameters, 'f');
+    }
+
+    /**
+     * Utility method to allow us to create a suitable pseudo cFunctionName
+     * matching the rest of the bindings naming conventions in cases where we
+     * have to improvise our own names (like the Boxed getters and setters).
+     * 
+     * @param pascalCaseName
+     *            a string like "GtkTreeIter"
+     * @return "gtk_tree_iter"
+     */
+    /*
+     * It would be ok to move this up to Generator should it come to pass that
+     * anything else needs this.
+     */
+    protected static String toUnderscores(String pascalCaseName) {
+        StringBuffer buf;
+        int i;
+        char ch;
+
+        buf = new StringBuffer(pascalCaseName);
+        i = 0;
+
+        while (i < buf.length()) {
+            ch = buf.charAt(i);
+
+            if (Character.isUpperCase(ch)) {
+                buf.setCharAt(i, Character.toLowerCase(ch));
+                if (i > 0) {
+                    buf.insert(i, '_');
+                    i++;
+                }
+            }
+            i++;
+        }
+
+        return buf.toString();
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ArrayThing.java b/src/generator/com/operationaldynamics/codegen/ArrayThing.java
new file mode 100644
index 0000000..bfad69b
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ArrayThing.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/**
+ * Base class for collections of Things and output parameters, that are
+ * treated in Java as an array.
+ * 
+ * @author Vreixo Formoso
+ */
+public abstract class ArrayThing extends Thing
+{
+    protected Thing type;
+
+    public ArrayThing(String gType, Thing type) {
+        super(gType, null, null, type.javaType + "[]", type.nativeType + "[]", type.jniType + "Array");
+        this.type = type;
+    }
+
+    public ArrayThing(String gType, Thing type, String jniArrayType) {
+        super(gType, null, null, type.javaType + "[]", type.nativeType + "[]", jniArrayType);
+        this.type = type;
+    }
+
+    protected ArrayThing() {}
+
+    String jniReturnErrorValue() {
+        return "NULL";
+    }
+
+    boolean jniConversionCanFail() {
+        return true;
+    }
+
+    public Thing getTypeToImport() {
+        return type.getTypeToImport();
+    }
+
+    boolean jniConversionHandlesNull() {
+        return false;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/BlacklistedThing.java b/src/generator/com/operationaldynamics/codegen/BlacklistedThing.java
new file mode 100644
index 0000000..e5d877a
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/BlacklistedThing.java
@@ -0,0 +1,57 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Types that are blacklisted. This could be hard coded for either code
+ * generator or java-gnome architectural reasons, but in all likelihood it is
+ * because we haven't the faintest idea what this type is yet due to lacking
+ * defs data or lacking Fundamental declarations. Note that this will be
+ * mapped as {@link org.freedesktop.bindings.FIXME} which is about as clear an
+ * indication as you could ask for that it's foobarred.
+ * 
+ * <p>
+ * <i>The example that led to the creation of this Thing category were
+ * function pointers, which we don't have a representation for yet.</i>
+ * 
+ * @author Andrew Cowie
+ */
+public class BlacklistedThing extends Thing
+{
+    public BlacklistedThing(String gType) {
+        super(gType, "org.freedesktop.bindings", "", "FIXME", "java.lang.Object", "");
+        this.blacklisted = true;
+    }
+
+    protected BlacklistedThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return "(FIXME) " + name;
+    }
+
+    String translationToNative(String name) {
+        return name;
+    }
+
+    String jniReturnErrorValue() {
+        return "";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/BoxedGenerator.java b/src/generator/com/operationaldynamics/codegen/BoxedGenerator.java
new file mode 100644
index 0000000..ba5c46e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/BoxedGenerator.java
@@ -0,0 +1,88 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/*
+ * This file originally contained a massive contribution of code to render
+ * getters and setters for fields. That has been refactored to GetterGenerator
+ * and SetterGenerator, but credit is due to Vreixo for having led the way
+ * with the development of this part of the codegen.
+ */
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the file header and include statements necessary to begin the
+ * translation code for a GBoxed. This Generator renders a BoxedBlock into the
+ * compilation unit class declaration, along with necessary file headers and
+ * include statements, care of its parent, {@link TypeGenerator}.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public class BoxedGenerator extends TypeGenerator
+{
+    public BoxedGenerator(DefsFile data) {
+        super(data);
+    }
+
+    protected void publicPackageAndImports(final PrintWriter out) {
+        out.print("package ");
+        out.print(objectType.bindingsPackage);
+        out.print(";\n\n");
+
+        out.print("import org.gnome.glib.Boxed;\n\n");
+    }
+
+    protected void publicClassDeclaration(final PrintWriter out) {
+        out.print("public final class ");
+        out.print(objectType.javaType);
+        out.print(" extends Boxed");
+        out.print("\n{\n");
+
+        out.print("    ");
+        out.print("protected ");
+        out.print(objectType.javaType);
+        out.print("(long pointer) {\n");
+        out.print("        ");
+        out.print("super(pointer);\n");
+        out.print("    ");
+        out.print("}\n");
+
+        out.print("\n");
+        out.print("    ");
+        out.print("protected void release() {\n");
+        out.print("        ");
+        out.print("/*\n");
+        out.print("        ");
+        out.print(" * FIXME This class's release() method must be implemented to call\n");
+        out.print("        ");
+        out.print(" * the correct free() or unref() function before it can be used.\n");
+        out.print("        ");
+        out.print("*/\n");
+        out.print("        ");
+        out.print("throw new UnsupportedOperationException(\"Not yet implemented\");\n");
+        out.print("    ");
+        out.print("}\n");
+
+        out.print("}\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/BoxedThing.java b/src/generator/com/operationaldynamics/codegen/BoxedThing.java
new file mode 100644
index 0000000..a6a1b0f
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/BoxedThing.java
@@ -0,0 +1,38 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * @author Vreixo Formoso
+ */
+public class BoxedThing extends ProxiedThing
+{
+    public BoxedThing(String gType, String bindingsPackage, String bindingsClass, String javaType) {
+        super(gType, bindingsPackage, bindingsClass, javaType);
+    }
+
+    protected BoxedThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return "(" + javaTypeInContext(data) + ") boxedFor(" + javaTypeInContext(data) + ".class, "
+                + name + ")";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ConstantArrayThing.java b/src/generator/com/operationaldynamics/codegen/ConstantArrayThing.java
new file mode 100644
index 0000000..60ed28f
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ConstantArrayThing.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Represent arrays of Constants, Enums or Flags, used as ouput parameters.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ConstantArrayThing extends ArrayThing
+{
+
+    public ConstantArrayThing(String gType, Thing type) {
+        super(gType, type);
+    }
+
+    protected ConstantArrayThing() {}
+
+    /*
+     * FIXME do we need this?
+     */
+    String translationToJava(String name, DefsFile data) {
+        System.out.println("Warning: Not supported return of Constant array.");
+        return "null";
+    }
+
+    String translationToNative(String name) {
+        return "_" + name;
+    }
+
+    String jniConversionDecode(String name) {
+        return "(*env)->GetIntArrayElements(env, _" + name + ", NULL)";
+    }
+
+    String jniConversionCleanup(String name) {
+        return "(*env)->ReleaseIntArrayElements(env, _" + name + ", (jint*)" + name + ", 0)";
+    }
+
+    /*
+     * FIXME do we need this?
+     */
+    String jniReturnEncode(String name) {
+        System.out.println("Warning: Not supported return of Constant array.");
+        return "NULL";
+    }
+
+    String jniReturnErrorValue() {
+        return "NULL";
+    }
+
+    String extraTranslationToJava(String name, DefsFile data) {
+        if (type instanceof FlagsThing) {
+            return "fillFlagArray(" + type.javaTypeInContext(data) + ".class, " + name + ", _" + name
+                    + ")";
+        } else {
+            return "fillEnumArray(" + type.javaTypeInContext(data) + ".class, " + name + ", _" + name
+                    + ")";
+        }
+    }
+
+    String extraTranslationToNative(String name) {
+        return "numsOf(" + name + ")";
+    }
+
+    boolean needExtraTranslation() {
+        return true;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ConstructorGenerator.java b/src/generator/com/operationaldynamics/codegen/ConstructorGenerator.java
new file mode 100644
index 0000000..1597ecc
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ConstructorGenerator.java
@@ -0,0 +1,120 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the code corresponding to a constructor function on a GObject. See
+ * {@link ConstructorBlock} for an example of the source .defs data describing
+ * constructors.
+ * 
+ * <p>
+ * In calling FunctionGenerator.<init>(), we igore the blockName and
+ * returnType; the gFuncitonName is munged per our naming convetion into the
+ * method name, and the return type is long, as it will be used as:
+ * 
+ * <pre>
+ *  public Button(String label) {
+ *      super(GtkButton.createButtonWithLabel(label);
+ *  }
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ */
+public class ConstructorGenerator extends FunctionGenerator
+{
+    private final Thing actualReturnType;
+
+    /**
+     * We send glong as a hard coded retrun type to FunctionGenerator because
+     * from an outside perspective, our translations of constructor functions
+     * return naked pointers (long), not Widgets, because the widget hasn't
+     * been instantiated Java side yet!
+     * 
+     * @param data
+     * @param gReturnType
+     *            the actual return type of the constructor function; will be
+     *            used internally within the JNI code; external return type is
+     *            hard wired to long.
+     * @param gFunctionName
+     * @param gParameters
+     */
+    public ConstructorGenerator(final DefsFile data, final String blockName, final String gReturnType,
+            final String gFunctionName, final String[][] gParameters, char callerOwnsReturn) {
+        super(data, "", "glong", gFunctionName, gParameters, callerOwnsReturn);
+
+        this.translationMethodName = mungeConstructorName(data.getType().gType, blockName);
+        this.actualReturnType = Thing.lookup(gReturnType);
+    }
+
+    /**
+     * Take a string of the form "gtk_button_new_with_label" and transform it
+     * into "create_Button_with_label" [so that a subsequent toCamel() call
+     * will transform it to "createButtonWithLabel"]
+     */
+    static String mungeConstructorName(String gType, String blockName) {
+        StringBuffer buf;
+        int cut;
+
+        buf = new StringBuffer(blockName);
+
+        cut = buf.indexOf("_new");
+        buf.delete(0, cut + 4);
+        buf.insert(0, Thing.lookup(gType).javaType);
+        buf.insert(0, "create_");
+
+        return toCamel(buf.toString());
+    }
+
+    /**
+     * Unlike normal method calls, the return type from G side constructor
+     * functions is long - the pointer address - and we pass it back up
+     * through the translation layer to the <code>super(long pointer)</code>
+     * constructor in the public API subclass of Proxy.
+     * 
+     * <p>
+     * Twiddling with the returnType field used in FunctionGenerator is a
+     * somewhat kludgy way of making sure that the code <i>inside</i> the JNI
+     * function is correct, but allows us to easily alter the super code's
+     * behaviour and gets the job done.
+     */
+    protected void jniFunctionConversionCode(PrintWriter out) {
+        Thing originalReturnType;
+
+        originalReturnType = returnType;
+        returnType = actualReturnType;
+
+        super.jniFunctionConversionCode(out);
+
+        returnType = originalReturnType;
+    }
+
+    protected void jniFunctionReturnCleanUp(PrintWriter out) {
+        Thing originalReturnType;
+
+        originalReturnType = returnType;
+        returnType = actualReturnType;
+        super.jniFunctionReturnCleanUp(out);
+
+        returnType = originalReturnType;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/EntityGenerator.java b/src/generator/com/operationaldynamics/codegen/EntityGenerator.java
new file mode 100644
index 0000000..585a910
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/EntityGenerator.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the file header and include statements necessary to begin the
+ * translation code for a Cairo entity.
+ * 
+ * @author Andrew Cowie
+ */
+public class EntityGenerator extends TypeGenerator
+{
+    public EntityGenerator(DefsFile data) {
+        super(data);
+    }
+
+    protected void publicPackageAndImports(final PrintWriter out) {
+        out.print("package ");
+        out.print(objectType.bindingsPackage);
+        out.print(";\n\n");
+
+        out.print("import org.freedesktop.bindings.Proxy;\n\n");
+    }
+
+    protected void publicClassDeclaration(final PrintWriter out) {
+        out.print("public final class ");
+        out.print(objectType.javaType);
+        out.print(" extends Proxy");
+        out.print("\n{\n");
+
+        out.print("    ");
+        out.print("protected ");
+        out.print(objectType.javaType);
+        out.print("(long pointer) {\n");
+        out.print("        ");
+        out.print("super(pointer);\n");
+        out.print("    ");
+        out.print("}\n");
+
+        out.print("\n");
+        out.print("    ");
+        out.print("protected void release() {\n");
+        out.print("        ");
+        out.print("/*\n");
+        out.print("        ");
+        out.print(" * FIXME This class's release() method must be implemented to call\n");
+        out.print("        ");
+        out.print(" * the correct free() or unref() function before it can be used.\n");
+        out.print("        ");
+        out.print("*/\n");
+        out.print("        ");
+        out.print("throw new UnsupportedOperationException(\"Not yet implemented\");\n");
+        out.print("    ");
+        out.print("}\n");
+
+        out.print("}\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/EntityThing.java b/src/generator/com/operationaldynamics/codegen/EntityThing.java
new file mode 100644
index 0000000..46d6980
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/EntityThing.java
@@ -0,0 +1,41 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Types that are unembelished sublcasses of Proxy. Memory management is done
+ * manually.
+ * 
+ * @author Andrew Cowie
+ */
+public class EntityThing extends ProxiedThing
+{
+    public EntityThing(String gType, String bindingsPackage, String bindingsClass, String javaType) {
+        super(gType, bindingsPackage, bindingsClass, javaType);
+    }
+
+    protected EntityThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return "(" + javaTypeInContext(data) + ") entityFor(" + javaTypeInContext(data) + ".class,  "
+                + name + ")";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/EnumGenerator.java b/src/generator/com/operationaldynamics/codegen/EnumGenerator.java
new file mode 100644
index 0000000..62784bf
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/EnumGenerator.java
@@ -0,0 +1,117 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the file header necessary to declare the class containing the
+ * constant objects of our representation of C enums via subclasses of
+ * Constant. See {@link EnumBlock} for an example of a (define-enum ...)
+ * stanza.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class EnumGenerator extends TypeGenerator
+{
+    private String[] values;
+
+    /**
+     * 
+     * @param data
+     *            a reference back to the DefsFile from which we will pull the
+     *            gTypeName (as found in the defs files) of the enum that you
+     *            are generating bindings code for.
+     * @param values
+     *            The different values enum could take.
+     */
+    public EnumGenerator(DefsFile data, String[][] values) {
+        super(data);
+
+        this.values = new String[values.length];
+        for (int i = 0; i < values.length; ++i) {
+
+            String value = values[i][0];
+
+            /*
+             * We need to convert values in the form: create-folder to
+             * CREATE_FOLDER, etc.
+             */
+            this.values[i] = toAllCaps(value);
+        }
+    }
+
+    public void writeTranslationCode(final PrintWriter out) {
+        super.writeTranslationCode(out);
+        writeTranslationValues(out);
+    }
+
+    // This is overridden by FlagsGenerator...
+    protected void writeTranslationValues(final PrintWriter out) {
+        for (int i = 0; i < values.length; ++i) {
+
+            out.print("\n");
+            out.print("    ");
+            out.print("static final int ");
+            out.print(values[i]);
+            out.print(" = ");
+            out.print(i);
+            out.print(";\n");
+        }
+    }
+
+    /*
+     * Enums don't need a C file. Thus, this doesn't do anything, thus we
+     * throw something (which gets caught up in the top level
+     * BindingsGenerator driver).
+     */
+    public void writeJniCode(PrintWriter out) {
+        throw new UnsupportedOperationException("No JNI code necessary for enums");
+    }
+
+    protected void publicPackageAndImports(final PrintWriter out) {
+        out.print("package ");
+        out.print(objectType.bindingsPackage);
+        out.print(";\n\n");
+
+        out.print("import org.freedesktop.bindings.Constant;\n\n");
+    }
+
+    protected void publicClassDeclaration(final PrintWriter out) {
+        out.print("public final class ");
+        out.print(objectType.javaType);
+        out.print(" extends Constant");
+        out.print("\n{\n");
+
+        out.print("    ");
+        out.print("private ");
+        out.print(objectType.javaType);
+        out.print("(int ordinal, String nickname) {\n");
+        out.print("        ");
+        out.print("super(ordinal, nickname);\n");
+        out.print("    ");
+        out.print("}\n");
+
+        out.print("}\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/EnumThing.java b/src/generator/com/operationaldynamics/codegen/EnumThing.java
new file mode 100644
index 0000000..90bd471
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/EnumThing.java
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Types corresponding to objects defined in (define-enum ...) blocks. These
+ * map to Constant subclasses in our bindings.
+ * 
+ * @author Andrew Cowie
+ */
+public class EnumThing extends Thing
+{
+    public EnumThing(String gType, String javaPackage, String javaClass, String javaType) {
+        super(gType, javaPackage, javaClass, javaType, "int", "jint");
+    }
+
+    protected EnumThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return "(" + javaTypeInContext(data) + ") enumFor(" + javaTypeInContext(data) + ".class, "
+                + name + ")";
+    }
+
+    String translationToNative(String name) {
+        return "numOf(" + name + ")";
+    }
+
+    String jniReturnErrorValue() {
+        return "0";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/FixmeThing.java b/src/generator/com/operationaldynamics/codegen/FixmeThing.java
new file mode 100644
index 0000000..fcd43bd
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/FixmeThing.java
@@ -0,0 +1,36 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/**
+ * FIXME! Types that are legit but that we simply don't know what to do with
+ * yet, either in the terms of code generator itself or more likely in the
+ * architecture of java-gnome as a whole. <b>These are known cases that WILL
+ * be fixed in due course</b>.
+ * 
+ * @author Andrew Cowie
+ */
+public class FixmeThing extends BlacklistedThing
+{
+    public FixmeThing(String gType) {
+        super(gType);
+    }
+
+    protected FixmeThing() {}
+}
diff --git a/src/generator/com/operationaldynamics/codegen/FlagsGenerator.java b/src/generator/com/operationaldynamics/codegen/FlagsGenerator.java
new file mode 100644
index 0000000..0bfb357
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/FlagsGenerator.java
@@ -0,0 +1,115 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.defsparser.FlagsBlock;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the file header necessary to declare the class containing the
+ * constant objects of our representation of C enums via subclasses of
+ * Constant. See {@link FlagsBlock} for an example of a (define-flags ...)
+ * stanza.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public class FlagsGenerator extends EnumGenerator
+{
+    private String[][] values;
+
+    /**
+     * 
+     * @param data
+     *            a reference back to the DefsFile from which we will pull the
+     *            gTypeName (as found in the defs files) of the enum that you
+     *            are generating bindings code for.
+     * @param values
+     *            The different values enum could take.
+     */
+    public FlagsGenerator(DefsFile data, String[][] values) {
+        super(data, values);
+
+        this.values = new String[values.length][2];
+        for (int i = 0; i < values.length; ++i) {
+            this.values[i][0] = values[i][0].replace('-', '_');
+            this.values[i][1] = values[i][1];
+        }
+    }
+
+    protected void writeTranslationValues(PrintWriter out) {
+        for (int i = 0; i < values.length; ++i) {
+
+            /*
+             * Write the static field
+             */
+
+            out.print("\n");
+            out.print("    ");
+            out.print("static final int ");
+            out.print(toAllCaps(values[i][0]));
+            out.print(" = get_ordinal_");
+            out.print(values[i][0]);
+            out.print("();\n");
+
+            /*
+             * And now the native method declaration
+             */
+
+            out.print("\n");
+            out.print("    ");
+            out.print("private static native final int get_ordinal_");
+            out.print(values[i][0]);
+            out.print("();\n");
+        }
+    }
+
+    public void writeJniCode(PrintWriter out) {
+        /*
+         * write file header and includes care of the code up in abstract
+         * parent class TypeGenerator
+         */
+        commonFileHeader(out, objectType.bindingsClass + ".c");
+        hashIncludeStatements(out);
+
+        /*
+         * and now the methods for get the values
+         */
+
+        for (int i = 0; i < values.length; ++i) {
+
+            out.print("\n");
+            out.print("JNIEXPORT jint JNICALL\n");
+
+            out.print("Java_");
+            out.print(encodeJavaClassName(objectType.bindingsPackage, objectType.bindingsClass));
+            out.print("_get_1ordinal_1");
+            out.print(encodeJavaMethodName(values[i][0]));
+            out.print("\n(\n\tJNIEnv* env,\n\tjclass cls\n)\n");
+            out.print("{\n");
+            out.print("\treturn (jint) ");
+            out.print(values[i][1]);
+            out.print(";\n");
+            out.print("}\n");
+        }
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/FlagsThing.java b/src/generator/com/operationaldynamics/codegen/FlagsThing.java
new file mode 100644
index 0000000..7d942e6
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/FlagsThing.java
@@ -0,0 +1,41 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Types corresponding to objects defined in (define-flags ...) blocks. These
+ * map to Flag subclasses in our bindings.
+ * 
+ * @author Vreixo Formoso
+ */
+public class FlagsThing extends EnumThing
+{
+    public FlagsThing(String gType, String javaPackage, String javaClass, String javaType) {
+        super(gType, javaPackage, javaClass, javaType);
+    }
+
+    protected FlagsThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return "(" + javaTypeInContext(data) + ") flagFor(" + javaTypeInContext(data) + ".class, "
+                + name + ")";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/FunctionGenerator.java b/src/generator/com/operationaldynamics/codegen/FunctionGenerator.java
new file mode 100644
index 0000000..092ae2a
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/FunctionGenerator.java
@@ -0,0 +1,702 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007-2008 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Generate Java and C code for constructors, methods and other kind of
+ * functions.
+ * <p>
+ * Subclasses can override the individual steps of the generation sequence if
+ * they wish, however adjusting input passing up to this classes's constructor
+ * has been thus far been enough for constructors blocks and methods blocks.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class FunctionGenerator extends Generator
+{
+    /**
+     * The Thing describing the object we are generating code relative to.
+     */
+    protected final Thing proxyType;
+
+    /**
+     * The name of the method that is exposed package visible to bindings
+     * hackers. Expected to be overridden by subclasses such as
+     * ConstuctorGenerator.
+     */
+    protected String translationMethodName;
+
+    /**
+     * Not final so that we can play with the return type variable in the JNI
+     * conversion code section.
+     */
+    protected Thing returnType;
+
+    protected final String nativeMethodName;
+
+    /**
+     * These are ordered collections so that sublcasses like MethodGenerator
+     * can insert the reference-to-self as a first argument.
+     */
+    protected final Thing[] parameterTypes;
+
+    protected final String[] parameterNames;
+
+    /**
+     * This is filled with true if the parameter can be null (indicated with a
+     * null-ok in .defs).
+     */
+    protected final boolean[] parameterNullOk;
+
+    /**
+     * If a blacklistedType type is detected in this block, set it here.
+     */
+    private Thing blacklistedType;
+
+    private final boolean addSentinal;
+
+    /**
+     * Whether the caller owns the return value. It is either 'f' (caller
+     * doesn't own return), 't' (caller own return) or 'l' (return type is a
+     * list/array... and only the list itself is own, not its contents)
+     */
+    private final char callerOwnsReturn;
+
+    /**
+     * @param data
+     *            the information about the class to which the block we are
+     *            generating code for pertains.
+     * @param blockName
+     *            however the .defs data named this block. Usually it's a
+     *            "short" name such as "set_label". Will be transformed into
+     *            the translation method name.
+     * @param gReturnType
+     *            the return type, as specified in the .defs data
+     * @param cFunctionName
+     *            the C function name, as specified in the .defs data. This
+     *            will be used to name the native method.
+     * @param gParameters
+     *            an array of String[2] arrays, listing the type and name of
+     *            each parameter.
+     * @param callerOwnsReturn
+     *            whether the caller owns the returned value.
+     */
+    public FunctionGenerator(final DefsFile data, final String blockName, final String gReturnType,
+            final String cFunctionName, final String[][] gParameters, char callerOwnsReturn) {
+        super(data);
+        final int len;
+
+        this.proxyType = data.getType();
+
+        this.translationMethodName = toCamel(blockName);
+
+        this.returnType = Thing.lookup(gReturnType);
+
+        this.nativeMethodName = cFunctionName;
+
+        this.callerOwnsReturn = callerOwnsReturn;
+
+        /*
+         * If ... is passed through as the last parameter, it means that we
+         * have a varargs and will need to a) add a NULL sentinel to the arg
+         * list, and b) chop this pseudo-parameter off the end of the array.
+         * This is a bit ugly, but the alternative was adding a boolean to
+         * every Generator constructor. This is better: varargs is a parameter
+         * type, and one we may someday choose to deal with.
+         */
+
+        if ((gParameters.length > 0) && ("...".equals(gParameters[gParameters.length - 1][0]))) {
+            this.addSentinal = true;
+            len = gParameters.length - 1;
+        } else {
+            this.addSentinal = false;
+            len = gParameters.length;
+        }
+
+        parameterTypes = new Thing[len];
+        parameterNames = new String[len];
+        parameterNullOk = new boolean[len];
+
+        for (int i = 0; i < len; i++) {
+            parameterTypes[i] = Thing.lookup(gParameters[i][0]);
+            parameterNames[i] = toCamel(gParameters[i][1]);
+            parameterNullOk[i] = "yes".equals(gParameters[i][2]);
+        }
+
+        blacklistedType = null;
+    }
+
+    protected void translationMethodDeclaration(PrintWriter out) {
+        boolean hasGError = false;
+
+        out.print("\n");
+
+        if (blockContainsBlacklistedThings()) {
+            out.print("    ");
+            out.print("@SuppressWarnings(\"unused\")\n");
+        }
+
+        out.print("    ");
+        out.print("static final ");
+        out.print(returnType.javaTypeInContext(data));
+        out.print(" ");
+        out.print(translationMethodName);
+
+        out.print("(");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                hasGError = true;
+                continue;
+            }
+
+            if (i > 0) {
+                out.print(", ");
+            }
+
+            out.print(parameterTypes[i].javaTypeInContext(data));
+            out.print(" ");
+            out.print(parameterNames[i]);
+        }
+
+        out.print(")");
+
+        if (hasGError && !blockContainsBlacklistedThings()) {
+            out.print(" throws GlibException");
+        }
+
+    }
+
+    protected void translationMethodThrowBlacklisted(PrintWriter out) {
+        out.print(" throws BlacklistedMethodError {\n");
+
+        out.print("        ");
+        out.print("throw new BlacklistedMethodError(\"");
+        out.print(blacklistedType.gType);
+        out.print("\");\n");
+
+        out.print("    ");
+        out.print("}\n");
+    }
+
+    protected void translationMethodConversionCode(PrintWriter out) {
+        int declarations = 0;
+
+        out.print(" {\n");
+
+        /*
+         * Declare translation variables as necessary
+         */
+
+        if (!returnType.javaType.equals("void")) {
+            out.print("        ");
+            out.print(returnType.nativeType);
+            out.print(" result;\n");
+            declarations++;
+        }
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            if (parameterTypes[i].needExtraTranslation()) {
+                out.print("        ");
+                out.print(parameterTypes[i].nativeType);
+                out.print(" _" + parameterNames[i] + ";\n");
+                declarations++;
+            }
+        }
+
+        if (declarations > 0) {
+            out.print("\n");
+        }
+
+        /*
+         * Guard against null in parameters that can't be null
+         */
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            if (!parameterNullOk[i] && !(parameterTypes[i] instanceof FundamentalThing)) {
+                out.print("        if (" + parameterNames[i] + " == null) {\n");
+                out.print("            throw new IllegalArgumentException(\"" + parameterNames[i]
+                        + " can't be null\");\n");
+                out.print("        }\n\n");
+            }
+        }
+
+        /*
+         * convert (translate) variables from public Java to JNI boundary
+         * crossing (ie, out-parameters)
+         */
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            if (parameterTypes[i].needExtraTranslation()) {
+                out.print("        ");
+                out.print("_" + parameterNames[i] + " = ");
+                out.print(parameterTypes[i].extraTranslationToNative(parameterNames[i]));
+                out.print(";\n\n");
+            }
+        }
+
+        /*
+         * And now enter the GDK lock prior to making the native calls. FUTURE
+         * this might have to be conditional if we ever have an environment
+         * where there is strictly zero possibility of a library depending on
+         * GTK. At the moment we're not allowing that as a strict KISS
+         * measure, and besides, most of the GNOME libraries need to be thread
+         * safe via the global GDK lock regardless.
+         */
+
+        out.print("        ");
+        out.print("synchronized (lock) {\n");
+    }
+
+    protected void translationMethodNativeCall(PrintWriter out) {
+        out.print("            ");
+        if (!returnType.javaType.equals("void")) {
+            out.print("result = ");
+        }
+        out.print(nativeMethodName);
+        out.print("(");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            if (i > 0) {
+                out.print(", ");
+            }
+
+            out.print(parameterTypes[i].translationToNative(parameterNames[i]));
+        }
+
+        out.print(");\n");
+    }
+
+    protected void translationMethodParamConversion(PrintWriter out) {
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            if (parameterTypes[i].needExtraTranslation()) {
+                out.print("            ");
+                out.print(parameterTypes[i].extraTranslationToJava(parameterNames[i], data));
+                out.print(";\n");
+            }
+        }
+    }
+
+    protected void translationMethodReturnCode(PrintWriter out) {
+        if (!returnType.nativeType.equals("void")) {
+            out.print("\n");
+            out.print("            ");
+            out.print("return ");
+            out.print(returnType.translationToJava("result", data));
+            out.print(";\n");
+        }
+        out.print("        }\n");
+        out.print("    }\n");
+    }
+
+    protected void nativeMethodDeclaration(PrintWriter out) {
+        boolean hasGError = false;
+
+        out.print("    ");
+        out.print("private static native final ");
+        out.print(returnType.nativeType);
+        out.print(" ");
+        out.print(nativeMethodName);
+        out.print("(");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                hasGError = true;
+                continue;
+            }
+            if (i > 0) {
+                out.print(", ");
+            }
+
+            out.print(parameterTypes[i].nativeType);
+            out.print(" ");
+            out.print(parameterNames[i]);
+        }
+
+        if (hasGError) {
+            out.print(") throws GlibException;\n");
+        } else {
+            out.print(");\n");
+        }
+    }
+
+    protected void jniFunctionDeclaration(PrintWriter out) {
+        out.print("\n");
+        out.print("JNIEXPORT ");
+        out.print(returnType.jniType);
+        out.print(" JNICALL\n");
+
+        out.print("Java_");
+        out.print(encodeJavaClassName(proxyType.bindingsPackage, proxyType.bindingsClass));
+        out.print("_");
+        out.print(encodeJavaMethodName(nativeMethodName));
+        out.print("\n(\n");
+        out.print("\tJNIEnv* env,\n");
+        out.print("\tjclass cls");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            out.print(",\n\t");
+
+            out.print(parameterTypes[i].jniType);
+            out.print(" _");
+            out.print(parameterNames[i]);
+        }
+
+        out.print("\n)\n{\n");
+    }
+
+    protected void jniFunctionConversionCode(PrintWriter out) {
+        /*
+         * Declare conversion variables as necessary
+         */
+        if (!returnType.javaType.equals("void")) {
+            out.print("\t");
+            out.print(returnType.cType);
+            out.print(" result;\n");
+            out.print("\t");
+            out.print(returnType.jniType);
+            out.print(" _result;\n");
+        }
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            out.print("\t");
+
+            out.print(parameterTypes[i].cType);
+            out.print(" ");
+            out.print(parameterNames[i]);
+            if (parameterTypes[i] instanceof GErrorThing) {
+                out.print(" = NULL");
+            }
+            out.print(";\n");
+        }
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            /*
+             * Comment
+             */
+            out.print("\n\t// convert parameter ");
+            out.print(parameterNames[i]);
+            out.print("\n");
+
+            /*
+             * If a parameter can be null, we need an extra if to avoid the
+             * conversion if it is in fact NULL
+             */
+            if (parameterNullOk[i] && !parameterTypes[i].jniConversionHandlesNull()) {
+                out.print("\tif (_" + parameterNames[i] + " == NULL) {\n");
+                out.print("\t\t" + parameterNames[i] + " = NULL;\n");
+                out.print("\t} else {\n");
+                out.print("\t");
+            }
+
+            /*
+             * variable equals
+             */
+            out.print("\t");
+            out.print(parameterNames[i]);
+
+            /*
+             * always a cast
+             */
+            out.print(" = (");
+            out.print(parameterTypes[i].cType);
+            out.print(") ");
+
+            /*
+             * and now a type specific decode. For many types, the cast is
+             * enough, so it's just the plain name.
+             */
+
+            out.print(parameterTypes[i].jniConversionDecode(parameterNames[i]));
+            out.print(";\n");
+            if (parameterTypes[i].jniConversionCanFail()) {
+                jniReturnIfExceptionThrown(out, i);
+            }
+
+            if (parameterNullOk[i] && !parameterTypes[i].jniConversionHandlesNull()) {
+                /* close the "else" */
+                out.print("\t}\n");
+            }
+        }
+    }
+
+    /**
+     * If a JNI access function hits a problem (ie, OutOfMemoryError) it needs
+     * to exit immediately. A Java Exception is already thown, so we just need
+     * to bail. This is tricky, however, since the return statement must
+     * return something of the return type of the function.
+     * 
+     * @param i
+     *            the index into the parameterNames array (you're calling this
+     *            from inside a for loop iterating over the parameters).
+     */
+    private void jniReturnIfExceptionThrown(PrintWriter out, int i) {
+        String extraTab;
+
+        /*
+         * When the parameter can be null, we need an extra tab because of the
+         * if.
+         */
+        extraTab = parameterNullOk[i] && !parameterTypes[i].jniConversionHandlesNull() ? "\t" : "";
+
+        out.print(extraTab + "\tif (");
+        out.print(parameterNames[i]);
+        out.print(" == NULL) {\n");
+        out.print(extraTab + "\t\treturn");
+
+        if (!("void".equals(returnType.jniType))) {
+            out.print(" ");
+            out.print(returnType.jniReturnErrorValue());
+        }
+
+        out.print("; // Java Exception already thrown\n");
+        out.print(extraTab + "\t}\n");
+    }
+
+    protected void jniFunctionLibraryCall(PrintWriter out) {
+        out.print("\n");
+        out.print("\t// call function\n");
+
+        out.print("\t");
+        if (!returnType.jniType.equals("void")) {
+            out.print("result = ");
+        }
+        out.print(nativeMethodName);
+        out.print("(");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (i > 0) {
+                out.print(", ");
+            }
+
+            if (parameterTypes[i] instanceof GErrorThing) {
+                /*
+                 * We pass the GError address
+                 */
+                out.print("&" + parameterNames[i]);
+            } else {
+                out.print(parameterNames[i]);
+            }
+
+        }
+
+        if (addSentinal) {
+            out.print(", NULL");
+        }
+
+        out.print(");\n");
+    }
+
+    /**
+     * Cleanup and return the result if not a void function.
+     */
+    protected void jniFunctionReturnCode(PrintWriter out) {
+        String cleanup;
+        String paramGError = null;
+
+        /*
+         * type specific cleanup:
+         */
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+
+            if (parameterTypes[i] instanceof GErrorThing) {
+                paramGError = parameterNames[i];
+                continue;
+            }
+
+            out.print("\n");
+            out.print("\t// cleanup parameter ");
+            out.print(parameterNames[i]);
+            out.print("\n");
+
+            cleanup = parameterTypes[i].jniConversionCleanup(parameterNames[i]);
+
+            if (cleanup == null) {
+                continue;
+            }
+
+            /*
+             * clean-up is not needed when the parameter is null
+             */
+            if (parameterNullOk[i] && !parameterTypes[i].jniConversionHandlesNull()) {
+                out.print("\tif (" + parameterNames[i] + " != NULL) {\n");
+                out.print("\t");
+            }
+            out.print("\t");
+            out.print(cleanup);
+            out.print(";\n");
+            if (parameterNullOk[i] && !parameterTypes[i].jniConversionHandlesNull()) {
+                out.print("\t}\n");
+            }
+        }
+
+        /*
+         * When the function takes a GError pointer as an out-parameter, we
+         * need to check if the function has efectivelly thrown an error.
+         * After doing the needed clean-up, we check for that situation and
+         * throw an exception from JNI side.
+         */
+        if (paramGError != null) {
+            out.print("\n");
+            out.print("\t// check for error\n");
+
+            out.print("\tif (" + paramGError + ") {\n");
+
+            out.print("\t\tbindings_java_throwGlibException(env, ");
+            out.print(paramGError);
+            out.print(");\n");
+            out.print("\t\treturn");
+            if (!returnType.jniType.equals("void")) {
+                out.print(" " + returnType.jniReturnErrorValue());
+            }
+            out.print(";\n");
+            out.print("\t}\n");
+        }
+
+        /*
+         * return result if applicable. Specific code for certain types; most
+         * others, just a cast.
+         */
+
+        if (!returnType.jniType.equals("void")) {
+            out.print("\n");
+            out.print("\t// translate return value to JNI type\n");
+            out.print("\t_result = ");
+            out.print("(");
+            out.print(returnType.jniType);
+            out.print(") ");
+            out.print(returnType.jniReturnEncode("result"));
+            out.print(";\n");
+
+            jniFunctionReturnCleanUp(out);
+
+            out.print("\n");
+            out.print("\t// and finally\n");
+            out.print("\treturn _result;\n");
+        }
+        out.print("}\n");
+    }
+
+    protected void jniFunctionReturnCleanUp(PrintWriter out) {
+
+        String cleanup;
+        cleanup = returnType.jniReturnCleanup("result", callerOwnsReturn);
+
+        /*
+         * TODO this assumes all type that need cleanup can be compared with
+         * NULL.
+         */
+        if (cleanup != null) {
+            out.print("\n");
+            out.print("\t// cleanup return value\n");
+            out.print("\tif (result != NULL) {\n");
+            out.print("\t");
+            out.print("\t");
+            out.print(cleanup);
+            out.print(";\n");
+            out.print("\t}\n");
+        }
+    }
+
+    /**
+     * Quickly scan the type information to see if there is a blacklistedType
+     * type present. If so, we use that to output a throws declaration instead
+     * of a real method block. As this gets called twice, we could cache this,
+     * but whatever.
+     */
+    private boolean blockContainsBlacklistedThings() {
+        if (returnType.blacklisted) {
+            blacklistedType = returnType;
+            return true;
+        }
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i].blacklisted) {
+                blacklistedType = parameterTypes[i];
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * See {@link DefsFile#generatePublicLayer(PrintWriter)} for a discussion
+     * of why this is not to be touched. I'm serious. Don't even think about
+     * it.
+     */
+    public final void writePublicCode(final PrintWriter out) {
+        System.err.println("Not paying attention, are we? Abort.");
+        System.exit(2);
+    }
+
+    public void writeTranslationCode(final PrintWriter out) {
+        translationMethodDeclaration(out);
+
+        if (blockContainsBlacklistedThings()) {
+            translationMethodThrowBlacklisted(out);
+            return;
+        }
+
+        translationMethodConversionCode(out);
+        translationMethodNativeCall(out);
+        translationMethodParamConversion(out);
+        translationMethodReturnCode(out);
+
+        out.print("\n");
+
+        nativeMethodDeclaration(out);
+    }
+
+    public void writeJniCode(final PrintWriter out) {
+        if (blockContainsBlacklistedThings()) {
+            return;
+        }
+
+        jniFunctionDeclaration(out);
+        jniFunctionConversionCode(out);
+        jniFunctionLibraryCall(out);
+        jniFunctionReturnCode(out);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/FundamentalArrayThing.java b/src/generator/com/operationaldynamics/codegen/FundamentalArrayThing.java
new file mode 100644
index 0000000..cab29e3
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/FundamentalArrayThing.java
@@ -0,0 +1,104 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Arrays of fundamental types. This is what we use to handle out parameters.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class FundamentalArrayThing extends ArrayThing
+{
+    public FundamentalArrayThing(String gType, String baseType) {
+        super(gType, Thing.lookup(baseType));
+
+        /* needed to prevent cType to be xxx[] */
+        this.cType = baseType + '*';
+    }
+
+    protected FundamentalArrayThing() {}
+
+    String jniConversionDecode(String name) {
+        if (jniType.equals("jfloatArray")) {
+            return "(*env)->GetFloatArrayElements(env, _" + name + ", NULL)";
+        } else if (jniType.equals("jdoubleArray")) {
+            return "(*env)->GetDoubleArrayElements(env, _" + name + ", NULL)";
+        } else if (jniType.equals("jbooleanArray")) {
+            return "(*env)->GetBooleanArrayElements(env, _" + name + ", NULL)";
+        } else if (jniType.equals("jintArray")) {
+            return "(*env)->GetIntArrayElements(env, _" + name + ", NULL)";
+        } else if (jniType.equals("jbyteArray")) {
+            return "(*env)->GetByteArrayElements(env, _" + name + ", NULL)";
+        } else if (jniType.equals("jlongArray")) {
+            return "(*env)->GetLongArrayElements(env, _" + name + ", NULL)";
+        } else {
+            throw new Error(
+                    "Code generator asked to deal with an array case for which we do not have logic. Stop.");
+        }
+    }
+
+    String jniConversionCleanup(String name) {
+        if (jniType.equals("jfloatArray")) {
+            return "(*env)->ReleaseFloatArrayElements(env, _" + name + ", (jfloat*)" + name + ", 0)";
+        } else if (jniType.equals("jdoubleArray")) {
+            return "(*env)->ReleaseDoubleArrayElements(env, _" + name + ", (jdouble*)" + name + ", 0)";
+        } else if (jniType.equals("jbooleanArray")) {
+            return "(*env)->ReleaseBooleanArrayElements(env, _" + name + ", (jboolean*)" + name + ", 0)";
+        } else if (jniType.equals("jintArray")) {
+            return "(*env)->ReleaseIntArrayElements(env, _" + name + ", (jint*)" + name + ", 0)";
+        } else if (jniType.equals("jbyteArray")) {
+            return "(*env)->ReleaseByteArrayElements(env, _" + name + ", (jbyte*)" + name + ", 0)";
+        } else if (jniType.equals("jlongArray")) {
+            return "(*env)->ReleaseLongArrayElements(env, _" + name + ", (jlong*)" + name + ", 0)";
+        } else {
+            throw new Error();
+        }
+    }
+
+    /*
+     * FIXME we would need a way to figure out the size of the native array,
+     * and then create a new java array with NewXXXArray and copy there the
+     * elements. This is a clear candidate for code override, as it seems to
+     * be very hard to manage in an automatic way.
+     */
+    String jniReturnEncode(String name) {
+        System.out.println("Warning: Not supported return of fundamental array.");
+        return "NULL";
+    }
+
+    String jniReturnCleanup(String name, char callerOwnsReturn) {
+        if (callerOwnsReturn != 'f') {
+            return "g_free(" + name + ")";
+        } else {
+            return null;
+        }
+    }
+
+    String translationToJava(String name, DefsFile data) {
+        return name;
+    }
+
+    String translationToNative(String name) {
+        return name;
+    }
+
+}
diff --git a/src/generator/com/operationaldynamics/codegen/FundamentalThing.java b/src/generator/com/operationaldynamics/codegen/FundamentalThing.java
new file mode 100644
index 0000000..3bfa6a0
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/FundamentalThing.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * A Thing that represent a type that is fundamental in both Java and C.
+ * 
+ * <p>
+ * This types are not Objects and can be used in the same way in both Java and
+ * C, passing JNI boundary needs no special conversion.
+ * 
+ * @author Andrew Cowie
+ */
+public class FundamentalThing extends Thing
+{
+    public FundamentalThing(String gType, String javaType, String nativeType, String jniType) {
+        super(gType, null, null, javaType, nativeType, jniType);
+    }
+
+    protected FundamentalThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return name;
+    }
+
+    String translationToNative(String name) {
+        return name;
+    }
+
+    String jniReturnErrorValue() {
+        if ("jboolean".equals(jniType)) {
+            return " JNI_FALSE";
+        } else if ("jint".equals(jniType)) {
+            return " 0";
+        } else if ("jlong".equals(jniType) || "jdouble".equals(jniType)) {
+            return " 0L";
+        } else {
+            return " FIXME";
+        }
+    }
+
+    String extraTranslationToJava(String name, DefsFile data) {
+        return null;
+    }
+
+    boolean needGuardAgainstNull() {
+        return false;
+    }
+
+    String extraTranslationToNative(String name) {
+        return null;
+    }
+
+    public Thing getTypeToImport() {
+        return null;
+    }
+
+    boolean needExtraTranslation() {
+        return false;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/GErrorThing.java b/src/generator/com/operationaldynamics/codegen/GErrorThing.java
new file mode 100644
index 0000000..19cbd8f
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/GErrorThing.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * A Thing that represent a GError.
+ * 
+ * <p>
+ * A GError will never wrapped in java. Instead, we throw an exception from
+ * JNI side.
+ * 
+ * @author Vreixo Formoso
+ */
+public class GErrorThing extends Thing
+{
+    public GErrorThing() {
+        super("GError**", null, null, null, null, null);
+        this.cType = "GError*";
+    }
+
+    String translationToJava(String name, DefsFile data) {
+        throw new Error("This method is undefined for GError");
+    }
+
+    String translationToNative(String name) {
+        throw new Error("This method is undefined for GError");
+    }
+
+    String jniReturnErrorValue() {
+        throw new Error("This method is undefined for GError");
+    }
+
+    boolean needGuardAgainstNull() {
+        throw new Error("This method is undefined for GError");
+    }
+
+    public Thing getTypeToImport() {
+        return Thing.lookup("GlibException");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/GListThing.java b/src/generator/com/operationaldynamics/codegen/GListThing.java
new file mode 100644
index 0000000..89c659b
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/GListThing.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/**
+ * A Thing that represents an array of Java objects. This is the Thing used to
+ * deal with GList and GSList types.
+ * 
+ * @author Vreixo Formoso
+ */
+public class GListThing extends ProxiedArrayThing
+{
+
+    public GListThing(String gType, Thing type) {
+        super(gType.split("-")[0], type);
+        this.cType = this.gType + "*";
+    }
+
+    protected GListThing() {}
+
+    String jniConversionDecode(String name) {
+        if (gType.equals("GList")) {
+            return "bindings_java_convert_jarray_to_glist(env, _" + name + ")";
+        } else if (gType.equals("GSList")) {
+            return "bindings_java_convert_jarray_to_gslist(env, _" + name + ")";
+        } else {
+            throw new Error();
+        }
+    }
+
+    String jniConversionCleanup(String name) {
+
+        // FIXME are there GList's as outparams? if so, a g_list_free is
+        // not enought. We need to copy back the results.
+
+        if (gType.equals("GList")) {
+            return "g_list_free(" + name + ")";
+        } else if (gType.equals("GSList")) {
+            return "g_slist_free(" + name + ")";
+        } else {
+            throw new Error();
+        }
+    }
+
+    String jniReturnEncode(String name) {
+        if (gType.equals("GList")) {
+            return "bindings_java_convert_glist_to_jarray(env, " + name + ")";
+        } else if (gType.equals("GSList")) {
+            return "bindings_java_convert_gslist_to_jarray(env, " + name + ")";
+        } else {
+            throw new Error("Unexpected gtype " + gType);
+        }
+    }
+
+    @Override
+    String jniReturnCleanup(String name, char callerOwnsReturn) {
+        // FIXME we need to manage t in a different way, with deep clean-up
+        if (callerOwnsReturn != 'f') {
+            if (gType.equals("GList")) {
+                return "g_list_free(" + name + ")";
+            } else if (gType.equals("GSList")) {
+                return "g_slist_free(" + name + ")";
+            } else {
+                throw new Error("Unexpected gtype " + gType);
+            }
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/Generator.java b/src/generator/com/operationaldynamics/codegen/Generator.java
new file mode 100644
index 0000000..049460e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/Generator.java
@@ -0,0 +1,149 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Base class of the code generator classes. Also houses numerous utility
+ * functions used to convert from the C names used in the .defs data to Java
+ * style names according to our requirements.
+ * 
+ * <p>
+ * An UnsupportedOperationException will bubbled out of the public writeXXX()
+ * methods if they're not supposed to do anything. You can use that as a
+ * signal not to write a file for that layer.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public abstract class Generator
+{
+    /**
+     * A reference to the parsed defs data that this particular Block's
+     * Generator came from.
+     */
+    protected final DefsFile data;
+
+    protected Generator(final DefsFile data) {
+        this.data = data;
+    }
+
+    public abstract void writePublicCode(PrintWriter out);
+
+    /**
+     * Generate Java code!
+     */
+    public abstract void writeTranslationCode(PrintWriter out);
+
+    /**
+     * Generate C code!
+     */
+    public abstract void writeJniCode(PrintWriter out);
+
+    /**
+     * Turn "org.gnome.glib", "GtkButton" into "org_gnome_glib_GtkButton"
+     */
+    protected static final String encodeJavaClassName(String javaPackageName, String javaClassName) {
+
+        return javaPackageName.replace('.', '_') + "_" + javaClassName;
+    }
+
+    /**
+     * Turn "gtk_button_set_label" into "gtk_1button_1set_1label"
+     */
+    protected static final String encodeJavaMethodName(String javaClassName) {
+        StringBuffer buf;
+        int i;
+
+        buf = new StringBuffer(javaClassName);
+        i = 0;
+
+        while ((i = buf.indexOf("_", i)) != -1) {
+            i++;
+            buf.insert(i, '1');
+        }
+        return buf.toString();
+
+        // TODO this method can be written like this from java 1.5
+        // return javaClassName.replace("_", "_1");
+        // From 1.4 exists a similar function, that uses regular expresions.
+        // This leads to simpler code, but probably more inefficient, so I
+        // prefer current code
+    }
+
+    /**
+     * Convert a short ["python"] name to the camel case used by convention in
+     * the Java world.
+     */
+    protected static final String toCamel(String shortName) {
+        StringBuffer buf;
+        int i;
+        char ch;
+
+        buf = new StringBuffer(shortName);
+        i = 0;
+
+        while ((i = buf.indexOf("_", i)) != -1) {
+            buf.deleteCharAt(i);
+            if (buf.length() > i) {
+                ch = buf.charAt(i);
+                buf.setCharAt(i, Character.toUpperCase(ch));
+            }
+        }
+
+        return buf.toString();
+    }
+
+    public static String toPascalCase(String lowerCaseName) {
+        StringBuffer buf;
+        int i;
+        char ch;
+
+        buf = new StringBuffer(lowerCaseName);
+
+        ch = buf.charAt(0);
+        buf.setCharAt(0, Character.toUpperCase(ch));
+
+        i = 1;
+
+        while ((i = buf.indexOf("_", i)) != -1) {
+            buf.deleteCharAt(i);
+            if (buf.length() > i) {
+                ch = buf.charAt(i);
+                buf.setCharAt(i, Character.toUpperCase(ch));
+            }
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     * We map a number of .defs file entities from lower case with a hyphen to
+     * upper case with an underscore. Notable examples are enums, where we map
+     * from "select-folder" -> "SELECT_FOLDER", and signal names, such as
+     * "delete-event" -> "DELETE_EVENT". This helper function does it for us.
+     */
+    protected static final String toAllCaps(String lowerCaseName) {
+        return lowerCaseName.toUpperCase(Locale.ENGLISH).replace('-', '_');
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/GetterGenerator.java b/src/generator/com/operationaldynamics/codegen/GetterGenerator.java
new file mode 100644
index 0000000..62029f1
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/GetterGenerator.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output a method to get a field from a GBoxed or struct (which are both
+ * represented by (define-boxed ...).
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @see AccessorGenerator
+ */
+public class GetterGenerator extends AccessorGenerator
+{
+    protected final String cField;
+
+    public GetterGenerator(DefsFile data, final String gFieldType, final String gFieldName,
+            final String[][] gParameters) {
+        super(data, "get_" + gFieldName, gFieldType, gParameters);
+
+        this.cField = gFieldName;
+    }
+
+    protected void jniFunctionLibraryCall(PrintWriter out) {
+        out.print("\n");
+        out.print("\t// get field value\n");
+
+        out.print("\tresult = self->");
+        out.print(cField);
+        out.print(";\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/InterfaceGenerator.java b/src/generator/com/operationaldynamics/codegen/InterfaceGenerator.java
new file mode 100644
index 0000000..9fba57b
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/InterfaceGenerator.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+public class InterfaceGenerator extends ObjectGenerator
+{
+    public InterfaceGenerator(final DefsFile data, final String parentGType,
+            final String[] implementedGInterfaces) {
+        super(data, null, implementedGInterfaces);
+
+        if (parentGType == null) {
+            parentType = null;
+        } else {
+            parentType = Thing.lookup(parentGType);
+        }
+    }
+
+    protected void publicClassDeclaration(final PrintWriter out) {
+        out.print("public interface ");
+        out.print(objectType.javaType);
+
+        if (parentType != null) {
+            out.print(" extends ");
+            out.print(parentType.javaType);
+        }
+
+        for (int i = 0; i < implementedTypes.length; i++) {
+            out.print(", ");
+            out.print(implementedTypes[i].javaType);
+        }
+
+        out.print("\n{\n}\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/InterfaceThing.java b/src/generator/com/operationaldynamics/codegen/InterfaceThing.java
new file mode 100644
index 0000000..0885f77
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/InterfaceThing.java
@@ -0,0 +1,37 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+public class InterfaceThing extends ObjectThing
+{
+    public InterfaceThing(String gType, String bindingsPackage, String bindingsClass, String javaType) {
+        super(gType, bindingsPackage, bindingsClass, javaType);
+    }
+
+    protected InterfaceThing() {}
+
+    /*
+     * GInterfaces are modelled as Java interfaces, but since objectFor()
+     * takes Proxy as its type, we need to cast the passed self references
+     * (which are concrete Proxies subclasses, of course)
+     */
+    String translationToNative(String name) {
+        return "pointerOf((Object) " + name + ")";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/MethodGenerator.java b/src/generator/com/operationaldynamics/codegen/MethodGenerator.java
new file mode 100644
index 0000000..140b05f
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/MethodGenerator.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the code corresponding to a GObject method definition. See
+ * {@link MethodBlock} for an example of a (define-method ...) stanza.
+ * 
+ * <p>
+ * Code generated by this class will be used as:
+ * 
+ * <pre>
+ * public setLabel(String label) {
+ *     GtkButton.setLabel(this, label);
+ * }
+ * </pre>
+ * 
+ * in the public API wrapper classes to be written by the bindings hackers.
+ * 
+ * @author Andrew Cowie
+ */
+public class MethodGenerator extends FunctionGenerator
+{
+    /**
+     * @param gObjectType
+     * @param blockName
+     * @param gReturnType
+     * @param gFunctionName
+     * @param gParameters
+     */
+    public MethodGenerator(final DefsFile data, final String blockName, final String gReturnType,
+            final String gFunctionName, final String[][] gParameters, char callerOwnsReturn) {
+        super(data, blockName, gReturnType, gFunctionName, gParameters, callerOwnsReturn);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ObjectGenerator.java b/src/generator/com/operationaldynamics/codegen/ObjectGenerator.java
new file mode 100644
index 0000000..b431a6e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ObjectGenerator.java
@@ -0,0 +1,98 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output the file header and include statements necessary to begin the
+ * translation code for a GObject. This Generator renders an ObjectBlock into
+ * the compilation unit class declaration, along with necessary file headers
+ * and include statements, care of its parent, {@link TypeGenerator}
+ * 
+ * @author Andrew Cowie
+ */
+public class ObjectGenerator extends TypeGenerator
+{
+    protected Thing parentType;
+
+    protected Thing[] implementedTypes;
+
+    public ObjectGenerator(DefsFile data, String parentGType, String[] implementedGInterfaces) {
+        super(data);
+        if (parentGType == null) {
+            parentType = Thing.lookup("GObject*");
+        } else {
+            parentType = Thing.lookup(parentGType);
+        }
+
+        implementedTypes = new Thing[implementedGInterfaces.length];
+        for (int i = 0; i < implementedGInterfaces.length; i++) {
+            implementedTypes[i] = Thing.lookup(implementedGInterfaces[i]);
+        }
+
+    }
+
+    protected void publicPackageAndImports(final PrintWriter out) {
+        out.print("package ");
+        out.print(objectType.bindingsPackage);
+        out.print(";\n\n");
+
+        if ((parentType == null) || (objectType.bindingsPackage.equals(parentType.bindingsPackage))) {
+            return;
+        }
+
+        out.print("import ");
+        out.print(parentType.bindingsPackage);
+        out.print(".");
+        out.print(parentType.javaType);
+        out.print(";\n\n");
+    }
+
+    protected void publicClassDeclaration(final PrintWriter out) {
+        out.print("public class ");
+        out.print(objectType.javaType);
+        out.print(" extends ");
+        out.print(parentType.javaType);
+
+        for (int i = 0; i < implementedTypes.length; i++) {
+            if (i == 0) {
+                out.print(" implements ");
+            } else {
+                out.print(", ");
+            }
+            out.print(implementedTypes[i].javaType);
+        }
+
+        out.print("\n{\n");
+
+        out.print("    ");
+        out.print("protected ");
+        out.print(objectType.javaType);
+        out.print("(long pointer) {\n");
+        out.print("        ");
+        out.print("super(pointer);\n");
+        out.print("    ");
+        out.print("}\n");
+
+        out.print("}\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ObjectThing.java b/src/generator/com/operationaldynamics/codegen/ObjectThing.java
new file mode 100644
index 0000000..b6f0cfc
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ObjectThing.java
@@ -0,0 +1,39 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+public class ObjectThing extends ProxiedThing
+{
+    public ObjectThing(String gType, String bindingsPackage, String bindingsClass, String javaType) {
+        super(gType, bindingsPackage, bindingsClass, javaType);
+    }
+
+    protected ObjectThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        return "(" + javaTypeInContext(data) + ") objectFor(" + name + ")";
+    }
+
+    String jniReturnCleanup(String name, char callerOwnsReturn) {
+        return "bindings_java_memory_cleanup((GObject*)" + name + ", "
+                + (callerOwnsReturn == 't' ? "TRUE" : "FALSE") + ")";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ProxiedArrayThing.java b/src/generator/com/operationaldynamics/codegen/ProxiedArrayThing.java
new file mode 100644
index 0000000..24f5202
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ProxiedArrayThing.java
@@ -0,0 +1,97 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Represent arrays of Proxies, or a Proxy used as an out parameter, that
+ * needs to be wrapped as an array in Java.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ProxiedArrayThing extends ArrayThing
+{
+
+    public ProxiedArrayThing(String gType, Thing type) {
+        super(gType, type);
+    }
+
+    protected ProxiedArrayThing() {}
+
+    String translationToJava(String name, DefsFile data) {
+        String newArray = "new " + type.javaTypeInContext(data) + "[" + name + ".length]";
+        if (type instanceof ObjectThing) {
+            return "(" + javaTypeInContext(data) + ") objectArrayFor(" + name + ", " + newArray + ")";
+        } else {
+            return "(" + javaTypeInContext(data) + ") boxedArrayFor(" + type.javaTypeInContext(data)
+                    + ".class, " + name + ", " + newArray + ")";
+        }
+    }
+
+    String translationToNative(String name) {
+        return "_" + name;
+    }
+
+    String jniConversionDecode(String name) {
+        return "bindings_java_convert_jarray_to_gpointer(env, _" + name + ")";
+    }
+
+    String jniConversionCleanup(String name) {
+        return "bindings_java_convert_gpointer_to_jarray(env, (gpointer*)" + name + ", _" + name + ")";
+    }
+
+    /*
+     * FIXME we would need a way to figure out the size of the array, and then
+     * create a new java array with NewXXXArray and copy there the elements.
+     * This is a clear candidate for code override, as it seems to be very
+     * hard to manage in an automatic way.
+     */
+    String jniReturnEncode(String name) {
+        System.out.println("Warning: Not supported return of GObject/GBoxed array.");
+        return "NULL";
+    }
+
+    String jniReturnErrorValue() {
+        return "NULL";
+    }
+
+    String extraTranslationToJava(String name, DefsFile data) {
+        if (type instanceof InterfaceThing) {
+            return "fillObjectArray((Object[])" + name + ", _" + name + ")";
+        } else if (type instanceof ObjectThing) {
+            return "fillObjectArray(" + name + ", _" + name + ")";
+        } else {
+            return "fillBoxedArray(" + type.javaTypeInContext(data) + ".class, " + name + ", _" + name
+                    + ")";
+        }
+    }
+
+    String extraTranslationToNative(String name) {
+        if (type instanceof InterfaceThing) {
+            return "pointersOf((Object[])" + name + ")";
+        } else {
+            return "pointersOf(" + name + ")";
+        }
+    }
+
+    boolean needExtraTranslation() {
+        return true;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ProxiedThing.java b/src/generator/com/operationaldynamics/codegen/ProxiedThing.java
new file mode 100644
index 0000000..b16dd6e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ProxiedThing.java
@@ -0,0 +1,40 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/**
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public abstract class ProxiedThing extends Thing
+{
+    public ProxiedThing(String gType, String bindingsPackage, String bindingsClass, String javaType) {
+        super(gType, bindingsPackage, bindingsClass, javaType, "long", "jlong");
+    }
+
+    protected ProxiedThing() {}
+
+    String translationToNative(String name) {
+        return "pointerOf(" + name + ")";
+    }
+
+    String jniReturnErrorValue() {
+        return "0L";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/SetterGenerator.java b/src/generator/com/operationaldynamics/codegen/SetterGenerator.java
new file mode 100644
index 0000000..34a9747
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/SetterGenerator.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Output a method to set a field in a GBoxed. Note that we would not expect
+ * this to be called very much as most fields in GTK structs are read-only.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @see AccessorGenerator
+ */
+public class SetterGenerator extends AccessorGenerator
+{
+    protected final String cField;
+
+    public SetterGenerator(final DefsFile data, final String gFieldType, final String gFieldName,
+            final String[][] gParameters) {
+        super(data, "set_" + gFieldName, "none", gParameters);
+
+        this.cField = gFieldName;
+    }
+
+    protected void jniFunctionLibraryCall(PrintWriter out) {
+        out.print("\n");
+        out.print("\t// set field value\n");
+
+        out.print("\tself->");
+        out.print(cField);
+        out.print(" = ");
+        out.print(parameterNames[1]);
+        out.print(";\n");
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/StringArrayThing.java b/src/generator/com/operationaldynamics/codegen/StringArrayThing.java
new file mode 100644
index 0000000..ea8977e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/StringArrayThing.java
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007-2008 Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Arrays of strings.
+ * 
+ * @author Vreixo Formoso
+ */
+public class StringArrayThing extends ArrayThing
+{
+    public StringArrayThing(String gType) {
+        super(gType, Thing.lookup("gchar*"), "jobjectArray");
+    }
+
+    protected StringArrayThing() {}
+
+    String jniConversionDecode(String name) {
+        return "bindings_java_convert_strarray_to_gchararray(env, _" + name + ")";
+    }
+
+    String jniConversionCleanup(String name) {
+        return "bindings_java_convert_gchararray_to_strarray(env, (gchar**)" + name + ", _" + name + ")";
+    }
+
+    String jniReturnEncode(String name) {
+        return "bindings_java_convert_gchararray_to_jarray(env, (const gchar**)" + name + ")";
+    }
+
+    String jniReturnCleanup(String name, char callerOwnsReturn) {
+        if (callerOwnsReturn == 't') {
+            return "g_strfreev(" + name + ")";
+        } else if (callerOwnsReturn == 'l') {
+            return "g_free(" + name + ")";
+        } else {
+            return null;
+        }
+    }
+
+    String translationToJava(String name, DefsFile data) {
+        return name;
+    }
+
+    String translationToNative(String name) {
+        return name;
+    }
+
+}
diff --git a/src/generator/com/operationaldynamics/codegen/StringThing.java b/src/generator/com/operationaldynamics/codegen/StringThing.java
new file mode 100644
index 0000000..694b69f
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/StringThing.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+public class StringThing extends Thing
+{
+    StringThing(String gType) {
+        super(gType, null, null, "String", "String", "jstring");
+    }
+
+    protected StringThing() {}
+
+    String jniConversionDecode(String name) {
+        return "bindings_java_getString(env, _" + name + ")";
+    }
+
+    boolean jniConversionCanFail() {
+        return true;
+    }
+
+    boolean jniConversionHandlesNull() {
+        return false;
+    }
+
+    String jniConversionCleanup(String name) {
+        return "bindings_java_releaseString(" + name + ")";
+    }
+
+    String jniReturnEncode(String name) {
+        return "bindings_java_newString(env, " + name + ")";
+    }
+
+    String jniReturnErrorValue() {
+        return "NULL";
+    }
+
+    String jniReturnCleanup(String name, char callerOwnsReturn) {
+        if (callerOwnsReturn == 't') {
+            return "g_free(" + name + ")";
+        } else {
+            return null;
+        }
+    }
+
+    String translationToJava(String name, DefsFile data) {
+        return name;
+    }
+
+    String translationToNative(String name) {
+        return name;
+    }
+
+    String extraTranslationToJava(String name, DefsFile data) {
+        return null;
+    }
+
+    String extraTranslationToNative(String name) {
+        return null;
+    }
+
+    public Thing getTypeToImport() {
+        return null;
+    }
+
+    boolean needExtraTranslation() {
+        return false;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/Thing.java b/src/generator/com/operationaldynamics/codegen/Thing.java
new file mode 100644
index 0000000..54e360e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/Thing.java
@@ -0,0 +1,665 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2013 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.util.HashMap;
+import java.util.List;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Things are our wrapper around types, with information about the type at all
+ * levels. These are to be created as encountered by the parser, and
+ * registered.
+ * <p>
+ * Things corresponding to primative types (int, String, etc) for which there
+ * are of course no (define- ...) blocks are registered internally by this
+ * class.
+ * <p>
+ * Things collaborate with Generators in the generation of code, and are
+ * responsible for generation of type-dependent code.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public abstract class Thing
+{
+    /*
+     * WARNING: if any fields are added here, code to clone them must be added
+     * to the createConstVariant() method as well.
+     */
+
+    String gType;
+
+    String bindingsPackage;
+
+    String bindingsClass;
+
+    String javaType;
+
+    String nativeType;
+
+    String jniType;
+
+    /**
+     * Additional C header files, as necessary.
+     */
+    /*
+     * TODO not super happy with this being here (because it is fed by a
+     * custom variation we have made to the .defs files; hopefully there is
+     * another way we can derive this information without needing to do that).
+     */
+    List<String> importHeaders;
+
+    /**
+     * This is gType, of course, except for things like "const-gchar*", which
+     * need to be decoded to "const gchar*". We store the clean version here
+     * to avoid messier code later.
+     */
+    String cType;
+
+    /**
+     * Whether or not this Thing is actually a fake or is otherwise a
+     * prohibited type.
+     */
+    boolean blacklisted;
+
+    /**
+     * All Things, with the excpetion of the FundamentalThings representing
+     * primative types, need to know where they slot in.
+     */
+    protected Thing(String gType, String javaPackage, String javaClass, String javaType,
+            String nativeType, String jniType) {
+        this.gType = gType;
+        this.bindingsPackage = javaPackage;
+        this.bindingsClass = javaClass;
+        this.javaType = javaType;
+        this.nativeType = nativeType;
+        this.jniType = jniType;
+        this.cType = gType;
+        this.blacklisted = false;
+    }
+
+    /**
+     * All Thing subclasses require a protected visibility no-args constructor
+     * so that clone() can instatiate them.
+     */
+    protected Thing() {}
+
+    public boolean isBlacklisted() {
+        return blacklisted;
+    }
+
+    private static HashMap<String, Thing> things;
+
+    static {
+        things = new HashMap<String, Thing>(500);
+
+        register(new FundamentalThing("none", "void", "void", "void"));
+        register(new FundamentalThing("gchar", "char", "char", "jchar"));
+        register(new FundamentalThing("guchar", "char", "char", "jchar"));
+        register(new FundamentalThing("gunichar", "int", "int", "jint"));
+        register(new StringThing("gchar*"));
+
+        /*
+         * A certain class of bugs arise from discarding the most significant
+         * bit in the unsigned integers but in practice it never seems to be a
+         * problem. Nevertheless, this is where to fix it if a problem crops
+         * up.
+         */
+
+        register(new FundamentalThing("gint", "int", "int", "jint"));
+        register(new FundamentalThing("guint", "int", "int", "jint"));
+        register(new FundamentalThing("gint8", "byte", "byte", "jbyte"));
+        register(new FundamentalThing("guint8", "byte", "byte", "jbyte"));
+        register(new FundamentalThing("gint16", "short", "short", "jshort"));
+        register(new FundamentalThing("guint16", "char", "char", "jchar"));
+        register(new FundamentalThing("gint32", "int", "int", "jint"));
+        register(new FundamentalThing("guint32", "int", "int", "jint"));
+        register(new FundamentalThing("gssize", "int", "int", "jint"));
+        register(new FundamentalThing("gsize", "long", "long", "jlong"));
+        register(new FundamentalThing("gint64", "long", "long", "jlong"));
+        register(new FundamentalThing("guint64", "long", "long", "jlong"));
+        register(new FundamentalThing("glong", "long", "long", "jlong"));
+        register(new FundamentalThing("gulong", "long", "long", "jlong"));
+        register(new FundamentalThing("gboolean", "boolean", "boolean", "jboolean"));
+        register(new FundamentalThing("cairo_bool_t", "boolean", "boolean", "jboolean"));
+        register(new FundamentalThing("gfloat", "float", "float", "jfloat"));
+        register(new FundamentalThing("gdouble", "double", "double", "jdouble"));
+        register(new FundamentalThing("goffset", "long", "long", "jlong"));
+
+        /*
+         * Types for array parameters
+         */
+        register(new FundamentalArrayThing("gfloat[]", "gfloat"));
+        register(new FundamentalArrayThing("gint8[]", "gint8"));
+
+        /*
+         * and for string arrays
+         */
+        register(new StringArrayThing("gchar**"));
+        register(new StringArrayThing("char**"));
+
+        /* these seem a bit harder */
+        register(new FixmeThing("const-gchar*[]"));
+        register(new FixmeThing("gchar**[]"));
+        register(new FixmeThing("gint**"));
+        register(new FixmeThing("guint**"));
+
+        /*
+         * Out parameters for fundamental types are special cases, probably,
+         * so we will continue to register their information here for now.
+         */
+        register(new FundamentalArrayThing("gint*", "gint"));
+        register(new FundamentalArrayThing("guint*", "guint"));
+        register(new FundamentalArrayThing("gfloat*", "gfloat"));
+        register(new FundamentalArrayThing("gdouble*", "gdouble"));
+        register(new FundamentalArrayThing("gboolean*", "gboolean"));
+        register(new FundamentalArrayThing("gsize*", "gsize"));
+        // and so on
+
+        /*
+         * The kludge of repeating certain basic types is here because Owen
+         * couldn't be bothered to follow the conventions that are used
+         * everywhere else in the GNOME stack when he worked on Pango. See
+         * http://bugzilla.gnome.org/show_bug.cgi?id=442823
+         */
+        register(new FundamentalThing("int", "int", "int", "jint"));
+        register(new FundamentalThing("double", "double", "double", "jdouble"));
+        register(new FundamentalArrayThing("double*", "double"));
+        register(new StringThing("char*"));
+        register(new FundamentalArrayThing("int*", "int"));
+
+        // is this actually correct?
+        register(new FundamentalThing("time_t", "long", "long", "jlong"));
+
+        /*
+         * Types with are either already defined by the java-gnome
+         * architecture and for which (by design) there is no .defs data, or
+         * those for which we have no need at all (ie GType).
+         */
+
+        register(new ObjectThing("GObject*", "org.gnome.glib", "GObject", "Object"));
+        register(new ValueThing());
+        register(new BlacklistedThing("GClosure*"));
+        register(new BlacklistedThing("GType"));
+
+        /*
+         * Types we register purely for the cosmetic purposes of including in
+         * the sorted includes declarations
+         */
+        register(new ObjectThing("Signal", "org.gnome.glib", "", "Signal"));
+        register(new ObjectThing("Proxy", "org.freedesktop.bindings", "", "Proxy"));
+        register(new ObjectThing("Blacklist", "org.freedesktop.bindings", "", "BlacklistedMethodError"));
+        register(new ObjectThing("FIXME", "org.freedesktop.bindings", "", "FIXME"));
+
+        /*
+         * Types needed for GError management
+         */
+        register(new GErrorThing());
+        register(new ObjectThing("GlibException", "org.gnome.glib", "", "GlibException"));
+
+        /*
+         * FIXME! Weirdo cases we haven't figured out what to do with yet.
+         * Should these be a new (define...) type intead of here?
+         */
+        register(new TypedefFundamentalThing("GQuark", "int", "int", "jint"));
+        register(new TypedefFundamentalThing("GdkNativeWindow", "long", "long", "jlong"));
+        register(new FixmeThing("gpointer"));
+        register(new FixmeThing("gpointer*"));
+        register(new FixmeThing("GdkAtom"));
+        register(new FixmeThing("GdkAtom*"));
+
+        register(new TypedefEnumThing("GdkKeyval", "guint", "org.gnome.gdk", "GdkKeyval", "Keyval"));
+        register(new TypedefEnumThing("GdkMouseButton", "guint", "org.gnome.gdk", "GdkMouseButton",
+                "MouseButton"));
+
+        /*
+         * Typedefs of fundamental type
+         */
+        register(new TypedefFundamentalThing("PangoGlyphUnit", "int", "int", "jint"));
+
+        /*
+         * These seem to be motif-isms.
+         */
+        register(new BlacklistedThing("GdkWMDecoration*"));
+        register(new BlacklistedThing("GdkWMFunction"));
+
+        /*
+         * From gdk_draw_rgb_image(): "The pixel data, represented as packed
+         * 24-bit data." No idea how we could possibly handle that properly.
+         */
+        register(new BlacklistedThing("guchar*"));
+        /*
+         * From gdk_property_get(), which is marked "don't use"
+         */
+        register(new BlacklistedThing("guchar**"));
+
+        register(new FixmeThing("AtkAttributeSet*"));
+
+        /*
+         * And what on earth are...
+         */
+        register(new BlacklistedThing("GtkFileSystemVolume*"));
+        register(new BlacklistedThing("GtkFilePath**"));
+        register(new BlacklistedThing("GtkFileSystemGetInfoCallback"));
+        register(new BlacklistedThing("GtkFileSystemGetFolderCallback"));
+
+        /*
+         * Dealing with out-parameters is now handled by lookup() and
+         * createOutVariant() in this class, so the manual declarations we had
+         * been accumulating are no longer included. As we were pushing
+         * through the full suite of .defs data, however, numerous comments
+         * were made which are preserved here: FIXME Out-parameter Proxies?
+         * Oh, joy FIXME Out-parameter enums and flags? Grr FIXME An array of
+         * outparameters? Make it stop! Clearly, there is further work to be
+         * done in this regard. Finally, FIXME String[] is a common return
+         * type, so out-parameter is probably not the way to deal with it. But
+         * on the other hand, arrays _are_ how we deal with out-parameters, so
+         * perhaps this will turn out to be close to what we want in the end
+         * after all.
+         */
+        // register(new OutParameterFundamentalThing("gchar**", "String[]",
+        // "String[]", "jobjectArray"));
+    }
+
+    public static void register(Thing t) {
+        if (t.gType == null) {
+            throw new IllegalStateException();
+        }
+
+        things.put(t.gType, t);
+    }
+
+    /**
+     * Lookup the Thing object registered as corresponding to
+     * <code>gType</code>
+     */
+    public static Thing lookup(String gType) {
+        Thing stored, dupe, black;
+        String bareGType;
+
+        /*
+         * Lookup the type. This will work most of the time...
+         */
+
+        stored = things.get(gType);
+
+        if (stored != null) {
+            return stored;
+        }
+
+        /*
+         * ...but not if it needs a const Thing variant, and one hasn't been
+         * created yet. So strip off the "const-" prefix, and look up the
+         * type.
+         */
+
+        if (gType.startsWith("const-")) {
+            bareGType = gType.substring(6);
+            stored = things.get(bareGType);
+
+            if (stored != null) {
+                dupe = stored.createConstVariant();
+
+                register(dupe);
+                return dupe;
+            }
+        } else if (gType.startsWith("GList-") || gType.startsWith("GSList-")) {
+            bareGType = gType.split("-")[1];
+            stored = things.get(bareGType);
+
+            if (stored != null) {
+                dupe = stored.createListVariant(gType);
+
+                register(dupe);
+                return dupe;
+            }
+        } else if (gType.endsWith("*")) {
+            bareGType = gType.substring(0, gType.length() - 1);
+            stored = things.get(bareGType);
+
+            /*
+             * we don't support arrays of arrays yet. the !(stored instanceof
+             * ArrayThing) is needed to prevent multiple recursion on the
+             * pointer star.
+             */
+            if ((stored != null) && !(stored instanceof ArrayThing)) {
+                dupe = stored.createArrayVariant();
+
+                register(dupe);
+                return dupe;
+            }
+        }
+
+        /*
+         * If we're still stuck, then that is would be fatal, except that we
+         * create a dummy type as a placeholder so we can proceed with the
+         * bindings generation without total closure.
+         */
+        System.out.println("Warning: no type data for " + gType + ", blacklisting");
+        black = new BlacklistedThing(gType);
+        register(black);
+        return black;
+    }
+
+    /**
+     * Returns the Java type of this Thing. In most cases this is just the
+     * bare type name. However, when there is an import conflict, the fully
+     * qualified java class name is retuned instead.
+     * <p>
+     * Note that <code>javaType</code> is still exposed - use it directly if
+     * you need it.
+     */
+    String javaTypeInContext(DefsFile context) {
+        if (context.doesTypeConflict(this)) {
+            return fullyQualifiedJavaClassName();
+        } else {
+            return javaType;
+        }
+    }
+
+    /**
+     * The translation code necessary to convert this type from Java to the
+     * native JNI crossing type.
+     * 
+     * @param name
+     *            the variable name being converted
+     * @return the code for the conversion. Usually a no-op, ie, "name" is
+     *         returned, but for Proxies and Constants, "pointerOf(name)" will
+     *         be the result.
+     */
+    abstract String translationToNative(String name);
+
+    /**
+     * Check if this type needs an extra translation other that the simple
+     * on-the-fly translationToNative(). If this is <code>true</code>, the
+     * correspondent generator will call extraTranslationToNative() and
+     * extraTranslationToJava() when needed.
+     */
+    boolean needExtraTranslation() {
+        return false;
+    }
+
+    /**
+     * When the translation to native needs some lines of code, or just it
+     * can't be done on-the-fly inside an argument list, this is called before
+     * the native method.
+     * 
+     * <p>
+     * For most Things, the extra translation is not needed. Only composes
+     * types such as some arrays / out parameters need this.
+     */
+    String extraTranslationToNative(String name) {
+        return null;
+    }
+
+    /**
+     * Like {@link #translationToJava(String, DefsFile) translationToJava()},
+     * but intented for "clean-up" of parameters.
+     * 
+     * TODO change name!!!
+     */
+    String extraTranslationToJava(String name, DefsFile data) {
+        return null;
+    }
+
+    /**
+     * Check if the type need to the guard against null values when null-ok is
+     * not present. For example, a fundamental "int" never needs a guard.
+     */
+    boolean needGuardAgainstNull() {
+        return true;
+    }
+
+    /**
+     * Check whether the jni conversion function can safety deal with a NULL
+     * input value, or is better to do a if like:
+     * 
+     * <pre>
+     * if (_x == NULL) {
+     *     x = NULL;
+     * } else {
+     *     ....
+     * }
+     * </pre>
+     * 
+     * to prevent the conversion function to be called with null values. Note
+     * that even if the funcion handles nulls well, using this is a good idea
+     * as it manages null-ok in a better way.
+     */
+    boolean jniConversionHandlesNull() {
+        return true;
+    }
+
+    /**
+     * The translation code necessary to convert this type from native JNI
+     * crossing type back to Java.
+     * 
+     * @param name
+     *            the variable name being converted
+     * @param data
+     *            Information about the file is thing is to be translated
+     * @return the code for the conversion. For Proxies "objectFor(name)" will
+     *         be the result.
+     */
+    abstract String translationToJava(String name, DefsFile data);
+
+    String jniConversionDecode(String name) {
+        return "_" + name;
+    }
+
+    /**
+     * Chek if the JNI conversion done by code generated by
+     * {@link #jniConversionDecode(String) jniConversionDecode()} can fail. If
+     * so, usually this requires some check code to be generated.
+     */
+    boolean jniConversionCanFail() {
+        return false;
+    }
+
+    /**
+     * @return null signiying no cleanup code is necessary
+     */
+    String jniConversionCleanup(String name) {
+        return null;
+    }
+
+    String jniReturnEncode(String name) {
+        return name;
+    }
+
+    /**
+     * 
+     * @param name
+     * @param callerOwnsReturn
+     *            Whether the caller owns the return value. It is either 'f'
+     *            (caller doesn't own return), 't' (caller own return) or 'l'
+     *            (return type is a list/array... and only the list itself is
+     *            own, not its contents)
+     * @return
+     */
+    String jniReturnCleanup(String name, char callerOwnsReturn) {
+        return null;
+    }
+
+    /**
+     * Little utility function so that when aborting out of a C function
+     * (because an Exception has been thrown) the correct "emtpy" value is
+     * used. Stick this after a "return" statement.
+     */
+    abstract String jniReturnErrorValue();
+
+    /**
+     * Get the type that a Java class needs to import. In most cases it will
+     * be <code>this</code>, but arrays, for example, are managed in a
+     * different way.
+     * 
+     * @return The type to import or <code>null</code> meaning no import
+     *         needed.
+     */
+    public Thing getTypeToImport() {
+        return this;
+    }
+
+    /**
+     * Get the fully qualified name of the public Java type, ie, for
+     * GtkButton, return "org.gnome.gtk.Button". This is used to create import
+     * statements for types that are used.
+     */
+    public String fullyQualifiedJavaClassName() {
+        StringBuffer buf;
+
+        buf = new StringBuffer();
+        buf.append(bindingsPackage);
+        buf.append(".");
+        buf.append(javaType);
+
+        return buf.toString().intern();
+    }
+
+    /**
+     * Get the name of the type for Class name used for the translation layer
+     * of the bindings, ie, for Thing "GtkButton*" which is exposed publicly
+     * as "org.gnome.gtk.Button", return "GtkButton". We use this to generate
+     * typeMapping.properties which needs to match the result of
+     * <code>g_type_name()</code>.
+     */
+
+    public String bareTranslationClassName() {
+        return bindingsClass;
+    }
+
+    /**
+     * Get the java type this Thing represents
+     */
+    public String bareJavaClassName() {
+        return javaType;
+    }
+
+    /**
+     * This is where we deal with the "const-" modifier by creating a clone of
+     * the object and then changing the cType field. We use reflection to
+     * create the appropriate fully derived instance.
+     */
+    /*
+     * This is effectively clone(). WARNING this doesn't deal with fields in
+     * subclasses. At the moment there aren't any, and we don't expect any. We
+     * could use reflection over the fields if we really had to. Yuk. In the
+     * mean time, this works.
+     */
+    private Thing createConstVariant() {
+        Thing t;
+
+        try {
+            t = this.getClass().newInstance();
+        } catch (InstantiationException ie) {
+            throw new RuntimeException("No nullary constructor available in " + this.getClass() + "?",
+                    ie);
+        } catch (IllegalAccessException iae) {
+            throw new RuntimeException("Constructor " + this.getClass() + "() private?", iae);
+        }
+
+        t.bindingsClass = this.bindingsClass;
+        t.bindingsPackage = this.bindingsPackage;
+        t.gType = ("const-" + this.gType).intern();
+        t.cType = ("const " + this.cType).intern();
+        t.javaType = this.javaType;
+        t.jniType = this.jniType;
+        t.nativeType = this.nativeType;
+        t.blacklisted = this.blacklisted;
+
+        /*
+         * Added to support cloning of ArrayThings, that have a field, but
+         * looks very ugly!
+         */
+        if (this instanceof ArrayThing) {
+            ((ArrayThing) t).type = ((ArrayThing) this).type;
+        }
+
+        return t;
+    }
+
+    /**
+     * Array variants are the way we manage both arrays and output parameters.
+     */
+    /*
+     * TODO for efficience reasons, in a near future we will want to deal with
+     * output params/arrays and input arrays in a different way.
+     */
+    private Thing createArrayVariant() {
+        if (this instanceof ProxiedThing) {
+            return new ProxiedArrayThing(gType + "*", this);
+        } else if (this instanceof EnumThing) {
+            return new ConstantArrayThing(gType + "*", this);
+        } else {
+            /*
+             * only Proxied/Constant arrays are supported yet. Note that
+             * fundamental arrays are managed in Thing static block.
+             */
+            System.out.println("Warning: Unsupported " + gType);
+            return new BlacklistedThing(this.gType + "*");
+        }
+    }
+
+    /**
+     * This is where we deal with both "GList" and "GSList" variants.
+     */
+    private Thing createListVariant(String gType) {
+        if (this instanceof ProxiedThing) {
+            return new GListThing(gType, this);
+        } else {
+            System.out.println("Warning: Unsupported " + gType);
+            return new BlacklistedThing(gType);
+        }
+    }
+
+    /**
+     * The name of the class that will contain the generated translation layer
+     * code. For example, GdkWindow return "org.gnome.gdk.GdkWindow". This is
+     * used by the BindingsGenerator to figure out where to create the output
+     * code.
+     */
+    public String fullyQualifiedTranslationClassName() {
+        StringBuffer buf;
+
+        buf = new StringBuffer();
+        buf.append(bindingsPackage);
+        buf.append(".");
+        buf.append(bindingsClass);
+
+        return buf.toString().intern();
+    }
+
+    /**
+     * Setter for importHeader.
+     */
+    /*
+     * Other Thing members are set in the constructor, but this is set in its
+     * own method because only a very few object really need it, so we can use
+     * the setter only in the needed Block.
+     */
+    public void setImportHeader(List<String> importHeader) {
+        this.importHeaders = importHeader;
+    }
+
+    public String toString() {
+        return gType;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/TypeGenerator.java b/src/generator/com/operationaldynamics/codegen/TypeGenerator.java
new file mode 100644
index 0000000..eab51ae
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/TypeGenerator.java
@@ -0,0 +1,209 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Base class for the Generators which process the information declaring a
+ * native type we are rendering into Java classes: GObjects, boxeds/structs,
+ * enums, etc. Note that these Generators simply output the code necessary for
+ * a Block objects that result from (define- ...) stanzas that declare data
+ * types. <b>This does not imply the Java side type as a whole - just its
+ * declaration.</b> All Blocks are independent and by themselves, no relation
+ * to any other Blocks, and likewise the Generators for them are just about
+ * the necessary file headers and opening statements. Any necessary context is
+ * provided by the {@link DefsFile} argument which is the first parameter to
+ * all Generator constructors.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+abstract class TypeGenerator extends Generator
+{
+    protected final Thing objectType;
+
+    public TypeGenerator(DefsFile data) {
+        super(data);
+        this.objectType = data.getType();
+    }
+
+    public void writePublicCode(final PrintWriter out) {
+        commonFileHeader(out, objectType.javaType + ".java");
+        publicPackageAndImports(out);
+        publicClassJavadocComment(out);
+        publicClassDeclaration(out);
+    }
+
+    public void writeTranslationCode(final PrintWriter out) {
+        commonFileHeader(out, objectType.bindingsClass + ".java");
+        packageStatementAndImports(out);
+        translationClassDeclaration(out);
+    }
+
+    public void writeJniCode(final PrintWriter out) {
+        commonFileHeader(out, objectType.bindingsClass + ".c");
+        hashIncludeStatements(out);
+    }
+
+    /**
+     * Compose the copyright header common to all generated sources files.
+     * 
+     * @param fileName
+     *            this is just cosmetic, but by convention we put the filename
+     *            at the top of our source files.
+     * @param stub
+     *            if this is actually a stub of a public API class, rather
+     *            than a "generated" translation or JNI later file.
+     */
+    /*
+     * I truly cannot believe that I just converted a here doc into a series
+     * of single line strings with \n at the end of each. Oh well, it's done
+     * now, and this was really the only long block of text.
+     */
+    protected static void commonFileHeader(PrintWriter out, String fileName) {
+        out.print("/*\n");
+        out.print(" * java-gnome, a UI library for writing GTK and GNOME programs from Java!\n");
+        out.print(" *\n");
+        out.print(" * Copyright © 2006-2012 Operational Dynamics Consulting, Pty Ltd and Others\n");
+        out.print(" *\n");
+        out.print(" * The code in this file, and the program it is a part of, is made available\n");
+        out.print(" * to you by its authors as open source software: you can redistribute it\n");
+        out.print(" * and/or modify it under the terms of the GNU General Public License version\n");
+        out.print(" * 2 (\"GPL\") as published by the Free Software Foundation.\n");
+        out.print(" *\n");
+        out.print(" * This program is distributed in the hope that it will be useful, but WITHOUT\n");
+        out.print(" * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n");
+        out.print(" * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.\n");
+        out.print(" *\n");
+        out.print(" * You should have received a copy of the GPL along with this program. If not,\n");
+        out.print(" * see http://www.gnu.org/licenses/. The authors of this program may be\n");
+        out.print(" * contacted through http://java-gnome.sourceforge.net/.\n");
+        out.print(" *\n");
+        out.print(" * Linking this library statically or dynamically with other modules is making\n");
+        out.print(" * a combined work based on this library. Thus, the terms and conditions of\n");
+        out.print(" * the GPL cover the whole combination. As a special exception (the\n");
+        out.print(" * \"Classpath Exception\"), the copyright holders of this library give you\n");
+        out.print(" * permission to link this library with independent modules to produce an\n");
+        out.print(" * executable, regardless of the license terms of these independent modules,\n");
+        out.print(" * and to copy and distribute the resulting executable under terms of your\n");
+        out.print(" * choice, provided that you also meet, for each linked independent module,\n");
+        out.print(" * the terms and conditions of the license of that module. An independent\n");
+        out.print(" * module is a module which is not derived from or based on this library. If\n");
+        out.print(" * you modify this library, you may extend the Classpath Exception to your\n");
+        out.print(" * version of the library, but you are not obligated to do so. If you do not\n");
+        out.print(" * wish to do so, delete this exception statement from your version.\n");
+        out.print(" */\n");
+    }
+
+    protected void generatedFileWarning(final PrintWriter out) {
+        out.print("/*\n");
+        out.print(" * THIS FILE IS GENERATED CODE!\n");
+        out.print(" *\n");
+        out.print(" * To modify its contents or behaviour, either update the generation program,\n");
+        out.print(" * change the information in the source defs file, or implement an override for\n");
+        out.print(" * this class.\n");
+        out.print(" */\n");
+    }
+
+    protected void packageStatementAndImports(final PrintWriter out) {
+        final List<String> types;
+
+        out.print("package ");
+        out.print(objectType.bindingsPackage);
+        out.print(";\n\n");
+        generatedFileWarning(out);
+        out.print("\n");
+
+        types = new ArrayList<String>();
+        types.add(objectType.bindingsPackage + ".Plumbing");
+
+        for (Thing type : data.getTypesToImport()) {
+            types.add(type.fullyQualifiedJavaClassName());
+        }
+
+        /* sort the types */
+        Collections.sort(types);
+
+        for (String t : types) {
+            out.print("import ");
+
+            out.print(t);
+            out.print(";\n");
+        }
+    }
+
+    protected void translationClassDeclaration(final PrintWriter out) {
+        out.print("\n");
+        out.print("final class ");
+        out.print(objectType.bindingsClass);
+        out.print(" extends Plumbing\n{\n");
+
+        out.print("    ");
+        out.print("private ");
+        out.print(objectType.bindingsClass);
+        out.print("() {}\n");
+    }
+
+    protected void hashIncludeStatements(final PrintWriter out) {
+        out.print("\n");
+        generatedFileWarning(out);
+        out.print("\n");
+
+        out.print("#include <jni.h>\n");
+        out.print("#include <gtk/gtk.h>\n");
+
+        if (objectType.importHeaders != null) {
+            for (String header : objectType.importHeaders) {
+                out.print("#include <" + header + ">\n");
+            }
+        }
+
+        out.print("#include \"bindings_java.h\"\n");
+
+        out.print("#include \"");
+        out.print(encodeJavaClassName(objectType.bindingsPackage, objectType.bindingsClass));
+        out.print(".h\"\n");
+    }
+
+    /*
+     * Code to output public stubs. DO NOT TOUCH
+     */
+
+    protected abstract void publicPackageAndImports(final PrintWriter out);
+
+    protected void publicClassJavadocComment(final PrintWriter out) {
+        out.print("/*\n");
+        out.print(" * FIXME this is a placeholder stub for what will become the public API for\n");
+        out.print(" * this type. Replace this comment with appropriate javadoc including author\n");
+        out.print(" * and since tags. Note that the class may need to be made abstract, implement\n");
+        out.print(" * interfaces, or even have its parent changed. No API stability guarantees\n");
+        out.print(" * are made about this class until it has been reviewed by a hacker and this\n");
+        out.print(" * comment has been replaced.\n");
+        out.print(" */\n");
+    }
+
+    protected abstract void publicClassDeclaration(final PrintWriter out);
+}
diff --git a/src/generator/com/operationaldynamics/codegen/TypedefEnumThing.java b/src/generator/com/operationaldynamics/codegen/TypedefEnumThing.java
new file mode 100644
index 0000000..eb55320
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/TypedefEnumThing.java
@@ -0,0 +1,36 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/**
+ * This is effectively a <code>typedef</code>, except it's hard wired to work
+ * the other way: java-gnome effectively declares a type (and uses it in the
+ * .defs data) but at the conversion to C layer it is returned to an int of
+ * the cType specified.
+ * 
+ * @author Andrew Cowie
+ */
+public class TypedefEnumThing extends EnumThing
+{
+    public TypedefEnumThing(String gType, String cType, String javaPackage, String javaClass,
+            String javaType) {
+        super(gType, javaPackage, javaClass, javaType);
+        super.cType = cType;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/TypedefFundamentalThing.java b/src/generator/com/operationaldynamics/codegen/TypedefFundamentalThing.java
new file mode 100644
index 0000000..ecdcdee
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/TypedefFundamentalThing.java
@@ -0,0 +1,34 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+/**
+ * Types that are declared as typedef of a fundamental type, rather than of a
+ * struct. FIXME; no idea if this is the correct way to deal with this.
+ * 
+ * @author Andrew Cowie
+ */
+public class TypedefFundamentalThing extends FundamentalThing
+{
+    public TypedefFundamentalThing(String gType, String javaType, String nativeType, String jniType) {
+        super(gType, javaType, nativeType, jniType);
+    }
+
+    protected TypedefFundamentalThing() {}
+}
diff --git a/src/generator/com/operationaldynamics/codegen/ValueThing.java b/src/generator/com/operationaldynamics/codegen/ValueThing.java
new file mode 100644
index 0000000..2e697e8
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/ValueThing.java
@@ -0,0 +1,42 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Hard coded Thing type for GValues, mostly here so that we can put
+ * <code>valueFor()</code> in as the translation code.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValueThing extends ProxiedThing
+{
+    /*
+     * Covers off requirement for a nullary constructor which in other Thing
+     * subclasses we have a protected constructor for.
+     */
+    public ValueThing() {
+        super("GValue*", "org.gnome.glib", "GValue", "Value");
+    }
+
+    String translationToJava(String name, DefsFile data) {
+        return "valueFor(" + name + ")";
+    }
+}
diff --git a/src/generator/com/operationaldynamics/codegen/VirtualGenerator.java b/src/generator/com/operationaldynamics/codegen/VirtualGenerator.java
new file mode 100644
index 0000000..d480564
--- /dev/null
+++ b/src/generator/com/operationaldynamics/codegen/VirtualGenerator.java
@@ -0,0 +1,270 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.io.PrintWriter;
+
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Generate Java and C code for signal callbacks (which are how we map
+ * virtuals).
+ * 
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * We don't use much of FunctionGenerators output code, but its field
+ * definitions (as translated from its constructor) are useful.
+ */
+public class VirtualGenerator extends FunctionGenerator
+{
+    // TODO use a Thing instead?
+
+    protected final String javaSignalClass;
+
+    protected final String cSignalName;
+
+    protected final String receiverMethodName;
+
+    protected final String interfaceMethodName;
+
+    /**
+     * 
+     * @param gObjectType
+     * @param blockName
+     *            the block name as given in the define statement. The
+     *            VirtualGenerator will work out how to transform into the
+     *            signal interface name as necessary.
+     * @param gReturnType
+     * @param gParameters
+     *            the parameters array describing the signature of the signal
+     *            handler callback.
+     */
+    /*
+     * We let FunctionGenerator split up the parameters, but they aren't used
+     * for the translationMethod singature, but rather the interface method.
+     */
+    public VirtualGenerator(final DefsFile data, final String blockName, final String gReturnType,
+            final String[][] gParameters) {
+        super(data, "connect", gReturnType, null, gParameters, 'f');
+
+        this.javaSignalClass = toPascalCase(blockName) + "Signal";
+        this.cSignalName = blockName.replace('_', '-');
+        this.receiverMethodName = toCamel("receive_" + blockName);
+        this.interfaceMethodName = toCamel("on_" + blockName);
+    }
+
+    /*
+     * Ripoff override of FunctionGenerator's method by this name.
+     */
+    protected void translationMethodDeclaration(PrintWriter out) {
+        out.print("\n");
+        out.print("    ");
+        out.print("static final void ");
+        out.print(translationMethodName);
+        out.print("(");
+        out.print(proxyType.javaTypeInContext(data));
+        out.print(" self, ");
+        out.print(proxyType.bindingsClass);
+        out.print(".");
+        out.print(javaSignalClass);
+        out.print(" handlerInstance, boolean after) {");
+        out.print("\n");
+    }
+
+    protected void translationMethodSuperCall(PrintWriter out) {
+        out.print("        ");
+        out.print("connectSignal(");
+        if (proxyType instanceof InterfaceThing) {
+            out.print("(Object) ");
+        }
+        out.print("self, handlerInstance, ");
+        out.print(proxyType.bindingsClass);
+        out.print(".class, \"");
+        out.print(cSignalName);
+        out.print("\", after);\n");
+
+        out.print("    }\n");
+    }
+
+    protected void receiverMethodDeclaration(PrintWriter out) {
+        out.print("\n");
+        out.print("    ");
+        out.print("protected static final ");
+        out.print(returnType.nativeType);
+        out.print(" ");
+        out.print(receiverMethodName);
+
+        out.print("(Signal handler, long source");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+
+            if (parameterTypes[i] instanceof GErrorThing) {
+                System.out.println("Warning: unsupported GError usage in a virtual");
+                continue;
+            }
+            out.print(", ");
+
+            out.print(parameterTypes[i].nativeType);
+            out.print(" ");
+            out.print(parameterNames[i]);
+        }
+
+        out.print(")");
+        out.print(" {\n");
+    }
+
+    protected void receiverMethodConversionCode(PrintWriter out) {
+        int declarations = 0;
+
+        if (!returnType.javaType.equals("void")) {
+            out.print("        ");
+            out.print(returnType.javaTypeInContext(data));
+            out.print(" result;\n");
+            declarations++;
+        }
+        if (returnType.needExtraTranslation()) {
+            out.print("        ");
+            out.print(returnType.nativeType);
+            out.print(" _result;\n");
+            declarations++;
+        }
+
+        if (declarations > 0) {
+            out.print("\n");
+        }
+    }
+
+    /**
+     * This is an ugly, complicated expression, but that's the way it is. Be
+     * happy you aren't writing this by hand a thousand times.
+     */
+    protected void receiverMethodInvokeInstance(PrintWriter out) {
+        out.print("        ");
+
+        if (!returnType.nativeType.equals("void")) {
+            out.print("result = ");
+        }
+
+        out.print("((");
+        out.print(proxyType.bindingsClass);
+        out.print(".");
+        out.print(javaSignalClass);
+        out.print(") handler).");
+        out.print(interfaceMethodName);
+        out.print("((");
+        out.print(proxyType.javaTypeInContext(data));
+        out.print(") objectFor(source)");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            out.print(", ");
+            out.print(parameterTypes[i].translationToJava(parameterNames[i], data));
+        }
+
+        out.print(");\n");
+        if (returnType.needExtraTranslation()) {
+            out.print("        ");
+            out.print("_result = ");
+            out.print(returnType.extraTranslationToNative("result"));
+            out.print(";\n");
+        }
+    }
+
+    protected void receiverMethodReturnCode(PrintWriter out) {
+        if (!returnType.nativeType.equals("void")) {
+            out.print("\n");
+            out.print("        ");
+            out.print("return ");
+            out.print(returnType.translationToNative("result"));
+            out.print(";\n");
+        }
+
+        out.print("    }\n");
+    }
+
+    protected void interfaceClassDeclaration(PrintWriter out) {
+        out.print("\n");
+        out.print("    ");
+        out.print("interface ");
+        out.print(javaSignalClass);
+        out.print(" extends Signal");
+        out.print("\n");
+        out.print("    ");
+        out.print("{");
+        out.print("\n");
+    }
+
+    protected void interfaceMethodDeclaration(PrintWriter out) {
+        out.print("        ");
+        out.print(returnType.javaTypeInContext(data));
+        out.print(" ");
+        out.print(interfaceMethodName);
+        out.print("(");
+        out.print(proxyType.javaTypeInContext(data));
+        out.print(" source");
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+            if (parameterTypes[i] instanceof GErrorThing) {
+                continue;
+            }
+            out.print(", ");
+            out.print(parameterTypes[i].javaTypeInContext(data));
+            out.print(" ");
+            out.print(parameterNames[i]);
+        }
+        out.print(");");
+        out.print("\n");
+
+    }
+
+    protected void interfaceClassClose(PrintWriter out) {
+        out.print("    ");
+        out.print("}");
+        out.print("\n");
+    }
+
+    /*
+     * Note that we don't use any of FunctionGenerator's code output methods;
+     * all these calls are here in VirtualGenerator.
+     */
+    public void writeTranslationCode(final PrintWriter out) {
+        interfaceClassDeclaration(out);
+        interfaceMethodDeclaration(out);
+        interfaceClassClose(out);
+
+        translationMethodDeclaration(out);
+        translationMethodSuperCall(out);
+
+        receiverMethodDeclaration(out);
+        receiverMethodConversionCode(out);
+        receiverMethodInvokeInstance(out);
+        receiverMethodReturnCode(out);
+    }
+
+    /*
+     * No JNI code necessary, but nor is it necessary to throw an exception;
+     * we just don't want it to do anything here, that's all. So we override
+     * the implementation from FunctionGenerator with an empty block.
+     */
+    public void writeJniCode(final PrintWriter out) {}
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/AccessorBlock.java b/src/generator/com/operationaldynamics/defsparser/AccessorBlock.java
new file mode 100644
index 0000000..0ed32f9
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/AccessorBlock.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.operationaldynamics.codegen.Thing;
+
+/**
+ * Parent of the pseudo Blocks used to describe the getters and setters for
+ * GBoxed fields. These are not described by full (define-...) blocks, but are
+ * driven by the lines in (fields ...) subcharacterisitcs.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * Both subclasses use the convention of stashing the gType in returnType and
+ * the name in blockName. That's just to give them somewhere to go until the
+ * Generator is instantiated.
+ */
+public abstract class AccessorBlock extends FunctionBlock
+{
+    @SuppressWarnings("unchecked")
+    AccessorBlock(final String blockName, final BoxedBlock parent, final List<String[]> parameters) {
+        super(blockName, Collections.EMPTY_LIST, parameters);
+
+        ofObject = parent.cName;
+        prependReferenceToSelf();
+    }
+
+    /*
+     * Each AccessorBlock is for a single field, so only one type to report.
+     */
+    public List<Thing> usesTypes() {
+        Thing type = Thing.lookup(returnType).getTypeToImport();
+        if (type != null) {
+            return Collections.singletonList(type);
+        } else {
+            return Collections.emptyList();
+        }
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/Block.java b/src/generator/com/operationaldynamics/defsparser/Block.java
new file mode 100644
index 0000000..8894039
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/Block.java
@@ -0,0 +1,272 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.List;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Base class representing a block s-expression .defs data. The system is
+ * predicated around the notion that by the time you are done creating a Block
+ * object, you know that Thing (type) the Block refers to, and can look it up
+ * and set it accordingly.
+ * 
+ * <p>
+ * All members are to be protected, and setters are to be used (via reflection
+ * in the DefsParser) to map the characteristics in each block to fields.
+ * 
+ * @author Andrew Cowie
+ */
+public abstract class Block
+{
+    /**
+     * The short "python" name for this Object/Function/Method/Constructor/etc
+     */
+    protected final String blockName;
+
+    protected Block(final String blockName, final List<String[]> characteristics) {
+        this.blockName = blockName;
+
+        processCharacteristics(characteristics);
+    }
+
+    /**
+     * When encountered by the constructor as it calls the reflexive machinery
+     * in processCharacteristics(), this will throw UnnecessaryCodeException
+     * to signal DefsParser to skip this Block object and move on to the next.
+     */
+    protected final void setDeprecated(final String deprecated) {
+        throw new UnnecessaryCodeException(deprecated);
+    }
+
+    protected final void setUnnecessary(final String msg) {
+        throw new UnnecessaryCodeException(msg);
+    }
+
+    /**
+     * Add the '*' pointer character because our indexes are built on the
+     * convention that the type that can be looked up is "GObject*", not
+     * "GObject". Used by the createThing() and createGenerator()
+     * implementations.
+     */
+    static final String addPointerSymbol(final String bareGObjectName) {
+        StringBuffer buf;
+
+        if (bareGObjectName == null) {
+            return null;
+        }
+        buf = new StringBuffer(bareGObjectName);
+        buf.append('*');
+        return buf.toString().intern();
+    }
+
+    /**
+     * Reflection engine to populate object members based on key/value pairs
+     * in list
+     */
+    private void processCharacteristics(final List<String[]> list) {
+        Iterator<String[]> iter;
+
+        if (list == null) {
+            return;
+        }
+
+        iter = list.iterator();
+        while (iter.hasNext()) {
+            final String[] array;
+            final String name, value;
+            final Class<?>[] signature;
+            Method setter;
+            Class<?> target;
+
+            array = iter.next();
+
+            name = nameToMethod(array[0]);
+            value = array[1];
+
+            /*
+             * our setters are always setSomething(String)
+             */
+            signature = new Class[] {
+                String.class
+            };
+
+            /*
+             * Class's getMethod() searches super classes, but only for public
+             * methods. So we have to use getDeclaredMethod() and walk up the
+             * hierarchy. What a bore.
+             */
+
+            target = this.getClass();
+            setter = null;
+
+            while (target != Object.class) {
+                try {
+                    setter = target.getDeclaredMethod(name, signature);
+                    break;
+                } catch (NoSuchMethodException nsme) {
+                    target = target.getSuperclass();
+                }
+            }
+            if (setter == null) {
+                throw new IllegalStateException("Setter " + name + "() not found");
+            }
+
+            /*
+             * Call setter.
+             */
+
+            try {
+                setter.invoke(this, new Object[] {
+                    value
+                });
+            } catch (IllegalArgumentException e) {
+                // If all screwed up
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                // This shouldn't happen - setters are all protected here or
+                // in super classes above us.
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                if (e.getCause() instanceof UnnecessaryCodeException) {
+                    throw (UnnecessaryCodeException) e.getCause();
+                }
+                // the setter itself threw an exception! Crazy.
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * .defs files have characteristic names like "c-name" and "return-value".
+     * Convert these to "setCName" and "setReturnValue" for calling setter.
+     */
+    static final String nameToMethod(final String key) {
+        StringBuffer buf;
+        int i;
+        char ch;
+
+        buf = new StringBuffer(key);
+        buf.insert(0, '-');
+
+        i = 0;
+        while ((i = buf.indexOf("-", i)) != -1) {
+            buf.deleteCharAt(i);
+            ch = buf.charAt(i);
+            buf.setCharAt(i, Character.toUpperCase(ch));
+        }
+
+        buf.insert(0, "set");
+
+        return buf.toString();
+    }
+
+    /**
+     * Get the code factory appropriate to this Block type, with the
+     * additional supporting infromation of what class it fits into.
+     */
+    public abstract Generator createGenerator(DefsFile file);
+
+    /**
+     * Get the type wrapper Thing appropriate to this Block. Actually only
+     * relevant for TypeBlock subclasses.
+     */
+    public abstract Thing createThing();
+
+    public String toString() {
+        final StringBuffer buf;
+        Class<?> target;
+
+        buf = new StringBuffer();
+
+        buf.append(this.getClass().getName());
+        buf.append("\n");
+
+        target = this.getClass();
+        while (target != Object.class) {
+            Field[] fields;
+            int i;
+
+            fields = target.getDeclaredFields();
+            for (i = 0; i < fields.length; i++) {
+                String name;
+                Object value;
+
+                // There's something weird about a few extra Class objects
+                // showing up.
+                if (fields[i].getType() == Class.class) {
+                    continue;
+                }
+
+                buf.append("\t");
+                name = fields[i].getName();
+                buf.append(name);
+                buf.append(": ");
+
+                try {
+                    value = fields[i].get(this);
+                } catch (IllegalArgumentException e) {
+                    // huh?
+                    e.printStackTrace();
+                    continue;
+                } catch (IllegalAccessException e) {
+                    // go figure.
+                    e.printStackTrace();
+                    continue;
+                }
+
+                if (name.equals("parameters")) {
+                    buf.append("\n");
+                    String[][] p = (String[][]) value;
+                    for (int j = 0; j < p.length; j++) {
+                        buf.append("\t\t");
+                        buf.append(p[j][0]);
+                        buf.append(" ");
+                        buf.append(p[j][1]);
+                        buf.append("\n");
+                    }
+                } else {
+                    buf.append(value);
+                    buf.append("\n");
+                }
+            }
+            target = target.getSuperclass();
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     * In order to put the import statements that goes at the top of the Java
+     * class file, we need to extract a list of all the types used in this
+     * Block.
+     * 
+     * @return a List of Things. It would have been an array, but subclasses
+     *         often want to build up the list; this is easier if less type
+     *         safe (in a pre-generics world).
+     */
+    public abstract List<Thing> usesTypes();
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/BoxedBlock.java b/src/generator/com/operationaldynamics/defsparser/BoxedBlock.java
new file mode 100644
index 0000000..0c5b425
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/BoxedBlock.java
@@ -0,0 +1,93 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.BoxedGenerator;
+import com.operationaldynamics.codegen.BoxedThing;
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Block object representing the .defs data defining a GBoxed. Source .defs
+ * data for a boxed is of the following form:
+ * 
+ * <pre>
+ *  (define-boxed Cursor
+ *    (in-module "Gdk")
+ *    (c-name "GdkCursor")
+ *    (gtype-id "GDK_TYPE_CURSOR")
+ *    (copy-func "gdk_cursor_ref")
+ *    (release-func "gdk_cursor_unref")
+ *    (fields
+ *      '("GdkCursorType" "type")
+ *    )
+ *  )
+ * </pre>
+ * 
+ * The "(fields ...)" subcharacteristic lines present in some GBoxed
+ * definitions define the fields of the underlying C struct wrapped by the
+ * boxed. These are represented by GetterBlock and SetterBlock instances that
+ * are manually created when DefsParser encounters a (define-boxed ...)
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public class BoxedBlock extends TypeBlock
+{
+    protected String copyFunc;
+
+    protected String releaseFunc;
+
+    public BoxedBlock(final String blockName, final List<String[]> characteristics) {
+        super(blockName, characteristics);
+    }
+
+    protected final void setCopyFunc(final String copyFunc) {
+        this.copyFunc = copyFunc;
+    }
+
+    protected final void setReleaseFunc(final String releaseFunc) {
+        this.releaseFunc = releaseFunc;
+    }
+
+    public Thing createThing() {
+        final String javaType;
+        final BoxedThing t;
+
+        /*
+         * GdkEventAny is an exception to the usual GBoxeds wrapping, as we
+         * don't need to expose it in our public API. Thus, the java type that
+         * wraps this boxed is a org.gnome.gdk.Event.
+         */
+        javaType = "EventAny".equals(blockName) ? "Event" : blockName;
+
+        t = new BoxedThing(addPointerSymbol(cName), moduleToJavaPackage(inModule), cName, javaType);
+        t.setImportHeader(importHeader);
+
+        return t;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new BoxedGenerator(data);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/DefsLineNumberReader.java b/src/generator/com/operationaldynamics/defsparser/DefsLineNumberReader.java
new file mode 100644
index 0000000..65daa29
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/DefsLineNumberReader.java
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.io.LineNumberReader;
+import java.io.Reader;
+
+/**
+ * A LineNumberReader that knows the name of the file its reading.
+ * 
+ * @author Andrew Cowie
+ */
+public class DefsLineNumberReader extends LineNumberReader
+{
+    private final String filename;
+
+    /**
+     * 
+     * @param in
+     *            It's pretty much assumed that this will be a FileReader, but
+     *            the type is left abstract to facilitate unit tests.
+     * @param filename
+     *            the name of the file being parsed.
+     */
+    public DefsLineNumberReader(final Reader in, final String filename) {
+        super(in);
+        this.filename = filename;
+    }
+
+    public String getFilename() {
+        return filename;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/DefsParseException.java b/src/generator/com/operationaldynamics/defsparser/DefsParseException.java
new file mode 100644
index 0000000..b4ef06f
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/DefsParseException.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.text.ParseException;
+
+/**
+ * Failure to parse a line of a .defs file
+ * 
+ * @author Andrew Cowie
+ */
+public class DefsParseException extends ParseException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * The three parameters are aggregated to gether into one message.
+     * 
+     * @param problem
+     * @param defsLine
+     *            the raw line from the defs file that the parser choked on.
+     * @param lineNumber
+     *            the line of the defs file where the problem occured.
+     */
+    public DefsParseException(String problem, String defsLine, DefsLineNumberReader in) {
+        super("In " + in.getFilename() + ", line " + in.getLineNumber() + ":\n" + defsLine + "\n"
+                + problem, 0);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/DefsParser.java b/src/generator/com/operationaldynamics/defsparser/DefsParser.java
new file mode 100644
index 0000000..9687f31
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/DefsParser.java
@@ -0,0 +1,389 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+/*
+ * This code started life as prototype written in Perl by Andrew Cowie. The
+ * parser portion was later ported to Python by Srichand Pendyala when we
+ * realized that trying to do object-oriented programming in Perl was a
+ * non-starter. Although we had a second working prototype in Python, it in
+ * turn was abandonded when I realized that my governing assumption - that we
+ * needed here docs to output code cleanly - wasn't necessarily true. While
+ * here docs indeed made for clean templates in the code generator, working in
+ * Python was not really much more productive that Perl had been. On the other
+ * hand, accepting some inconveniences in exchange for being able to work in
+ * Java with the powerful tools we have available to develop and debug seems a
+ * good trade. While nothing beyond the original regular expressions has
+ * survived from the Perl program, and the Python program only has echos here,
+ * thanks are nevertheless due to Srichand for his hard work assisting in the
+ * prototyping process.
+ */
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * A .defs file parser: convert a stream of s-expression defines data into an
+ * array of Block objects suitable to be used to instantiate code generators.
+ * 
+ * <p>
+ * Observations:
+ * <ul>
+ * <li>We don't have include directives in our defs files. They're all flat.
+ * <li>At the moment, we have one type per file, but this class does not rely
+ * on that; it's just a .defs parser.
+ * </ul>
+ * 
+ * @author Andrew Cowie
+ */
+public class DefsParser
+{
+    private final DefsLineNumberReader source;
+
+    /*
+     * Parser state
+     */
+
+    private List<String[]> characteristics, values, fields, parameters;
+
+    private String phylum;
+
+    private String name;
+
+    /*
+     * Java is a bit annoying about caching constant things, since they [have
+     * to] end up as class members, but to do the regex compile only once, its
+     * best done this way.
+     */
+    private static final Pattern defineLine;
+
+    private static final Pattern characteristicLine;
+
+    private static final Pattern parametersBegin;
+
+    private static final Pattern fieldsBegin;
+
+    private static final Pattern valuesBegin;
+
+    private static final Pattern subCharacteristicsLine;
+
+    private static final Pattern subEnds;
+
+    static {
+        // (define-method get_some
+        defineLine = Pattern.compile("^\\(define-(\\w+)\\s+(\\w+)");
+
+        /*
+         * (?:X) is a "non-capturing group".
+         */
+        // __(c-name "gtk_button_new_with_label")
+        // __(return-type "GtkWidget*")
+        // __(return-type "const-gchar")
+        // __(deprecated)
+        characteristicLine = Pattern.compile("^\\s+\\((\\S+)(?:\\s+\"?([\\w #\\(\\)'/\\.\\-\\*]+)\"?)?\\)");
+
+        /*
+         * TODO: it's not entirely clear that we actually need to support
+         * arbitrary sub-characteristic types; now that I've gone and coded
+         * all this and we differentiate when we call the Block constructors,
+         * I wonder if a three-way-or in the regex would have done well
+         * enough. Might simplify things.
+         */
+
+        // __(parameters
+        parametersBegin = Pattern.compile("^\\s+\\(parameters");
+
+        // __(fields
+        fieldsBegin = Pattern.compile("^\\s+\\(fields");
+
+        // __(values
+        valuesBegin = Pattern.compile("^\\s+\\(values");
+
+        /*
+         * FIXME The final dot-star excludes qualifying information as found
+         * in lines like the second following line; we need to figure out
+         * whether we need to capture and use this information; while defaul
+         * values are meaningless in Java (except in so far as advising that
+         * an overloaded public API method with less parameters and using that
+         * default might make sense), we'll need it for others (ie (null-ok),
+         * which would allow us to put an assert elsewhere, and (read-write)
+         * if we add it to struct fields to indicate that it's ok to create a
+         * setter)
+         */
+        // ____'("const-gchar*" "label")
+        // ____'("gfloat[]" "vector")
+        // ____'("GtkButtonsType" "buttons" (default "GTK_BUTTONS_NONE"))
+        subCharacteristicsLine = Pattern.compile("^\\s+'\\(\"([\\w\\-\\*\\[\\]]+)\"\\s+\"([\\w]+)\".*\\)");
+
+        // __)
+        subEnds = Pattern.compile("^\\s+\\)");
+    }
+
+    /**
+     * Initialize the parser for a stream of .defs data.
+     * 
+     * @param source
+     *            a data stream containing s-expression .defs data.
+     * @param filename
+     *            name of the .defs file being parsed (for debug purposes)
+     */
+    public DefsParser(DefsLineNumberReader source) {
+        this.source = source;
+    }
+
+    /**
+     * Read a series of lines from the input source comprising a complete
+     * (define- ...) block, storing them in the parser state.
+     * 
+     * @return whether or not a complete ( ) balanced stanza was read. If
+     *         there was, there might be another one.
+     */
+    boolean readNextStanza() throws ParseException {
+        String line;
+        Matcher m;
+        List<String[]> l;
+
+        /*
+         * Clear the parser state:
+         */
+
+        phylum = null;
+        name = null;
+
+        characteristics = new ArrayList<String[]>();
+        values = new ArrayList<String[]>();
+        fields = new ArrayList<String[]>();
+        parameters = new ArrayList<String[]>();
+
+        try {
+
+            /*
+             * Handle the first line, always of the form "(define-phylum name"
+             */
+
+            while ((line = source.readLine()) != null) {
+                if (line.equals("")) {
+                    continue;
+                }
+                if (line.startsWith(";;")) {
+                    continue;
+                }
+                break;
+            }
+            if (line == null) {
+                return false;
+            }
+
+            m = defineLine.matcher(line);
+
+            if (!m.matches()) {
+                throw new DefsParseException("Parser failed to find a proper define line", line, source);
+            }
+
+            phylum = m.group(1);
+            name = m.group(2).intern();
+
+            /*
+             * Run through subsequent lines, sorting the key/values in the
+             * characteristics list. If we hit a fields or parameters sublist,
+             * change the target list accordingly and carry on.
+             */
+
+            l = characteristics;
+
+            while ((line = source.readLine()) != null) {
+                String key, value;
+
+                if (line.equals(")")) {
+                    return true;
+                }
+                if (line.startsWith(";;")) {
+                    continue;
+                }
+
+                if (parametersBegin.matcher(line).matches()) {
+                    l = parameters;
+                    continue;
+                } else if (fieldsBegin.matcher(line).matches()) {
+                    l = fields;
+                    continue;
+                } else if (valuesBegin.matcher(line).matches()) {
+                    l = values;
+                    continue;
+                } else if (subEnds.matcher(line).matches()) {
+                    l = characteristics;
+                    continue;
+                }
+
+                if (l == characteristics) {
+                    m = characteristicLine.matcher(line);
+                } else {
+                    m = subCharacteristicsLine.matcher(line);
+                }
+
+                if (!m.matches()) {
+                    throw new DefsParseException("Couldn't match characteristics line", line, source);
+                }
+
+                key = m.group(1);
+                if (key != null) {
+                    key = key.intern();
+                }
+                value = m.group(2);
+                if (value != null) {
+                    value = value.intern();
+                }
+
+                if (key == null) {
+                    throw new DefsParseException("Parsed key turned out to be null", line, source);
+                }
+
+                /*
+                 * reduce the String pressure by normalizing the Strings to
+                 * intern() before placing them into the arrays used for
+                 * subsequent manipulation.
+                 */
+                if (l == parameters) {
+                    // TODO could null-ok be present in other than parameters
+                    l.add(new String[] {
+                        key,
+                        value,
+                        /* 3rd value is used to take null-ok under control */
+                        line.indexOf("(null-ok)") != -1 ? "yes" : "no"
+                    });
+                } else {
+                    l.add(new String[] {
+                        key,
+                        value
+                    });
+                }
+            }
+        } catch (IOException ioe) {
+            // ignore? Either way, it's end of file, right?
+        }
+
+        return false;
+    }
+
+    /**
+     * Run the parser across the input data stream and return an array of
+     * Block objects representing the (define- ...) blocks found there.
+     */
+    /*
+     * FIXME the fact that there are two exceptions that come out of this,
+     * both for the same problem needs to be changed.
+     */
+    public Block[] parseData() {
+        List<Block> blocks;
+        Block block;
+        BoxedBlock parent;
+        Iterator<String[]> iter;
+        String[] field;
+
+        blocks = new ArrayList<Block>();
+
+        while (true) {
+            try {
+                if (!readNextStanza()) {
+                    break;
+                }
+
+                /*
+                 * And now, with the stanza's data organized into Lists,
+                 * instantiate the appropriate Block object to represent the
+                 * data. Block's processCharacteristics() and FunctionBlock's
+                 * processParameters() complete the parsing by allocating
+                 * key/value pairs to fields in the Block objects.
+                 */
+
+                if (phylum.equals("object")) {
+                    block = new ObjectBlock(name, characteristics, fields);
+                    blocks.add(block);
+                } else if (phylum.equals("interface")) {
+                    block = new InterfaceBlock(name, characteristics);
+                    blocks.add(block);
+                } else if (phylum.equals("method")) {
+                    block = new MethodBlock(name, characteristics, parameters);
+                    blocks.add(block);
+                } else if (phylum.equals("function")) {
+                    block = new FunctionBlock(name, characteristics, parameters);
+                    blocks.add(block);
+                } else if ((phylum.equals("virtual")) || (phylum.equals("signal"))) {
+                    block = new VirtualBlock(name, characteristics, parameters);
+                    blocks.add(block);
+                } else if (phylum.equals("enum")) {
+                    block = new EnumBlock(name, characteristics, values);
+                    blocks.add(block);
+                } else if (phylum.equals("flags")) {
+                    block = new FlagsBlock(name, characteristics, values);
+                    blocks.add(block);
+                } else if (phylum.equals("boxed")) {
+                    block = new BoxedBlock(name, characteristics);
+                    blocks.add(block);
+
+                    parent = (BoxedBlock) block;
+
+                    iter = fields.iterator();
+                    while (iter.hasNext()) {
+                        field = iter.next();
+
+                        block = new GetterBlock(parent, field[0], field[1]);
+                        blocks.add(block);
+
+                        /*
+                         * FIXME this is just for testing! Most GTK fields are
+                         * read only! Field setters must ONLY be generated if
+                         * it is known safe to do so and so annotated in the
+                         * fields line in the defs data.
+                         */
+                        block = new SetterBlock(parent, field[0], field[1]);
+                        blocks.add(block);
+                    }
+                } else if (phylum.equals("entity")) {
+                    block = new EntityBlock(name, characteristics);
+                    blocks.add(block);
+                } else {
+                    // etc
+                    throw new ParseException("What kind of block was \"" + phylum + "\"?", 0);
+                }
+
+            } catch (ParseException pe) {
+                System.out.println("Failed to parse");
+                System.out.print(source.getFilename() + ", ");
+                System.out.println(pe.getMessage());
+                System.out.println("[continuing next block]\n");
+            } catch (UnnecessaryCodeException uce) {
+                // TODO skip to next file?
+            } catch (IllegalStateException ise) {
+                System.out.println("Failed parsing (an internal problem? FIXME!):");
+                System.out.print(source.getFilename() + ", ");
+                System.out.println(ise.getMessage());
+                System.out.println("[continuing next block]\n");
+            }
+        }
+
+        // Wow. Eclipse gave me this as a template. Nice.
+        return blocks.toArray(new Block[blocks.size()]);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/EntityBlock.java b/src/generator/com/operationaldynamics/defsparser/EntityBlock.java
new file mode 100644
index 0000000..6ee6c71
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/EntityBlock.java
@@ -0,0 +1,66 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.EntityGenerator;
+import com.operationaldynamics.codegen.EntityThing;
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Block object representing the .defs data defining the entities in
+ * (currently) the Cairo library. The key feature is forcing the bindings
+ * class name to be wildly different than the wacko C side name.
+ * 
+ * @author Andrew Cowie
+ */
+public class EntityBlock extends TypeBlock
+{
+    public EntityBlock(final String blockName, final List<String[]> characteristics) {
+        super(blockName, characteristics);
+    }
+
+    public Thing createThing() {
+        final String bindingsPackage;
+        final EntityThing t;
+
+        bindingsPackage = moduleToJavaPackage(inModule);
+
+        if (bindingsPackage.equals("org.freedesktop.enchant")) {
+            t = new EntityThing(addPointerSymbol(cName), bindingsPackage, cName, blockName);
+        } else {
+            /*
+             * Note that we're not using cName here; it's cairo_t and not
+             * suitable as a generated bindings layer class name.
+             */
+            t = new EntityThing(addPointerSymbol(cName), bindingsPackage, inModule + blockName,
+                    blockName);
+        }
+
+        t.setImportHeader(importHeader);
+        return t;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new EntityGenerator(data);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/EnumBlock.java b/src/generator/com/operationaldynamics/defsparser/EnumBlock.java
new file mode 100644
index 0000000..af6895c
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/EnumBlock.java
@@ -0,0 +1,75 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.EnumGenerator;
+import com.operationaldynamics.codegen.EnumThing;
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Block object representing the .defs data defining a Enum.
+ * 
+ * Source .defs data for an emum is of the following form:
+ * 
+ * <pre>
+ *  (define-enum ReliefStyle
+ *    (in-module "Gtk")
+ *    (c-name "GtkReliefStyle")
+ *    (values
+ *      '("normal" "GTK_RELIEF_NORMAL")
+ *      '("half" "GTK_RELIEF_HALF")
+ *      '("none" "GTK_RELIEF_NONE")
+ *    )
+ *  )
+ * </pre>
+ * 
+ * Enums are unusual in that all the information needed to define the Java
+ * code that will result for this native type is in a single (define...)
+ * stanza; most other TypeBlocks are accompanied by a series of FunctionBlock
+ * subclasses.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class EnumBlock extends TypeBlock
+{
+    protected String[][] values;
+
+    EnumBlock(String blockName, List<String[]> characteristics, List<String[]> values) {
+        super(blockName, characteristics);
+
+        processValues(values);
+    }
+
+    private void processValues(final List<String[]> values) {
+        this.values = values.toArray(new String[values.size()][]);
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new EnumGenerator(data, values);
+    }
+
+    public Thing createThing() {
+        return new EnumThing(cName, moduleToJavaPackage(inModule), inModule + blockName, blockName);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/FlagsBlock.java b/src/generator/com/operationaldynamics/defsparser/FlagsBlock.java
new file mode 100644
index 0000000..7a5dd1a
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/FlagsBlock.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.FlagsGenerator;
+import com.operationaldynamics.codegen.FlagsThing;
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Block object representing the .defs data defining a Flag. A flag is like an
+ * enum, but their ordinal values can't be obtained in an automatic way.
+ * 
+ * Source .defs data for an emum is of the following form:
+ * 
+ * <pre>
+ *  (define-flags WindowState
+ *    (in-module "Gdk")
+ *    (c-name "GdkWindowState")
+ *    (gtype-id "GDK_TYPE_WINDOW_STATE")
+ *    (values
+ *      '("withdrawn" "GDK_WINDOW_STATE_WITHDRAWN")
+ *      '("iconified" "GDK_WINDOW_STATE_ICONIFIED")
+ *    )
+ *  )
+ * </pre>
+ * 
+ * Like Enums, all the information needed to define the Java code that will
+ * result for a Flag type is in a single (define...) stanza.
+ * 
+ * @author Vreixo Formoso
+ */
+public class FlagsBlock extends EnumBlock
+{
+    FlagsBlock(String blockName, List<String[]> characteristics, List<String[]> values) {
+        super(blockName, characteristics, values);
+    }
+
+    public Thing createThing() {
+        FlagsThing t = new FlagsThing(cName, moduleToJavaPackage(inModule), inModule + blockName,
+                blockName);
+        t.setImportHeader(importHeader);
+        return t;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new FlagsGenerator(data, values);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/FunctionBlock.java b/src/generator/com/operationaldynamics/defsparser/FunctionBlock.java
new file mode 100644
index 0000000..f949695
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/FunctionBlock.java
@@ -0,0 +1,210 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.operationaldynamics.codegen.ConstructorGenerator;
+import com.operationaldynamics.codegen.FunctionGenerator;
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.InterfaceThing;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * A .defs (define-function...) block, and the superclass for other entities
+ * that are represented in C with functions. This also includes functions with
+ * the "is-constructor-of" attributes, i.e. constructors.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public class FunctionBlock extends Block
+{
+    /**
+     * Strictly speaking, this isn't here, but down in MethodBlock and
+     * VirtualBlock. But it needs to be figured out before FunctionGenerator
+     * can be used in a (define-function ...), and it's present for all the
+     * sub block types.
+     */
+    protected String ofObject;
+
+    protected String returnType;
+
+    protected String cName;
+
+    protected String[][] parameters;
+
+    protected String callerOwnsReturn;
+
+    protected String varargs;
+
+    protected String isConstructorOf;
+
+    FunctionBlock(final String blockName, final List<String[]> characteristics,
+            final List<String[]> parameters) {
+        super(blockName, characteristics);
+
+        processParameters(parameters);
+
+        if (varargs != null) {
+            appendVarargsMark();
+        }
+    }
+
+    final void setOfObject(final String ofObject) {
+        this.ofObject = ofObject;
+    }
+
+    private void processParameters(final List<String[]> parameters) {
+        this.parameters = parameters.toArray(new String[parameters.size()][]);
+    }
+
+    protected final void setCallerOwnsReturn(final String callerOwnsReturn) {
+        this.callerOwnsReturn = callerOwnsReturn;
+    }
+
+    protected final char getCallerOwnsReturn() {
+        if (this.callerOwnsReturn == null) {
+            return 'f';
+        } else {
+            return this.callerOwnsReturn.charAt(1);
+        }
+    }
+
+    protected final void setIsConstructorOf(final String isConstructorOf) {
+        this.isConstructorOf = isConstructorOf;
+    }
+
+    protected final void setCName(final String name) {
+        this.cName = name;
+    }
+
+    protected final void setReturnType(final String returnType) {
+        this.returnType = returnType;
+    }
+
+    /*
+     * We don't model variable length arguments in java-gnome, but we do need
+     * to pass this along so that we can stick a NULL as a last argument to
+     * avoid "warning: not enough variable arguments to fit a sentinel" from
+     * the C compiler.
+     */
+    protected final void setVarargs(final String value) {
+        this.varargs = value;
+    }
+
+    /**
+     * Only the TypeBlock class hierarchy can create and return Things that
+     * match a given Block.
+     */
+    public Thing createThing() {
+        throw new UnsupportedOperationException();
+    }
+
+    /*
+     * Special cases will probably be needed for at least VirtualBlock, but
+     * this is a good start.
+     */
+    public List<Thing> usesTypes() {
+        List<Thing> types;
+        Thing t;
+
+        types = new ArrayList<Thing>(parameters.length + 1);
+
+        /*
+         * For constructors, our translation layer method will return long and
+         * not the actual type, so we don't need to import it.
+         */
+        if (isConstructorOf == null) {
+            t = Thing.lookup(returnType).getTypeToImport();
+            if (t != null) {
+                types.add(t);
+            }
+        }
+
+        for (int i = 0; i < parameters.length; i++) {
+            t = Thing.lookup(parameters[i][0]);
+            t = t.getTypeToImport();
+            if (t == null) {
+                continue;
+            }
+            types.add(t);
+
+            if (t instanceof InterfaceThing) {
+                types.add(Thing.lookup("GObject*"));
+            }
+        }
+
+        return types;
+    }
+
+    /**
+     * Load the reference-to-self that all "method" functions start with onto
+     * the beginning of the parameters List. Used by MethodBlock and
+     * AccessorBlock, in case you're wondering what this is doing here.
+     */
+    protected void prependReferenceToSelf() {
+        String[][] target;
+
+        target = new String[parameters.length + 1][3];
+        System.arraycopy(parameters, 0, target, 1, parameters.length);
+
+        target[0][0] = addPointerSymbol(ofObject);
+        target[0][1] = "self";
+        target[0][2] = "no"; /* self can't ever be null */
+
+        parameters = target;
+    }
+
+    /**
+     * The varrags case is handled, essentially, as an artificial last
+     * parameter. This utility method appends a marker to show that the
+     * function being described by this Block was declared as taking variable
+     * arguments. We do not actually present this with any kind of public API
+     * (and may never do so), but we do need to deal with this at the C
+     * library call layer because those functions require a NULL in the
+     * argument list to signal the end of the list.
+     * 
+     * The FunctionGenerator constructor will strip it off the end of the
+     * parameters list (thus allowing us to avoid needing a SentinalThing).
+     */
+    protected void appendVarargsMark() {
+        String[][] target;
+
+        target = new String[parameters.length + 1][3];
+        System.arraycopy(parameters, 0, target, 0, parameters.length);
+
+        target[parameters.length][0] = "...";
+
+        parameters = target;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        if (isConstructorOf != null) {
+            return new ConstructorGenerator(data, blockName, returnType, cName, parameters,
+                    getCallerOwnsReturn());
+        } else {
+            return new FunctionGenerator(data, blockName, returnType, cName, parameters,
+                    getCallerOwnsReturn());
+        }
+    }
+
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/GetterBlock.java b/src/generator/com/operationaldynamics/defsparser/GetterBlock.java
new file mode 100644
index 0000000..d1e5afc
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/GetterBlock.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.Collections;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.GetterGenerator;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Pseudo Block which is to be created when a public field is exposed in a
+ * (define-boxed ...) with one or more (fields (...)) subcharacteristics.
+ * block is writable. Note that this is <b>not</b> a (define-method ...) block
+ * in the source data; we just create these so that we can drive creation of a
+ * getter method when the generator runs.
+ * 
+ * @author Andrew Cowie
+ */
+public class GetterBlock extends AccessorBlock
+{
+    /**
+     * This breaks the convention used by all the other Block subclass
+     * constructors, but this and SetterBlock are special "psuedo" cases
+     * anyway, so no great harm done. The call to super() in AccessorBlock
+     * normalizes the behaviour in any case.
+     * 
+     * @param gType
+     *            the type from the (define-boxed (fields (...))) line.
+     * @param name
+     *            the name from the (define-boxed (fields (...))) line.
+     * @param ofObject
+     *            the boxed this getter belongs to
+     */
+    @SuppressWarnings("unchecked")
+    GetterBlock(final BoxedBlock parent, final String gType, final String name) {
+        super(name, parent, Collections.EMPTY_LIST);
+
+        this.returnType = gType;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new GetterGenerator(data, returnType, blockName, parameters);
+    }
+
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/InterfaceBlock.java b/src/generator/com/operationaldynamics/defsparser/InterfaceBlock.java
new file mode 100644
index 0000000..ccf2df7
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/InterfaceBlock.java
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.InterfaceGenerator;
+import com.operationaldynamics.codegen.InterfaceThing;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * ObjectBlocks could well be subclasses of TypeBlock, but we need the parent
+ * field and that's already implemented in ObjectBlock, so, good enough.
+ * 
+ * @author Andrew Cowie
+ */
+public class InterfaceBlock extends ObjectBlock
+{
+    public InterfaceBlock(final String blockName, final List<String[]> characteristics) {
+        super(blockName, characteristics, null);
+    }
+
+    public Thing createThing() {
+        return new InterfaceThing(addPointerSymbol(cName), moduleToJavaPackage(inModule), cName,
+                blockName);
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new InterfaceGenerator(data, addPointerSymbol(parent), implementsToArray(interfaces));
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/MethodBlock.java b/src/generator/com/operationaldynamics/defsparser/MethodBlock.java
new file mode 100644
index 0000000..1c83fe6
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/MethodBlock.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.MethodGenerator;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * A .defs block that gives the information for a method on a GObject.
+ * 
+ * <p>
+ * Source .defs data is of the following form:
+ * 
+ * <pre>
+ *  (define-method set_label
+ *    (of-object "GtkButton")
+ *    (c-name "gtk_button_set_label")
+ *    (return-type "none")
+ *    (parameters
+ *      '("const-gchar*" "label")
+ *    )
+ *  )
+ * </pre>
+ * 
+ * In a sense, the definition of a method in GNOME terms is a function whose
+ * first parameter is a pointer to the object that the function will act on.
+ * This is implicit in the .defs data so we prepend a reference to self to the
+ * parameter list as we construct the object to represent this block.
+ * 
+ * @author Andrew Cowie
+ */
+class MethodBlock extends FunctionBlock
+{
+    /*
+     * NOTE: ofObject should be here (by the defs file legacy), but its needed
+     * at FunctionGenerator level, and VirtualBlocks have it too.
+     */
+
+    MethodBlock(final String blockName, final List<String[]> characteristics,
+            final List<String[]> parameters) {
+        super(blockName, characteristics, parameters);
+
+        prependReferenceToSelf();
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new MethodGenerator(data, blockName, returnType, cName, parameters, getCallerOwnsReturn());
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/ObjectBlock.java b/src/generator/com/operationaldynamics/defsparser/ObjectBlock.java
new file mode 100644
index 0000000..cfde60c
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/ObjectBlock.java
@@ -0,0 +1,94 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.ObjectGenerator;
+import com.operationaldynamics.codegen.ObjectThing;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Block object representing the .defs data defining a GObject.
+ * 
+ * @author Andrew Cowie
+ */
+public class ObjectBlock extends TypeBlock
+{
+    protected String parent;
+
+    protected List<String> interfaces;
+
+    public ObjectBlock(final String blockName, final List<String[]> characteristics,
+            final List<String[]> fields) {
+        super(blockName, characteristics);
+
+        processFields(fields);
+    }
+
+    /**
+     * The "(fields ...)" subcharacteristic lines present in some GObject
+     * definitions are not used by the java-gnome bindings at present.
+     */
+    /*
+     * fields would be String[][]
+     */
+    protected final void processFields(List<String[]> fields) {}
+
+    protected final void setParent(final String parent) {
+        this.parent = parent;
+    }
+
+    protected final void setImplements(final String impl) {
+        if (interfaces == null) {
+            interfaces = new ArrayList<String>(1);
+        }
+        interfaces.add(impl);
+    }
+
+    public Thing createThing() {
+        ObjectThing t = new ObjectThing(addPointerSymbol(cName), moduleToJavaPackage(inModule), cName,
+                blockName);
+        t.setImportHeader(importHeader);
+        return t;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new ObjectGenerator(data, addPointerSymbol(parent), implementsToArray(interfaces));
+    }
+
+    protected static String[] implementsToArray(List<String> interfaces) {
+        String[] implemented;
+        int i;
+
+        if (interfaces == null) {
+            return new String[0];
+        }
+
+        implemented = new String[interfaces.size()];
+        for (i = 0; i < implemented.length; i++) {
+            implemented[i] = addPointerSymbol(interfaces.get(i));
+        }
+
+        return implemented;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/SetterBlock.java b/src/generator/com/operationaldynamics/defsparser/SetterBlock.java
new file mode 100644
index 0000000..c22818a
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/SetterBlock.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.Collections;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.SetterGenerator;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Pseudo Block which is to be created if a field in a (define-boxed ...)
+ * block is writable. TODO describe what that looks like, exactly.
+ * 
+ * @author Andrew Cowie
+ * @see GetterBlock
+ */
+public class SetterBlock extends AccessorBlock
+{
+    SetterBlock(final BoxedBlock parent, final String gType, final String name) {
+        // TODO mmm, how can we know if a field can be null?
+        super(name, parent, Collections.singletonList(new String[] {
+            gType,
+            name,
+            "no"
+        }));
+
+        this.returnType = gType;
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new SetterGenerator(data, returnType, blockName, parameters);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/TypeBlock.java b/src/generator/com/operationaldynamics/defsparser/TypeBlock.java
new file mode 100644
index 0000000..05fbfb2
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/TypeBlock.java
@@ -0,0 +1,112 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * Base class for blocks that declare type information. <b>Note that TypeBlock
+ * does not imply total information for what will become an entire Java
+ * compilation unit; it's just the information that allows us to know that the
+ * type exists in the first place.</b> The context that this block lives in is
+ * represented in this program by the {@link DefsFile} class.
+ * 
+ * @author Andrew Cowie
+ */
+public abstract class TypeBlock extends Block
+{
+    protected String inModule;
+
+    protected String cName;
+
+    protected List<String> importHeader;
+
+    protected TypeBlock(final String blockName, final List<String[]> characteristics) {
+        super(blockName, characteristics);
+    }
+
+    final void setCName(final String name) {
+        this.cName = name;
+    }
+
+    /**
+     * We ignore gtype-id completely as it is unnecessary in the java-gnome
+     * context, but this stub allows the reflection to work when it hits a
+     * characteristic so named.
+     */
+    protected final void setGtypeId(final String gtypeId) {}
+
+    protected final void setInModule(final String inModule) {
+        this.inModule = inModule;
+    }
+
+    /**
+     * Some types need additional import header, other than <gtk/gtk.h>. This
+     * characteristic, introduced by java-gnome, solves that problem.
+     */
+    protected final void setImportHeader(final String importHeader) {
+        if (this.importHeader == null) {
+            this.importHeader = new ArrayList<String>(1);
+        }
+        this.importHeader.add(importHeader);
+    }
+
+    /**
+     * Convert the module name to a package suiting the Java namespace and our
+     * mapping into it. At the moment, this simply means "Gtk" ->
+     * "org.gnome.gtk". FUTURE when we wrap things outside of GNOME this will
+     * have to change somewhat radically.
+     */
+    protected static String moduleToJavaPackage(String module) {
+        StringBuffer buf;
+        char ch;
+
+        if (module.equals("Cairo")) {
+            return "org.freedesktop.cairo";
+        } else if (module.equals("Enchant")) {
+            return "org.freedesktop.enchant";
+        } else if (module.equals("GtkSourceView")) {
+            return "org.gnome.sourceview";
+        }
+
+        buf = new StringBuffer(module);
+
+        ch = buf.charAt(0);
+        ch = Character.toLowerCase(ch);
+        buf.setCharAt(0, ch);
+
+        buf.insert(0, "org.gnome.");
+
+        return buf.toString();
+    }
+
+    /*
+     * Default bahavior, as most TypeBlock's don't import anything. This will
+     * have to change if we start using the values subcharacteristics in
+     * ObjectBlocks.
+     */
+    public List<Thing> usesTypes() {
+        return Collections.emptyList();
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/UnnecessaryCodeException.java b/src/generator/com/operationaldynamics/defsparser/UnnecessaryCodeException.java
new file mode 100644
index 0000000..07e4afc
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/UnnecessaryCodeException.java
@@ -0,0 +1,34 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+/**
+ * Used to cause the parser to skip a block containing a (deprecated...) or
+ * (unnecessary...) declaration.
+ * 
+ * @author Andrew Cowie
+ */
+class UnnecessaryCodeException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    UnnecessaryCodeException(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/generator/com/operationaldynamics/defsparser/VirtualBlock.java b/src/generator/com/operationaldynamics/defsparser/VirtualBlock.java
new file mode 100644
index 0000000..823a61e
--- /dev/null
+++ b/src/generator/com/operationaldynamics/defsparser/VirtualBlock.java
@@ -0,0 +1,60 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.List;
+
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.codegen.VirtualGenerator;
+import com.operationaldynamics.driver.DefsFile;
+
+/**
+ * The block type for virtual methods. In the java-gnome bindings, these are
+ * translated as signal handlers.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * There isn't a whole lot that this gains by being a subclass of
+ * FunctionBlock, but it seems as good a place as any to slot it in.
+ */
+class VirtualBlock extends FunctionBlock
+{
+    VirtualBlock(String blockName, final List<String[]> characteristics, final List<String[]> parameters) {
+        super(blockName, characteristics, parameters);
+    }
+
+    public Generator createGenerator(final DefsFile data) {
+        return new VirtualGenerator(data, blockName, returnType, parameters);
+    }
+
+    /*
+     * Insert org.gnome.glib.Signal ("Signal" is a pseudo gType registered in
+     * Thing.<clinit>(). Yes, this is a bit kludgy.
+     */
+    public List<Thing> usesTypes() {
+        List<Thing> things;
+
+        things = super.usesTypes();
+        things.add(Thing.lookup("Signal"));
+
+        return things;
+    }
+}
diff --git a/src/generator/com/operationaldynamics/driver/DefsFile.java b/src/generator/com/operationaldynamics/driver/DefsFile.java
new file mode 100644
index 0000000..1e2f7e8
--- /dev/null
+++ b/src/generator/com/operationaldynamics/driver/DefsFile.java
@@ -0,0 +1,272 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.driver;
+
+import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import com.operationaldynamics.codegen.FundamentalThing;
+import com.operationaldynamics.codegen.Generator;
+import com.operationaldynamics.codegen.Thing;
+import com.operationaldynamics.defsparser.Block;
+import com.operationaldynamics.defsparser.TypeBlock;
+
+/**
+ * A wrapper class representing a parsed .defs file that contained a single
+ * native type. We use this to provide a clean mechanism to pass data between
+ * the parser and generator parts of the program.
+ * 
+ * TODO: needs a better name.
+ * 
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ */
+public final class DefsFile
+{
+    /**
+     * The type that this class represents.
+     */
+    private final Thing forObject;
+
+    /**
+     * The source array of parsed .defs Blocks
+     */
+    private final Block[] blocks;
+
+    /**
+     * The types being used in this file that are safe to import
+     */
+    // Sets don't do duplicates. Ta-da.
+    private final Set<Thing> typesToImport;
+
+    /**
+     * The remainder of the types in use in this file, which musy be used
+     * fully qualified.
+     */
+    private final Set<Thing> typesThatConflict;
+
+    private final Set<String> bareNamesInUse;
+
+    /**
+     * Create a new wrapper class representing the parsed .defs file for a
+     * single type. Along the way this registers the type in the Thing
+     * database, and generate the list of types used in the file, checking for
+     * import collisions.
+     * 
+     * @throws ImproperDefsFileException
+     *             if the supplised blocks array doesn't match our
+     *             expectations for ordering.
+     */
+    public DefsFile(final Block[] blocks) throws ImproperDefsFileException {
+        this.blocks = blocks;
+
+        if (blocks.length == 0) {
+            throw new ImproperDefsFileException("No data was parsed in this defs file");
+        }
+
+        if (!(blocks[0] instanceof TypeBlock)) {
+            throw new ImproperDefsFileException("First block in defs file didn't describe a type");
+        }
+
+        this.forObject = blocks[0].createThing();
+        Thing.register(forObject);
+
+        typesToImport = new HashSet<Thing>();
+        typesThatConflict = new HashSet<Thing>();
+        bareNamesInUse = new HashSet<String>();
+    }
+
+    public final Thing getType() {
+        return forObject;
+    }
+
+    /**
+     * Iterate over the Blocks in this DefsFile and work out what types can be
+     * imported, and what types must be fully qualified due to their bare name
+     * conflicting with a previous import.
+     */
+    /*
+     * Note that this is not in the constructor because it must only be called
+     * (and only once) after all Things are registered and full type
+     * information is available.
+     */
+    private void calculateImportsAndConflicts() {
+        List<Thing> things;
+        Iterator<Thing> iter;
+        Thing t;
+
+        for (int i = 0; i < blocks.length; i++) {
+            things = blocks[i].usesTypes();
+
+            iter = things.iterator();
+            while (iter.hasNext()) {
+                t = iter.next();
+
+                if (t.isBlacklisted()) {
+                    addToImports(Thing.lookup("Blacklist"));
+                    addToImports(Thing.lookup("FIXME"));
+                    continue;
+                }
+
+                if (t instanceof FundamentalThing) {
+                    continue;
+                }
+
+                /*
+                 * If this is the first time the bare Java class name is
+                 * added, then we can safely import it. Otherwise, that bare
+                 * name is [will be] imported already, so we're going to have
+                 * to fully qualifiy it.
+                 */
+
+                if (isNameImported(t)) {
+                    addToConflictsIfCollision(t);
+                } else {
+                    addToImports(t);
+                }
+            }
+        }
+    }
+
+    private void addToImports(Thing t) {
+        typesToImport.add(t);
+        bareNamesInUse.add(t.bareJavaClassName());
+    }
+
+    private void addToConflictsIfCollision(Thing t) {
+        if (typesToImport.contains(t)) {
+            // already know about it, not a conflict
+        } else {
+            typesThatConflict.add(t);
+        }
+    }
+
+    private boolean isNameImported(Thing t) {
+        return bareNamesInUse.contains(t.bareJavaClassName());
+    }
+
+    /**
+     * Having iterated over all the Blocks in this DefsFile's constructor,
+     * return a Set with the Things representing the types that <b>can</b> be
+     * imported. Assumes all types already registered.
+     */
+    public Set<Thing> getTypesToImport() {
+        return typesToImport;
+    }
+
+    /**
+     * Return a Set of the Things whose Java type names conflict with names
+     * already imported by this file.
+     */
+    public boolean doesTypeConflict(Thing type) {
+        return typesThatConflict.contains(type);
+    }
+
+    /**
+     * Generate a stub for the public API class that corresponds to a type
+     * defined in a given .defs file so that the generated translation layer
+     * classes will compile.
+     * 
+     * <p>
+     * <b>WARNING</b>
+     * <p>
+     * This is <b>not</b> for regular use. It is only here for the very rare
+     * occasions when we get a new set of .defs data describing an entirely
+     * new native library which we are adding to java-gnome for the first
+     * time. In such an event, it will be used <b>once and only once</b> to
+     * create the necessary stubs.
+     * 
+     * <p>
+     * <i>The presence of this method and associated hooks in TypeGenerators
+     * are not an invitation to automatically write public API methods. Those
+     * <b>must</b> be written by hand: only a human can make the appropirate
+     * choices about whether to expose a method in the java-gnome's public
+     * API, and with what signature. This is a defining characteristic for
+     * achieving our project's approachability goal; coverage alone is
+     * meaningless (and indeed harmful) if not done with exquisite care. See
+     * {@link org.gnome.gtk.Button#setAlignmentX() Button's setAlignmentX()}
+     * (where we changed the method name slightly for good reason) and
+     * {@link org.gnome.gtk.FileChooser#getURI() FileChooser's getURI()} where
+     * we bridge from strings to a more appropriate Java type in the return
+     * value) as examples.</i>
+     * 
+     * @param out
+     *            the destination for the generated code.
+     */
+    /*
+     * In other words, if you're not the maintainer of java-gnome, don't
+     * touch. I'm really not kidding. Any patches changing the visibility of
+     * this method or adding to its cability will be immediately rejected
+     * without further discussion. Thank you.
+     */
+    public final void generatePublicLayer(final PrintWriter out) {
+        Generator gen;
+
+        gen = blocks[0].createGenerator(this);
+        gen.writePublicCode(out);
+    }
+
+    /**
+     * Generate the Java code that goes with a given .defs file. This is the
+     * main entry point into the Java side of the code generator classes, and
+     * runs through the sequence of iterating across the Blocks and
+     * instantiating the appropriate generator for each one.
+     * 
+     * @param out
+     *            the destination for the generated code. [This is
+     *            parameterzied to facilitate testing and debugging]
+     */
+    public final void generateTranslationLayer(final PrintWriter out) {
+        Generator gen;
+
+        calculateImportsAndConflicts();
+
+        for (int i = 0; i < blocks.length; i++) {
+            gen = blocks[i].createGenerator(this);
+            gen.writeTranslationCode(out);
+
+            out.flush(); // FIXME hmm
+        }
+        out.println("}\n");
+    }
+
+    /**
+     * Generate the JNI layer code that goes with a given .defs file. This is
+     * the other main entry point into the code generator classes, and runs
+     * through the sequence of iterating across the Blocks and instantiating
+     * the appropriate generator for each one.
+     * 
+     * @param out
+     *            the destination for the generated code. [This is
+     *            parameterzied to facilitate testing and debugging]
+     */
+    public final void generateJniLayer(final PrintWriter out) {
+        Generator gen;
+
+        for (int i = 0; i < blocks.length; i++) {
+            gen = blocks[i].createGenerator(this);
+            gen.writeJniCode(out);
+
+            out.flush(); // FIXME hmm
+        }
+    }
+}
diff --git a/src/generator/com/operationaldynamics/driver/ImproperDefsFileException.java b/src/generator/com/operationaldynamics/driver/ImproperDefsFileException.java
new file mode 100644
index 0000000..501e458
--- /dev/null
+++ b/src/generator/com/operationaldynamics/driver/ImproperDefsFileException.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007 Vreixo Formoso
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+package com.operationaldynamics.driver;
+
+/**
+ * Exception related to errors while parsing .defs. Once a .defs file is
+ * parsed, we then attempt to fit it into our model of how such files should
+ * be laid out. While there is nothing in the (define-...) blocks themselves
+ * that implies order, we impose the additional requirement that all the
+ * blocks related to one native type be in a single .defs file If the program
+ * cannot figure out how to adapt a given file in such terms, this exception
+ * is thrown.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public class ImproperDefsFileException extends Exception
+{
+    private static final long serialVersionUID = 1L;
+
+    public ImproperDefsFileException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ImproperDefsFileException(String message) {
+        super(message);
+    }
+
+    public ImproperDefsFileException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/src/jni/bindings_java.h b/src/jni/bindings_java.h
new file mode 100644
index 0000000..3a29539
--- /dev/null
+++ b/src/jni/bindings_java.h
@@ -0,0 +1,118 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Claspath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#ifndef _BINDINGS_JAVA_H_
+#define _BINDINGS_JAVA_H_
+
+#include <jni.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+/*
+ * bindings_java_util.c
+ */
+
+extern JNIEnv* bindings_java_getEnv();
+
+extern void bindings_java_throwByName(JNIEnv*, const char*, const char*);
+extern void bindings_java_throw(JNIEnv*, const char*, ...);
+extern void bindings_java_throwGlibException(JNIEnv*, GError*);
+
+extern const gchar* bindings_java_typeToSignature(GType);
+
+extern void bindings_java_logging_init();
+
+extern const gchar* bindings_java_getString(JNIEnv*, jstring);
+extern jstring bindings_java_newString(JNIEnv*, const gchar*);
+extern void bindings_java_releaseString(const gchar*);
+
+/*
+ *  bindings_java_signal.c
+ */
+
+extern GClosure* bindings_java_closure_new(JNIEnv*, jobject, jclass, const gchar*, guint);
+
+/*
+ * bindings_java_memory.c
+ */
+
+extern void bindings_java_memory_ref(JNIEnv*, GObject*, jobject);
+extern void bindings_java_memory_unref(GObject*);
+extern void bindings_java_memory_cleanup(GObject*, gboolean);
+extern const gchar* bindings_java_memory_pointerToString(void*);
+
+// TODO derive this at compile time from org.freedesktop.bindings.Debug
+#define DEBUG_MEMORY_MANAGEMENT FALSE
+/*
+ * bindings_java_threads.c
+ */
+
+extern void bindings_java_threads_init(JNIEnv*, jobject);
+extern void bindings_java_threads_lock();
+extern void bindings_java_threads_unlock();
+
+/*
+ * bindings_java_convert.c
+ */
+ 
+extern GList* bindings_java_convert_jarray_to_glist(JNIEnv*, jlongArray);
+extern GSList* bindings_java_convert_jarray_to_gslist(JNIEnv*, jlongArray);
+extern jlongArray bindings_java_convert_glist_to_jarray(JNIEnv*, GList*);
+extern jlongArray bindings_java_convert_gslist_to_jarray(JNIEnv*, GSList*);
+extern gpointer* bindings_java_convert_jarray_to_gpointer(JNIEnv*, jlongArray);
+
+// the gpointer array is freed at the end
+extern void bindings_java_convert_gpointer_to_jarray(JNIEnv*, gpointer*, jlongArray);
+
+// the gchar* arrays is not freed
+extern jobjectArray bindings_java_convert_gchararray_to_jarray(JNIEnv*, const gchar**);
+extern gchar** bindings_java_convert_strarray_to_gchararray(JNIEnv*, jobjectArray);
+
+// the gchar* array is freed
+extern void bindings_java_convert_gchararray_to_strarray(JNIEnv*, gchar**, jobjectArray);
+
+/*
+ * bindings_java_type.c
+ */
+
+extern GType BINDINGS_JAVA_TYPE_REFERENCE;
+extern GType bindings_java_type_lookup(const gchar*);
+
+/*
+ * gnome_screenshot_capture.c
+ */
+
+extern GdkPixbuf* gnome_screenshot_capture(gboolean, gboolean, const gchar*);
+
+#endif 
diff --git a/src/jni/bindings_java_convert.c b/src/jni/bindings_java_convert.c
new file mode 100644
index 0000000..212cec9
--- /dev/null
+++ b/src/jni/bindings_java_convert.c
@@ -0,0 +1,361 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * Utility functions for handling the conversion of GList and friends
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include "bindings_java.h"
+
+/*
+ * Allocates and initializes a GList with the contents of a java long array.
+ * The returned list must be freed with g_list_free () when no longer needed.
+ */
+GList*
+bindings_java_convert_jarray_to_glist
+(
+	JNIEnv* env,
+	jlongArray _array
+)
+{
+	GList* list;
+	jlong* array;
+	int i, size;
+	
+	list = g_list_alloc();
+	
+	size = (*env)->GetArrayLength(env, _array);
+	if ( size == 0 ) {
+		return list;
+	}
+	
+	array = (jlong*) (*env)->GetLongArrayElements(env, _array, NULL);
+	if (array == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		list = g_list_append(list, (gpointer) array[i]);
+	}
+	
+	(*env)->ReleaseLongArrayElements(env, _array, array, JNI_ABORT);
+	
+	return list;
+}
+
+/*
+ * Allocates and initializes a GSList with the contents of a java long array.
+ * The returned list must be freed with g_slist_free() when no longer needed.
+ */
+GSList*
+bindings_java_convert_jarray_to_gslist
+(
+	JNIEnv* env,
+	jlongArray _array
+)
+{
+	GSList* list;
+	jlong* array;
+	int i, size;
+	
+	list = g_slist_alloc();
+	
+	size = (*env)->GetArrayLength(env, _array);
+	if ( size == 0 ) {
+		return list;
+	}
+	
+	array = (jlong*) (*env)->GetLongArrayElements(env, _array, NULL);
+	if (array == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		list = g_slist_append(list, (gpointer) array[i]);
+	}
+	
+	(*env)->ReleaseLongArrayElements(env, _array, array, JNI_ABORT);
+	
+	return list;
+}
+
+jlongArray
+bindings_java_convert_glist_to_jarray
+(
+	JNIEnv* env,
+	GList* list
+)
+{
+	jlongArray _array;
+	jlong* array;
+	int i, size;
+	
+	if (list == NULL) {
+		size = 0;
+	} else {
+		size = g_list_length(list);
+	}
+	
+	_array = (*env)->NewLongArray(env, size);
+	
+	if (size == 0) {
+		return _array;
+	}
+	
+	array = (jlong*) (*env)->GetLongArrayElements(env, _array, NULL);
+	if (array == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		array[i] = (jlong) list->data;
+		list = list->next;
+	}
+	
+	(*env)->ReleaseLongArrayElements(env, _array, array, 0);
+	
+	return _array;
+}
+
+jlongArray
+bindings_java_convert_gslist_to_jarray
+(
+	JNIEnv* env,
+	GSList* list
+)
+{
+	jlongArray _array;
+	jlong* array;
+	int i, size;
+	
+	if (list == NULL) {
+		size = 0;
+	} else {
+		size = g_slist_length(list);
+	}
+	
+	_array = (*env)->NewLongArray(env, size);
+	
+	if (size == 0) {
+		return _array;
+	}
+	
+	array = (jlong*) (*env)->GetLongArrayElements(env, _array, NULL);
+	if (array == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		array[i] = (jlong) list->data;
+		list = list->next;
+	}
+	
+	(*env)->ReleaseLongArrayElements(env, _array, array, 0);
+	
+	return _array;
+}
+
+gpointer*
+bindings_java_convert_jarray_to_gpointer
+(
+	JNIEnv* env,
+	jlongArray _array
+)
+{
+	gpointer* ptrs;
+	jlong* array;
+	int i, size;
+	
+	size = (*env)->GetArrayLength(env, _array);
+	if ( size == 0 ) {
+		//FIXME mmm, what if we just what an empty array?
+		return NULL;
+	}
+	
+	ptrs = g_malloc(size * sizeof(gpointer));
+	if (ptrs == NULL) {
+		return NULL; // throw MemoryError??
+	}
+	
+	array = (jlong*) (*env)->GetLongArrayElements(env, _array, NULL);
+	if (array == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		ptrs[i] = (gpointer) array[i];
+	}
+	
+	(*env)->ReleaseLongArrayElements(env, _array, array, JNI_ABORT);
+	
+	return ptrs;
+}
+
+void
+bindings_java_convert_gpointer_to_jarray
+(
+	JNIEnv* env,
+	gpointer* ptrs,
+	jlongArray _array
+)
+{
+	jlong* array;
+	int i, size;
+	
+	size = (*env)->GetArrayLength(env, _array);
+	if ( size == 0 ) {
+		return;
+	}
+	
+	array = (jlong*) (*env)->GetLongArrayElements(env, _array, NULL);
+	if (array == NULL) {
+		return; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		array[i] = (jlong) ptrs[i];
+	}
+	
+	(*env)->ReleaseLongArrayElements(env, _array, array, 0);
+	
+	// and finally free ptrs
+	g_free(ptrs);
+}
+
+jobjectArray
+bindings_java_convert_gchararray_to_jarray
+(
+	JNIEnv* env,
+	const gchar** array
+)
+{
+	jobjectArray _array;
+	jclass strClass;
+	int i, size;
+	
+	size = 0;
+	
+	if (array == NULL) {
+		return NULL;
+	}
+	
+	/*
+	 * In Gtk+, all returning gchar* arrays are NULL-terminated
+	 */
+	while (array[size] != NULL) ++size;
+	if ( size == 0 ) {
+		// FIXME, maybe a 0 length array is better
+		return NULL;
+	}
+	
+	strClass = (*env)->FindClass(env, "java/lang/String");
+	if (strClass == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	_array = (*env)->NewObjectArray(env, size, strClass, NULL);
+	if (_array == NULL) {
+		return NULL; // Java Exception already thrown
+	}
+	
+	for (i = 0; i < size; ++i) {
+		jstring str = bindings_java_newString(env, array[i]);
+		(*env)->SetObjectArrayElement(env, _array, i, (jobject) str);
+		(*env)->DeleteLocalRef(env, str);
+	}
+	
+	(*env)->DeleteLocalRef(env, strClass);
+	return _array;
+}
+
+gchar**
+bindings_java_convert_strarray_to_gchararray
+(
+	JNIEnv* env,
+	jobjectArray _array
+)
+{
+	gchar** array;
+	int i, size;
+	
+	size = (*env)->GetArrayLength(env, _array);
+	if ( size == 0 ) {
+		//FIXME mmm, what if we just pass an empty array?
+		return NULL;
+	}
+	
+	/*
+	 * Most gchar** arrays in Gtk+ are NULL-terminated. But in java it
+	 * has no sense force users to NULL-terminate an array. Thus, we always
+	 * allocate an extra element that we will set to NULL.
+	 */
+	array = g_malloc((size+1) * sizeof(gchar*));
+	if (array == NULL) {
+		return NULL; // throw MemoryError??
+	}
+	
+	for (i = 0; i < size; ++i) {
+		jstring str = (jstring) (*env)->GetObjectArrayElement(env, _array, i);
+		const gchar* cstr = bindings_java_getString(env, str);
+		array[i] = g_strdup(cstr);
+		bindings_java_releaseString(cstr);
+		(*env)->DeleteLocalRef(env, str);
+	}
+	array[size] = NULL;
+	
+	return array;
+}
+
+void
+bindings_java_convert_gchararray_to_strarray
+(
+	JNIEnv* env,
+	gchar** array,
+	jobjectArray _array
+)
+{
+	/*
+	 * FIXME
+	 * For now, we don't support string arrays that are filled by Gtk+,
+	 * other than return parameters (managed in above function
+	 * bindings_java_convert_gchararray_to_jarray).
+	 * Thus, this just free the C array. It's supposed that this is an array
+	 * previously allocated in bindings_java_convert_strarray_to_gchararray.
+	 * Take care that this can lead to failures in methods like
+	 * gtk_image_get_icon_name, where the returning strings are hanled by Gtk+.
+	 */
+	// array needs to be NULL-terminated
+	g_strfreev(array);
+}
diff --git a/src/jni/bindings_java_memory.c b/src/jni/bindings_java_memory.c
new file mode 100644
index 0000000..4db785c
--- /dev/null
+++ b/src/jni/bindings_java_memory.c
@@ -0,0 +1,308 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * We would be remiss if we did not record that the GObject ToggleRef
+ * capability was worked out by Owen Taylor especially for language bindings
+ * and that the original implementation in the old java-gnome 2.x was done by
+ * Nick Rahn, Ismael Juma, and Jeffrey Morgan, ultimately coming to rest in
+ * glib-java/src/jni/glib_java.c. Although our overall Proxy strategy, memory
+ * management approach, and use of ToggleRef is somewhat different, the idea
+ * of switching to a weak Java reference (rather than dropping it entirely)
+ * is inspired from that code.
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include <glib-object.h>
+#include "bindings_java.h"
+
+#define REFERENCE "RefToJavaProxy"
+
+/**
+ * This function is called whenever the GObject reference count drops to one,
+ * and that one reference is the ToggleRef. When that happens, we drop the
+ * strong Java reference which means that if that was the last such strong
+ * reference, the Java object can be finalized (with the result that the
+ * ToggleRef will in turn be dropped, allowing the GObject to destroy).
+ *
+ * We switch to a weak Java reference instead of just removing it so that we
+ * can find our way back to the Java object should the ToggleRef be activated
+ * with a "you're not the last ref anymore".
+ */
+/*
+ * Signature the prototype of a (*GToggleNotify) callback, meeting the
+ * requirements of the second argument to g_object_add_toggle_ref()
+ */
+static void
+bindings_java_toggle
+(
+	gpointer data,
+        GObject *object,
+        gboolean is_last_ref
+)
+{
+	JNIEnv* env;
+	jobject ref;
+	jobject strong;
+	jobject weak;
+
+	ref = g_object_get_data(object, REFERENCE);
+	env = bindings_java_getEnv();
+
+	if (is_last_ref) {
+		/*
+		 * Create weak Java reference, replace association stored in
+		 * GObject, and remove strong Java reference
+		 */
+		if (DEBUG_MEMORY_MANAGEMENT) {
+			g_printerr("mem: toggle Java ref to WEAK\t%s\n", bindings_java_memory_pointerToString(object));
+		}
+		weak = (*env)->NewWeakGlobalRef(env, ref);
+		g_object_set_data(object, REFERENCE, weak);
+ 		(*env)->DeleteGlobalRef(env, ref);
+	} else {
+		/*
+		 * Create strong Java reference, overwrite association in
+		 * GObject, and remove weak Java reference now that we've
+		 * replaced it with a strong one.
+		 */
+		if (DEBUG_MEMORY_MANAGEMENT) {
+			g_printerr("mem: toggle Java ref to STRONG\t%s\n", bindings_java_memory_pointerToString(object));
+		}
+
+		strong = (*env)->NewGlobalRef(env, ref);
+		g_object_set_data(object, REFERENCE, strong);
+		(*env)->DeleteWeakGlobalRef(env, ref);
+	}	
+}
+
+/**
+ * Drop our initial default GObject reference. This is called via a GIdle
+ * call to avoid the ping pong effect which results if the ToggleRef is the
+ * only ref count to a GtkWidget while setters are called prior to the
+ * GtkWidget being added to a GtkContainer. By delaying the ref count
+ * reduction, the initial strong Java reference is left alone.
+ */
+/*
+ * Signature the prototype of a (*GSourceFunc) callback, meeting the
+ * requirements of the first argument to g_idle_add()
+ */
+static gboolean
+bindings_java_memory_deref
+(
+        gpointer data
+)
+{
+        GObject* object;
+
+        object = (GObject*) data;
+
+	if (DEBUG_MEMORY_MANAGEMENT) {
+		g_printerr("mem: drop GObject ref\t\t%s\n", bindings_java_memory_pointerToString(object));
+	}
+        g_object_unref(object);
+        return FALSE;
+}
+
+/**
+ * Called from
+ *   Java_org_gnome_glib_GObject_g_1object_1add_1toggle_1ref()
+ * called from
+ *   org.gnome.glib.GObject.g_object_add_toggle_ref(long reference, Object target)
+ * called from
+ *   org.gnome.glib.GObject.addToggleRef(Object reference)
+ * called from
+ *   org.gnome.glib.Object.<init>(long pointer)
+ *
+ * Here we go through the various motions necessary to appropriately
+ * increment the ref count on the GObject for which we are creating a Proxy
+ * to.
+ */
+void
+bindings_java_memory_ref
+(
+	JNIEnv* env,
+	GObject* object,
+	jobject target
+)
+{
+	jobject strong;
+
+	/*
+	 * Take out a strong Java reference "from the GObject to the Proxy"
+	 * and stash it in the GObject.
+	 */
+
+ 	if (DEBUG_MEMORY_MANAGEMENT) {
+ 		g_printerr("mem: add STRONG Java ref\t%s\n", bindings_java_memory_pointerToString(object));
+ 	}
+	strong = (*env)->NewGlobalRef(env, target);
+	g_object_set_data(object, REFERENCE, strong);
+
+	/*
+	 * Add a ToggleRef to the GObject "from the Proxy to the GObject",
+	 * incrementing its ref count
+	 */
+
+	g_object_add_toggle_ref(object, bindings_java_toggle, NULL);
+
+	/*
+	 * And drop the reference we originally own. Note that our automatically
+	 * generated code ensure we always own a ref, adding it if we don't have
+	 * such reference originally.
+	 */
+	g_idle_add(bindings_java_memory_deref, object);
+}
+
+
+/**
+ * Called from
+ *   Java_org_gnome_glib_GObject_g_1object_1remove_1toggle_1ref()
+ * called from
+ *   org.gnome.glib.GObject.g_object_remove_toggle_ref(long reference)
+ * called from
+ *   org.gnome.glib.GObject.removeToggleRef(Object reference)
+ * called when
+ *   org.gnome.glib.Object.release()
+ * is invoked by a finalizer.
+ *
+ * Remove the ToggleRef. Since this is called by the Java finalizer, and
+ * since the Java object should only become only-weakly-reachable when there
+ * are no more GObject refs, this should drop the last ref count to the
+ * GObject, resulting it in it being eligible for destruction.
+ */
+void
+bindings_java_memory_unref
+(
+	GObject* object
+)
+{
+	if (DEBUG_MEMORY_MANAGEMENT) {
+		g_printerr("mem: remove toggle ref for\t%s\n", bindings_java_memory_pointerToString(object));
+	}
+
+	g_object_remove_toggle_ref(object, bindings_java_toggle, NULL);
+}
+
+/**
+ * Ensure we properly own a GObject.
+ *
+ * This is really important. The aggregate result ensures that we own one Ref
+ * count to the object - no more, no less - which we can then turn into a
+ * ToggleRef. It needs to be called anywhere we are preparing to create a
+ * Proxy.
+ */
+/*
+ * TODO This needs a better name
+ */
+void
+bindings_java_memory_cleanup
+(
+    GObject* object,
+    gboolean owner
+)
+{
+    if (g_object_get_data(object, REFERENCE) == NULL) {
+
+        /*
+         * We don't have a proxy for the given object. If we own the object,
+         * we don't need to do anything, as Object constructor will take care
+         * of adding the toggle ref and removing the ref we own. There is an
+         * exception, however, as for GInitiallyUnowned we need to sink the
+         * reference if we have one.
+         *
+         * If we don't own the object, we need to add a new ref, that will be
+         * later removed by the Proxy constructor.
+         */
+        if (owner) {
+            if (G_IS_INITIALLY_UNOWNED(object) && g_object_is_floating(object)) {
+                if (DEBUG_MEMORY_MANAGEMENT) {
+                    g_printerr("mem: sink GObject ref\t\t%s\n", bindings_java_memory_pointerToString(object));
+                }
+                g_object_ref_sink(object);
+            }
+        } else {
+            /*
+             * We do not own the object, so we need to add an extra ref, as
+             * Object constructor assumes we actually own the object.
+             */
+            if (DEBUG_MEMORY_MANAGEMENT) {
+                g_printerr("mem: added extra ref for\t%s\n", bindings_java_memory_pointerToString(object));
+            }
+            g_object_ref(object);
+        }
+    } else {
+        /*
+         * We already have a proxy for the object. So we already have our
+         * toggle ref. Thus, if a methods adds an extra ref, we need to drop
+         * it.
+         * TODO does such behavior exist in Gtk+?
+         */
+        if (owner) {
+            if (DEBUG_MEMORY_MANAGEMENT) {
+                g_printerr("mem: remove ref for\t%s\n", bindings_java_memory_pointerToString(object));
+            }
+            g_object_unref(object);
+        }
+    }
+}
+
+#if GLIB_SIZEOF_VOID_P == 8
+#define WIDTH "16"
+#define SIZE GLIB_SIZEOF_VOID_P * 2 + 3
+#else
+#define WIDTH "8"
+#define SIZE GLIB_SIZEOF_VOID_P * 2 + 3
+#endif
+
+/*
+ * A utility function to format a pointer address as an appropriate width
+ * string. This is necessary because of the inadequecies of printf's %p.
+ * The return value is statically allocated and must not be free'd.
+ *
+ * This is called when debugging, both from C and from Java via
+ * Plumbing.toHexString()
+ */
+const gchar*
+bindings_java_memory_pointerToString
+(
+	gpointer pointer
+)
+{
+	static gchar result[SIZE];
+	
+	g_snprintf(result, SIZE, "0x%." WIDTH "lX", (unsigned long) pointer);
+	
+	return result;
+}
diff --git a/src/jni/bindings_java_signal.c b/src/jni/bindings_java_signal.c
new file mode 100644
index 0000000..ae81347
--- /dev/null
+++ b/src/jni/bindings_java_signal.c
@@ -0,0 +1,579 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 1998-2005 The java-gnome Team
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * The code for signal marshaling was completely rewritten by Andrew Cowie
+ * during the 4.0 re-engineering effort. Working with JNI and with GLib is
+ * very idiomatic, however, and the sequence of calls employed here was drawn
+ * directly from the example set by the java-gnome 2.x project in their
+ * glib-java/src/jni/org_gnu_glib_GObject.c. We are certainly indebted to the
+ * previous hackers for having worked out these techniques.
+ */
+
+#include <jni.h>
+#include <string.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+
+typedef struct  {
+	/**
+	 * In typical G fashion, we extend something by build this structure
+	 * on top of an existing one.
+	 */
+	GClosure	closure;
+
+	/**
+	 * We use Java's single letter codes to choose which kind of
+	 * invocation we will use
+	 */
+	jchar		returnType;
+
+ 	/*
+ 	 * The Class upon which we invoke the [static] "receiveBlah" method.
+ 	 */
+ 	jclass		receiver;
+
+ 	/*
+ 	 * The actual Signal subinterface that is being connected. This will
+ 	 * be passed to the handler on the Java side so it can call the
+ 	 * appropriate method which is actually (from the developer's
+ 	 * standpoint) the callback being invoked.
+ 	 */
+ 	jobject 	handler;
+
+ 	/*
+ 	 * ID of the method on handlerInstance that will be invoked upon
+ 	 * callback
+ 	 */
+ 	jmethodID	method;
+
+} BindingsJavaClosure;
+
+
+/**
+ * This method actually receives all callbacks in the system. It receives a
+ * GClosure struct as its data, which turns out to be our BindingsJavaClosure.
+ * It then determines what Java method to call and invokes it passing the
+ * correct parameters
+ */
+/*
+ * Signature the prototype of (*GClosureMarshall), meeting the requirements
+ * to be the second argument to g_closure_set_marshal()
+ */
+static void
+bindings_java_marshaller
+(
+	GClosure* closure,
+	GValue* return_value,
+	guint n_param_values,
+	const GValue* param_values,
+	gpointer invocation_hint,
+	gpointer marshal_data
+)
+{
+ 	BindingsJavaClosure* bjc;
+ 	JNIEnv* env;
+ 	jvalue* jargs;
+	guint i;
+	GType type;
+
+	// Return values, as necessary
+	jboolean _b;
+	gboolean b;
+	
+	jint _e;
+	
+	jstring _str;
+	gchar* str;
+	GObject* obj;
+	
+	/*
+	 * Begin marshaller by downcasting the GClosure we got.
+	 */
+
+	bjc = (BindingsJavaClosure*) closure;
+
+	/*
+	 * Get the JNIEnv interface pointer
+	 */
+
+	env = bindings_java_getEnv();
+	if (env == NULL) {
+		g_critical("Couldn't get JNIEnv interface, aborting marshal");
+		return;
+	}
+		
+	/*
+	 * Build the parameters for the callback. The signature of the
+	 * handlers on the Java side for a signal "name" would be:
+	 *
+	 * 	receiveName(Signal handler, type arg0, type arg1, ...)
+	 *
+	 * Note that arg0 is universally the source object (in otherwords, a
+	 * method function where the first argument is always a reference to
+	 * self).
+	 *
+	 * In case you didn't know, JNI's jvalue us a rather complex union
+	 * which holds any of the possible things you can send across the
+	 * boundary. So we allocate an array of them, then for each parameter
+	 * passed to the marshaller, whack them in.
+	 */
+
+	jargs = g_newa(jvalue, n_param_values + 1);
+
+	jargs[0].l = bjc->handler;
+
+	for(i = 0; i < n_param_values; i++) {
+		type = G_VALUE_TYPE(&param_values[i]);
+		switch(G_TYPE_FUNDAMENTAL(type)) {
+		case G_TYPE_CHAR:
+			jargs[i+1].c = g_value_get_char(&param_values[i]);
+      			break;
+
+		case G_TYPE_UCHAR:
+			jargs[i+1].c = g_value_get_uchar(&param_values[i]);
+      			break;
+
+		case G_TYPE_BOOLEAN:
+			b = g_value_get_boolean(&param_values[i]);
+			jargs[i+1].z = (b == TRUE) ? JNI_TRUE : JNI_FALSE;
+			break;
+
+		case G_TYPE_INT:
+			jargs[i+1].i = g_value_get_int(&param_values[i]);
+			break;
+
+		case G_TYPE_UINT:
+			jargs[i+1].i = g_value_get_uint(&param_values[i]);
+			break;
+
+		case G_TYPE_ENUM:
+			jargs[i+1].i = g_value_get_enum(&param_values[i]);
+			break;
+
+		case G_TYPE_FLAGS:
+			jargs[i+1].i = g_value_get_flags(&param_values[i]);
+			break;
+
+		case G_TYPE_LONG:
+			jargs[i+1].j = g_value_get_long(&param_values[i]);
+			break;
+
+		case G_TYPE_ULONG:
+			jargs[i+1].j = g_value_get_ulong(&param_values[i]);
+			break;
+
+		case G_TYPE_FLOAT:
+			jargs[i+1].f = g_value_get_float(&param_values[i]);
+			break;
+
+		case G_TYPE_DOUBLE:
+			jargs[i+1].d = g_value_get_double(&param_values[i]);
+			break;
+
+		case G_TYPE_STRING:
+			jargs[i+1].l = bindings_java_newString(env, g_value_get_string(&param_values[i]));
+      			break;
+
+		case G_TYPE_OBJECT:
+		case G_TYPE_INTERFACE:
+			/*
+			 * GObjects are just pointers, and so we pass up the
+			 * address across the boundary to be looked up and
+			 * either an existing Proxy returned or a new Proxy
+			 * created.
+			 */
+			obj = g_value_get_object(&param_values[i]);
+			bindings_java_memory_cleanup(obj, FALSE);
+			jargs[i+1].j = (jlong) obj;
+			break;
+
+		case G_TYPE_BOXED:
+			/*
+			 * We make a copy of the GBoxed so that we own it and
+			 * thus it can (will) survive the duration of the
+			 * signal in the event that the developer using this
+			 * code keeps a reference to the returned Boxed.
+			 */
+			jargs[i+1].j = (jlong) g_boxed_copy(type, g_value_get_boxed(&param_values[i]));
+			break;
+
+		case G_TYPE_PARAM:
+			/*
+			 * We're ignoring GParamSpec at the moment. They
+			 * normally only show up in 'notify' signals, and we
+			 * don't need them.
+			 */
+		case G_TYPE_POINTER:
+			/*
+			 * and, we're ignoring something that gets registered
+			 * as a gpointer, by definition it has no type
+			 * information and there's nothing we can do.
+			 */
+			jargs[i+1].j = (jlong) NULL;
+			break;
+
+		default:
+			/*
+			 * Unrecognized. Probably means we need to add a clause above.
+			 */
+			g_printerr("Don't know how to marshal a %s", g_type_name(type));
+			jargs[i+1].l = 0;
+			break;
+		}
+	}
+	
+	/*
+	 * And now we invoke the callback on the Java side Signal handler; we have to
+	 * select the correct function based on what return type is necessary.
+	 */
+
+	switch(bjc->returnType) {
+	case 'V':
+		/*
+		 * void return signals
+		 */
+		(*env)->CallStaticVoidMethodA(env, bjc->receiver, bjc->method, jargs);
+		break;
+
+	case 'Z':
+		/*
+		 * boolean return signals
+		 */
+		_b = (*env)->CallStaticBooleanMethodA(env, bjc->receiver, bjc->method, jargs);		
+		if (_b == JNI_TRUE) {
+			b = TRUE;
+		} else if (_b == JNI_FALSE) {
+			b = FALSE;
+		} else {
+			g_critical("How did you manage to return a boolean that's neither TRUE nor FALSE?");
+			return;
+		}
+		
+		g_value_set_boolean(return_value, b);
+		break;
+
+	case 'I':
+		/*
+		 * integer return signals
+		 */
+		_e = (*env)->CallStaticIntMethodA(env, bjc->receiver, bjc->method, jargs);
+		
+		g_value_set_int(return_value, _e);
+		break;
+
+	case 'E':
+		/*
+		 * enum return signals
+		 */
+		_e = (*env)->CallStaticIntMethodA(env, bjc->receiver, bjc->method, jargs);		
+		
+		g_value_set_enum(return_value, _e);
+		break;
+
+	case 'L':
+		/*
+		 * String return signals
+		 *
+		 * L is actually Object, of course, but the only type we need to
+		 * worry about is java.lang.String encode it for now, and so make the
+		 * enormous assumption that a string is what we get back.
+		 */
+		_str = (*env)->CallStaticObjectMethodA(env, bjc->receiver, bjc->method, jargs);
+		if (_str == NULL) {
+			g_warning("Invoking string handler returned null. That's probably bad");
+			break;
+		}
+		
+		str = (gchar*) bindings_java_getString(env, _str);
+		if (str == NULL) {
+			/* OutOfMemoryError already thrown */
+			return;
+		}
+		
+		// according to the API docs, this copies the input...
+		g_value_set_string(return_value, str);
+		
+		// ... so we can release str
+		bindings_java_releaseString(str);
+		break;
+
+	default:
+		/*
+		 * If it's not void, boolean or gchar*, then what kind of signal is it?
+		 */
+		g_critical("Invocation for return type %c not implemented", bjc->returnType);
+		break;
+	}
+
+	/*
+	 * Cleanup
+	 */
+
+	for(i = 0; i < n_param_values; i++) {
+  		type = G_VALUE_TYPE(&param_values[i]);
+		switch(G_TYPE_FUNDAMENTAL(type)) {
+		case G_TYPE_STRING:
+			(*env)->DeleteLocalRef(env, jargs[i+1].l);
+			break;
+
+		default:
+			break;
+		}
+	}
+	
+	/*
+	 * Don't need to free jargs - we alloca()'d it
+	 */
+	
+	/*
+	 * Now, check if an exception occurred in the callback. There's a
+	 * catch: because we're in native code right now [care of the call to
+	 * gtk_main()] the exception gets swallowed until we return from that
+	 * native call. So we call the function which causes the main loop to
+	 * terminate, with the result that the exception will propegate out
+	 * and, yes, probably halt the program.
+	 *
+	 * This is abrupt, but it is deliberate: we need to force developers
+	 * to deal with criticals emitted by the underlying libraries.
+	 * Otherwise, the next thing that is likely to happen is a
+	 * segmentation fault, and not only does that crash the "program" but
+	 * it takes out the Java Virtual Machine running it. People don't
+	 * like VM crashes.
+	 *
+	 * Uncaught exceptions of any kind leaving a signal handler are to be
+	 * considered programmer error and will be fatal.
+	 */
+
+	if ((*env)->ExceptionOccurred(env)) {
+		gtk_main_quit();
+	}
+}
+
+/**
+ * Called to cleanup a BindingsJavaClosure, and critically, to remove the
+ * reference to the Java object which is the signal handler.
+ */
+/*
+ * Signature the prototype of (*GClosureNotify), meeting the requirements
+ * to be the third argument to g_closure_add_finalize_notifier()
+ */
+static void
+bindings_java_closure_destroy
+(
+	gpointer data,
+	GClosure *closure
+)
+{
+	BindingsJavaClosure* bjc;
+	JNIEnv* env;	
+
+ 	bjc = (BindingsJavaClosure*) closure;
+
+	if (bjc->handler) {
+		env = bindings_java_getEnv();
+		(*env)->DeleteWeakGlobalRef(env, bjc->handler);
+	}
+}
+
+/**
+ * Create one of our custom GClosure subclasses. To save us having to export
+ * it, however, we just return the GClosure* that it extends.
+ */
+GClosure*
+bindings_java_closure_new
+(
+	JNIEnv* env,
+	jobject handler,
+	jclass receiver,
+	const gchar* name,
+	guint id
+)
+{
+	GClosure* closure;
+	BindingsJavaClosure* bjc;
+	
+	GSignalQuery info;
+
+	GString* buf;
+	guint i;
+
+	gchar* methodName;
+	gchar* methodSignature;
+	
+	/*
+	 * First we allocate the closure and do the footwork to tell it what
+	 * its marshaller is
+	 */
+
+	closure = g_closure_new_simple(sizeof(BindingsJavaClosure), NULL);
+	g_closure_add_finalize_notifier(closure, NULL, bindings_java_closure_destroy);
+	g_closure_set_marshal(closure, bindings_java_marshaller);
+
+	bjc = (BindingsJavaClosure*) closure;
+
+	/*
+	 * And now we begin the legwork of figuring out what the methodID of
+	 * the callback to be invoked is and caching that in the closure. We
+	 * get the GSignalQuery data for the specified signal and then use that
+	 * to formulate a string that can be use to lookup the method.
+	 */
+
+	g_signal_query(id, &info);
+
+	switch(G_TYPE_FUNDAMENTAL(info.return_type)) {
+	case G_TYPE_BOOLEAN:
+		bjc->returnType = 'Z';
+      		break;
+
+	case G_TYPE_INT:
+		bjc->returnType = 'I';
+		break;
+
+	case G_TYPE_ENUM:
+		bjc->returnType = 'E';
+      		break;
+
+	case G_TYPE_STRING:
+		/*
+		 * Strings are encoded as java.lang.String objects in signatures,
+		 * so we use the object type marker for gchar* (only).
+		 */
+		bjc->returnType = 'L';
+      		break;
+
+	case G_TYPE_NONE:
+		bjc->returnType = 'V';
+		break;
+
+	default:
+		g_critical("Don't know what to do with signal return type %s", g_type_name(info.return_type));
+		return NULL;
+	}
+	
+
+	/*
+	 * the name of the methods we invoke is algorithmic: "receiveName",
+	 * where Name is a PascalCase version of the signal name we were
+	 * passed in.
+	 */
+
+	buf = g_string_new("receive");
+
+	gchar** tokens = g_strsplit_set(name, "_-:", -1);
+
+	for (i = 0; i < g_strv_length(tokens); i++) {
+		gchar* token = tokens[i];
+
+		if (token[0] == '\0') {
+			// skip past :: which splits signal name from "detail"
+			continue;
+		}
+
+		gchar first = g_unichar_toupper(token[0]);
+		g_string_append_c(buf, first);
+
+		token++;
+		g_string_append(buf, token);
+	}
+
+	methodName = buf->str;
+
+	g_string_free(buf, FALSE);
+	g_strfreev(tokens);
+
+	/*
+	 * And here is the tricky bit: formulate the method signature that goes
+	 * along with this signal. A method of the signature
+	 *
+	 * 	boolean method(int, long, String)
+	 *
+	 * has a JNI encoding of
+	 *
+	 * 	(IJLjava/util/String;)Z
+	 */
+
+	buf = g_string_new("(Lorg/gnome/glib/Signal;J");
+
+	// add the signature for each parameter type
+	for(i = 0; i < info.n_params; i++) {
+		g_string_append(buf, bindings_java_typeToSignature(info.param_types[i]));
+	}
+
+	// and the return type
+	g_string_append(buf, ")");
+	g_string_append(buf, bindings_java_typeToSignature(info.return_type));
+	
+	methodSignature = buf->str;
+	g_string_free(buf, FALSE);
+	
+	/*
+	 * Now at last we can lookup the method ID
+	 */
+	
+//	jclass CANDIDATE = (*env)->FindClass(env, "org/gnome/gtk/GtkWidget");
+//	if ((*env)->IsSameObject(env, CANDIDATE, receiver)) {
+//		g_debug("Received a GtkWidget");
+//	}
+
+	bjc->receiver = receiver;
+	bjc->method = (*env)->GetStaticMethodID(env, bjc->receiver, methodName, methodSignature);
+	
+//	g_debug("Looking for\nJava method %s\nwith signature %s\nin class %s\nto handle signal %s\n",
+//			methodName, methodSignature, "FIXME", g_signal_name(id));
+
+	// clean up	
+	g_free(methodName);
+	g_free(methodSignature);
+
+	// and check for error
+	if (bjc->method == NULL) {
+		// Exception already thrown by GetMethodID
+		return NULL;
+	}
+
+	/*
+	 * Set the reference so that the marshaller can find the Signal instance.
+	 */
+
+	bjc->handler = (*env)->NewWeakGlobalRef(env, handler);
+
+	/*
+	 * And we're done!
+	 */
+	
+	return closure;
+}
diff --git a/src/jni/bindings_java_threads.c b/src/jni/bindings_java_threads.c
new file mode 100644
index 0000000..e82c773
--- /dev/null
+++ b/src/jni/bindings_java_threads.c
@@ -0,0 +1,116 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <gdk/gdk.h>
+#include "bindings_java.h"
+
+/*
+ * Permit multi threaded use of GTK by synchronizing access via "the GTK
+ * main lock". We do this almost entirely on the Java side, except that a
+ * mutex is a mutex, ultimately, so by overriding the default implementations
+ * in gtk+'s gdk/gdk.c we can properly interoperate with the rest of the GTK
+ * library.
+ */
+
+static jobject lock;
+
+/**
+ * Save a reference to the lock object on the Java side, and then register our
+ * custom lock functions. This function also initializes  GLib's thread
+ * mechanism; which call needs to be the _very_ first thing in a GLib program
+ * these days.
+ */
+void
+bindings_java_threads_init
+(
+	JNIEnv *env,
+	jobject obj
+)
+{
+	// must be first GLib call!
+	g_thread_init(NULL);
+
+	// now get about setting up GDK's threads
+	lock = (*env)->NewGlobalRef(env, obj);
+
+	gdk_threads_set_lock_functions(bindings_java_threads_lock, bindings_java_threads_unlock);
+	gdk_threads_init();
+}
+
+/**
+ * Enter the monitor for our Java side GDK lock object. This is, strictly,
+ * the opening half of a sychronized (obj) { ... } in Java, as expressed in
+ * JNI.
+ */
+/*
+ * Signature the prototype of the generic (*GCallback) prototype, meeting the
+ * requirements of the first argument to gdk_threads_set_lock_functions()
+ */
+void
+bindings_java_threads_lock
+(
+)
+{
+	JNIEnv* env;
+	
+	env = bindings_java_getEnv();
+
+	if ((*env)->MonitorEnter(env, lock) != JNI_OK) {
+		g_critical("Error trying to get Java side GDK lock!?!");
+	}
+}
+
+/**
+ * Release the monitor (lock) held on our Java side GDK lock object. Note the
+ * Sun Java VM implementation will still show this thread as having entered
+ * the lock, but if you look at a thread dump closely you'll see it waiting
+ * on monitor, which is correct.
+ */
+/*
+ * Signature the prototype of the generic (*GCallback) prototype, meeting the
+ * requirements of the second argument to gdk_threads_set_lock_functions()
+ */
+void
+bindings_java_threads_unlock
+(
+)
+{
+	JNIEnv* env;
+
+	env = bindings_java_getEnv();
+
+	if ((*env)->MonitorExit(env, lock) != JNI_OK) {
+		g_critical("Error trying to release Java side GDK lock?!?");
+	}
+}
diff --git a/src/jni/bindings_java_type.c b/src/jni/bindings_java_type.c
new file mode 100644
index 0000000..4c99f24
--- /dev/null
+++ b/src/jni/bindings_java_type.c
@@ -0,0 +1,161 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+/*
+ * Thanks to the guidance from Mathias Hasselmann to protect g_str_equal(),
+ * and to Manish Singh for suggesting the technique of using a GBoxed to
+ * manage the reference count to a Java side object being stored in a
+ * TreeModel, and for locating the code to implement this in pygobject's
+ * gobject/gobjectmodule.c and gobject/pygtype.c
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include "bindings_java.h"
+
+/*
+ * Create a GBoxed type to hold Java references. The actual "structure" being
+ * boxed is just a gpointer. When the GBoxed is free'd, the reference will be
+ * dropped, all neat and tidy.
+ *
+ * Using a pointer as a GBoxed is somewhat of a sharp shortcut, but it is
+ * viable: GBoxeds are treated as pointers by the g_value_*() functions, and
+ * since we control the meaning of the _copy() and _free() functions it's all
+ * under control. Beware, however, the problem that arose in using the pointer
+ * value in the getter case; see the native implementation of
+ * GtkTreeModelOverride.gtk_tree_model_get_reference() for further details.
+ */
+
+GType BINDINGS_JAVA_TYPE_REFERENCE = 0;
+
+/**
+ * Called as a result of GTK attempting to store a GValue into a GtkListStore
+ * column of type BINDNGS_JAVA_REFERENCE.
+ *
+ * Increment the global reference count on the actual Java object that we are
+ * storing in a TreeModel. We go to the trouble of doing this because JNI
+ * global references are pinned and not arbitrarily moved by the garbage
+ * collector (else the stored pointer might become invalid if moved between
+ * generations).
+ */
+/*
+ * Meets the signature of (*GBoxedCopyFunc).
+ */
+static gpointer
+bindings_java_reference_copy
+(
+	gpointer _boxed
+)
+{
+	JNIEnv* env;
+	jobject result, reference;
+
+	env = bindings_java_getEnv();
+	reference = (jobject) _boxed;
+
+	result = (*env)->NewGlobalRef(env, reference);
+
+	return (gpointer) result;
+}
+
+/*
+ * Meets the signature requirement of (*GBoxedFreeFunc)
+ */
+static void
+bindings_java_reference_free
+(
+	gpointer _boxed
+)
+{
+	JNIEnv* env;
+	jobject reference;
+	
+	env = bindings_java_getEnv();
+	reference = (jobject) _boxed;
+
+	(*env)->DeleteGlobalRef(env, reference);
+}
+
+
+/**
+ * Called from
+ *   Java_org_gnome_gtk_GtkTreeModelOverride_gtk_1list_1store_1new
+ * called from
+ *   org.gnome.gtk.GtkTreeModeOverride.gtk_list_store_new(String[])
+ *
+ * Map from a fully qualified class name string to a GType. Also initialize
+ * our custom GBoxed if called upon to store a DataColumnReference
+ *
+ * So long as this is a short list, do it in an if/else ladder. Switch to a
+ * GHashTable if it
+ * becomes a performance bottleneck.
+ */
+GType
+bindings_java_type_lookup
+(
+	const gchar* fqcn
+)
+{
+	g_assert(fqcn != NULL);
+
+	if (g_str_equal(fqcn, "java.lang.String")) {
+		return G_TYPE_STRING;
+	} else if (g_str_equal(fqcn, "java.lang.Integer")) {
+		return G_TYPE_INT;
+	} else if (g_str_equal(fqcn, "java.lang.Long")) {
+		return G_TYPE_INT64;
+	} else if (g_str_equal(fqcn, "java.lang.Boolean")) {
+		return G_TYPE_BOOLEAN;
+	} else if (g_str_equal(fqcn, "org.gnome.glib.Object")) {
+		return G_TYPE_OBJECT;
+	} else if (g_str_equal(fqcn, "org.gnome.gdk.Pixbuf")) {
+		return GDK_TYPE_PIXBUF;
+	} else if (g_str_equal(fqcn, "java.lang.Object")) {
+		/*
+		 * This is what we use to stash references to Java objects.
+		 * They're never displayed in a TreeView, but used to find
+		 * your way back to your Java side domain object graph.
+		 */
+		if (!BINDINGS_JAVA_TYPE_REFERENCE) {
+        		BINDINGS_JAVA_TYPE_REFERENCE = g_boxed_type_register_static(
+        			"BindingsJavaReference",
+                                bindings_java_reference_copy,
+                                bindings_java_reference_free
+			);
+		}
+
+		return BINDINGS_JAVA_TYPE_REFERENCE;
+	} else {
+		return G_TYPE_INVALID;
+	}
+}
diff --git a/src/jni/bindings_java_util.c b/src/jni/bindings_java_util.c
new file mode 100644
index 0000000..bdcf150
--- /dev/null
+++ b/src/jni/bindings_java_util.c
@@ -0,0 +1,545 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ *
+ * Linking this library statically or dynamically with other modules is making
+ * a combined work based on this library. Thus, the terms and conditions of
+ * the GPL cover the whole combination. As a special exception (the
+ * "Classpath Exception"), the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library. If
+ * you modify this library, you may extend the Classpath Exception to your
+ * version of the library, but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <jni.h>
+#include <glib.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "bindings_java.h"
+
+static JavaVM*	cachedJavaVM;
+
+/**
+ * Here we cache the JavaVM pointer so that we can use it to retrieve the
+ * JNIEnv interface pointer whenever necessary.
+ */
+/*
+ * A symbol by this name is automatically called when the library containing it
+ * is loaded by a System.loadLibrary().
+ */
+JNIEXPORT jint JNICALL
+JNI_OnLoad
+(
+	JavaVM *jvm,
+	void *reserved
+)
+{
+	if (jvm == NULL) {
+		g_error("JavaVM pointer was NULL when initializing library");
+	}
+ 	cachedJavaVM = jvm;
+ 	return JNI_VERSION_1_4;
+}
+
+
+/**
+ * Since the JNIEnv pointer is specific to each thread, it is necessary to
+ * retrieve it from the VM directly when we are dealing with arbitrary events
+ * as opposed to local JNI calls. Returns NULL on failure.
+ */
+JNIEnv*
+bindings_java_getEnv()
+{
+	JNIEnv* env = NULL;
+	void* ptr = NULL;
+	JavaVMAttachArgs args = { 0, };
+	static int i = 0;
+	jint result;
+
+	result = (*cachedJavaVM)->GetEnv(cachedJavaVM, &ptr, JNI_VERSION_1_4);
+	env = (JNIEnv*) ptr;
+	if (env != NULL) {
+		return env;
+	}
+	
+	switch (result) {	
+	case JNI_EDETACHED:
+		args.version = JNI_VERSION_1_4;
+		args.name = g_strdup_printf("NativeThread%d", i++);
+
+		result = (*cachedJavaVM)->AttachCurrentThreadAsDaemon(cachedJavaVM, &ptr, &args);
+		env = (JNIEnv*) ptr;
+		if ((result == JNI_OK) && (env != NULL)) {
+			g_free(args.name);
+			return env;
+		}
+		
+		g_printerr("\nTried to get JNIEnv but thread detached and attempt to attach failed.\n");
+		break;
+	
+	case JNI_EVERSION:
+		g_printerr("Trying to get JNIEnv resulted in version error.\n");
+		break;
+	}
+
+	fflush(stderr);
+	exit(2);
+
+	return NULL;
+}
+
+
+/**
+ * Throw an exception, naming the Exception or Error class to be thrown. If
+ * an Exception is already pending this call will be a no-op.
+ */
+/*
+ * Inspired by code from "The Java Native Interface", section 6.1.2.
+ * Modified in java-gnome 2.x by Andrew Cowie to fix a potential crasher.
+ * And then improved for use here.
+ *
+ * It turns out different Java implementations are finicky about the syntax
+ * of the string used to lookup a class. "Ljava/lang/Blah;" makes GCJ
+ * unhappy; "java.lang.Blah" makes Sun Java barf. The JNI standard actually
+ * specifies "java/lang/Blah" only.
+ *
+ * If the class can't be found (or the above problem causes a misfire) then
+ * ClassNotFoundException is raised by the FindClass() call, and null is
+ * returned.
+ *
+ * We could probably check the syntax ourselves, but the class loader is
+ * going to do so for us anyway.
+ */
+void
+bindings_java_throwByName
+(
+	JNIEnv* env,
+	const gchar* name,
+	const gchar* msg
+)
+{
+	jclass cls = NULL;
+
+	if (env == NULL) {
+		g_printerr("Want to throw a %s but JNIEnv is NULL\n", name);
+		return;
+	}
+
+	/*
+	 * Somewhat ugly hack: Sun's JVM segfaults (!) if you try to throw
+	 * another Exception without having first handled, propegated or
+	 * otherwise cleared an existing one. The sooner we get back to Java,
+	 * the better.
+	 */
+
+	if ((*env)->ExceptionOccurred(env)) {
+		return;
+	}
+
+	/*
+	 * Look up the class. We could cache these, but really, Exceptions
+	 * out of the native layer are rare and, in most cases, terminal. If
+	 * profiling shows a hot spot on this, then cache the lookup and
+	 * create a call which takes a jclass.
+	 */
+
+	cls = (*env)->FindClass(env, name);
+	if (cls == NULL) {
+		g_printerr("Tried to throw a %s but calling FindClass() on that name failed.\n", name);
+		return;
+	}
+
+	(*env)->ThrowNew(env, cls, msg);
+
+	(*env)->DeleteLocalRef(env, cls);
+}
+
+
+/**
+ * Utility function to just blow our generic FatalError throwable in order to
+ * propagate a failure back to the caller. While you could, notionally, catch
+ * such a thing, we define a condition of this nature coming out of our
+ * native code to be unrecoverable, and hence the java.lang.Error subclass.
+ */
+void
+bindings_java_throw
+(
+	JNIEnv* env,
+	const char* fmt,
+	...
+)
+{
+	va_list args;
+	
+	gchar* msg;
+	const gchar* name = "org/freedesktop/bindings/FatalError";
+
+	va_start(args, fmt);
+	msg = g_strdup_vprintf(fmt, args);
+	va_end(args);
+
+	bindings_java_throwByName(env, name, msg);
+	
+	g_free(msg);
+}
+
+void
+bindings_java_throwGlibException
+(
+	JNIEnv* env,
+	GError* error
+)
+{
+	const gchar* name = "org/gnome/glib/GlibException";
+	
+	bindings_java_throwByName(env, name, error->message);
+	
+	g_error_free(error);
+}
+
+/**
+ * Convert from a GType to a JNI signature
+ */
+/*
+ * This piece of magic is inspired from the old 2.x code, and the technique
+ * represents a useful block of knowledge. It turns out the old one was leaky
+ * as hell, though. Here we just return constant strings.
+ */
+const gchar*
+bindings_java_typeToSignature
+(
+	GType type
+)
+{
+	/*
+	 * the G_TYPE_FUNDAMENTAL macro returns "the fundamental type which
+	 * is the ancestor of the argument ... roots of distinct inheritance
+	 * hierarchies."
+	 */
+	switch(G_TYPE_FUNDAMENTAL(type)) {
+	case G_TYPE_NONE:
+		return "V";
+
+	case G_TYPE_CHAR:
+	case G_TYPE_UCHAR:
+		return "C";
+
+	case G_TYPE_BOOLEAN:
+		return "Z";
+
+	case G_TYPE_INT:
+	case G_TYPE_UINT:
+		return "I";
+
+	case G_TYPE_ENUM:
+		return "I";
+
+	case G_TYPE_FLAGS:
+		return "I";
+
+	case G_TYPE_LONG:
+	case G_TYPE_ULONG:
+		return "J";
+
+	case G_TYPE_FLOAT:
+		return "F";
+
+	case G_TYPE_DOUBLE:
+		return "D";
+
+	case G_TYPE_STRING:
+		return "Ljava/lang/String;";
+
+	case G_TYPE_BOXED:
+		return "J";
+
+	case G_TYPE_OBJECT:
+	case G_TYPE_INTERFACE:
+	case G_TYPE_PARAM:
+		return "J";
+
+	/*
+	 * This is a special case; we don't (and indeed cannot) actually
+	 * handle a raw "pointer" as a type, but by marshalling it as a
+	 * meaningless long we can at least wrap and ignore it on the Java
+	 * side.
+	 */
+
+	case G_TYPE_POINTER:
+		return "J";
+
+	case G_TYPE_INVALID:
+	default:
+		g_printerr("Don't know how to convert type %s to JNI signature\n", g_type_name(type));
+		return NULL;
+	}
+}
+
+void
+bindings_java_debug
+(
+	JNIEnv* env,
+	jobject obj
+)
+{
+	jclass cls;
+	jmethodID mid = NULL;
+	jobject _name;
+	const gchar* name;
+
+	cls = (*env)->FindClass(env, "java/lang/Object");
+	if ((*env)->ExceptionCheck(env)) {
+		(*env)->ExceptionDescribe(env);
+		g_error("No jclass?");
+	}
+
+	mid = (*env)->GetMethodID(env, cls, "toString", "()Ljava/lang/String;");
+	if ((*env)->ExceptionCheck(env)) {
+		(*env)->ExceptionDescribe(env);
+		g_error("No methodID?");
+	}
+
+	_name = (*env)->CallObjectMethod(env, obj, mid);
+	if (_name == NULL) {
+		(*env)->ExceptionDescribe(env);
+		g_error("null?");
+	}
+	if ((*env)->ExceptionCheck(env)) {
+		(*env)->ExceptionDescribe(env);
+		g_error("No String");
+	}
+
+	name = bindings_java_getString(env, _name);
+	if (name == NULL) {
+		(*env)->ExceptionDescribe(env);
+		g_error("OOM?");
+	}
+	if ((*env)->ExceptionCheck(env)) {
+		(*env)->ExceptionDescribe(env);
+		g_error("No conversion");
+	}
+
+	g_debug("obj.toString(): %s", name);
+	bindings_java_releaseString(name);
+}
+
+
+/*
+ * Meets the signature of (*GLogFunc), as used by the first parameter of
+ * g_log_set_default_handler().
+ */
+static void
+bindings_java_logging_handler
+(
+	const gchar *log_domain,
+	GLogLevelFlags log_level,
+	const gchar *message,
+	gpointer user_data
+)
+{
+	JNIEnv* env;
+	gchar* level;
+	gchar* msg;
+	
+	env = bindings_java_getEnv();
+
+	/*
+	 * Whether or not to throw on WARNING here is an open question.
+	 * Although the "--g-fatal-warnings" GTK option allows people to tell
+	 * GLib to make warnings fatal, their idea of fatal is to print the
+	 * WARNING and then to abort!
+	 *
+	 * So the alternatives open to us are to leave it to flow on to the
+	 * default log handler, or to throw our FatalError.
+	 *
+	 * In every instance we've observed, seeing a WARNING from GTK has
+	 * immediately indicated serious programmer error. So an Exception it
+	 * is.
+	 */
+	
+	switch (log_level) {
+	case G_LOG_LEVEL_ERROR:
+		level = "ERROR";
+		break;
+
+	case G_LOG_LEVEL_CRITICAL:
+		level = "CRITICAL";
+		break;
+
+	case G_LOG_LEVEL_WARNING:
+		level = "WARNING";
+		break;
+
+	default:
+		g_log_default_handler(log_domain, log_level, message, user_data);
+		return;
+	}
+	
+	msg = g_strdup_printf("%s-%s\n%s", log_domain, level, message);
+
+	bindings_java_throwByName(env, "org/gnome/glib/FatalError", msg);
+
+	g_free(msg);
+
+	/*
+	 * We would happily throw our exception and be done with it, except
+	 * that the Java VM messes with our good intentions: Exceptions which
+	 * occur during finalizing are ignored.
+	 *
+	 * Since these messages are often the root cause problem, it's
+	 * important to hear about them. So we output an alert.
+ 	 */
+
+	g_printerr("DANGER: %s-%s, %s\n", log_domain, level, message);
+	fflush(stderr);
+}
+
+void
+bindings_java_logging_init
+(
+)
+{
+	g_log_set_default_handler(bindings_java_logging_handler, NULL);
+}
+
+/*
+ * Convert a Java String object into a NULL-terminated UTF-8 string
+ *
+ * This serves as a replacement for JNI's GetStringUTFChars(). It uses GLib's
+ * UTF-16 to UTF-8 conversion function, which theoretically is a compliant
+ * implementation, unlike Java's.
+ *
+ * You must call bindings_java_releaseString() on the returned gchar*!
+ */
+const gchar*
+bindings_java_getString
+(
+	JNIEnv* env,
+	jstring _str
+)
+{
+	const jchar* _pointer;
+	const gunichar2* pointer;
+	gchar* str;
+	jsize _len;
+	glong len;
+	GError* error = NULL;
+
+	if (_str == NULL) {
+		return NULL;
+	}
+
+	/*
+	 * This is strange; it's tempting to assume that we can wait for the
+	 * NULL termination, but testing showed that there was sometimes junk
+	 * characters at the end. It seems safest just to ask the VM how long
+	 * the char[] is.
+	 */
+
+	_len = (*env)->GetStringLength(env, _str);
+	len = (glong) _len;
+
+	/*
+	 * Get a pointer to the underlying character array. With any luck, the
+	 * data will not be copied.
+	 */
+	// WARNING uses the JVM critical code path
+	_pointer = (*env)->GetStringCritical(env, _str, NULL);
+	if (G_UNLIKELY(_pointer == NULL)) {
+		return NULL; // Java Exception already thrown
+	}
+	pointer = (const gunichar2*) _pointer;
+
+
+	// call conversion function
+	str = g_utf16_to_utf8(pointer, len, NULL, NULL, &error);
+
+	(*env)->ReleaseStringCritical(env, _str, _pointer);
+	// WARNING end critical section
+
+	// cleanup
+	if (G_UNLIKELY(error != NULL)) {
+		bindings_java_throwGlibException(env, error);
+		return NULL;
+	}
+
+	return str;
+}
+
+/*
+ * Convert a NULL-terminated UTF-8 string into a Java String object.
+ *
+ * This serves as a replacement for JNI's NewStringUTF(), using GLib's
+ * theoretically correct UTF-8 to UTF-16 conversion function, rather than
+ * Java's internal non-compliant encoding.
+ */
+jstring
+bindings_java_newString
+(
+	JNIEnv* env,
+	const gchar* str
+)
+{
+	gunichar2* pointer;
+	const jchar* _pointer;
+	jstring _result;
+	glong num;
+	GError* error = NULL;
+
+	if (str == NULL) {
+		return NULL;
+	}
+
+	// call conversion function
+	pointer = g_utf8_to_utf16(str, -1, NULL, &num, &error);
+
+	if (G_UNLIKELY(error != NULL)) {
+		bindings_java_throwGlibException(env, error);
+		return NULL;
+	}
+
+	// construct object
+	_pointer = (const jchar*) pointer;
+	_result = (*env)->NewString(env, _pointer, num);
+
+	// cleanup
+	g_free(pointer);
+
+	return _result;
+}
+
+/*
+ * Free a String as created by bindings_java_getString().
+ *
+ * This is largely just an exercise in getting us around the const qualifier in
+ * const-gchar* types, but it has the benefit of keeping our String conversion
+ * utilities symmetric with the JNI API.
+ */
+void
+bindings_java_releaseString
+(
+	const gchar* str
+)
+{
+	g_free((gpointer) str);
+}
diff --git a/src/jni/gnome_screenshot.h b/src/jni/gnome_screenshot.h
new file mode 100644
index 0000000..f1ea660
--- /dev/null
+++ b/src/jni/gnome_screenshot.h
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2001-2006 Jonathan Blandford
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * This code is presented in java-gnome as wrapped in the class
+ * org.gnome.screeshot.Screenshot; making use of this code path require you
+ * to make your entire application available under a GPL compatible licence.
+ */
+
+#ifndef __GNOME_SCREENSHOT_H__
+#define __GNOME_SCREENSHOT_H__
+
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+
+/*
+ * This is somewhat of a force, but my system configured this way. Since we
+ * don't have the infrastructure to probe this sort of thing at present, we 
+ * just assume we're on a modern and capable GNOME Desktop. If not, too bad.
+ */
+#define HAVE_X11_EXTENSIONS_SHAPE_H 1
+
+extern gboolean screenshot_grab_lock(void);
+extern void screenshot_release_lock(void);
+extern GdkWindow* screenshot_find_current_window(void);
+extern GdkPixbuf* screenshot_get_pixbuf(GdkWindow*, gboolean, gboolean);
+
+extern void screenshot_add_shadow(GdkPixbuf**);
+extern void screenshot_add_border(GdkPixbuf**);
+
+#endif
diff --git a/src/jni/gnome_screenshot_capture.c b/src/jni/gnome_screenshot_capture.c
new file mode 100644
index 0000000..49d8ece
--- /dev/null
+++ b/src/jni/gnome_screenshot_capture.c
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code to capture an X11 Window as a GdkPixbuf is taken from gnome-utils's
+ * gnome-screenshot/gnome-screenshot.c,
+ *
+ * Copyright © 2001-2005 Jonathan Blandford
+ * Copyright © 2006-2008 Emmanuele Bassi
+ * Copyright © 2008      Cosimo Cecchi
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * This code is presented in java-gnome as wrapped in the class
+ * org.gnome.screeshot.Screenshot; making use of this code path require you to
+ * make your entire application available under a GPL compatible licence.
+ */
+
+#include <jni.h>
+#include <gtk/gtk.h>
+#include "bindings_java.h"
+#include "gnome_screenshot.h"
+
+/*
+ * This basically is a slimmed down and java-gnome adapted version of the
+ * code from gnome-utils/gnome-screenshot/gnome-screenshot.c's
+ * prepare_screenshot() function.
+ */
+GdkPixbuf*
+gnome_screenshot_capture
+(
+	gboolean take_window_shot,
+ 	gboolean include_border,
+    	const gchar* border_effect
+)
+{
+	GdkWindow* win;
+	GdkPixbuf* result;
+	JNIEnv* env;
+
+ 	if (!screenshot_grab_lock()) {
+ 		env = bindings_java_getEnv();
+ 		bindings_java_throw(env, "Unable to take grab screenshot lock");
+		return 0L;
+	}
+ 		
+    	if (take_window_shot) {
+		win = screenshot_find_current_window();
+		if (!win) {
+			take_window_shot = FALSE;
+			win = gdk_get_default_root_window();
+		}
+	} else {
+		win = gdk_get_default_root_window();
+
+	}
+
+	if (take_window_shot) {
+		result = screenshot_get_pixbuf(win, FALSE, TRUE);
+
+		switch (border_effect[0]) {
+		case 's': /* shadow */
+			screenshot_add_shadow(&result);
+        		break;
+		case 'b': /* border */
+			screenshot_add_border(&result);
+			break;
+		case 'n': /* none */
+		default:
+			break;
+		}
+  	} else {
+		result = screenshot_get_pixbuf(win, FALSE, FALSE);
+	}
+
+
+
+	screenshot_release_lock();
+
+	if (result == NULL) {
+		env = bindings_java_getEnv();
+		bindings_java_throw(env, "Unable to take a screenshot of the current window");
+		return 0L;
+	}
+
+	// and finally
+	return result;
+}
diff --git a/src/jni/gnome_screenshot_shadow.c b/src/jni/gnome_screenshot_shadow.c
new file mode 100644
index 0000000..08239c4
--- /dev/null
+++ b/src/jni/gnome_screenshot_shadow.c
@@ -0,0 +1,231 @@
+/* screenshot-shadow.c - part of GNOME Screenshot
+ *
+ * Copyright (C) 2001-2006  Jonathan Blandford <jrb at alum.mit.edu>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ */
+
+/* Shadow code from anders */
+
+#include "gnome_screenshot.h"
+#include <math.h>
+
+#define BLUR_RADIUS    5
+#define SHADOW_OFFSET  (BLUR_RADIUS * 4 / 5)
+#define SHADOW_OPACITY 0.5
+
+#define OUTLINE_RADIUS  1
+#define OUTLINE_OFFSET  0
+#define OUTLINE_OPACITY 1.0
+
+#define dist(x0, y0, x1, y1) sqrt(((x0) - (x1))*((x0) - (x1)) + ((y0) - (y1))*((y0) - (y1)))
+
+typedef struct {
+  int size;
+  double *data;
+} ConvFilter;
+
+static double
+gaussian (double x, double y, double r)
+{
+    return ((1 / (2 * M_PI * r)) *
+	    exp ((- (x * x + y * y)) / (2 * r * r)));
+}
+
+static ConvFilter *
+create_blur_filter (int radius)
+{
+  ConvFilter *filter;
+  int x, y;
+  double sum;
+
+  filter = g_new0 (ConvFilter, 1);
+  filter->size = radius * 2 + 1;
+  filter->data = g_new (double, filter->size * filter->size);
+
+  sum = 0.0;
+
+  for (y = 0 ; y < filter->size; y++)
+    {
+      for (x = 0 ; x < filter->size; x++)
+	{
+	  sum += filter->data[y * filter->size + x] = gaussian (x - (filter->size >> 1),
+								y - (filter->size >> 1),
+								radius);
+	}
+    }
+
+  for (y = 0; y < filter->size; y++)
+    {
+      for (x = 0; x < filter->size; x++)
+	{
+	  filter->data[y * filter->size + x] /= sum;
+	}
+    }
+
+  return filter;
+
+}
+
+static ConvFilter *
+create_outline_filter (int radius)
+{
+  ConvFilter *filter;
+  double *iter;
+
+  filter = g_new0 (ConvFilter, 1);
+  filter->size = radius * 2 + 1;
+  filter->data = g_new (double, filter->size * filter->size);
+
+  for (iter = filter->data;
+       iter < filter->data + (filter->size * filter->size);
+       iter++)
+    {
+      *iter = 1.0;
+    }
+
+  return filter;
+}
+
+static GdkPixbuf *
+create_effect (GdkPixbuf *src,
+               ConvFilter const *filter,
+               int radius,
+               int offset,
+               double opacity)
+{
+  GdkPixbuf *dest;
+  int x, y, i, j;
+  int src_x, src_y;
+  int suma;
+  int dest_width, dest_height;
+  int src_width, src_height;
+  int src_rowstride, dest_rowstride;
+  gboolean src_has_alpha;
+
+  guchar *src_pixels, *dest_pixels;
+
+  src_has_alpha =  gdk_pixbuf_get_has_alpha (src);
+
+  src_width = gdk_pixbuf_get_width (src);
+  src_height = gdk_pixbuf_get_height (src);
+  dest_width = src_width + 2 * radius + offset;
+  dest_height = src_height + 2 * radius + offset;
+
+  dest = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src),
+			 TRUE,
+			 gdk_pixbuf_get_bits_per_sample (src),
+			 dest_width, dest_height);
+
+  gdk_pixbuf_fill (dest, 0);
+
+  src_pixels = gdk_pixbuf_get_pixels (src);
+  src_rowstride = gdk_pixbuf_get_rowstride (src);
+
+  dest_pixels = gdk_pixbuf_get_pixels (dest);
+  dest_rowstride = gdk_pixbuf_get_rowstride (dest);
+
+  for (y = 0; y < dest_height; y++)
+    {
+      for (x = 0; x < dest_width; x++)
+	{
+	  suma = 0;
+
+	  src_x = x - radius;
+	  src_y = y - radius;
+
+	  /* We don't need to compute effect here, since this pixel will be
+	   * discarded when compositing */
+	  if (src_x >= 0 && src_x < src_width &&
+	      src_y >= 0 && src_y < src_height &&
+	      (!src_has_alpha ||
+	       src_pixels [src_y * src_rowstride + src_x * 4 + 3] == 0xFF))
+	    continue;
+
+	  for (i = 0; i < filter->size; i++)
+	    {
+	      for (j = 0; j < filter->size; j++)
+		{
+		  src_y = -(radius + offset) + y - (filter->size >> 1) + i;
+		  src_x = -(radius + offset) + x - (filter->size >> 1) + j;
+
+		  if (src_y < 0 || src_y >= src_height ||
+		      src_x < 0 || src_x >= src_width)
+		    continue;
+
+		  suma += ( src_has_alpha ?
+			    src_pixels [src_y * src_rowstride + src_x * 4 + 3] :
+			    0xFF ) * filter->data [i * filter->size + j];
+		}
+	    }
+
+	  dest_pixels [y * dest_rowstride + x * 4 + 3] = CLAMP (suma * opacity, 0x00, 0xFF);
+	}
+    }
+
+  return dest;
+}
+
+void
+screenshot_add_shadow (GdkPixbuf **src)
+{
+  GdkPixbuf *dest;
+  static ConvFilter *filter = NULL;
+
+  if (!filter)
+    filter = create_blur_filter (BLUR_RADIUS);
+
+  dest = create_effect (*src, filter,
+			BLUR_RADIUS,
+                        SHADOW_OFFSET, SHADOW_OPACITY);
+
+  if (dest == NULL)
+	  return;
+
+  gdk_pixbuf_composite (*src, dest,
+			BLUR_RADIUS, BLUR_RADIUS,
+			gdk_pixbuf_get_width (*src),
+			gdk_pixbuf_get_height (*src),
+			BLUR_RADIUS, BLUR_RADIUS, 1.0, 1.0,
+			GDK_INTERP_BILINEAR, 255);
+  g_object_unref (*src);
+  *src = dest;
+}
+
+void
+screenshot_add_border (GdkPixbuf **src)
+{
+  GdkPixbuf *dest;
+  static ConvFilter *filter = NULL;
+
+  if (!filter)
+    filter = create_outline_filter (OUTLINE_RADIUS);
+
+  dest = create_effect (*src, filter,
+			OUTLINE_RADIUS,
+                        OUTLINE_OFFSET, OUTLINE_OPACITY);
+
+  if (dest == NULL)
+	  return;
+
+  gdk_pixbuf_composite (*src, dest,
+			OUTLINE_RADIUS, OUTLINE_RADIUS,
+			gdk_pixbuf_get_width (*src),
+			gdk_pixbuf_get_height (*src),
+			OUTLINE_RADIUS, OUTLINE_RADIUS, 1.0, 1.0,
+			GDK_INTERP_BILINEAR, 255);
+  g_object_unref (*src);
+  *src = dest;
+}
diff --git a/src/jni/gnome_screenshot_shadow.h b/src/jni/gnome_screenshot_shadow.h
new file mode 100644
index 0000000..cac37db
--- /dev/null
+++ b/src/jni/gnome_screenshot_shadow.h
@@ -0,0 +1,28 @@
+/* screenshot-shadow.h - part of GNOME Screenshot
+ *
+ * Copyright (C) 2001-2006  Jonathan Blandford <jrb at alum.mit.edu>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ */
+
+#ifndef __SCREENSHOT_SHADOW_H__
+#define __SCREENSHOT_SHADOW_H__
+
+#include <gtk/gtk.h>
+
+void screenshot_add_shadow (GdkPixbuf **src);
+void screenshot_add_border (GdkPixbuf **src);
+
+#endif /* __SCREENSHOT_SHADOW_H__ */
diff --git a/src/jni/gnome_screenshot_utils.c b/src/jni/gnome_screenshot_utils.c
new file mode 100644
index 0000000..87eabff
--- /dev/null
+++ b/src/jni/gnome_screenshot_utils.c
@@ -0,0 +1,499 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011  Operational Dynamics Consulting, Pty Ltd
+ *
+ * This is ripped almost verbatim (we dropped a few functions) from
+ * gnome-utils's gnome-screenshot/screenshot-utils.c,
+ *
+ * Copyright © 2001-2006  Jonathan Blandford
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * This code is presented in java-gnome as wrapped in the class
+ * org.gnome.screeshot.Screenshot; making use of this code path require you
+ * to make your entire application available under a GPL compatible licence.
+ */
+
+#include "gnome_screenshot.h"
+
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#ifdef HAVE_X11_EXTENSIONS_SHAPE_H
+#include <X11/extensions/shape.h>
+#endif
+
+static GtkWidget *selection_window;
+
+#define SELECTION_NAME "_GNOME_PANEL_SCREENSHOT"
+
+static char *
+get_utf8_property (GdkWindow *window,
+		   GdkAtom    atom)
+{
+  gboolean res;
+  GdkAtom utf8_string;
+  GdkAtom type;
+  int actual_format, actual_length;
+  guchar *data;
+  char *retval;
+
+  utf8_string = gdk_x11_xatom_to_atom (gdk_x11_get_xatom_by_name ("UTF8_STRING"));
+  res = gdk_property_get (window, atom, utf8_string,
+                          0, G_MAXLONG, FALSE,
+                          &type,
+                          &actual_format, &actual_length,
+                          &data);
+  if (!res)
+    return NULL;
+
+  if (type != utf8_string || actual_format != 8 || actual_length == 0)
+    {
+      g_free (data);
+      return NULL;
+    }
+
+  if (!g_utf8_validate ((gchar *) data, actual_length, NULL))
+    {
+      char *atom_name = gdk_atom_name (atom);
+
+      g_warning ("Property `%s' (format: %d, length: %d) contained "
+                 "invalid UTF-8",
+                 atom_name,
+                 actual_format,
+                 actual_length);
+
+      g_free (atom_name);
+      g_free (data);
+
+      return NULL;
+    }
+
+  retval = g_strndup ((gchar *) data, actual_length);
+
+  g_free (data);
+
+  return retval;
+}
+
+/* To make sure there is only one screenshot taken at a time,
+ * (Imagine key repeat for the print screen key) we hold a selection
+ * until we are done taking the screenshot
+ */
+gboolean
+screenshot_grab_lock (void)
+{
+  GdkAtom selection_atom;
+  gboolean result = FALSE;
+
+  selection_atom = gdk_atom_intern (SELECTION_NAME, FALSE);
+  gdk_x11_grab_server ();
+
+  if (gdk_selection_owner_get (selection_atom) != NULL)
+    goto out;
+
+  selection_window = gtk_invisible_new ();
+  gtk_widget_show (selection_window);
+
+  if (!gtk_selection_owner_set (selection_window,
+				gdk_atom_intern (SELECTION_NAME, FALSE),
+				GDK_CURRENT_TIME))
+    {
+      gtk_widget_destroy (selection_window);
+      selection_window = NULL;
+      goto out;
+    }
+
+  result = TRUE;
+
+ out:
+  gdk_x11_ungrab_server ();
+  gdk_flush ();
+
+  return result;
+}
+
+void
+screenshot_release_lock (void)
+{
+  if (selection_window)
+    {
+      gtk_widget_destroy (selection_window);
+      selection_window = NULL;
+    }
+
+  gdk_flush ();
+}
+
+static GdkWindow *
+screenshot_find_active_window (void)
+{
+  GdkWindow *window;
+  GdkScreen *default_screen;
+
+  default_screen = gdk_screen_get_default ();
+  window = gdk_screen_get_active_window (default_screen);
+
+  return window;
+}
+
+static gboolean
+screenshot_window_is_desktop (GdkWindow *window)
+{
+  GdkWindow *root_window = gdk_get_default_root_window ();
+  GdkWindowTypeHint window_type_hint;
+
+  if (window == root_window)
+    return TRUE;
+
+  window_type_hint = gdk_window_get_type_hint (window);
+  if (window_type_hint == GDK_WINDOW_TYPE_HINT_DESKTOP)
+    return TRUE;
+
+  return FALSE;
+
+}
+
+#define MAXIMUM_WM_REPARENTING_DEPTH 4
+
+static GdkWindow *
+look_for_hint_helper (GdkWindow *window,
+		      GdkAtom    property,
+		      int       depth)
+{
+  gboolean res;
+  GdkAtom actual_type;
+  int actual_format, actual_length;
+  guchar *data;
+
+  res = gdk_property_get (window, property, GDK_NONE,
+                          0, 1, FALSE,
+                          &actual_type,
+                          &actual_format, &actual_length,
+                          &data);
+
+  if (res == TRUE &&
+      data != NULL &&
+      actual_format == 32 &&
+      data[0] == 1)
+    {
+      g_free (data);
+
+      return window;
+    }
+
+  if (depth < MAXIMUM_WM_REPARENTING_DEPTH)
+    {
+      GList *children, *l;
+
+      children = gdk_window_get_children (window);
+      if (children != NULL)
+        {
+          for (l = children; l; l = l->next)
+            {
+              window = look_for_hint_helper (l->data, property, depth + 1);
+              if (window)
+                break;
+            }
+
+          g_list_free (children);
+
+          if (window)
+            return window;
+        }
+    }
+
+  return NULL;
+}
+
+static GdkWindow *
+look_for_hint (GdkWindow *window,
+	       GdkAtom property)
+{
+  GdkWindow *retval;
+
+  retval = look_for_hint_helper (window, property, 0);
+
+  return retval;
+}
+
+GdkWindow *
+screenshot_find_current_window ()
+{
+  GdkWindow *current_window;
+
+  current_window = screenshot_find_active_window ();
+
+  /* If there's no active window, we fall back to returning the
+   * window that the cursor is in.
+   */
+  if (!current_window)
+    current_window = gdk_window_at_pointer (NULL, NULL);
+
+  if (current_window)
+    {
+      if (screenshot_window_is_desktop (current_window))
+	/* if the current window is the desktop (e.g. nautilus), we
+	 * return NULL, as getting the whole screen makes more sense.
+         */
+        return NULL;
+
+      /* Once we have a window, we take the toplevel ancestor. */
+      current_window = gdk_window_get_toplevel (current_window);
+    }
+
+  return current_window;
+}
+
+static Window
+find_wm_window (Window xid)
+{
+  Window root, parent, *children;
+  unsigned int nchildren;
+
+  do
+    {
+      if (XQueryTree (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), xid, &root,
+		      &parent, &children, &nchildren) == 0)
+	{
+	  g_warning ("Couldn't find window manager window");
+	  return None;
+	}
+
+      if (root == parent)
+	return xid;
+
+      xid = parent;
+    }
+  while (TRUE);
+}
+
+
+GdkPixbuf *
+screenshot_get_pixbuf (GdkWindow *window,
+                       gboolean   include_pointer,
+                       gboolean   include_border)
+{
+  GdkWindow *root;
+  GdkPixbuf *screenshot;
+  gint x_real_orig, y_real_orig, x_orig, y_orig;
+  gint width, real_width, height, real_height;
+
+  /* If the screenshot should include the border, we look for the WM window. */
+
+  if (include_border)
+    {
+      Window xid, wm;
+      GdkDisplay* display;
+
+      xid = gdk_x11_window_get_xid (window);
+      wm = find_wm_window (xid);
+
+      if (wm != None) {
+        display = gdk_display_get_default();
+        window = gdk_x11_window_foreign_new_for_display (display, wm);
+      }
+
+      /* fallback to no border if we can't find the WM window. */
+    }
+
+  root = gdk_get_default_root_window ();
+
+  gdk_window_get_geometry (window, NULL, NULL, &real_width, &real_height);
+  gdk_window_get_origin (window, &x_real_orig, &y_real_orig);
+
+  x_orig = x_real_orig;
+  y_orig = y_real_orig;
+  width  = real_width;
+  height = real_height;
+
+  if (x_orig < 0)
+    {
+      width = width + x_orig;
+      x_orig = 0;
+    }
+
+  if (y_orig < 0)
+    {
+      height = height + y_orig;
+      y_orig = 0;
+    }
+
+  if (x_orig + width > gdk_screen_width ())
+    width = gdk_screen_width () - x_orig;
+
+  if (y_orig + height > gdk_screen_height ())
+    height = gdk_screen_height () - y_orig;
+
+  screenshot = gdk_pixbuf_get_from_window (root,
+                                             x_orig, y_orig,
+                                             width, height);
+
+#ifdef HAVE_X11_EXTENSIONS_SHAPE_H
+  if (include_border)
+    {
+      XRectangle *rectangles;
+      GdkPixbuf *tmp;
+      int rectangle_count, rectangle_order, i;
+
+      /* we must use XShape to avoid showing what's under the rounder corners
+       * of the WM decoration.
+       */
+
+      rectangles = XShapeGetRectangles (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()),
+                                        gdk_x11_window_get_xid (window),
+                                        ShapeBounding,
+                                        &rectangle_count,
+                                        &rectangle_order);
+      if (rectangles && rectangle_count > 0)
+        {
+          gboolean has_alpha = gdk_pixbuf_get_has_alpha (screenshot);
+
+          tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+          gdk_pixbuf_fill (tmp, 0);
+
+          for (i = 0; i < rectangle_count; i++)
+            {
+              gint rec_x, rec_y;
+              gint rec_width, rec_height;
+              gint y;
+
+              rec_x = rectangles[i].x;
+              rec_y = rectangles[i].y;
+              rec_width = rectangles[i].width;
+              rec_height = rectangles[i].height;
+
+              if (x_real_orig < 0)
+                {
+                  rec_x += x_real_orig;
+                  rec_x = MAX(rec_x, 0);
+                  rec_width += x_real_orig;
+                }
+
+              if (y_real_orig < 0)
+                {
+                  rec_y += y_real_orig;
+                  rec_y = MAX(rec_y, 0);
+                  rec_height += y_real_orig;
+                }
+
+              if (x_orig + rec_x + rec_width > gdk_screen_width ())
+                rec_width = gdk_screen_width () - x_orig - rec_x;
+
+              if (y_orig + rec_y + rec_height > gdk_screen_height ())
+                rec_height = gdk_screen_height () - y_orig - rec_y;
+
+              for (y = rec_y; y < rec_y + rec_height; y++)
+                {
+                  guchar *src_pixels, *dest_pixels;
+                  gint x;
+
+                  src_pixels = gdk_pixbuf_get_pixels (screenshot)
+                             + y * gdk_pixbuf_get_rowstride(screenshot)
+                             + rec_x * (has_alpha ? 4 : 3);
+                  dest_pixels = gdk_pixbuf_get_pixels (tmp)
+                              + y * gdk_pixbuf_get_rowstride (tmp)
+                              + rec_x * 4;
+
+                  for (x = 0; x < rec_width; x++)
+                    {
+                      *dest_pixels++ = *src_pixels++;
+                      *dest_pixels++ = *src_pixels++;
+                      *dest_pixels++ = *src_pixels++;
+
+                      if (has_alpha)
+                        *dest_pixels++ = *src_pixels++;
+                      else
+                        *dest_pixels++ = 255;
+                    }
+                }
+            }
+
+          g_object_unref (screenshot);
+          screenshot = tmp;
+        }
+    }
+#endif /* HAVE_X11_EXTENSIONS_SHAPE_H */
+
+  if (include_pointer)
+    {
+      GdkCursor *cursor;
+      GdkPixbuf *cursor_pixbuf;
+
+      cursor = gdk_cursor_new_for_display (gdk_display_get_default (), GDK_LEFT_PTR);
+      cursor_pixbuf = gdk_cursor_get_image (cursor);
+
+      if (cursor_pixbuf != NULL)
+        {
+          GdkRectangle r1, r2;
+          gint cx, cy, xhot, yhot;
+
+          gdk_window_get_pointer (window, &cx, &cy, NULL);
+          sscanf (gdk_pixbuf_get_option (cursor_pixbuf, "x_hot"), "%d", &xhot);
+          sscanf (gdk_pixbuf_get_option (cursor_pixbuf, "y_hot"), "%d", &yhot);
+
+          /* in r1 we have the window coordinates */
+          r1.x = x_real_orig;
+          r1.y = y_real_orig;
+          r1.width = real_width;
+          r1.height = real_height;
+
+          /* in r2 we have the cursor window coordinates */
+          r2.x = cx + x_real_orig;
+          r2.y = cy + y_real_orig;
+          r2.width = gdk_pixbuf_get_width (cursor_pixbuf);
+          r2.height = gdk_pixbuf_get_height (cursor_pixbuf);
+
+          /* see if the pointer is inside the window */
+          if (gdk_rectangle_intersect (&r1, &r2, &r2))
+            {
+              gdk_pixbuf_composite (cursor_pixbuf, screenshot,
+                                    cx - xhot, cy - yhot,
+                                    r2.width, r2.height,
+                                    cx - xhot, cy - yhot,
+                                    1.0, 1.0,
+                                    GDK_INTERP_BILINEAR,
+                                    255);
+            }
+
+          g_object_unref (cursor_pixbuf);
+          gdk_cursor_unref (cursor);
+        }
+    }
+
+  return screenshot;
+}
+
+gchar *
+screenshot_get_window_title (GdkWindow *win)
+{
+  gchar *name;
+
+  win = gdk_window_get_toplevel (win);
+  win = look_for_hint (win, gdk_x11_xatom_to_atom (gdk_x11_get_xatom_by_name ("WM_STATE")));
+
+  name = get_utf8_property (win, gdk_x11_xatom_to_atom (gdk_x11_get_xatom_by_name ("_NET_WM_NAME")));
+  if (name)
+    return name;
+
+  /* TODO: maybe we should also look at WM_NAME and WM_CLASS? */
+
+  return g_strdup (_("Untitled Window"));
+}
+
diff --git a/src/util/coverage.pl b/src/util/coverage.pl
new file mode 100755
index 0000000..fe43b45
--- /dev/null
+++ b/src/util/coverage.pl
@@ -0,0 +1,108 @@
+#! /usr/bin/perl -w
+#
+# coverage.pl, a quick first order approximation of the extend of the coverage
+# provided by java-gnome. This works releative to the project top level
+# directory, so you need to invoke it as [./]src/util/coverage.pl
+#
+# Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+use strict;
+
+print "Coverage\n";
+print "========\n";
+print "\n";
+print "Functions, methods, and virtuals\n";
+print "--------------------------------\n";
+print "\n";
+
+my $num;
+my ( @defs, @sources );
+
+$num = 0;
+
+print "Size of imported pygtk data:\t";
+printf "%5d\n", 5468; 
+
+
+ at defs = glob "src/defs/*.defs src/util/missing.defs";
+
+foreach my $file ( @defs ) {
+	open DEFS, $file;
+
+	while (<DEFS>) {
+		if ((/^\(define-method/) ||
+		    (/^\(define-function/) ||
+		    (/^\(define-virtual/)) {
+			$num++;
+		}
+	}
+
+	close DEFS;
+}
+
+print "Current size of .defs data:\t";
+printf "%5d\n", $num;
+
+ at sources = split(/\n/, `find generated/bindings/ -name '*.java'`);
+$num = 0;
+
+foreach my $file ( @sources ) {
+	open JAVA, $file;
+
+	while (<JAVA>) {
+		if (/^    private static native /) {
+			if (/get_ordinal_/) {
+				# skip flags
+				next;
+			}
+			$num++;
+		} elsif (/^    protected static final void /) {
+			# receiver
+			$num++;
+		}
+	}
+
+	close JAVA;
+}
+
+print "Number generated:\t\t";
+printf "%5d\n", $num;
+
+print "Number actually relevant:\t 1800?\n";
+
+ at sources = split(/\n/, `find src/bindings/ -name '*.java'`);
+$num = 0;
+
+foreach my $file ( @sources ) {
+	open JAVA, $file;
+
+	while (<JAVA>) {
+		if (/^    public /) {
+			if (/^    public interface/) {
+				next;
+			}
+			$num++;
+		}
+	}
+
+	close JAVA;
+}
+
+print "java-gnome public API:\t\t";
+printf "%5d\n", $num;
+
+
diff --git a/src/util/demux/Makefile b/src/util/demux/Makefile
new file mode 100644
index 0000000..541584e
--- /dev/null
+++ b/src/util/demux/Makefile
@@ -0,0 +1,44 @@
+PYGTK=~/vcs/gnome2/pygtk
+MISSING=missing.txt
+DEFSDIR=../../defs
+
+all: demux blacklist install
+
+demux:
+	rm -f *.defs
+	rm -f $(MISSING)
+
+	./demux.py java-gnome.fixes >> $(MISSING)
+
+	./demux.py $(PYGTK)/gtk/gdk-base.defs >> $(MISSING)
+	./demux.py $(PYGTK)/gtk/gdk-2.10.defs >> $(MISSING)
+
+	./demux.py $(PYGTK)/gtk/gtk-base.defs >> $(MISSING)
+	./demux.py $(PYGTK)/gtk/gtk-2.10.defs >> $(MISSING)
+
+	./demux.py $(PYGTK)/gtk/libglade.defs >> $(MISSING)
+	./demux.py $(PYGTK)/gtk/gtkunixprint.defs >> $(MISSING)
+	./demux.py $(PYGTK)/pango.defs >> $(MISSING)
+	./demux.py $(PYGTK)/atk.defs >> $(MISSING)
+
+blacklist:
+	rm -f PyGtkGenericCellRenderer.defs
+	rm -f PyGtkGenericTreeModel.defs
+	rm -f GtkProgress.defs
+	rm -f GtkList.defs
+	rm -f GtkCTree.defs
+	rm -f GtkCTreeExpanderStyle.defs
+	rm -f GtkCTreeExpansionType.defs
+	rm -f GtkCTreeLineStyle.defs
+	rm -f GtkCTreePos.defs
+	rm -f GtkType.defs
+	rm -f GtkText.defs
+	rm -f GtkCombo.defs
+	rm -f GtkOldEditable.defs
+	rm -f GtkArgs.defs
+	rm -f GtkPixmap.defs
+
+install:
+	mv *.defs $(DEFSDIR)
+	mv $(MISSING) ../missing.defs
+
diff --git a/src/util/demux/definitions.py b/src/util/demux/definitions.py
new file mode 100644
index 0000000..a5b76fe
--- /dev/null
+++ b/src/util/demux/definitions.py
@@ -0,0 +1,601 @@
+# vim: set fileencoding=UTF-8
+#
+# definitions.py
+#
+# Copyright © 1998-2006 James Henstridge, John Finlay and Others
+# Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# This code imported from pygtk, the Python language bindings for GTK and
+# GNOME, then stripped down to the task of round-tripping .defs data from
+# a single stream of data into individual files.
+#
+
+import copy
+import sys
+
+def get_valid_scheme_definitions(defs):
+    return [x for x in defs if isinstance(x, tuple) and len(x) >= 2]
+
+# New Parameter class, wich emulates a tuple for compatibility reasons
+class Parameter(object):
+    def __init__(self, ptype, pname, pdflt, pnull, pdir=None):
+        self.ptype = ptype
+        self.pname = pname
+        self.pdflt = pdflt
+        self.pnull = pnull
+        self.pdir = pdir
+
+    def __len__(self): return 4
+    def __getitem__(self, i):
+        return (self.ptype, self.pname, self.pdflt, self.pnull)[i]
+
+    def merge(self, old):
+        if old.pdflt is not None:
+            self.pdflt = old.pdflt
+        if old.pnull is not None:
+            self.pnull = old.pnull
+
+# Parameter for property based constructors
+class Property(object):
+    def __init__(self, pname, optional, argname):
+        self.pname = pname
+        self.optional = optional
+        self.argname = argname
+
+    def merge(self, old):
+        if old.optional is not None:
+            self.optional = old.optional
+        if old.argname is not None:
+            self.argname = old.argname
+
+
+class Definition:
+    docstring = "NULL"
+    def __init__(self, *args):
+        """Create a new defs object of this type.  The arguments are the
+        components of the definition"""
+        raise RuntimeError, "this is an abstract class"
+    def merge(self, old):
+        """Merge in customisations from older version of definition"""
+        raise RuntimeError, "this is an abstract class"
+    def write_defs(self, fp=sys.stdout):
+        """write out this definition in defs file format"""
+        raise RuntimeError, "this is an abstract class"
+
+    def guess_return_value_ownership(self):
+        "return 1 if caller owns return value"
+        if getattr(self, 'is_constructor_of', False):
+            self.caller_owns_return = True
+        elif self.ret in ('char*', 'gchar*', 'string'):
+            self.caller_owns_return = True
+        else:
+            self.caller_owns_return = False
+    
+    def whichClass(self):
+        self.write_defs()
+        raise RuntimeError, "This method must be overridden"
+
+
+class ObjectDef(Definition):
+    def __init__(self, name, *args):
+        self.name = name
+        self.module = None
+        self.parent = None
+        self.c_name = None
+        self.typecode = None
+        self.fields = []
+        self.implements = []
+        self.class_init_func = None
+        self.has_new_constructor_api = False
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'in-module':
+                self.module = arg[1]
+            elif arg[0] == 'docstring':
+                self.docstring = make_docstring(arg[1:])
+            elif arg[0] == 'parent':
+                self.parent = arg[1]
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'fields':
+                for parg in arg[1:]:
+                    self.fields.append((parg[0], parg[1]))
+            elif arg[0] == 'implements':
+                self.implements.append(arg[1])
+    def merge(self, old):
+        # currently the .h parser doesn't try to work out what fields of
+        # an object structure should be public, so we just copy the list
+        # from the old version ...
+        self.fields = old.fields
+        self.implements = old.implements
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-object ' + self.name + '\n')
+        if self.module:
+            fp.write('  (in-module "' + self.module + '")\n')
+        if self.parent:
+            fp.write('  (parent "' + self.parent + '")\n')
+        for interface in self.implements:
+            fp.write('  (implements "' + interface + '")\n')
+        if self.c_name:
+            fp.write('  (c-name "' + self.c_name + '")\n')
+        if self.typecode:
+            fp.write('  (gtype-id "' + self.typecode + '")\n')
+        if self.fields:
+            fp.write('  (fields\n')
+            for (ftype, fname) in self.fields:
+                fp.write('    \'("' + ftype + '" "' + fname + '")\n')
+            fp.write('  )\n')
+        fp.write(')\n\n')
+
+    def whichClass(self):
+        return self.c_name
+
+class InterfaceDef(Definition):
+    def __init__(self, name, *args):
+        self.name = name
+        self.module = None
+        self.c_name = None
+        self.typecode = None
+        self.vtable = None
+        self.fields = []
+        self.interface_info = None
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'in-module':
+                self.module = arg[1]
+            elif arg[0] == 'docstring':
+                self.docstring = make_docstring(arg[1:])
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'vtable':
+                self.vtable = arg[1]
+        if self.vtable is None:
+            self.vtable = self.c_name + "Iface"
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-interface ' + self.name + '\n')
+        if self.module:
+            fp.write('  (in-module "' + self.module + '")\n')
+        if self.c_name:
+            fp.write('  (c-name "' + self.c_name + '")\n')
+        if self.typecode:
+            fp.write('  (gtype-id "' + self.typecode + '")\n')
+        fp.write(')\n\n')
+
+    def whichClass(self):
+        return self.c_name
+
+
+class EnumDef(Definition):
+    def __init__(self, name, *args):
+        self.deftype = 'enum'
+        self.name = name
+        self.in_module = None
+        self.c_name = None
+        self.typecode = None
+        self.values = []
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'in-module':
+                self.in_module = arg[1]
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'values':
+                for varg in arg[1:]:
+                    self.values.append((varg[0], varg[1]))
+    def merge(self, old):
+        pass
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-' + self.deftype + ' ' + self.name + '\n')
+        if self.in_module:
+            fp.write('  (in-module "' + self.in_module + '")\n')
+        fp.write('  (c-name "' + self.c_name + '")\n')
+        fp.write('  (gtype-id "' + self.typecode + '")\n')
+        if self.values:
+            fp.write('  (values\n')
+            for name, val in self.values:
+                fp.write('    \'("' + name + '" "' + val + '")\n')
+            fp.write('  )\n')
+        fp.write(')\n\n')
+    
+    def whichClass(self):
+        return self.c_name
+
+
+class FlagsDef(EnumDef):
+    def __init__(self, *args):
+        apply(EnumDef.__init__, (self,) + args)
+        self.deftype = 'flags'
+
+
+
+class BoxedDef(Definition):
+    def __init__(self, name, *args):
+        self.name = name
+        self.module = None
+        self.c_name = None
+        self.typecode = None
+        self.copy = None
+        self.release = None
+        self.fields = []
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'in-module':
+                self.module = arg[1]
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'copy-func':
+                self.copy = arg[1]
+            elif arg[0] == 'release-func':
+                self.release = arg[1]
+            elif arg[0] == 'fields':
+                for parg in arg[1:]:
+                    self.fields.append((parg[0], parg[1]))
+    def merge(self, old):
+        # currently the .h parser doesn't try to work out what fields of
+        # an object structure should be public, so we just copy the list
+        # from the old version ...
+        self.fields = old.fields
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-boxed ' + self.name + '\n')
+        if self.module:
+            fp.write('  (in-module "' + self.module + '")\n')
+        if self.c_name:
+            fp.write('  (c-name "' + self.c_name + '")\n')
+        if self.typecode:
+            fp.write('  (gtype-id "' + self.typecode + '")\n')
+        if self.copy:
+            fp.write('  (copy-func "' + self.copy + '")\n')
+        if self.release:
+            fp.write('  (release-func "' + self.release + '")\n')
+        if self.fields:
+            fp.write('  (fields\n')
+            for (ftype, fname) in self.fields:
+                fp.write('    \'("' + ftype + '" "' + fname + '")\n')
+            fp.write('  )\n')
+        fp.write(')\n\n')
+
+    def whichClass(self):
+        return self.c_name
+
+
+class PointerDef(Definition):
+    def __init__(self, name, *args):
+        self.name = name
+        self.module = None
+        self.c_name = None
+        self.typecode = None
+        self.fields = []
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'in-module':
+                self.module = arg[1]
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'fields':
+                for parg in arg[1:]:
+                    self.fields.append((parg[0], parg[1]))
+    def merge(self, old):
+        # currently the .h parser doesn't try to work out what fields of
+        # an object structure should be public, so we just copy the list
+        # from the old version ...
+        self.fields = old.fields
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-pointer ' + self.name + '\n')
+        if self.module:
+            fp.write('  (in-module "' + self.module + '")\n')
+        if self.c_name:
+            fp.write('  (c-name "' + self.c_name + '")\n')
+        if self.typecode:
+            fp.write('  (gtype-id "' + self.typecode + '")\n')
+        if self.fields:
+            fp.write('  (fields\n')
+            for (ftype, fname) in self.fields:
+                fp.write('    \'("' + ftype + '" "' + fname + '")\n')
+            fp.write('  )\n')
+        fp.write(')\n\n')
+    
+    def whichClass(self):
+        return None
+
+class MethodDefBase(Definition):
+    def __init__(self, name, *args):
+        dump = 0
+        self.name = name
+        self.ret = None
+        self.caller_owns_return = None
+        self.unblock_threads = None
+        self.c_name = None
+        self.typecode = None
+        self.of_object = None
+        self.params = [] # of form (type, name, default, nullok)
+        self.varargs = 0
+        self.deprecated = None
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'of-object':
+                self.of_object = arg[1]
+            elif arg[0] == 'docstring':
+                self.docstring = make_docstring(arg[1:])
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'return-type':
+                self.ret = arg[1]
+            elif arg[0] == 'caller-owns-return':
+                self.caller_owns_return = arg[1] in ('t', '#t')
+            elif arg[0] == 'unblock-threads':
+                self.unblock_threads = arg[1] in ('t', '#t')
+            elif arg[0] == 'parameters':
+                for parg in arg[1:]:
+                    ptype = parg[0]
+                    pname = parg[1]
+                    pdflt = None
+                    pnull = 0
+                    pdir = None
+                    for farg in parg[2:]:
+                        assert isinstance(farg, tuple)
+                        if farg[0] == 'default':
+                            pdflt = farg[1]
+                        elif farg[0] == 'null-ok':
+                            pnull = 1
+                        elif farg[0] == 'direction':
+                            pdir = farg[1]
+                    self.params.append(Parameter(ptype, pname, pdflt, pnull, pdir))
+            elif arg[0] == 'varargs':
+                self.varargs = arg[1] in ('t', '#t')
+            elif arg[0] == 'deprecated':
+                self.deprecated = arg[1]
+            else:
+                sys.stderr.write("Warning: %s argument unsupported.\n"
+                                 % (arg[0]))
+                dump = 1
+        if dump:
+            self.write_defs(sys.stderr)
+
+        if self.caller_owns_return is None and self.ret is not None:
+            self.guess_return_value_ownership()
+
+    def merge(self, old, parmerge):
+        self.caller_owns_return = old.caller_owns_return
+        self.varargs = old.varargs
+        # here we merge extra parameter flags accross to the new object.
+        if not parmerge:
+            self.params = copy.deepcopy(old.params)
+            return
+        for i in range(len(self.params)):
+            ptype, pname, pdflt, pnull = self.params[i]
+            for p2 in old.params:
+                if p2[1] == pname:
+                    self.params[i] = (ptype, pname, p2[2], p2[3])
+                    break
+    def _write_defs(self, fp=sys.stdout):
+        if self.of_object != (None, None):
+            fp.write('  (of-object "' + self.of_object + '")\n')
+        if self.c_name:
+            fp.write('  (c-name "' + self.c_name + '")\n')
+        if self.typecode:
+            fp.write('  (gtype-id "' + self.typecode + '")\n')
+        if self.caller_owns_return:
+            fp.write('  (caller-owns-return #t)\n')
+        if self.unblock_threads:
+            fp.write('  (unblock_threads #t)\n')
+        if self.ret:
+            fp.write('  (return-type "' + self.ret + '")\n')
+        if self.deprecated:
+            fp.write('  (deprecated "' + self.deprecated + '")\n')
+        if self.params:
+            fp.write('  (parameters\n')
+            for ptype, pname, pdflt, pnull in self.params:
+                fp.write('    \'("' + ptype + '" "' + pname +'"')
+                if pdflt: fp.write(' (default "' + pdflt + '")')
+                if pnull: fp.write(' (null-ok)')
+                fp.write(')\n')
+            fp.write('  )\n')
+        if self.varargs:
+            fp.write('  (varargs #t)\n')
+        fp.write(')\n\n')
+
+
+class MethodDef(MethodDefBase):
+    def __init__(self, name, *args):
+        MethodDefBase.__init__(self, name, *args)
+        for item in ('c_name', 'of_object'):
+            if self.__dict__[item] == None:
+                self.write_defs(sys.stderr)
+                raise RuntimeError, "definition missing required %s" % (item,)
+
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-method ' + self.name + '\n')
+        self._write_defs(fp)
+
+    def whichClass(self):
+        return self.of_object
+
+class VirtualDef(MethodDefBase):
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-virtual ' + self.name + '\n')
+        self._write_defs(fp)
+        
+    def whichClass(self):
+        return self.of_object
+
+
+class FunctionDef(Definition):
+    def __init__(self, name, *args):
+        dump = 0
+        self.name = name
+        self.in_module = None
+        self.is_constructor_of = None
+        self.ret = None
+        self.caller_owns_return = None
+        self.unblock_threads = None
+        self.c_name = None
+        self.typecode = None
+        self.params = [] # of form (type, name, default, nullok)
+        self.varargs = 0
+        self.deprecated = None
+        for arg in get_valid_scheme_definitions(args):
+            if arg[0] == 'in-module':
+                self.in_module = arg[1]
+            elif arg[0] == 'docstring':
+                self.docstring = make_docstring(arg[1:])
+            elif arg[0] == 'is-constructor-of':
+                self.is_constructor_of = arg[1]
+            elif arg[0] == 'c-name':
+                self.c_name = arg[1]
+            elif arg[0] == 'gtype-id':
+                self.typecode = arg[1]
+            elif arg[0] == 'return-type':
+                self.ret = arg[1]
+            elif arg[0] == 'caller-owns-return':
+                self.caller_owns_return = arg[1] in ('t', '#t')
+            elif arg[0] == 'unblock-threads':
+                self.unblock_threads = arg[1] in ('t', '#t')
+            elif arg[0] == 'parameters':
+                for parg in arg[1:]:
+                    ptype = parg[0]
+                    pname = parg[1]
+                    pdflt = None
+                    pnull = 0
+                    for farg in parg[2:]:
+                        if farg[0] == 'default':
+                            pdflt = farg[1]
+                        elif farg[0] == 'null-ok':
+                            pnull = 1
+                    self.params.append(Parameter(ptype, pname, pdflt, pnull))
+            elif arg[0] == 'properties':
+                if self.is_constructor_of is None:
+                    print >> sys.stderr, "Warning: (properties ...) "\
+                          "is only valid for constructors"
+                for prop in arg[1:]:
+                    pname = prop[0]
+                    optional = False
+                    argname = pname
+                    for farg in prop[1:]:
+                        if farg[0] == 'optional':
+                            optional = True
+                        elif farg[0] == 'argname':
+                            argname = farg[1]
+                    self.params.append(Property(pname, optional, argname))
+            elif arg[0] == 'varargs':
+                self.varargs = arg[1] in ('t', '#t')
+            elif arg[0] == 'deprecated':
+                self.deprecated = arg[1]
+            else:
+                sys.stderr.write("Warning: %s argument unsupported\n"
+                                 % (arg[0],))
+                dump = 1
+        if dump:
+            self.write_defs(sys.stderr)
+
+        if self.caller_owns_return is None and self.ret is not None:
+            self.guess_return_value_ownership()
+        for item in ('c_name',):
+            if self.__dict__[item] == None:
+                self.write_defs(sys.stderr)
+                raise RuntimeError, "definition missing required %s" % (item,)
+
+    _method_write_defs = MethodDef.__dict__['write_defs']
+
+    def merge(self, old, parmerge):
+        self.caller_owns_return = old.caller_owns_return
+        self.varargs = old.varargs
+        if not parmerge:
+            self.params = copy.deepcopy(old.params)
+            return
+        # here we merge extra parameter flags accross to the new object.
+        def merge_param(param):
+            for old_param in old.params:
+                if old_param.pname == param.pname:
+                    if isinstance(old_param, Property):
+                        # h2def never scans Property's, therefore if
+                        # we have one it was manually written, so we
+                        # keep it.
+                        return copy.deepcopy(old_param)
+                    else:
+                        param.merge(old_param)
+                        return param
+            raise RuntimeError, "could not find %s in old_parameters %r" % (
+                param.pname, [p.pname for p in old.params])
+        try:
+            self.params = map(merge_param, self.params)
+        except RuntimeError:
+            # parameter names changed and we can't find a match; it's
+            # safer to keep the old parameter list untouched.
+            self.params = copy.deepcopy(old.params)
+
+        if not self.is_constructor_of:
+            try:
+                self.is_constructor_of = old.is_constructor_of
+            except AttributeError:
+                pass
+        if isinstance(old, MethodDef):
+            self.name = old.name
+            # transmogrify from function into method ...
+            self.write_defs = self._method_write_defs
+            self.of_object = old.of_object
+            del self.params[0]
+    def write_defs(self, fp=sys.stdout):
+        fp.write('(define-function ' + self.name + '\n')
+        if self.in_module:
+            fp.write('  (in-module "' + self.in_module + '")\n')
+        if self.is_constructor_of:
+            fp.write('  (is-constructor-of "' + self.is_constructor_of +'")\n')
+        if self.c_name:
+            fp.write('  (c-name "' + self.c_name + '")\n')
+        if self.typecode:
+            fp.write('  (gtype-id "' + self.typecode + '")\n')
+        if self.caller_owns_return:
+            fp.write('  (caller-owns-return #t)\n')
+        if self.unblock_threads:
+            fp.write('  (unblock-threads #t)\n')
+        if self.ret:
+            fp.write('  (return-type "' + self.ret + '")\n')
+        if self.deprecated:
+            fp.write('  (deprecated "' + self.deprecated + '")\n')
+        if self.params:
+            if isinstance(self.params[0], Parameter):
+                fp.write('  (parameters\n')
+                for ptype, pname, pdflt, pnull in self.params:
+                    fp.write('    \'("' + ptype + '" "' + pname +'"')
+                    if pdflt: fp.write(' (default "' + pdflt + '")')
+                    if pnull: fp.write(' (null-ok)')
+                    fp.write(')\n')
+                fp.write('  )\n')
+            elif isinstance(self.params[0], Property):
+                fp.write('  (properties\n')
+                for prop in self.params:
+                    fp.write('    \'("' + prop.pname +'"')
+                    if prop.optional: fp.write(' (optional)')
+                    fp.write(')\n')
+                fp.write('  )\n')
+            else:
+                assert False, "strange parameter list %r" % self.params[0]
+        if self.varargs:
+            fp.write('  (varargs #t)\n')
+
+        fp.write(')\n\n')
+        
+    def whichClass(self):
+        return self.is_constructor_of
+
diff --git a/src/util/demux/defsparser.py b/src/util/demux/defsparser.py
new file mode 100644
index 0000000..bb465f2
--- /dev/null
+++ b/src/util/demux/defsparser.py
@@ -0,0 +1,181 @@
+# vim: set fileencoding=UTF-8
+#
+# defsparser.py
+#
+# Copyright © 1998-2006 James Henstridge, John Finlay and Others
+# Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# This code imported from pygtk, the Python language bindings for GTK and
+# GNOME, then stripped down to the task of round-tripping .defs data from
+# a single stream of data into individual files.
+#
+
+import os, sys
+import scmexpr
+from definitions import BoxedDef, EnumDef, FlagsDef, FunctionDef, \
+     InterfaceDef, MethodDef, ObjectDef, PointerDef, VirtualDef
+
+include_path = ['.']
+
+class IncludeParser(scmexpr.Parser):
+    """A simple parser that follows include statements automatically"""
+    def include(self, input_filename):
+        global include_path
+        if os.path.isabs(input_filename):
+            filename = input_filename
+            # set self.filename to the include name, to handle recursive includes
+            oldfile = self.filename
+            self.filename = filename
+            self.startParsing()
+            self.filename = oldfile
+        else:
+            inc_path = [os.path.dirname(self.filename)] + include_path
+            for filename in [os.path.join(path_entry, input_filename)
+                             for path_entry in inc_path]:
+                if not os.path.exists(filename):
+                    continue
+                # set self.filename to the include name, to handle recursive includes
+                oldfile = self.filename
+                self.filename = filename
+                self.startParsing()
+                self.filename = oldfile
+                break
+            else:
+                raise IOError("%s not found in include path %s" % (input_filename, inc_path))
+
+class DefsParser(IncludeParser):
+    def __init__(self, arg, defines={}):
+        IncludeParser.__init__(self, arg)
+        self.objects = []
+        self.interfaces = []
+        self.enums = []      # enums and flags
+        self.boxes = []      # boxed types
+        self.pointers = []   # pointer types
+        self.functions = []  # functions and methods
+        self.virtuals = []   # virtual methods
+        self.c_name = {}     # hash of c names of functions
+        self.methods = {}    # hash of methods of particular objects
+        self.defines = defines      # -Dfoo=bar options, as dictionary
+
+    def define_object(self, *args):
+        odef = apply(ObjectDef, args)
+        self.objects.append(odef)
+        self.c_name[odef.c_name] = odef
+    def define_interface(self, *args):
+        idef = apply(InterfaceDef, args)
+        self.interfaces.append(idef)
+        self.c_name[idef.c_name] = idef
+    def define_enum(self, *args):
+        edef = apply(EnumDef, args)
+        self.enums.append(edef)
+        self.c_name[edef.c_name] = edef
+    def define_flags(self, *args):
+        fdef = apply(FlagsDef, args)
+        self.enums.append(fdef)
+        self.c_name[fdef.c_name] = fdef
+    def define_boxed(self, *args):
+        bdef = apply(BoxedDef, args)
+        self.boxes.append(bdef)
+        self.c_name[bdef.c_name] = bdef
+    def define_pointer(self, *args):
+        pdef = apply(PointerDef, args)
+        self.pointers.append(pdef)
+        self.c_name[pdef.c_name] = pdef
+    def define_function(self, *args):
+        fdef = apply(FunctionDef, args)
+        self.functions.append(fdef)
+        self.c_name[fdef.c_name] = fdef
+    def define_method(self, *args):
+        mdef = apply(MethodDef, args)
+        self.functions.append(mdef)
+        self.c_name[mdef.c_name] = mdef
+    def define_virtual(self, *args):
+        vdef = apply(VirtualDef, args)
+        self.virtuals.append(vdef)
+    def merge(self, old, parmerge):
+        for obj in self.objects:
+            if old.c_name.has_key(obj.c_name):
+                obj.merge(old.c_name[obj.c_name])
+        for f in self.functions:
+            if old.c_name.has_key(f.c_name):
+                f.merge(old.c_name[f.c_name], parmerge)
+
+    def printMissing(self, old):
+        for obj in self.objects:
+            if not old.c_name.has_key(obj.c_name):
+                obj.write_defs()
+        for f in self.functions:
+            if not old.c_name.has_key(f.c_name):
+                f.write_defs()
+
+    def writeDefs(self, fp=sys.stdout):
+        all = []
+        all = self.objects + self.interfaces + self.enums + self.boxes + self.pointers + self.functions + self.virtuals
+        
+        for obj in all:
+            type = obj.whichClass()
+            if type == None:
+                obj.write_defs(sys.stdout)
+                continue
+            
+            fp = open(""+obj.whichClass()+".defs", "a")
+            obj.write_defs(fp)
+            fp.close()
+
+    def find_object(self, c_name):
+        for obj in self.objects:
+            if obj.c_name == c_name:
+                return obj
+        else:
+            raise ValueError('object %r not found' % c_name)
+
+    def find_constructor(self, obj, overrides):
+        for func in self.functions:
+            if isinstance(func, FunctionDef) and \
+               func.is_constructor_of == obj.c_name and \
+               not overrides.is_ignored(func.c_name):
+                return func
+
+    def find_methods(self, obj):
+        objname = obj.c_name
+        return filter(lambda func, on=objname: isinstance(func, MethodDef) and
+                      func.of_object == on, self.functions)
+
+    def find_virtuals(self, obj):
+        objname = obj.c_name
+        retval = filter(lambda func, on=objname: isinstance(func, VirtualDef) and
+                        func.of_object == on, self.virtuals)
+        return retval
+
+    def find_functions(self):
+        return filter(lambda func: isinstance(func, FunctionDef) and
+                      not func.is_constructor_of, self.functions)
+
+    def ifdef(self, *args):
+        if args[0] in self.defines:
+            for arg in args[1:]:
+                #print >> sys.stderr, "-----> Handling conditional definition (%s): %s" % (args[0], arg)
+                self.handle(arg)
+        else:
+            pass
+            #print >> sys.stderr, "-----> Conditional %s is not true" % (args[0],)
+
+    def ifndef(self, *args):
+        if args[0] not in self.defines:
+            for arg in args[1:]:
+                self.handle(arg)
diff --git a/src/util/demux/demux.py b/src/util/demux/demux.py
new file mode 100755
index 0000000..7d9ebe0
--- /dev/null
+++ b/src/util/demux/demux.py
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+# vim: set fileencoding=UTF-8
+#
+# demux.py
+#
+# Copyright © 1998-2006 James Henstridge, John Finlay and Others
+# Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# This code imported from pygtk, the Python language bindings for GTK and
+# GNOME, then stripped down to the task of round-tripping .defs data from
+# a single stream of data into individual files.
+#
+# @author: Andrew Cowie
+#
+
+import sys
+import definitions
+import defsparser
+
+def main(argv):
+    defines = {}
+
+    p = defsparser.DefsParser(argv[1], defines)
+
+    p.startParsing()
+
+    p.writeDefs()
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/src/util/demux/java-gnome.fixes b/src/util/demux/java-gnome.fixes
new file mode 100644
index 0000000..c2402f1
--- /dev/null
+++ b/src/util/demux/java-gnome.fixes
@@ -0,0 +1,210 @@
+(define-boxed Attribute
+  (in-module "Pango")
+  (c-name "PangoAttribute")
+  (copy-func "pango_attribute_copy")
+  (release-func "pango_attribute_destroy")
+)
+
+(define-boxed AttrIterator
+  (in-module "Pango")
+  (c-name "PangoAttrIterator")
+  (copy-func "pango_attr_iterator_copy")
+  (release-func "pango_attr_iterator_destroy")
+)
+
+(define-boxed TextRectangle
+  (in-module "Atk")
+  (c-name "AtkTextRectangle")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-boxed TextRange
+  (in-module "Atk")
+  (c-name "AtkTextRange")
+  (fields
+    '("gint" "start_offset")
+    '("gint" "end_offset")
+    '("gchar*" "content")
+  )
+)
+
+(define-boxed AccelKey
+  (in-module "Gtk")
+  (c-name "GtkAccelKey")
+  (fields
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+    '("guint" "accel_flags")
+  )
+)
+
+(define-boxed Geometry
+  (in-module "Gdk")
+  (c-name "GdkGeometry")
+  (fields
+    '("gint" "min_width")
+    '("gint" "min_height")
+    '("gint" "max_width")
+    '("gint" "max_height")
+    '("gint" "base_width")
+    '("gint" "base_height")
+    '("gint" "width_inc")
+    '("gint" "height_inc")
+    '("gdouble" "min_aspect")
+    '("gdouble" "max_aspect")
+    '("GdkGravity" "win_gravity")
+  )
+)
+
+(define-boxed EventKey
+  (in-module "Gdk")
+  (c-name "GdkEventKey")
+  (fields
+    '("GdkEventType" "type")
+    '("GdkWindow*" "window")
+    '("gint8" "send_event")
+    '("guint32" "time")
+    '("guint" "state")
+    '("guint" "keyval")
+    '("gint" "length")
+    '("gchar*" "string")
+    '("guint16" "hardware_keycode")
+    '("guint8" "group")
+    '("gboolean" "is_modifier")
+  )
+)
+
+(define-boxed GlyphInfo
+  (in-module "Pango")
+  (c-name "PangoGlyphInfo")
+)
+
+(define-boxed GlyphGeometry
+  (in-module "Pango")
+  (c-name "PangoGlyphGeometry")
+)
+
+(define-boxed GlyphUnit
+  (in-module "Pango")
+  (c-name "PangoGlyphUnit")
+)
+
+(define-boxed Rectangle
+  (in-module "Pango")
+  (c-name "PangoRectangle")
+  (fields
+    '("int" "x")
+    '("int" "y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-boxed Analysis
+  (in-module "Pango")
+  (c-name "PangoAnalysis")
+)
+
+(define-boxed KeymapKey
+  (in-module "Gdk")
+  (c-name "GdkKeymapKey")
+  (fields
+    '("guint" "keycode")
+    '("gint" "group")
+    '("gint" "level")
+  )
+)
+
+(define-flag ModifierType
+  (in-module "Gdk")
+  (c-name "GdkModifierType")
+  (values
+    '("shift_mask" "GDK_SHIFT_MASK")
+    '("lock_mask" "GDK_LOCK_MASK")
+    '("control_mask" "GDK_CONTROL_MASK")
+    '("mod1_mask" "GDK_MOD1_MASK")
+    '("mod2_mask" "GDK_MOD2_MASK")
+    '("mod3_mask" "GDK_MOD3_MASK")
+    '("mod4_mask" "GDK_MOD4_MASK")
+    '("mod5_mask" "GDK_MOD5_MASK")
+    '("button1_mask" "GDK_BUTTON1_MASK")
+    '("button2_mask" "GDK_BUTTON2_MASK")
+    '("button3_mask" "GDK_BUTTON3_MASK")
+    '("button4_mask" "GDK_BUTTON4_MASK")
+    '("button5_mask" "GDK_BUTTON5_MASK")
+    '("super_mask" "GDK_SUPER_MASK")
+    '("hyper_mask" "GDK_HYPER_MASK")
+    '("meta_mask" "GDK_META_MASK")
+    '("release_mask" "GDK_RELEASE_MASK")
+    '("modifier_mask" "GDK_MODIFIER_MASK")
+  )
+)
+
+(define-boxed Point
+  (in-module "Gdk")
+  (c-name "GdkPoint")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+  )
+)
+
+(define-boxed Segment
+  (in-module "Gdk")
+  (c-name "GdkSegment")
+  (fields
+    '("gint" "x1")
+    '("gint" "y1")
+    '("gint" "x2")
+    '("gint" "y2")
+  )
+)
+
+(define-boxed Trapezoid
+  (in-module "Gdk")
+  (c-name "GdkTrapezoid")
+  (fields
+    '("double" "y1")
+    '("double" "x11")
+    '("double" "x21")
+    '("double" "y2")
+    '("double" "x12")
+    '("double" "x22")
+  )
+)
+
+;; This is a monster struct with what looks like writeable fields. FIXME
+
+(define-boxed GCValues
+  (in-module "Gdk")
+  (c-name "GdkGCValues")
+)
+
+(define-boxed RgbCmap
+  (in-module "Gdk")
+  (c-name "GdkRgbCmap")
+)
+
+
+;; FIXME many fields!
+(define-boxed WindowAttr
+  (in-module "Gdk")
+  (c-name "GdkWindowAttr")
+)
+
+(define-boxed Allocation
+  (in-module "Gtk")
+  (c-name "GtkAllocation")
+  (fields
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
diff --git a/src/util/demux/scmexpr.py b/src/util/demux/scmexpr.py
new file mode 100644
index 0000000..bcdabcc
--- /dev/null
+++ b/src/util/demux/scmexpr.py
@@ -0,0 +1,149 @@
+# vim: set fileencoding=UTF-8
+#
+# scmexpr.py
+#
+# Copyright © 1998-2006 James Henstridge, John Finlay and Others
+# Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# This code imported from pygtk, the Python language bindings for GTK and
+# GNOME, then stripped down to the task of round-tripping .defs data from
+# a single stream of data into individual files.
+#
+
+from __future__ import generators
+
+import string
+from cStringIO import StringIO
+
+class error(Exception):
+    def __init__(self, filename, lineno, msg):
+        Exception.__init__(self, msg)
+        self.filename = filename
+        self.lineno = lineno
+        self.msg = msg
+    def __str__(self):
+        return '%s:%d: error: %s' % (self.filename, self.lineno, self.msg)
+
+trans = [' '] * 256
+for i in range(256):
+    if chr(i) in string.letters + string.digits + '_':
+        trans[i] = chr(i)
+    else:
+        trans[i] = '_'
+trans = string.join(trans, '')
+
+def parse(filename):
+    if isinstance(filename, str):
+        fp = open(filename, 'r')
+    else: # if not string, assume it is some kind of iterator
+        fp = filename
+        filename = getattr(fp, 'name', '<unknown>')
+    whitespace = ' \t\n\r\x0b\x0c'
+    nonsymbol = whitespace + '();\'"'
+    stack = []
+    openlines = []
+    lineno = 0
+    for line in fp:
+        pos = 0
+        lineno += 1
+        while pos < len(line):
+            if line[pos] in whitespace: # ignore whitespace
+                pass
+            elif line[pos] == ';': # comment
+                break
+            elif line[pos:pos+2] == "'(":
+                pass # the open parenthesis will be handled next iteration
+            elif line[pos] == '(':
+                stack.append(())
+                openlines.append(lineno)
+            elif line[pos] == ')':
+                if len(stack) == 0:
+                    raise error(filename, lineno, 'close parenthesis found when none open')
+                closed = stack[-1]
+                del stack[-1]
+                del openlines[-1]
+                if stack:
+                    stack[-1] += (closed,)
+                else:
+                    yield closed
+            elif line[pos] == '"': # quoted string
+                if not stack:
+                    raise error(filename, lineno,
+                                'string found outside of s-expression')
+                endpos = pos + 1
+                chars = []
+                while endpos < len(line):
+                    if endpos+1 < len(line) and line[endpos] == '\\':
+                        endpos += 1
+                        if line[endpos] == 'n':
+                            chars.append('\n')
+                        elif line[endpos] == 'r':
+                            chars.append('\r')
+                        elif line[endpos] == 't':
+                            chars.append('\t')
+                        else:
+                            chars.append('\\')
+                            chars.append(line[endpos])
+                    elif line[endpos] == '"':
+                        break
+                    else:
+                        chars.append(line[endpos])
+                    endpos += 1
+                if endpos >= len(line):
+                    raise error(filename, lineno, "unclosed quoted string")
+                pos = endpos
+                stack[-1] += (''.join(chars),)
+            else: # symbol/number
+                if not stack:
+                    raise error(filename, lineno,
+                                'identifier found outside of s-expression')
+                endpos = pos
+                while endpos < len(line) and line[endpos] not in nonsymbol:
+                    endpos += 1
+                symbol = line[pos:endpos]
+                pos = max(pos, endpos-1)
+                try: symbol = int(symbol)
+                except ValueError:
+                    try: symbol = float(symbol)
+                    except ValueError: pass
+                stack[-1] += (symbol,)
+            pos += 1
+    if len(stack) != 0:
+        msg = '%d unclosed parentheses found at end of ' \
+              'file (opened on line(s) %s)' % (len(stack),
+                                               ', '.join(map(str, openlines)))
+        raise error(filename, lineno, msg)
+
+class Parser:
+    def __init__(self, filename):
+        """Argument is either a string, a parse tree, or file object"""
+        self.filename = filename
+    def startParsing(self, filename=None):
+        statements = parse(filename or self.filename)
+        for statement in statements:
+            self.handle(statement)
+    def handle(self, tup):
+        cmd = string.translate(tup[0], trans)
+        if hasattr(self, cmd):
+            getattr(self, cmd)(*tup[1:])
+        else:
+            self.unknown(tup)
+    def unknown(self, tup):
+        pass
+
+
diff --git a/src/util/keyval/keysymsToKeyval.pl b/src/util/keyval/keysymsToKeyval.pl
new file mode 100755
index 0000000..92d59a7
--- /dev/null
+++ b/src/util/keyval/keysymsToKeyval.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -s
+#
+# Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+# 
+# The code in this file, and the program it is a part of, is made available
+# to you by its authors as open source software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License version
+# 2 ("GPL") as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+#
+# You should have received a copy of the GPL along with this program. If not,
+# see http://www.gnu.org/licenses/. The authors of this program may be
+# contacted through http://java-gnome.sourceforge.net/.
+#
+
+#
+# Output constant object lines corresonsing to the keyvals as found in
+# gtk+'s gdk/gdkkeysyms.h
+#
+# It would probably be better if this output (defs-flags ...) data
+#
+
+use strict;
+
+while (<>) {
+	my $name;
+	my $val;
+
+	if (!(s/^#define GDK_//)) {
+		next;
+	}
+	chomp;
+	if (!(/(.*) (0x[\d\w]+)/)) {
+		next;
+	}
+
+	$name = $1;
+	$val = $2;
+
+	$name =~ s/_//g;
+	
+	print "     public static final Keyval $name = new Keyval($val, \"$name\");\n";
+}
+	
+#define GDK_VoidSymbol 0xffffff
diff --git a/src/util/missing.defs b/src/util/missing.defs
new file mode 100644
index 0000000..31f6a85
--- /dev/null
+++ b/src/util/missing.defs
@@ -0,0 +1,6399 @@
+(define-function notify_startup_complete
+  (c-name "gdk_notify_startup_complete")
+  (return-type "none")
+)
+
+(define-function get_display_arg_name
+  (c-name "gdk_get_display_arg_name")
+  (return-type "const-gchar*")
+)
+
+(define-function get_program_class
+  (c-name "gdk_get_program_class")
+  (return-type "const-gchar*")
+)
+
+(define-function set_program_class
+  (c-name "gdk_set_program_class")
+  (parameters
+    '("const-gchar*" "program_class")
+  )
+)
+
+(define-function get_display
+  (c-name "gdk_get_display")
+  (return-type "const-gchar*")
+)
+
+(define-function pointer_grab
+  (c-name "gdk_pointer_grab")
+  (return-type "GdkGrabStatus")
+  (parameters
+    '("GdkWindow*" "window")
+    '("gboolean" "owner_events" (default "FALSE") (null-ok))
+    '("GdkEventMask" "event_mask" (default "0") (null-ok))
+    '("GdkWindow*" "confine_to" (default "NULL") (null-ok))
+    '("GdkCursor*" "cursor" (default "NULL") (null-ok))
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-function pointer_ungrab
+  (c-name "gdk_pointer_ungrab")
+  (return-type "none")
+  (parameters
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-function keyboard_grab
+  (c-name "gdk_keyboard_grab")
+  (return-type "GdkGrabStatus")
+  (parameters
+    '("GdkWindow*" "window")
+    '("gboolean" "owner_events" (default "FALSE") (null-ok))
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-function keyboard_ungrab
+  (c-name "gdk_keyboard_ungrab")
+  (return-type "none")
+  (parameters
+    '("guint32" "time" (default "GDK_CURRENT_TIME") (null-ok))
+  )
+)
+
+(define-function pointer_is_grabbed
+  (c-name "gdk_pointer_is_grabbed")
+  (return-type "gboolean")
+)
+
+(define-function screen_width
+  (c-name "gdk_screen_width")
+  (return-type "gint")
+)
+
+(define-function screen_height
+  (c-name "gdk_screen_height")
+  (return-type "gint")
+)
+
+(define-function screen_width_mm
+  (c-name "gdk_screen_width_mm")
+  (return-type "gint")
+)
+
+(define-function screen_height_mm
+  (c-name "gdk_screen_height_mm")
+  (return-type "gint")
+)
+
+(define-function flush
+  (c-name "gdk_flush")
+  (return-type "none")
+)
+
+(define-function beep
+  (c-name "gdk_beep")
+  (return-type "none")
+)
+
+(define-function set_double_click_time
+  (c-name "gdk_set_double_click_time")
+  (return-type "none")
+  (parameters
+    '("guint" "msec")
+  )
+)
+
+(define-function threads_enter
+  (c-name "gdk_threads_enter")
+  (return-type "none")
+)
+
+(define-function threads_leave
+  (c-name "gdk_threads_leave")
+  (return-type "none")
+)
+
+(define-function threads_init
+  (c-name "gdk_threads_init")
+  (return-type "none")
+)
+
+(define-function parse_args
+  (c-name "gdk_parse_args")
+  (return-type "none")
+  (parameters
+    '("gint*" "argc")
+    '("gchar***" "argv")
+  )
+)
+
+(define-function init
+  (c-name "gdk_init")
+  (return-type "none")
+  (parameters
+    '("gint*" "argc")
+    '("gchar***" "argv")
+  )
+)
+
+(define-function init_check
+  (c-name "gdk_init_check")
+  (return-type "gboolean")
+  (parameters
+    '("gint*" "argc")
+    '("gchar***" "argv")
+  )
+)
+
+(define-function add_option_entries_libgtk_only
+  (c-name "gdk_add_option_entries_libgtk_only")
+  (return-type "none")
+  (parameters
+    '("GOptionGroup*" "group")
+  )
+)
+
+(define-function pre_parse_libgtk_only
+  (c-name "gdk_pre_parse_libgtk_only")
+  (return-type "none")
+)
+
+(define-function exit
+  (c-name "gdk_exit")
+  (return-type "none")
+  (parameters
+    '("gint" "error_code")
+  )
+)
+
+(define-function set_locale
+  (c-name "gdk_set_locale")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-function error_trap_push
+  (c-name "gdk_error_trap_push")
+  (return-type "none")
+)
+
+(define-function error_trap_pop
+  (c-name "gdk_error_trap_pop")
+  (return-type "gint")
+)
+
+(define-function set_use_xshm
+  (c-name "gdk_set_use_xshm")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_xshm")
+  )
+)
+
+(define-function get_use_xshm
+  (c-name "gdk_get_use_xshm")
+  (return-type "gboolean")
+)
+
+(define-function input_add_full
+  (c-name "gdk_input_add_full")
+  (return-type "gint")
+  (parameters
+    '("gint" "source")
+    '("GdkInputCondition" "condition")
+    '("GdkInputFunction" "function")
+    '("gpointer" "data")
+    '("GdkDestroyNotify" "destroy")
+  )
+)
+
+(define-function input_add
+  (c-name "gdk_input_add")
+  (return-type "gint")
+  (parameters
+    '("gint" "source")
+    '("GdkInputCondition" "condition")
+    '("GdkInputFunction" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-function input_remove
+  (c-name "gdk_input_remove")
+  (return-type "none")
+  (parameters
+    '("gint" "tag")
+  )
+)
+
+(define-function pointer_grab_info_libgtk_only
+  (c-name "gdk_pointer_grab_info_libgtk_only")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkWindow**" "grab_window")
+    '("gboolean*" "owner_events")
+  )
+)
+
+(define-function keyboard_grab_info_libgtk_only
+  (c-name "gdk_keyboard_grab_info_libgtk_only")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkWindow**" "grab_window")
+    '("gboolean*" "owner_events")
+  )
+)
+
+(define-function rectangle_get_type
+  (c-name "gdk_rectangle_get_type")
+  (return-type "GType")
+)
+
+(define-function wcstombs
+  (c-name "gdk_wcstombs")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GdkWChar*" "src")
+  )
+)
+
+(define-function mbstowcs
+  (c-name "gdk_mbstowcs")
+  (return-type "gint")
+  (parameters
+    '("GdkWChar*" "dest")
+    '("const-gchar*" "src")
+    '("gint" "dest_max")
+  )
+)
+
+(define-function event_send_client_message_for_display
+  (c-name "gdk_event_send_client_message_for_display")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkEvent*" "event")
+    '("GdkNativeWindow" "winid")
+  )
+)
+
+(define-function threads_set_lock_functions
+  (c-name "gdk_threads_set_lock_functions")
+  (return-type "none")
+  (parameters
+    '("GCallback" "enter_fn")
+    '("GCallback" "leave_fn")
+  )
+)
+
+(define-function color_get_type
+  (c-name "gdk_color_get_type")
+  (return-type "GType")
+)
+
+(define-function colors_store
+  (c-name "gdk_colors_store")
+  (return-type "none")
+  (parameters
+    '("GdkColormap*" "colormap")
+    '("GdkColor*" "colors")
+    '("gint" "ncolors")
+  )
+)
+
+(define-function colors_alloc
+  (c-name "gdk_colors_alloc")
+  (return-type "gint")
+  (parameters
+    '("GdkColormap*" "colormap")
+    '("gboolean" "contiguous")
+    '("gulong*" "planes")
+    '("gint" "nplanes")
+    '("gulong*" "pixels")
+    '("gint" "npixels")
+  )
+)
+
+(define-function colors_free
+  (c-name "gdk_colors_free")
+  (return-type "none")
+  (parameters
+    '("GdkColormap*" "colormap")
+    '("gulong*" "pixels")
+    '("gint" "npixels")
+    '("gulong" "planes")
+  )
+)
+
+(define-function colormap_get_type
+  (c-name "gdk_colormap_get_type")
+  (return-type "GType")
+)
+
+(define-function colormap_get_system
+  (c-name "gdk_colormap_get_system")
+  (return-type "GdkColormap*")
+)
+
+(define-function colormap_get_system_size
+  (c-name "gdk_colormap_get_system_size")
+  (return-type "gint")
+  (deprecated "deprecated")
+)
+
+(define-function color_parse
+  (c-name "gdk_color_parse")
+  (return-type "gint")
+  (parameters
+    '("const-gchar*" "spec")
+    '("GdkColor*" "color")
+  )
+)
+
+(define-function color_change
+  (c-name "gdk_color_change")
+  (return-type "gint")
+  (deprecated "deprecated")
+  (parameters
+    '("GdkColormap*" "colormap")
+    '("GdkColor*" "color")
+  )
+)
+
+(define-function cursor_get_type
+  (c-name "gdk_cursor_get_type")
+  (return-type "GType")
+)
+
+(define-function gdk_display_get_type
+  (c-name "gdk_display_get_type")
+  (return-type "GType")
+)
+
+(define-function display_get_default
+  (c-name "gdk_display_get_default")
+  (return-type "GdkDisplay*")
+)
+
+(define-function gdk_display_manager_get_type
+  (c-name "gdk_display_manager_get_type")
+  (return-type "GType")
+)
+
+(define-function display_manager_get
+  (c-name "gdk_display_manager_get")
+  (return-type "GdkDisplayManager*")
+)
+
+(define-function display_open_default_libgtk_only
+  (c-name "gdk_display_open_default_libgtk_only")
+  (return-type "GdkDisplay*")
+)
+
+(define-function drag_context_get_type
+  (c-name "gdk_drag_context_get_type")
+  (return-type "GType")
+)
+
+(define-function drag_get_protocol
+  (c-name "gdk_drag_get_protocol")
+  (return-type "guint32")
+  (parameters
+    '("guint32" "xid")
+    '("GdkDragProtocol*" "protocol")
+  )
+)
+
+(define-function drag_get_protocol_for_display
+  (c-name "gdk_drag_get_protocol_for_display")
+  (return-type "guint32")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("guint32" "xid")
+    '("GdkDragProtocol*" "protocol")
+  )
+)
+
+(define-function gdk_drawable_get_type
+  (c-name "gdk_drawable_get_type")
+  (return-type "GType")
+)
+
+(define-function draw_layout_line_with_colors
+  (c-name "gdk_draw_layout_line_with_colors")
+  (return-type "none")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkGC*" "gc")
+    '("gint" "x")
+    '("gint" "y")
+    '("PangoLayoutLine*" "line")
+    '("GdkColor*" "foreground")
+    '("GdkColor*" "background")
+  )
+)
+
+(define-function draw_layout_with_colors
+  (c-name "gdk_draw_layout_with_colors")
+  (return-type "none")
+  (deprecated "use gtk.gdk.Drawable.draw_layout instead")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkGC*" "gc")
+    '("gint" "x")
+    '("gint" "y")
+    '("PangoLayout*" "layout")
+    '("GdkColor*" "foreground")
+    '("GdkColor*" "background")
+  )
+)
+
+(define-function draw_glyphs_transformed
+  (c-name "gdk_draw_glyphs_transformed")
+  (return-type "none")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkGC*" "gc")
+    '("PangoMatrix*" "matrix")
+    '("PangoFont*" "font")
+    '("gint" "x")
+    '("gint" "y")
+    '("PangoGlyphString*" "glyphs")
+  )
+)
+
+(define-function draw_trapezoids
+  (c-name "gdk_draw_trapezoids")
+  (return-type "none")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkGC*" "gc")
+    '("GdkTrapezoid*" "trapezoids")
+    '("gint" "n_trapezoids")
+  )
+)
+
+(define-function gdk_event_get_type
+  (c-name "gdk_event_get_type")
+  (return-type "GType")
+)
+
+(define-function events_pending
+  (c-name "gdk_events_pending")
+  (return-type "gboolean")
+)
+
+(define-function event_get
+  (c-name "gdk_event_get")
+  (return-type "GdkEvent*")
+)
+
+(define-function event_peek
+  (c-name "gdk_event_peek")
+  (return-type "GdkEvent*")
+)
+
+(define-function event_get_graphics_expose
+  (c-name "gdk_event_get_graphics_expose")
+  (return-type "GdkEvent*")
+  (parameters
+    '("GdkWindow*" "window")
+  )
+)
+
+(define-function event_handler_set
+  (c-name "gdk_event_handler_set")
+  (return-type "none")
+  (parameters
+    '("GdkEventFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "notify")
+  )
+)
+
+(define-function set_show_events
+  (c-name "gdk_set_show_events")
+  (return-type "none")
+  (parameters
+    '("gboolean" "show_events")
+  )
+)
+
+(define-function get_show_events
+  (c-name "gdk_get_show_events")
+  (return-type "gboolean")
+)
+
+(define-function add_client_message_filter
+  (c-name "gdk_add_client_message_filter")
+  (return-type "none")
+  (parameters
+    '("GdkAtom" "message_type")
+    '("GdkFilterFunc" "func")
+    '("gpointer" "data")
+  )
+)
+
+(define-function setting_get
+  (c-name "gdk_setting_get")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "name")
+    '("GValue*" "value")
+  )
+)
+
+(define-function font_get_type
+  (c-name "gdk_font_get_type")
+  (return-type "GType")
+)
+
+(define-function font_load_for_display
+  (c-name "gdk_font_load_for_display")
+  (return-type "GdkFont*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("const-gchar*" "font_name")
+  )
+)
+
+(define-function fontset_load_for_display
+  (c-name "gdk_fontset_load_for_display")
+  (return-type "GdkFont*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("const-gchar*" "fontset_name")
+  )
+)
+
+(define-function font_from_description_for_display
+  (c-name "gdk_font_from_description_for_display")
+  (return-type "GdkFont*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("PangoFontDescription*" "font_desc")
+  )
+)
+
+(define-function fontset_load
+  (c-name "gdk_fontset_load")
+  (return-type "GdkFont*")
+  (parameters
+    '("const-gchar*" "fontset_name")
+  )
+)
+
+(define-function font_from_description
+  (c-name "gdk_font_from_description")
+  (return-type "GdkFont*")
+  (parameters
+    '("PangoFontDescription*" "font_desc")
+  )
+)
+
+(define-function gdk_gc_get_type
+  (c-name "gdk_gc_get_type")
+  (return-type "GType")
+)
+
+(define-function gc_new
+  (c-name "gdk_gc_new2")
+  (return-type "GdkGC*")
+  (deprecated "use gdk.GC")
+  (parameters
+    '("GdkDrawable*" "drawable")
+  )
+)
+
+(define-function gdk_image_get_type
+  (c-name "gdk_image_get_type")
+  (return-type "GType")
+)
+
+(define-function image_new_bitmap
+  (c-name "gdk_image_new_bitmap")
+  (return-type "GdkImage*")
+  (parameters
+    '("GdkVisual*" "visual")
+    '("gpointer" "data")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-function device_get_type
+  (c-name "gdk_device_get_type")
+  (return-type "GType")
+)
+
+(define-function devices_list
+  (c-name "gdk_devices_list")
+  (return-type "GList*")
+)
+
+(define-function device_free_history
+  (c-name "gdk_device_free_history")
+  (return-type "none")
+  (parameters
+    '("GdkTimeCoord**" "events")
+    '("gint" "n_events")
+  )
+)
+
+(define-function device_get_core_pointer
+  (c-name "gdk_device_get_core_pointer")
+  (return-type "GdkDevice*")
+)
+
+(define-function gdk_keymap_get_type
+  (c-name "gdk_keymap_get_type")
+  (return-type "GType")
+)
+
+(define-function keymap_get_default
+  (c-name "gdk_keymap_get_default")
+  (return-type "GdkKeymap*")
+)
+
+(define-function keymap_get_for_display
+  (c-name "gdk_keymap_get_for_display")
+  (return-type "GdkKeymap*")
+  (parameters
+    '("GdkDisplay*" "display")
+  )
+)
+
+(define-function gdk_pango_renderer_get_type
+  (c-name "gdk_pango_renderer_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_renderer_get_default
+  (c-name "gdk_pango_renderer_get_default")
+  (return-type "PangoRenderer*")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-function pango_context_get_for_screen
+  (c-name "gdk_pango_context_get_for_screen")
+  (return-type "PangoContext*")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-function pango_context_get
+  (c-name "gdk_pango_context_get")
+  (return-type "PangoContext*")
+)
+
+(define-function pango_context_set_colormap
+  (c-name "gdk_pango_context_set_colormap")
+  (return-type "none")
+  (parameters
+    '("PangoContext*" "context")
+    '("GdkColormap*" "colormap")
+  )
+)
+
+(define-function pango_layout_line_get_clip_region
+  (c-name "gdk_pango_layout_line_get_clip_region")
+  (caller-owns-return #t)
+  (return-type "GdkRegion*")
+  (parameters
+    '("PangoLayoutLine*" "line")
+    '("gint" "x_origin")
+    '("gint" "y_origin")
+    '("gint*" "index_ranges")
+    '("gint" "n_ranges")
+  )
+)
+
+(define-function pango_layout_get_clip_region
+  (c-name "gdk_pango_layout_get_clip_region")
+  (caller-owns-return #t)
+  (return-type "GdkRegion*")
+  (parameters
+    '("PangoLayout*" "layout")
+    '("gint" "x_origin")
+    '("gint" "y_origin")
+    '("gint*" "index_ranges")
+    '("gint" "n_ranges")
+  )
+)
+
+(define-function pixbuf_get_from_drawable
+  (c-name "gdk_pixbuf_get_from_drawable2")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("GdkPixbuf*" "pixbuf" (null-ok))
+    '("GdkDrawable*" "src")
+    '("GdkColormap*" "cmap")
+    '("int" "src_x")
+    '("int" "src_y")
+    '("int" "dest_x")
+    '("int" "dest_y")
+    '("int" "width")
+    '("int" "height")
+  )
+)
+
+(define-function gdk_pixmap_get_type
+  (c-name "gdk_pixmap_get_type")
+  (return-type "GType")
+)
+
+(define-function bitmap_create_from_data
+  (c-name "gdk_bitmap_create_from_data")
+  (return-type "GdkBitmap*")
+  (parameters
+    '("GdkDrawable*" "drawable" (null-ok))
+    '("const-guchar*" "data")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-function pixmap_create_from_data
+  (c-name "gdk_pixmap_create_from_data")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDrawable*" "drawable" (null-ok))
+    '("const-guchar*" "data")
+    '("gint" "width")
+    '("gint" "height")
+    '("gint" "depth")
+    '("GdkColor*" "fg")
+    '("GdkColor*" "bg")
+  )
+)
+
+(define-function pixmap_create_from_xpm
+  (c-name "gdk_pixmap_create_from_xpm")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkBitmap**" "mask")
+    '("GdkColor*" "transparent_color")
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-function pixmap_colormap_create_from_xpm
+  (c-name "gdk_pixmap_colormap_create_from_xpm")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkColormap*" "colormap")
+    '("GdkBitmap**" "mask")
+    '("GdkColor*" "transparent_color")
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-function pixmap_create_from_xpm_d
+  (c-name "gdk_pixmap_create_from_xpm_d")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkBitmap**" "mask")
+    '("GdkColor*" "transparent_color")
+    '("gchar**" "data")
+  )
+)
+
+(define-function pixmap_colormap_create_from_xpm_d
+  (c-name "gdk_pixmap_colormap_create_from_xpm_d")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkColormap*" "colormap")
+    '("GdkBitmap**" "mask")
+    '("GdkColor*" "transparent_color")
+    '("gchar**" "data")
+  )
+)
+
+(define-function pixmap_foreign_new
+  (c-name "gdk_pixmap_foreign_new")
+  (caller-owns-return #t)
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function pixmap_lookup
+  (c-name "gdk_pixmap_lookup")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function pixmap_foreign_new_for_display
+  (c-name "gdk_pixmap_foreign_new_for_display")
+  (caller-owns-return #t)
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function pixmap_lookup_for_display
+  (c-name "gdk_pixmap_lookup_for_display")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function synthesize_window_state
+  (c-name "gdk_synthesize_window_state")
+  (return-type "none")
+  (parameters
+    '("GdkWindow*" "window")
+    '("GdkWindowState" "unset_flags")
+    '("GdkWindowState" "set_flags")
+  )
+)
+
+(define-function text_property_to_text_list
+  (c-name "gdk_text_property_to_text_list")
+  (return-type "gint")
+  (parameters
+    '("GdkAtom" "encoding")
+    '("gint" "format")
+    '("const-guchar*" "text")
+    '("gint" "length")
+    '("gchar***" "list")
+  )
+)
+
+(define-function text_property_to_utf8_list
+  (c-name "gdk_text_property_to_utf8_list")
+  (return-type "gint")
+  (parameters
+    '("GdkAtom" "encoding")
+    '("gint" "format")
+    '("const-guchar*" "text")
+    '("gint" "length")
+    '("gchar***" "list")
+  )
+)
+
+(define-function utf8_to_compound_text
+  (c-name "gdk_utf8_to_compound_text")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "str")
+    '("GdkAtom*" "encoding")
+    '("gint*" "format")
+    '("guchar**" "ctext")
+    '("gint*" "length")
+  )
+)
+
+(define-function string_to_compound_text
+  (c-name "gdk_string_to_compound_text")
+  (return-type "gint")
+  (parameters
+    '("const-gchar*" "str")
+    '("GdkAtom*" "encoding")
+    '("gint*" "format")
+    '("guchar**" "ctext")
+    '("gint*" "length")
+  )
+)
+
+(define-function text_property_to_text_list_for_display
+  (c-name "gdk_text_property_to_text_list_for_display")
+  (return-type "gint")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkAtom" "encoding")
+    '("gint" "format")
+    '("const-guchar*" "text")
+    '("gint" "length")
+    '("gchar***" "list")
+  )
+)
+
+(define-function text_property_to_utf8_list_for_display
+  (c-name "gdk_text_property_to_utf8_list_for_display")
+  (return-type "gint")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkAtom" "encoding")
+    '("gint" "format")
+    '("const-guchar*" "text")
+    '("gint" "length")
+    '("gchar***" "list")
+  )
+)
+
+(define-function utf8_to_string_target
+  (c-name "gdk_utf8_to_string_target")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-gchar*" "str")
+  )
+)
+
+(define-function string_to_compound_text_for_display
+  (c-name "gdk_string_to_compound_text_for_display")
+  (return-type "gint")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("const-gchar*" "str")
+    '("GdkAtom*" "encoding")
+    '("gint*" "format")
+    '("guchar**" "ctext")
+    '("gint*" "length")
+  )
+)
+
+(define-function utf8_to_compound_text_for_display
+  (c-name "gdk_utf8_to_compound_text_for_display")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("const-gchar*" "str")
+    '("GdkAtom*" "encoding")
+    '("gint*" "format")
+    '("guchar**" "ctext")
+    '("gint*" "length")
+  )
+)
+
+(define-function free_text_list
+  (c-name "gdk_free_text_list")
+  (return-type "none")
+  (parameters
+    '("gchar**" "list")
+  )
+)
+
+(define-function free_compound_text
+  (c-name "gdk_free_compound_text")
+  (return-type "none")
+  (parameters
+    '("guchar*" "ctext")
+  )
+)
+
+(define-function atom_intern
+  (c-name "gdk_atom_intern")
+  (return-type "GdkAtom")
+  (parameters
+    '("gchar*" "atom_name")
+    '("gboolean" "only_if_exists" (default "FALSE"))
+  )
+)
+
+(define-function rgb_xpixel_from_rgb
+  (c-name "gdk_rgb_xpixel_from_rgb")
+  (return-type "gulong")
+  (parameters
+    '("guint32" "rgb")
+  )
+)
+
+(define-function rgb_gc_set_foreground
+  (c-name "gdk_rgb_gc_set_foreground")
+  (return-type "none")
+  (parameters
+    '("GdkGC*" "gc")
+    '("guint32" "rgb")
+  )
+)
+
+(define-function rgb_gc_set_background
+  (c-name "gdk_rgb_gc_set_background")
+  (return-type "none")
+  (parameters
+    '("GdkGC*" "gc")
+    '("guint32" "rgb")
+  )
+)
+
+(define-function rgb_cmap_new
+  (c-name "gdk_rgb_cmap_new")
+  (return-type "GdkRgbCmap*")
+  (parameters
+    '("guint32*" "colors")
+    '("gint" "n_colors")
+  )
+)
+
+(define-function rgb_ditherable
+  (c-name "gdk_rgb_ditherable")
+  (return-type "gboolean")
+)
+
+(define-function rgb_set_verbose
+  (c-name "gdk_rgb_set_verbose")
+  (return-type "none")
+  (parameters
+    '("gboolean" "verbose")
+  )
+)
+
+(define-function rgb_set_install
+  (c-name "gdk_rgb_set_install")
+  (return-type "none")
+  (parameters
+    '("gboolean" "install")
+  )
+)
+
+(define-function rgb_set_min_colors
+  (c-name "gdk_rgb_set_min_colors")
+  (return-type "none")
+  (parameters
+    '("gint" "min_colors")
+  )
+)
+
+(define-function rgb_get_colormap
+  (c-name "gdk_rgb_get_colormap")
+  (return-type "GdkColormap*")
+)
+
+(define-function rgb_get_cmap
+  (c-name "gdk_rgb_get_cmap")
+  (return-type "GdkColormap*")
+  (deprecated "use gtk.gdk.rgb_get_colormap instead")
+)
+
+(define-function rgb_get_visual
+  (c-name "gdk_rgb_get_visual")
+  (return-type "GdkVisual*")
+)
+
+(define-function rgb_init
+  (c-name "gdk_rgb_init")
+  (return-type "none")
+)
+
+(define-function rgb_find_color
+  (c-name "gdk_rgb_find_color")
+  (return-type "none")
+  (parameters
+    '("GdkColormap*" "colormap")
+    '("GdkColor*" "color")
+  )
+)
+
+(define-function draw_rgb_32_image_dithalign
+  (c-name "gdk_draw_rgb_32_image_dithalign")
+  (return-type "none")
+  (parameters
+    '("GdkDrawable*" "drawable")
+    '("GdkGC*" "gc")
+    '("gint" "x")
+    '("gint" "y")
+    '("gint" "width")
+    '("gint" "height")
+    '("GdkRgbDither" "dith")
+    '("guchar*" "buf")
+    '("gint" "rowstride")
+    '("gint" "xdith")
+    '("gint" "ydith")
+  )
+)
+
+(define-function rgb_colormap_ditherable
+  (c-name "gdk_rgb_colormap_ditherable")
+  (return-type "gboolean")
+  (parameters
+    '("GdkColormap*" "cmap")
+  )
+)
+
+(define-function gdk_screen_get_type
+  (c-name "gdk_screen_get_type")
+  (return-type "GType")
+)
+
+(define-function selection_owner_set
+  (c-name "gdk_selection_owner_set")
+  (return-type "gboolean")
+  (parameters
+    '("GdkWindow*" "owner")
+    '("GdkAtom" "selection")
+    '("guint32" "time")
+    '("gboolean" "send_event")
+  )
+)
+
+(define-function selection_owner_get
+  (c-name "gdk_selection_owner_get")
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkAtom" "selection")
+  )
+)
+
+(define-function selection_owner_set_for_display
+  (c-name "gdk_selection_owner_set_for_display")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkWindow*" "owner")
+    '("GdkAtom" "selection")
+    '("guint32" "time")
+    '("gboolean" "send_event")
+  )
+)
+
+(define-function selection_owner_get_for_display
+  (c-name "gdk_selection_owner_get_for_display")
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkAtom" "selection")
+  )
+)
+
+(define-function selection_send_notify
+  (c-name "gdk_selection_send_notify")
+  (return-type "none")
+  (parameters
+    '("guint32" "requestor")
+    '("GdkAtom" "selection")
+    '("GdkAtom" "target")
+    '("GdkAtom" "property")
+    '("guint32" "time")
+  )
+)
+
+(define-function selection_send_notify_for_display
+  (c-name "gdk_selection_send_notify_for_display")
+  (return-type "none")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("guint32" "requestor")
+    '("GdkAtom" "selection")
+    '("GdkAtom" "target")
+    '("GdkAtom" "property")
+    '("guint32" "time")
+  )
+)
+
+(define-function spawn_on_screen
+  (c-name "gdk_spawn_on_screen")
+  (return-type "gboolean")
+  (parameters
+    '("GdkScreen*" "screen")
+    '("const-gchar*" "working_directory")
+    '("gchar**" "argv")
+    '("gchar**" "envp")
+    '("GSpawnFlags" "flags")
+    '("GSpawnChildSetupFunc" "child_setup")
+    '("gpointer" "user_data")
+    '("gint*" "child_pid")
+    '("GError**" "error")
+  )
+)
+
+(define-function spawn_on_screen_with_pipes
+  (c-name "gdk_spawn_on_screen_with_pipes")
+  (return-type "gboolean")
+  (parameters
+    '("GdkScreen*" "screen")
+    '("const-gchar*" "working_directory")
+    '("gchar**" "argv")
+    '("gchar**" "envp")
+    '("GSpawnFlags" "flags")
+    '("GSpawnChildSetupFunc" "child_setup")
+    '("gpointer" "user_data")
+    '("gint*" "child_pid")
+    '("gint*" "standard_input")
+    '("gint*" "standard_output")
+    '("gint*" "standard_error")
+    '("GError**" "error")
+  )
+)
+
+(define-function spawn_command_line_on_screen
+  (c-name "gdk_spawn_command_line_on_screen")
+  (return-type "gboolean")
+  (parameters
+    '("GdkScreen*" "screen")
+    '("const-gchar*" "command_line")
+    '("GError**" "error")
+  )
+)
+
+(define-function gdk_visual_get_type
+  (c-name "gdk_visual_get_type")
+  (return-type "GType")
+)
+
+(define-function visual_get_best_type
+  (c-name "gdk_visual_get_best_type")
+  (return-type "GdkVisualType")
+)
+
+(define-function visual_get_system
+  (c-name "gdk_visual_get_system")
+  (return-type "GdkVisual*")
+)
+
+(define-function visual_get_best
+  (c-name "gdk_visual_get_best")
+  (return-type "GdkVisual*")
+)
+
+(define-function visual_get_best_with_depth
+  (c-name "gdk_visual_get_best_with_depth")
+  (return-type "GdkVisual*")
+  (parameters
+    '("gint" "depth")
+  )
+)
+
+(define-function visual_get_best_with_type
+  (c-name "gdk_visual_get_best_with_type")
+  (return-type "GdkVisual*")
+  (parameters
+    '("GdkVisualType" "visual_type")
+  )
+)
+
+(define-function query_depths
+  (c-name "gdk_query_depths")
+  (return-type "none")
+  (parameters
+    '("gint**" "depths")
+    '("gint*" "count")
+  )
+)
+
+(define-function query_visual_types
+  (c-name "gdk_query_visual_types")
+  (return-type "none")
+  (parameters
+    '("GdkVisualType**" "visual_types")
+    '("gint*" "count")
+  )
+)
+
+(define-function list_visuals
+  (c-name "gdk_list_visuals")
+  (return-type "GList*")
+)
+
+(define-function gdk_window_object_get_type
+  (c-name "gdk_window_object_get_type")
+  (return-type "GType")
+)
+
+(define-function window_at_pointer
+  (c-name "gdk_window_at_pointer")
+  (return-type "GdkWindow*")
+  (parameters
+    '("gint*" "win_x")
+    '("gint*" "win_y")
+  )
+)
+
+(define-function window_foreign_new
+  (c-name "gdk_window_foreign_new")
+  (caller-owns-return #t)
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function window_lookup
+  (c-name "gdk_window_lookup")
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function window_foreign_new_for_display
+  (c-name "gdk_window_foreign_new_for_display")
+  (caller-owns-return #t)
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function window_lookup_for_display
+  (c-name "gdk_window_lookup_for_display")
+  (return-type "GdkWindow*")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkNativeWindow" "anid")
+  )
+)
+
+(define-function set_sm_client_id
+  (c-name "gdk_set_sm_client_id")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "sm_client_id")
+  )
+)
+
+(define-function window_get_toplevels
+  (c-name "gdk_window_get_toplevels")
+  (return-type "GList*")
+)
+
+(define-function window_process_all_updates
+  (c-name "gdk_window_process_all_updates")
+  (return-type "none")
+)
+
+(define-function window_set_debug_updates
+  (c-name "gdk_window_set_debug_updates")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-function window_constrain_size
+  (c-name "gdk_window_constrain_size")
+  (return-type "none")
+  (parameters
+    '("GdkGeometry*" "geometry")
+    '("guint" "flags")
+    '("gint" "width")
+    '("gint" "height")
+    '("gint*" "new_width")
+    '("gint*" "new_height")
+  )
+)
+
+(define-function set_pointer_hooks
+  (c-name "gdk_set_pointer_hooks")
+  (return-type "GdkPointerHooks*")
+  (parameters
+    '("const-GdkPointerHooks*" "new_hooks")
+  )
+)
+
+(define-function pixbuf_new_from_data
+  (c-name "gdk_pixbuf_new_from_data")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-guchar*" "data")
+    '("GdkColorspace" "colorspace")
+    '("gboolean" "has_alpha")
+    '("int" "bits_per_sample")
+    '("int" "width")
+    '("int" "height")
+    '("int" "rowstride")
+    '("GdkPixbufDestroyNotify" "destroy_fn")
+    '("gpointer" "destroy_fn_data")
+  )
+)
+
+(define-function pixbuf_new_from_array
+  (c-name "gdk_pixbuf_new_from_array")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("PyArrayObject*" "array")
+    '("GdkColorspace" "colorspace")
+    '("int" "bits_per_sample")
+  )
+)
+
+(define-function pixbuf_new_from_xpm_data
+  (c-name "gdk_pixbuf_new_from_xpm_data")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-char**" "data")
+  )
+)
+
+(define-function pixbuf_new_from_inline
+  (c-name "gdk_pixbuf_new_from_inline")
+  (caller-owns-return #t)
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("gint" "data_length")
+    '("const-guchar*" "data")
+    '("gboolean" "copy_pixels")
+    '("GError**" "error")
+  )
+)
+
+(define-function pixbuf_animation_get_type
+  (c-name "gdk_pixbuf_animation_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_animation_iter_get_type
+  (c-name "gdk_pixbuf_animation_iter_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_error_quark
+  (c-name "gdk_pixbuf_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function pixbuf_get_type
+  (c-name "gdk_pixbuf_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_alpha_mode_get_type
+  (c-name "gdk_pixbuf_alpha_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function colorspace_get_type
+  (c-name "gdk_colorspace_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_error_get_type
+  (c-name "gdk_pixbuf_error_get_type")
+  (return-type "GType")
+)
+
+(define-function interp_type_get_type
+  (c-name "gdk_interp_type_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_rotation_get_type
+  (c-name "gdk_pixbuf_rotation_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_get_formats
+  (c-name "gdk_pixbuf_get_formats")
+  (return-type "GSList*")
+)
+
+(define-function pixbuf_get_file_info
+  (c-name "gdk_pixbuf_get_file_info")
+  (return-type "GdkPixbufFormat*")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-function pixbuf_loader_get_type
+  (c-name "gdk_pixbuf_loader_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_loader_new
+  (c-name "gdk_pixbuf_loader_new")
+  (return-type "GdkPixbufLoader*")
+  (deprecated "use gtk.gdk.PixbufLoader instead")
+)
+
+(define-function pixbuf_loader_new_with_mime_type
+  (c-name "gdk_pixbuf_loader_new_with_mime_type")
+  (caller-owns-return #t)
+  (return-type "GdkPixbufLoader*")
+  (parameters
+    '("const-char*" "mime_type")
+    '("GError**" "error")
+  )
+)
+
+(define-function pixbuf_simple_anim_get_type
+  (c-name "gdk_pixbuf_simple_anim_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_simple_anim_iter_get_type
+  (c-name "gdk_pixbuf_simple_anim_iter_get_type")
+  (return-type "GType")
+)
+
+(define-function pixbuf_from_pixdata
+  (c-name "gdk_pixbuf_from_pixdata")
+  (return-type "GdkPixbuf*")
+  (parameters
+    '("const-GdkPixdata*" "pixdata")
+    '("gboolean" "copy_pixels")
+    '("GError**" "error")
+  )
+)
+
+(define-function cursor_type_get_type
+  (c-name "gdk_cursor_type_get_type")
+  (return-type "GType")
+)
+
+(define-function drag_action_get_type
+  (c-name "gdk_drag_action_get_type")
+  (return-type "GType")
+)
+
+(define-function drag_protocol_get_type
+  (c-name "gdk_drag_protocol_get_type")
+  (return-type "GType")
+)
+
+(define-function filter_return_get_type
+  (c-name "gdk_filter_return_get_type")
+  (return-type "GType")
+)
+
+(define-function event_type_get_type
+  (c-name "gdk_event_type_get_type")
+  (return-type "GType")
+)
+
+(define-function event_mask_get_type
+  (c-name "gdk_event_mask_get_type")
+  (return-type "GType")
+)
+
+(define-function visibility_state_get_type
+  (c-name "gdk_visibility_state_get_type")
+  (return-type "GType")
+)
+
+(define-function scroll_direction_get_type
+  (c-name "gdk_scroll_direction_get_type")
+  (return-type "GType")
+)
+
+(define-function notify_type_get_type
+  (c-name "gdk_notify_type_get_type")
+  (return-type "GType")
+)
+
+(define-function crossing_mode_get_type
+  (c-name "gdk_crossing_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function property_state_get_type
+  (c-name "gdk_property_state_get_type")
+  (return-type "GType")
+)
+
+(define-function window_state_get_type
+  (c-name "gdk_window_state_get_type")
+  (return-type "GType")
+)
+
+(define-function setting_action_get_type
+  (c-name "gdk_setting_action_get_type")
+  (return-type "GType")
+)
+
+(define-function owner_change_get_type
+  (c-name "gdk_owner_change_get_type")
+  (return-type "GType")
+)
+
+(define-function font_type_get_type
+  (c-name "gdk_font_type_get_type")
+  (return-type "GType")
+)
+
+(define-function cap_style_get_type
+  (c-name "gdk_cap_style_get_type")
+  (return-type "GType")
+)
+
+(define-function fill_get_type
+  (c-name "gdk_fill_get_type")
+  (return-type "GType")
+)
+
+(define-function function_get_type
+  (c-name "gdk_function_get_type")
+  (return-type "GType")
+)
+
+(define-function join_style_get_type
+  (c-name "gdk_join_style_get_type")
+  (return-type "GType")
+)
+
+(define-function line_style_get_type
+  (c-name "gdk_line_style_get_type")
+  (return-type "GType")
+)
+
+(define-function subwindow_mode_get_type
+  (c-name "gdk_subwindow_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gc_values_mask_get_type
+  (c-name "gdk_gc_values_mask_get_type")
+  (return-type "GType")
+)
+
+(define-function image_type_get_type
+  (c-name "gdk_image_type_get_type")
+  (return-type "GType")
+)
+
+(define-function extension_mode_get_type
+  (c-name "gdk_extension_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function input_source_get_type
+  (c-name "gdk_input_source_get_type")
+  (return-type "GType")
+)
+
+(define-function input_mode_get_type
+  (c-name "gdk_input_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function axis_use_get_type
+  (c-name "gdk_axis_use_get_type")
+  (return-type "GType")
+)
+
+(define-function prop_mode_get_type
+  (c-name "gdk_prop_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function fill_rule_get_type
+  (c-name "gdk_fill_rule_get_type")
+  (return-type "GType")
+)
+
+(define-function overlap_type_get_type
+  (c-name "gdk_overlap_type_get_type")
+  (return-type "GType")
+)
+
+(define-function rgb_dither_get_type
+  (c-name "gdk_rgb_dither_get_type")
+  (return-type "GType")
+)
+
+(define-function byte_order_get_type
+  (c-name "gdk_byte_order_get_type")
+  (return-type "GType")
+)
+
+(define-function modifier_type_get_type
+  (c-name "gdk_modifier_type_get_type")
+  (return-type "GType")
+)
+
+(define-function input_condition_get_type
+  (c-name "gdk_input_condition_get_type")
+  (return-type "GType")
+)
+
+(define-function status_get_type
+  (c-name "gdk_status_get_type")
+  (return-type "GType")
+)
+
+(define-function grab_status_get_type
+  (c-name "gdk_grab_status_get_type")
+  (return-type "GType")
+)
+
+(define-function visual_type_get_type
+  (c-name "gdk_visual_type_get_type")
+  (return-type "GType")
+)
+
+(define-function window_class_get_type
+  (c-name "gdk_window_class_get_type")
+  (return-type "GType")
+)
+
+(define-function window_type_get_type
+  (c-name "gdk_window_type_get_type")
+  (return-type "GType")
+)
+
+(define-function window_attributes_type_get_type
+  (c-name "gdk_window_attributes_type_get_type")
+  (return-type "GType")
+)
+
+(define-function window_hints_get_type
+  (c-name "gdk_window_hints_get_type")
+  (return-type "GType")
+)
+
+(define-function window_type_hint_get_type
+  (c-name "gdk_window_type_hint_get_type")
+  (return-type "GType")
+)
+
+(define-function wm_decoration_get_type
+  (c-name "gdk_wm_decoration_get_type")
+  (return-type "GType")
+)
+
+(define-function wm_function_get_type
+  (c-name "gdk_wm_function_get_type")
+  (return-type "GType")
+)
+
+(define-function gravity_get_type
+  (c-name "gdk_gravity_get_type")
+  (return-type "GType")
+)
+
+(define-function window_edge_get_type
+  (c-name "gdk_window_edge_get_type")
+  (return-type "GType")
+)
+
+(define-function region_polygon
+  (c-name "gdk_region_polygon")
+  (return-type "GdkRegion*")
+  (parameters
+    '("GdkPoint*" "points")
+    '("gint" "npoints")
+    '("GdkFillRule" "fill_rule")
+  )
+)
+
+(define-function region_rectangle
+  (c-name "gdk_region_rectangle")
+  (return-type "GdkRegion*")
+  (parameters
+    '("GdkRectangle*" "rectangle")
+  )
+)
+
+(define-function cairo_set_source_color
+  (c-name "gdk_cairo_set_source_color")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GdkColor*" "color")
+  )
+)
+
+(define-function cairo_set_source_pixbuf
+  (c-name "gdk_cairo_set_source_pixbuf")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GdkPixbuf*" "pixbuf")
+    '("double" "pixbuf_x")
+    '("double" "pixbuf_y")
+  )
+)
+
+(define-function cairo_rectangle
+  (c-name "gdk_cairo_rectangle")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GdkRectangle*" "rectangle")
+  )
+)
+
+(define-function cairo_region
+  (c-name "gdk_cairo_region")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GdkRegion*" "region")
+  )
+)
+
+(define-function cairo_set_source_pixmap
+  (c-name "gdk_cairo_set_source_pixmap")
+  (return-type "none")
+  (parameters
+    '("cairo_t*" "cr")
+    '("GdkPixmap*" "pixmap")
+    '("double" "pixmap_x")
+    '("double" "pixmap_y")
+  )
+)
+
+(define-function pixmap_foreign_new_for_screen
+  (c-name "gdk_pixmap_foreign_new_for_screen")
+  (return-type "GdkPixmap*")
+  (parameters
+    '("GdkScreen*" "screen")
+    '("GdkNativeWindow" "anid")
+    '("gint" "width")
+    '("gint" "height")
+    '("gint" "depth")
+  )
+)
+
+(define-function atom_intern_static_string
+  (c-name "gdk_atom_intern_static_string")
+  (return-type "GdkAtom")
+  (parameters
+    '("const-gchar*" "atom_name")
+  )
+)
+
+(define-pointer CTreeNode
+  (in-module "Gtk")
+  (c-name "GtkCTreeNode")
+  (gtype-id "GTK_TYPE_CTREE_NODE")
+)
+
+(define-function pygtk_generic_tree_model_get_type
+  (c-name "pygtk_generic_tree_model_get_type")
+  (return-type "GType")
+)
+
+(define-function pygtk_generic_cell_renderer_get_type
+  (c-name "pygtk_generic_cell_renderer_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_about_dialog_get_type
+  (c-name "gtk_about_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function about_dialog_set_email_hook
+  (c-name "gtk_about_dialog_set_email_hook")
+  (return-type "GtkAboutDialogActivateLinkFunc")
+  (parameters
+    '("GtkAboutDialogActivateLinkFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-function about_dialog_set_url_hook
+  (c-name "gtk_about_dialog_set_url_hook")
+  (return-type "GtkAboutDialogActivateLinkFunc")
+  (parameters
+    '("GtkAboutDialogActivateLinkFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-function show_about_dialog
+  (c-name "gtk_show_about_dialog")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "parent")
+    '("const-gchar*" "first_property_name")
+  )
+  (varargs #t)
+)
+
+(define-function gtk_accel_group_get_type
+  (c-name "gtk_accel_group_get_type")
+  (return-type "GType")
+)
+
+(define-function accel_groups_activate
+  (c-name "gtk_accel_groups_activate")
+  (return-type "gboolean")
+  (parameters
+    '("GObject*" "object")
+    '("guint" "accel_key")
+    '("GdkModifierType" "accel_mods")
+  )
+)
+
+(define-function accel_groups_from_object
+  (c-name "gtk_accel_groups_from_object")
+  (return-type "GSList*")
+  (parameters
+    '("GObject*" "object")
+  )
+)
+
+(define-function accel_group_from_accel_closure
+  (c-name "gtk_accel_group_from_accel_closure")
+  (return-type "GtkAccelGroup*")
+  (parameters
+    '("GClosure*" "closure")
+  )
+)
+
+(define-function gtk_accel_label_get_type
+  (c-name "gtk_accel_label_get_type")
+  (return-type "GType")
+)
+
+(define-function accel_map_get_type
+  (c-name "gtk_accel_map_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_accessible_get_type
+  (c-name "gtk_accessible_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_action_get_type
+  (c-name "gtk_action_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_action_group_get_type
+  (c-name "gtk_action_group_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_adjustment_get_type
+  (c-name "gtk_adjustment_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_alignment_get_type
+  (c-name "gtk_alignment_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_arrow_get_type
+  (c-name "gtk_arrow_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_aspect_frame_get_type
+  (c-name "gtk_aspect_frame_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_button_box_get_type
+  (c-name "gtk_button_box_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_bin_get_type
+  (c-name "gtk_bin_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_binding_set_new
+  (c-name "gtk_binding_set_new")
+  (return-type "GtkBindingSet*")
+  (deprecated "use binding_set_new")
+  (parameters
+    '("const-gchar*" "set_name")
+  )
+)
+
+(define-function gtk_binding_set_by_class
+  (c-name "gtk_binding_set_by_class")
+  (return-type "GtkBindingSet*")
+  (deprecated "use binding_set_by_class")
+  (parameters
+    '("gpointer" "object_class")
+  )
+)
+
+(define-function binding_set_by_class
+  (c-name "gtk_binding_set_by_class")
+  (return-type "GtkBindingSet*")
+  (parameters
+    '("gpointer" "object_class")
+  )
+)
+
+(define-function gtk_binding_set_find
+  (c-name "gtk_binding_set_find")
+  (return-type "GtkBindingSet*")
+  (deprecated "use binding_set_find")
+  (parameters
+    '("const-gchar*" "set_name")
+  )
+)
+
+(define-function bindings_activate
+  (c-name "gtk_bindings_activate")
+  (return-type "gboolean")
+  (parameters
+    '("GtkObject*" "object")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-function bindings_activate_event
+  (c-name "gtk_bindings_activate_event")
+  (return-type "gboolean")
+  (parameters
+    '("GtkObject*" "object")
+    '("GdkEventKey*" "event")
+  )
+)
+
+(define-function binding_entry_clear
+  (c-name "gtk_binding_entry_clear")
+  (return-type "none")
+  (parameters
+    '("GtkBindingSet*" "binding_set")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-function binding_entry_add_signal
+  (c-name "gtk_binding_entry_add_signal")
+  (return-type "none")
+  (parameters
+    '("GtkBindingSet*" "binding_set")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+    '("const-gchar*" "signal_name")
+    '("guint" "n_args")
+  )
+  (varargs #t)
+)
+
+(define-function binding_entry_remove
+  (c-name "gtk_binding_entry_remove")
+  (return-type "none")
+  (parameters
+    '("GtkBindingSet*" "binding_set")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-function binding_entry_add_signall
+  (c-name "gtk_binding_entry_add_signall")
+  (return-type "none")
+  (parameters
+    '("GtkBindingSet*" "binding_set")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+    '("const-gchar*" "signal_name")
+    '("GSList*" "binding_args")
+  )
+)
+
+(define-function binding_parse_binding
+  (c-name "gtk_binding_parse_binding")
+  (return-type "guint")
+  (parameters
+    '("GScanner*" "scanner")
+  )
+)
+
+(define-function gtk_box_get_type
+  (c-name "gtk_box_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_button_get_type
+  (c-name "gtk_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_calendar_get_type
+  (c-name "gtk_calendar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_editable_get_type
+  (c-name "gtk_cell_editable_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_layout_get_type
+  (c-name "gtk_cell_layout_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_get_type
+  (c-name "gtk_cell_renderer_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_combo_get_type
+  (c-name "gtk_cell_renderer_combo_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_pixbuf_get_type
+  (c-name "gtk_cell_renderer_pixbuf_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_progress_get_type
+  (c-name "gtk_cell_renderer_progress_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_text_get_type
+  (c-name "gtk_cell_renderer_text_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_toggle_get_type
+  (c-name "gtk_cell_renderer_toggle_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_view_get_type
+  (c-name "gtk_cell_view_get_type")
+  (return-type "GType")
+)
+
+(define-function cell_view_new_with_text
+  (c-name "gtk_cell_view_new_with_text")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "text")
+  )
+)
+
+(define-function cell_view_new_with_markup
+  (c-name "gtk_cell_view_new_with_markup")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "markup")
+  )
+)
+
+(define-function cell_view_new_with_pixbuf
+  (c-name "gtk_cell_view_new_with_pixbuf")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkPixbuf*" "pixbuf")
+  )
+)
+
+(define-function gtk_check_button_get_type
+  (c-name "gtk_check_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_check_menu_item_get_type
+  (c-name "gtk_check_menu_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_clipboard_get_type
+  (c-name "gtk_clipboard_get_type")
+  (return-type "GType")
+)
+
+(define-function clipboard_get
+  (c-name "gtk_clipboard_get")
+  (return-type "GtkClipboard*")
+  (parameters
+    '("GdkAtom" "selection" (default "GDK_SELECTION_CLIPBOARD"))
+  )
+)
+
+(define-function gtk_clist_get_type
+  (c-name "gtk_clist_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_color_button_get_type
+  (c-name "gtk_color_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_color_selection_get_type
+  (c-name "gtk_color_selection_get_type")
+  (return-type "GType")
+)
+
+(define-function color_selection_palette_from_string
+  (c-name "gtk_color_selection_palette_from_string")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "str")
+    '("GdkColor**" "colors")
+    '("gint*" "n_colors")
+  )
+)
+
+(define-function color_selection_palette_to_string
+  (c-name "gtk_color_selection_palette_to_string")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-GdkColor*" "colors")
+    '("gint" "n_colors")
+  )
+)
+
+(define-function color_selection_set_change_palette_hook
+  (c-name "gtk_color_selection_set_change_palette_hook")
+  (return-type "GtkColorSelectionChangePaletteFunc")
+  (parameters
+    '("GtkColorSelectionChangePaletteFunc" "func")
+  )
+)
+
+(define-function color_selection_set_change_palette_with_screen_hook
+  (c-name "gtk_color_selection_set_change_palette_with_screen_hook")
+  (return-type "GtkColorSelectionChangePaletteWithScreenFunc")
+  (parameters
+    '("GtkColorSelectionChangePaletteWithScreenFunc" "func")
+  )
+)
+
+(define-function gtk_color_selection_dialog_get_type
+  (c-name "gtk_color_selection_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_combo_get_type
+  (c-name "gtk_combo_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_combo_box_get_type
+  (c-name "gtk_combo_box_get_type")
+  (return-type "GType")
+)
+
+(define-function combo_box_new_text
+  (c-name "gtk_combo_box_new_text")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_combo_box_entry_get_type
+  (c-name "gtk_combo_box_entry_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_container_get_type
+  (c-name "gtk_container_get_type")
+  (return-type "GType")
+)
+
+(define-function container_class_install_child_property
+  (c-name "gtk_container_class_install_child_property")
+  (return-type "none")
+  (parameters
+    '("GtkContainerClass*" "cclass")
+    '("guint" "property_id")
+    '("GParamSpec*" "pspec")
+  )
+)
+
+(define-function container_class_find_child_property
+  (c-name "gtk_container_class_find_child_property")
+  (return-type "GParamSpec*")
+  (parameters
+    '("GObjectClass*" "cclass")
+    '("const-gchar*" "property_name")
+  )
+)
+
+(define-function container_class_list_child_properties
+  (c-name "gtk_container_class_list_child_properties")
+  (return-type "GParamSpec**")
+  (parameters
+    '("GObjectClass*" "cclass")
+    '("guint*" "n_properties")
+  )
+)
+
+(define-function gtk_ctree_get_type
+  (c-name "gtk_ctree_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_ctree_node_get_type
+  (c-name "gtk_ctree_node_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_curve_get_type
+  (c-name "gtk_curve_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_dialog_get_type
+  (c-name "gtk_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function alternative_dialog_button_order
+  (c-name "gtk_alternative_dialog_button_order")
+  (return-type "gboolean")
+  (parameters
+    '("GdkScreen*" "screen" (default "NULL") (null-ok))
+  )
+)
+
+(define-function drag_finish
+  (c-name "gtk_drag_finish")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("gboolean" "success")
+    '("gboolean" "del")
+    '("guint32" "time_")
+  )
+)
+
+(define-function drag_set_icon_widget
+  (c-name "gtk_drag_set_icon_widget")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("GtkWidget*" "widget")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-function drag_set_icon_pixmap
+  (c-name "gtk_drag_set_icon_pixmap")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("GdkColormap*" "colormap")
+    '("GdkPixmap*" "pixmap")
+    '("GdkBitmap*" "mask")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-function drag_set_icon_pixbuf
+  (c-name "gtk_drag_set_icon_pixbuf")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("GdkPixbuf*" "pixbuf")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-function drag_set_icon_stock
+  (c-name "gtk_drag_set_icon_stock")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("const-gchar*" "stock_id")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-function drag_set_icon_name
+  (c-name "gtk_drag_set_icon_name")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+    '("const-gchar*" "icon_name")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-function drag_set_icon_default
+  (c-name "gtk_drag_set_icon_default")
+  (return-type "none")
+  (parameters
+    '("GdkDragContext*" "context")
+  )
+)
+
+(define-function drag_set_default_icon
+  (c-name "gtk_drag_set_default_icon")
+  (return-type "none")
+  (deprecated "change the stock pixbuf for GTK_STOCK_DND")
+  (parameters
+    '("GdkColormap*" "colormap")
+    '("GdkPixmap*" "pixmap")
+    '("GdkBitmap*" "mask")
+    '("gint" "hot_x")
+    '("gint" "hot_y")
+  )
+)
+
+(define-function target_list_add_text_targets
+  (c-name "gtk_target_list_add_text_targets")
+  (return-type "none")
+  (parameters
+    '("GtkTargetList*" "list")
+    '("guint" "info")
+  )
+)
+
+(define-function target_list_add_image_targets
+  (c-name "gtk_target_list_add_image_targets")
+  (return-type "none")
+  (parameters
+    '("GtkTargetList*" "list")
+    '("guint" "info")
+    '("gboolean" "writable")
+  )
+)
+
+(define-function target_list_add_uri_targets
+  (c-name "gtk_target_list_add_uri_targets")
+  (return-type "none")
+  (parameters
+    '("GtkTargetList*" "list")
+    '("guint" "info")
+  )
+)
+
+(define-function drag_get_source_widget
+  (c-name "gtk_drag_get_source_widget")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkDragContext*" "context")
+  )
+)
+
+(define-function drag_source_set_icon_name
+  (c-name "gtk_drag_source_set_icon_name1")
+  (return-type "none")
+  (deprecated "use GtkWidget.drag_source_set_icon_name")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("const-gchar*" "icon_name")
+  )
+)
+
+(define-function gtk_drawing_area_get_type
+  (c-name "gtk_drawing_area_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_editable_get_type
+  (c-name "gtk_editable_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_entry_get_type
+  (c-name "gtk_entry_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_entry_completion_get_type
+  (c-name "gtk_entry_completion_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_event_box_get_type
+  (c-name "gtk_event_box_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_expander_get_type
+  (c-name "gtk_expander_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_chooser_get_type
+  (c-name "gtk_file_chooser_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_chooser_error_quark
+  (c-name "gtk_file_chooser_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function gtk_file_chooser_button_get_type
+  (c-name "gtk_file_chooser_button_get_type")
+  (return-type "GType")
+)
+
+(define-function file_chooser_button_new_with_backend
+  (c-name "gtk_file_chooser_button_new_with_backend")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title")
+    '("const-gchar*" "backend")
+  )
+)
+
+(define-function gtk_file_chooser_dialog_get_type
+  (c-name "gtk_file_chooser_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_chooser_widget_get_type
+  (c-name "gtk_file_chooser_widget_get_type")
+  (return-type "GType")
+)
+
+(define-function file_chooser_widget_new_with_backend
+  (c-name "gtk_file_chooser_widget_new_with_backend")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("GtkFileChooserAction" "action")
+    '("const-gchar*" "backend")
+  )
+)
+
+(define-function gtk_file_filter_get_type
+  (c-name "gtk_file_filter_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_selection_get_type
+  (c-name "gtk_file_selection_get_type")
+  (return-type "GType")
+)
+
+(define-function file_system_error_quark
+  (c-name "gtk_file_system_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function gtk_file_info_get_type
+  (c-name "gtk_file_info_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_system_get_type
+  (c-name "gtk_file_system_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_folder_get_type
+  (c-name "gtk_file_folder_get_type")
+  (return-type "GType")
+)
+
+(define-function file_paths_sort
+  (c-name "gtk_file_paths_sort")
+  (return-type "GSList*")
+  (parameters
+    '("GSList*" "paths")
+  )
+)
+
+(define-function file_paths_copy
+  (c-name "gtk_file_paths_copy")
+  (return-type "GSList*")
+  (parameters
+    '("GSList*" "paths")
+  )
+)
+
+(define-function file_paths_free
+  (c-name "gtk_file_paths_free")
+  (return-type "none")
+  (parameters
+    '("GSList*" "paths")
+  )
+)
+
+(define-function file_system_handle_get_type
+  (c-name "gtk_file_system_handle_get_type")
+  (return-type "GType")
+)
+
+(define-function file_system_cancel_operation
+  (c-name "gtk_file_system_cancel_operation")
+  (return-type "none")
+  (parameters
+    '("GtkFileSystemHandle*" "handle")
+  )
+)
+
+(define-function file_path_get_type
+  (c-name "gtk_file_path_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_fixed_get_type
+  (c-name "gtk_fixed_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_font_button_get_type
+  (c-name "gtk_font_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_font_button_new_with_font
+  (c-name "gtk_font_button_new_with_font")
+  (caller-owns-return #t)
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "fontname")
+  )
+)
+
+(define-function gtk_font_selection_get_type
+  (c-name "gtk_font_selection_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_font_selection_dialog_get_type
+  (c-name "gtk_font_selection_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_frame_get_type
+  (c-name "gtk_frame_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_gamma_curve_get_type
+  (c-name "gtk_gamma_curve_get_type")
+  (return-type "GType")
+)
+
+(define-function gc_get
+  (c-name "gtk_gc_get")
+  (return-type "GdkGC*")
+  (parameters
+    '("gint" "depth")
+    '("GdkColormap*" "colormap")
+    '("GdkGCValues*" "values")
+    '("GdkGCValuesMask" "values_mask")
+  )
+)
+
+(define-function gc_release
+  (c-name "gtk_gc_release")
+  (return-type "none")
+  (parameters
+    '("GdkGC*" "gc")
+  )
+)
+
+(define-function gtk_handle_box_get_type
+  (c-name "gtk_handle_box_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_hbutton_box_get_type
+  (c-name "gtk_hbutton_box_get_type")
+  (return-type "GType")
+)
+
+(define-function hbutton_box_get_spacing_default
+  (c-name "gtk_hbutton_box_get_spacing_default")
+  (return-type "gint")
+)
+
+(define-function hbutton_box_get_layout_default
+  (c-name "gtk_hbutton_box_get_layout_default")
+  (return-type "GtkButtonBoxStyle")
+)
+
+(define-function hbutton_box_set_spacing_default
+  (c-name "gtk_hbutton_box_set_spacing_default")
+  (return-type "none")
+  (parameters
+    '("gint" "spacing")
+  )
+)
+
+(define-function hbutton_box_set_layout_default
+  (c-name "gtk_hbutton_box_set_layout_default")
+  (return-type "none")
+  (parameters
+    '("GtkButtonBoxStyle" "layout")
+  )
+)
+
+(define-function gtk_hbox_get_type
+  (c-name "gtk_hbox_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_hpaned_get_type
+  (c-name "gtk_hpaned_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_hruler_get_type
+  (c-name "gtk_hruler_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_hscale_get_type
+  (c-name "gtk_hscale_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_hscrollbar_get_type
+  (c-name "gtk_hscrollbar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_hseparator_get_type
+  (c-name "gtk_hseparator_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_factory_get_type
+  (c-name "gtk_icon_factory_get_type")
+  (return-type "GType")
+)
+
+(define-function icon_factory_lookup_default
+  (c-name "gtk_icon_factory_lookup_default")
+  (return-type "GtkIconSet*")
+  (parameters
+    '("const-gchar*" "stock_id")
+  )
+)
+
+(define-function icon_size_lookup
+  (c-name "gtk_icon_size_lookup")
+  (return-type "gboolean")
+  (parameters
+    '("GtkIconSize" "size")
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-function icon_size_lookup_for_settings
+  (c-name "gtk_icon_size_lookup_for_settings")
+  (return-type "gboolean")
+  (parameters
+    '("GtkSettings*" "settings")
+    '("GtkIconSize" "size")
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-function icon_size_register
+  (c-name "gtk_icon_size_register")
+  (return-type "GtkIconSize")
+  (parameters
+    '("const-gchar*" "name")
+    '("gint" "width")
+    '("gint" "height")
+  )
+)
+
+(define-function icon_size_register_alias
+  (c-name "gtk_icon_size_register_alias")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "alias")
+    '("GtkIconSize" "target")
+  )
+)
+
+(define-function icon_size_from_name
+  (c-name "gtk_icon_size_from_name")
+  (return-type "GtkIconSize")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function icon_size_get_name
+  (c-name "gtk_icon_size_get_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkIconSize" "size")
+  )
+)
+
+(define-function icon_set_get_type
+  (c-name "gtk_icon_set_get_type")
+  (return-type "GType")
+)
+
+(define-function icon_set_new
+  (c-name "gtk_icon_set_new")
+  (caller-owns-return #t)
+  (return-type "GtkIconSet*")
+)
+
+(define-function gtk_icon_source_get_type
+  (c-name "gtk_icon_source_get_type")
+  (return-type "GType")
+)
+
+(define-function icon_theme_error_quark
+  (c-name "gtk_icon_theme_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function gtk_icon_theme_get_type
+  (c-name "gtk_icon_theme_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_info_get_type
+  (c-name "gtk_icon_info_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_view_get_type
+  (c-name "gtk_icon_view_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_image_get_type
+  (c-name "gtk_image_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_image_menu_item_get_type
+  (c-name "gtk_image_menu_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_im_context_get_type
+  (c-name "gtk_im_context_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_im_context_simple_get_type
+  (c-name "gtk_im_context_simple_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_im_multicontext_get_type
+  (c-name "gtk_im_multicontext_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_input_dialog_get_type
+  (c-name "gtk_input_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_invisible_get_type
+  (c-name "gtk_invisible_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_item_get_type
+  (c-name "gtk_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_item_factory_get_type
+  (c-name "gtk_item_factory_get_type")
+  (return-type "GType")
+)
+
+(define-function item_factory_add_foreign
+  (c-name "gtk_item_factory_add_foreign")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "accel_widget")
+    '("const-gchar*" "full_path")
+    '("GtkAccelGroup*" "accel_group")
+    '("guint" "keyval")
+    '("GdkModifierType" "modifiers")
+  )
+)
+
+(define-function item_factory_from_widget
+  (c-name "gtk_item_factory_from_widget")
+  (return-type "GtkItemFactory*")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function item_factory_path_from_widget
+  (c-name "gtk_item_factory_path_from_widget")
+  (return-type "const-gchar*")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function item_factory_popup_data_from_widget
+  (c-name "gtk_item_factory_popup_data_from_widget")
+  (return-type "gpointer")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function item_factory_from_path
+  (c-name "gtk_item_factory_from_path")
+  (return-type "GtkItemFactory*")
+  (parameters
+    '("const-gchar*" "path")
+  )
+)
+
+(define-function item_factory_create_menu_entries
+  (c-name "gtk_item_factory_create_menu_entries")
+  (return-type "none")
+  (parameters
+    '("guint" "n_entries")
+    '("GtkMenuEntry*" "entries")
+  )
+)
+
+(define-function item_factories_path_delete
+  (c-name "gtk_item_factories_path_delete")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "ifactory_path")
+    '("const-gchar*" "path")
+  )
+)
+
+(define-function gtk_label_get_type
+  (c-name "gtk_label_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_layout_get_type
+  (c-name "gtk_layout_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_list_get_type
+  (c-name "gtk_list_get_type")
+  (return-type "GType")
+  (deprecated "use GtkListStore/GtkTreeView")
+)
+
+(define-function gtk_list_item_get_type
+  (c-name "gtk_list_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_list_store_get_type
+  (c-name "gtk_list_store_get_type")
+  (return-type "GType")
+)
+
+(define-function check_version
+  (c-name "gtk_check_version")
+  (return-type "gchar*")
+  (parameters
+    '("guint" "required_major")
+    '("guint" "required_minor")
+    '("guint" "required_micro")
+  )
+)
+
+(define-function init
+  (c-name "gtk_init")
+  (return-type "none")
+  (parameters
+    '("int*" "argc")
+    '("char***" "argv")
+  )
+)
+
+(define-function init_check
+  (c-name "gtk_init_check")
+  (return-type "gboolean")
+  (parameters
+    '("int*" "argc")
+    '("char***" "argv")
+  )
+)
+
+(define-function init_abi_check
+  (c-name "gtk_init_abi_check")
+  (return-type "none")
+  (parameters
+    '("int*" "argc")
+    '("char***" "argv")
+    '("int" "num_checks")
+    '("size_t" "sizeof_GtkWindow")
+  )
+)
+
+(define-function init_check_abi_check
+  (c-name "gtk_init_check_abi_check")
+  (return-type "gboolean")
+  (parameters
+    '("int*" "argc")
+    '("char***" "argv")
+    '("int" "num_checks")
+    '("size_t" "sizeof_GtkWindow")
+  )
+)
+
+(define-function exit
+  (c-name "gtk_exit")
+  (return-type "none")
+  (parameters
+    '("gint" "error_code")
+  )
+)
+
+(define-function disable_setlocale
+  (c-name "gtk_disable_setlocale")
+  (return-type "none")
+)
+
+(define-function set_locale
+  (c-name "gtk_set_locale")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-function get_default_language
+  (c-name "gtk_get_default_language")
+  (return-type "PangoLanguage*")
+)
+
+(define-function events_pending
+  (c-name "gtk_events_pending")
+  (return-type "gint")
+)
+
+(define-function main_do_event
+  (c-name "gtk_main_do_event")
+  (return-type "none")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-function main
+  (c-name "gtk_main")
+  (return-type "none")
+)
+
+(define-function main_level
+  (c-name "gtk_main_level")
+  (return-type "guint")
+)
+
+(define-function main_quit
+  (c-name "gtk_main_quit")
+  (return-type "none")
+)
+
+(define-function main_iteration
+  (c-name "gtk_main_iteration")
+  (return-type "gboolean")
+)
+
+(define-function main_iteration_do
+  (c-name "gtk_main_iteration_do")
+  (return-type "gboolean")
+  (parameters
+    '("gboolean" "blocking" (default "TRUE"))
+  )
+)
+
+(define-function true
+  (c-name "gtk_true")
+  (return-type "gboolean")
+)
+
+(define-function false
+  (c-name "gtk_false")
+  (return-type "gboolean")
+)
+
+(define-function grab_get_current
+  (c-name "gtk_grab_get_current")
+  (return-type "GtkWidget*")
+)
+
+(define-function init_add
+  (c-name "gtk_init_add")
+  (return-type "none")
+  (parameters
+    '("GtkFunction" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-function quit_add_destroy
+  (c-name "gtk_quit_add_destroy")
+  (return-type "none")
+  (parameters
+    '("guint" "main_level")
+    '("GtkObject*" "object")
+  )
+)
+
+(define-function quit_add
+  (c-name "gtk_quit_add")
+  (return-type "guint")
+  (parameters
+    '("guint" "main_level")
+    '("GtkFunction" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-function quit_add_full
+  (c-name "gtk_quit_add_full")
+  (return-type "guint")
+  (parameters
+    '("guint" "main_level")
+    '("GtkFunction" "function")
+    '("GtkCallbackMarshal" "marshal")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-function quit_remove
+  (c-name "gtk_quit_remove")
+  (return-type "none")
+  (parameters
+    '("guint" "quit_handler_id")
+  )
+)
+
+(define-function quit_remove_by_data
+  (c-name "gtk_quit_remove_by_data")
+  (return-type "none")
+  (parameters
+    '("gpointer" "data")
+  )
+)
+
+(define-function timeout_add
+  (c-name "gtk_timeout_add")
+  (return-type "guint")
+  (parameters
+    '("guint32" "interval")
+    '("GtkFunction" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-function timeout_add_full
+  (c-name "gtk_timeout_add_full")
+  (return-type "guint")
+  (parameters
+    '("guint32" "interval")
+    '("GtkFunction" "function")
+    '("GtkCallbackMarshal" "marshal")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-function timeout_remove
+  (c-name "gtk_timeout_remove")
+  (return-type "none")
+  (parameters
+    '("guint" "timeout_handler_id")
+  )
+)
+
+(define-function idle_add
+  (c-name "gtk_idle_add")
+  (return-type "guint")
+  (parameters
+    '("GtkFunction" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-function idle_add_priority
+  (c-name "gtk_idle_add_priority")
+  (return-type "guint")
+  (parameters
+    '("gint" "priority")
+    '("GtkFunction" "function")
+    '("gpointer" "data")
+  )
+)
+
+(define-function idle_add_full
+  (c-name "gtk_idle_add_full")
+  (return-type "guint")
+  (parameters
+    '("gint" "priority")
+    '("GtkFunction" "function")
+    '("GtkCallbackMarshal" "marshal")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-function idle_remove
+  (c-name "gtk_idle_remove")
+  (return-type "none")
+  (parameters
+    '("guint" "idle_handler_id")
+  )
+)
+
+(define-function idle_remove_by_data
+  (c-name "gtk_idle_remove_by_data")
+  (return-type "none")
+  (parameters
+    '("gpointer" "data")
+  )
+)
+
+(define-function input_add_full
+  (c-name "gtk_input_add_full")
+  (return-type "guint")
+  (parameters
+    '("gint" "source")
+    '("GdkInputCondition" "condition")
+    '("GdkInputFunction" "function")
+    '("GtkCallbackMarshal" "marshal")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy")
+  )
+)
+
+(define-function input_remove
+  (c-name "gtk_input_remove")
+  (return-type "none")
+  (parameters
+    '("guint" "input_handler_id")
+  )
+)
+
+(define-function key_snooper_install
+  (c-name "gtk_key_snooper_install")
+  (return-type "guint")
+  (parameters
+    '("GtkKeySnoopFunc" "snooper")
+    '("gpointer" "func_data")
+  )
+)
+
+(define-function key_snooper_remove
+  (c-name "gtk_key_snooper_remove")
+  (return-type "none")
+  (parameters
+    '("guint" "snooper_handler_id")
+  )
+)
+
+(define-function get_current_event
+  (c-name "gtk_get_current_event")
+  (caller-owns-return #t)
+  (return-type "GdkEvent*")
+)
+
+(define-function get_current_event_time
+  (c-name "gtk_get_current_event_time")
+  (return-type "guint32")
+)
+
+(define-function get_current_event_state
+  (c-name "gtk_get_current_event_state")
+  (return-type "gboolean")
+  (parameters
+    '("GdkModifierType*" "state")
+  )
+)
+
+(define-function get_event_widget
+  (c-name "gtk_get_event_widget")
+  (return-type "GtkWidget*")
+  (parameters
+    '("GdkEvent*" "event")
+  )
+)
+
+(define-function parse_args
+  (c-name "gtk_parse_args")
+  (return-type "gboolean")
+  (parameters
+    '("int*" "argc")
+    '("char***" "argv")
+  )
+)
+
+(define-function init_with_args
+  (c-name "gtk_init_with_args")
+  (return-type "gboolean")
+  (parameters
+    '("int*" "argc")
+    '("char***" "argv")
+    '("char*" "parameter_string")
+    '("GOptionEntry*" "entries")
+    '("char*" "translation_domain")
+    '("GError**" "error")
+  )
+)
+
+(define-function get_option_group
+  (c-name "gtk_get_option_group")
+  (return-type "GOptionGroup*")
+  (parameters
+    '("gboolean" "open_default_display")
+  )
+)
+
+(define-function gtk_menu_get_type
+  (c-name "gtk_menu_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_menu_bar_get_type
+  (c-name "gtk_menu_bar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_menu_item_get_type
+  (c-name "gtk_menu_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_menu_shell_get_type
+  (c-name "gtk_menu_shell_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_menu_tool_button_get_type
+  (c-name "gtk_menu_tool_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_message_dialog_get_type
+  (c-name "gtk_message_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_misc_get_type
+  (c-name "gtk_misc_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_notebook_get_type
+  (c-name "gtk_notebook_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_object_get_type
+  (c-name "gtk_object_get_type")
+  (return-type "GType")
+)
+
+(define-function object_new
+  (c-name "gtk_object_new")
+  (return-type "GtkObject*")
+  (parameters
+    '("GType" "type")
+    '("const-gchar*" "first_property_name")
+  )
+  (varargs #t)
+)
+
+(define-function gtk_old_editable_get_type
+  (c-name "gtk_old_editable_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_option_menu_get_type
+  (c-name "gtk_option_menu_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_paned_get_type
+  (c-name "gtk_paned_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_pixmap_get_type
+  (c-name "gtk_pixmap_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_plug_get_type
+  (c-name "gtk_plug_get_type")
+  (return-type "GType")
+)
+
+(define-function plug_new_for_display
+  (c-name "gtk_plug_new_for_display")
+  (return-type "GtkWidget*")
+  (deprecated "use gtk.Plug(socket_id, display)")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GdkNativeWindow" "socket_id")
+  )
+)
+
+(define-function gtk_preview_get_type
+  (c-name "gtk_preview_get_type")
+  (return-type "GType")
+)
+
+(define-function preview_uninit
+  (c-name "gtk_preview_uninit")
+  (return-type "none")
+  (deprecated "use GtkPixbuf")
+)
+
+(define-function preview_set_gamma
+  (c-name "gtk_preview_set_gamma")
+  (return-type "none")
+  (deprecated "use GtkPixbuf")
+  (parameters
+    '("double" "gamma")
+  )
+)
+
+(define-function preview_set_color_cube
+  (c-name "gtk_preview_set_color_cube")
+  (return-type "none")
+  (deprecated "use GtkPixbuf")
+  (parameters
+    '("guint" "nred_shades")
+    '("guint" "ngreen_shades")
+    '("guint" "nblue_shades")
+    '("guint" "ngray_shades")
+  )
+)
+
+(define-function preview_set_install_cmap
+  (c-name "gtk_preview_set_install_cmap")
+  (return-type "none")
+  (deprecated "use GtkPixbuf")
+  (parameters
+    '("gint" "install_cmap")
+  )
+)
+
+(define-function preview_set_reserved
+  (c-name "gtk_preview_set_reserved")
+  (return-type "none")
+  (deprecated "use GtkPixbuf")
+  (parameters
+    '("gint" "nreserved")
+  )
+)
+
+(define-function preview_get_visual
+  (c-name "gtk_preview_get_visual")
+  (return-type "GdkVisual*")
+  (deprecated "use GtkPixbuf")
+)
+
+(define-function preview_get_cmap
+  (c-name "gtk_preview_get_cmap")
+  (return-type "GdkColormap*")
+  (deprecated "use GtkPixbuf")
+)
+
+(define-function preview_get_info
+  (c-name "gtk_preview_get_info")
+  (return-type "GtkPreviewInfo*")
+  (deprecated "use GtkPixbuf")
+)
+
+(define-function preview_reset
+  (c-name "gtk_preview_reset")
+  (return-type "none")
+  (deprecated "use GtkPixbuf")
+)
+
+(define-function gtk_progress_get_type
+  (c-name "gtk_progress_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_progress_bar_get_type
+  (c-name "gtk_progress_bar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_radio_action_get_type
+  (c-name "gtk_radio_action_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_radio_button_get_type
+  (c-name "gtk_radio_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_radio_menu_item_get_type
+  (c-name "gtk_radio_menu_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_radio_tool_button_get_type
+  (c-name "gtk_radio_tool_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_range_get_type
+  (c-name "gtk_range_get_type")
+  (return-type "GType")
+)
+
+(define-function rc_add_default_file
+  (c-name "gtk_rc_add_default_file")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-function rc_set_default_files
+  (c-name "gtk_rc_set_default_files")
+  (return-type "none")
+  (parameters
+    '("gchar**" "filenames")
+  )
+)
+
+(define-function rc_get_default_files
+  (c-name "gtk_rc_get_default_files")
+  (return-type "gchar**")
+)
+
+(define-function rc_get_style_by_paths
+  (c-name "gtk_rc_get_style_by_paths")
+  (return-type "GtkStyle*")
+  (parameters
+    '("GtkSettings*" "settings")
+    '("const-char*" "widget_path" (default "NULL") (null-ok))
+    '("const-char*" "class_path" (default "NULL") (null-ok))
+    '("GType" "type")
+  )
+)
+
+(define-function rc_reparse_all_for_settings
+  (c-name "gtk_rc_reparse_all_for_settings")
+  (return-type "gboolean")
+  (parameters
+    '("GtkSettings*" "settings")
+    '("gboolean" "force_load")
+  )
+)
+
+(define-function rc_reset_styles
+  (c-name "gtk_rc_reset_styles")
+  (return-type "none")
+  (parameters
+    '("GtkSettings*" "settings")
+  )
+)
+
+(define-function rc_find_pixmap_in_path
+  (c-name "gtk_rc_find_pixmap_in_path")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("GtkSettings*" "settings")
+    '("GScanner*" "scanner")
+    '("const-gchar*" "pixmap_file")
+  )
+)
+
+(define-function rc_parse
+  (c-name "gtk_rc_parse")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+  )
+)
+
+(define-function rc_parse_string
+  (c-name "gtk_rc_parse_string")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "rc_string")
+  )
+)
+
+(define-function rc_reparse_all
+  (c-name "gtk_rc_reparse_all")
+  (return-type "gboolean")
+)
+
+(define-function gtk_rc_style_get_type
+  (c-name "gtk_rc_style_get_type")
+  (return-type "GType")
+)
+
+(define-function rc_find_module_in_path
+  (c-name "gtk_rc_find_module_in_path")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+  (parameters
+    '("const-gchar*" "module_file")
+  )
+)
+
+(define-function rc_get_theme_dir
+  (c-name "gtk_rc_get_theme_dir")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-function rc_get_module_dir
+  (c-name "gtk_rc_get_module_dir")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-function rc_get_im_module_path
+  (c-name "gtk_rc_get_im_module_path")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-function rc_get_im_module_file
+  (c-name "gtk_rc_get_im_module_file")
+  (caller-owns-return #t)
+  (return-type "gchar*")
+)
+
+(define-function rc_parse_color
+  (c-name "gtk_rc_parse_color")
+  (return-type "guint")
+  (parameters
+    '("GScanner*" "scanner")
+    '("GdkColor*" "color")
+  )
+)
+
+(define-function rc_parse_state
+  (c-name "gtk_rc_parse_state")
+  (return-type "guint")
+  (parameters
+    '("GScanner*" "scanner")
+    '("GtkStateType*" "state")
+  )
+)
+
+(define-function rc_parse_priority
+  (c-name "gtk_rc_parse_priority")
+  (return-type "guint")
+  (parameters
+    '("GScanner*" "scanner")
+    '("GtkPathPriorityType*" "priority")
+  )
+)
+
+(define-function gtk_ruler_get_type
+  (c-name "gtk_ruler_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_scale_get_type
+  (c-name "gtk_scale_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_scrollbar_get_type
+  (c-name "gtk_scrollbar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_scrolled_window_get_type
+  (c-name "gtk_scrolled_window_get_type")
+  (return-type "GType")
+)
+
+(define-function selection_owner_set_for_display
+  (c-name "gtk_selection_owner_set_for_display")
+  (return-type "gboolean")
+  (parameters
+    '("GdkDisplay*" "display")
+    '("GtkWidget*" "widget" (null-ok))
+    '("GdkAtom" "selection")
+    '("guint32" "time" (default "GDK_CURRENT_TIME"))
+  )
+)
+
+(define-function gtk_selection_data_get_type
+  (c-name "gtk_selection_data_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_separator_get_type
+  (c-name "gtk_separator_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_separator_menu_item_get_type
+  (c-name "gtk_separator_menu_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_separator_tool_item_get_type
+  (c-name "gtk_separator_tool_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_settings_get_type
+  (c-name "gtk_settings_get_type")
+  (return-type "GType")
+)
+
+(define-function settings_install_property
+  (c-name "gtk_settings_install_property")
+  (return-type "none")
+  (parameters
+    '("GParamSpec*" "pspec")
+  )
+)
+
+(define-function settings_install_property_parser
+  (c-name "gtk_settings_install_property_parser")
+  (return-type "none")
+  (parameters
+    '("GParamSpec*" "pspec")
+    '("GtkRcPropertyParser" "parser")
+  )
+)
+
+(define-function rc_property_parse_color
+  (c-name "gtk_rc_property_parse_color")
+  (return-type "gboolean")
+  (parameters
+    '("const-GParamSpec*" "pspec")
+    '("const-GString*" "gstring")
+    '("GValue*" "property_value")
+  )
+)
+
+(define-function rc_property_parse_enum
+  (c-name "gtk_rc_property_parse_enum")
+  (return-type "gboolean")
+  (parameters
+    '("const-GParamSpec*" "pspec")
+    '("const-GString*" "gstring")
+    '("GValue*" "property_value")
+  )
+)
+
+(define-function rc_property_parse_flags
+  (c-name "gtk_rc_property_parse_flags")
+  (return-type "gboolean")
+  (parameters
+    '("const-GParamSpec*" "pspec")
+    '("const-GString*" "gstring")
+    '("GValue*" "property_value")
+  )
+)
+
+(define-function rc_property_parse_requisition
+  (c-name "gtk_rc_property_parse_requisition")
+  (return-type "gboolean")
+  (parameters
+    '("const-GParamSpec*" "pspec")
+    '("const-GString*" "gstring")
+    '("GValue*" "property_value")
+  )
+)
+
+(define-function rc_property_parse_border
+  (c-name "gtk_rc_property_parse_border")
+  (return-type "gboolean")
+  (parameters
+    '("const-GParamSpec*" "pspec")
+    '("const-GString*" "gstring")
+    '("GValue*" "property_value")
+  )
+)
+
+(define-function signal_newv
+  (c-name "gtk_signal_newv")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "name")
+    '("GtkSignalRunType" "signal_flags")
+    '("GtkType" "object_type")
+    '("guint" "function_offset")
+    '("GtkSignalMarshaller" "marshaller")
+    '("GtkType" "return_val")
+    '("guint" "n_args")
+    '("GtkType*" "args")
+  )
+)
+
+(define-function signal_new
+  (c-name "gtk_signal_new")
+  (return-type "guint")
+  (parameters
+    '("const-gchar*" "name")
+    '("GtkSignalRunType" "signal_flags")
+    '("GtkType" "object_type")
+    '("guint" "function_offset")
+    '("GtkSignalMarshaller" "marshaller")
+    '("GtkType" "return_val")
+    '("guint" "n_args")
+  )
+  (varargs #t)
+)
+
+(define-function signal_emit_stop_by_name
+  (c-name "gtk_signal_emit_stop_by_name")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function signal_connect_object_while_alive
+  (c-name "gtk_signal_connect_object_while_alive")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("const-gchar*" "name")
+    '("GtkSignalFunc" "func")
+    '("GtkObject*" "alive_object")
+  )
+)
+
+(define-function signal_connect_while_alive
+  (c-name "gtk_signal_connect_while_alive")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("const-gchar*" "name")
+    '("GtkSignalFunc" "func")
+    '("gpointer" "func_data")
+    '("GtkObject*" "alive_object")
+  )
+)
+
+(define-function signal_connect_full
+  (c-name "gtk_signal_connect_full")
+  (return-type "gulong")
+  (parameters
+    '("GtkObject*" "object")
+    '("const-gchar*" "name")
+    '("GtkSignalFunc" "func")
+    '("GtkCallbackMarshal" "unsupported")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "destroy_func")
+    '("gint" "object_signal")
+    '("gint" "after")
+  )
+)
+
+(define-function signal_emitv
+  (c-name "gtk_signal_emitv")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("guint" "signal_id")
+    '("GtkArg*" "args")
+  )
+)
+
+(define-function signal_emit
+  (c-name "gtk_signal_emit")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("guint" "signal_id")
+  )
+  (varargs #t)
+)
+
+(define-function signal_emit_by_name
+  (c-name "gtk_signal_emit_by_name")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("const-gchar*" "name")
+  )
+  (varargs #t)
+)
+
+(define-function signal_emitv_by_name
+  (c-name "gtk_signal_emitv_by_name")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("const-gchar*" "name")
+    '("GtkArg*" "args")
+  )
+)
+
+(define-function signal_compat_matched
+  (c-name "gtk_signal_compat_matched")
+  (return-type "none")
+  (parameters
+    '("GtkObject*" "object")
+    '("GtkSignalFunc" "func")
+    '("gpointer" "data")
+    '("GSignalMatchType" "match")
+    '("guint" "action")
+  )
+)
+
+(define-function gtk_size_group_get_type
+  (c-name "gtk_size_group_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_socket_get_type
+  (c-name "gtk_socket_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_spin_button_get_type
+  (c-name "gtk_spin_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_statusbar_get_type
+  (c-name "gtk_statusbar_get_type")
+  (return-type "GType")
+)
+
+(define-function stock_add
+  (c-name "gtk_stock_add")
+  (return-type "none")
+  (parameters
+    '("const-GtkStockItem*" "items")
+    '("guint" "n_items")
+  )
+)
+
+(define-function stock_add_static
+  (c-name "gtk_stock_add_static")
+  (return-type "none")
+  (parameters
+    '("const-GtkStockItem*" "items")
+    '("guint" "n_items")
+  )
+)
+
+(define-function stock_lookup
+  (c-name "gtk_stock_lookup")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "stock_id")
+    '("GtkStockItem*" "item")
+  )
+)
+
+(define-function stock_list_ids
+  (c-name "gtk_stock_list_ids")
+  (return-type "GSList*")
+)
+
+(define-function stock_set_translate_func
+  (c-name "gtk_stock_set_translate_func")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "domain")
+    '("GtkTranslateFunc" "func")
+    '("gpointer" "data")
+    '("GtkDestroyNotify" "notify")
+  )
+)
+
+(define-function gtk_style_get_type
+  (c-name "gtk_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_border_get_type
+  (c-name "gtk_border_get_type")
+  (return-type "GType")
+)
+
+(define-function draw_insertion_cursor
+  (c-name "gtk_draw_insertion_cursor")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "widget")
+    '("GdkDrawable*" "drawable")
+    '("GdkRectangle*" "area" (null-ok))
+    '("GdkRectangle*" "location")
+    '("gboolean" "is_primary")
+    '("GtkTextDirection" "direction")
+    '("gboolean" "draw_arrow")
+  )
+)
+
+(define-function gtk_table_get_type
+  (c-name "gtk_table_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tearoff_menu_item_get_type
+  (c-name "gtk_tearoff_menu_item_get_type")
+  (return-type "GType")
+)
+
+(define-function text_get_type
+  (c-name "gtk_text_get_type")
+  (return-type "GtkType")
+)
+
+(define-function gtk_text_buffer_get_type
+  (c-name "gtk_text_buffer_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_child_anchor_get_type
+  (c-name "gtk_text_child_anchor_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_iter_get_type
+  (c-name "gtk_text_iter_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_layout_get_type
+  (c-name "gtk_text_layout_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_anchored_child_set_layout
+  (c-name "gtk_text_anchored_child_set_layout")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "child")
+    '("GtkTextLayout*" "layout")
+  )
+)
+
+(define-function gtk_text_mark_get_type
+  (c-name "gtk_text_mark_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_tag_get_type
+  (c-name "gtk_text_tag_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_attributes_get_type
+  (c-name "gtk_text_attributes_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_tag_table_get_type
+  (c-name "gtk_text_tag_table_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_view_get_type
+  (c-name "gtk_text_view_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tips_query_get_type
+  (c-name "gtk_tips_query_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toggle_action_get_type
+  (c-name "gtk_toggle_action_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toggle_button_get_type
+  (c-name "gtk_toggle_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toggle_tool_button_get_type
+  (c-name "gtk_toggle_tool_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toolbar_get_type
+  (c-name "gtk_toolbar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tool_button_get_type
+  (c-name "gtk_tool_button_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tool_item_get_type
+  (c-name "gtk_tool_item_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tooltips_get_type
+  (c-name "gtk_tooltips_get_type")
+  (return-type "GType")
+)
+
+(define-function tooltips_data_get
+  (c-name "gtk_tooltips_data_get")
+  (return-type "GtkTooltipsData*")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function gtk_tooltips_data_get
+  (c-name "gtk_tooltips_data_get1")
+  (return-type "GtkTooltipsData*")
+  (deprecated "use tooltips_data_get")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function gtk_tree_drag_source_get_type
+  (c-name "gtk_tree_drag_source_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_drag_dest_get_type
+  (c-name "gtk_tree_drag_dest_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_get_type
+  (c-name "gtk_tree_get_type")
+  (return-type "GtkType")
+)
+
+(define-function gtk_tree_item_get_type
+  (c-name "gtk_tree_item_get_type")
+  (return-type "GtkType")
+)
+
+(define-function gtk_tree_item_new_with_label
+  (c-name "gtk_tree_item_new_with_label")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-function tree_path_get_type
+  (c-name "gtk_tree_path_get_type")
+  (return-type "GType")
+)
+
+(define-function tree_path_new_from_indices
+  (c-name "gtk_tree_path_new_from_indices")
+  (return-type "GtkTreePath*")
+  (parameters
+    '("gint" "first_index")
+  )
+  (varargs #t)
+)
+
+(define-function tree_path_new_first
+  (c-name "gtk_tree_path_new_first")
+  (return-type "GtkTreePath*")
+)
+
+(define-function gtk_tree_row_reference_get_type
+  (c-name "gtk_tree_row_reference_get_type")
+  (return-type "GType")
+)
+
+(define-function tree_row_reference_inserted
+  (c-name "gtk_tree_row_reference_inserted")
+  (return-type "none")
+  (parameters
+    '("GObject*" "proxy")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-function tree_row_reference_deleted
+  (c-name "gtk_tree_row_reference_deleted")
+  (return-type "none")
+  (parameters
+    '("GObject*" "proxy")
+    '("GtkTreePath*" "path")
+  )
+)
+
+(define-function tree_row_reference_reordered
+  (c-name "gtk_tree_row_reference_reordered")
+  (return-type "none")
+  (parameters
+    '("GObject*" "proxy")
+    '("GtkTreePath*" "path")
+    '("GtkTreeIter*" "iter")
+    '("gint*" "new_order")
+  )
+)
+
+(define-function gtk_tree_iter_get_type
+  (c-name "gtk_tree_iter_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_model_get_type
+  (c-name "gtk_tree_model_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_model_filter_get_type
+  (c-name "gtk_tree_model_filter_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_model_sort_get_type
+  (c-name "gtk_tree_model_sort_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_selection_get_type
+  (c-name "gtk_tree_selection_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_sortable_get_type
+  (c-name "gtk_tree_sortable_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_store_get_type
+  (c-name "gtk_tree_store_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_view_get_type
+  (c-name "gtk_tree_view_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_view_column_get_type
+  (c-name "gtk_tree_view_column_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_accel_flags_get_type
+  (c-name "gtk_accel_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_calendar_display_options_get_type
+  (c-name "gtk_calendar_display_options_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_state_get_type
+  (c-name "gtk_cell_renderer_state_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_renderer_mode_get_type
+  (c-name "gtk_cell_renderer_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_cell_type_get_type
+  (c-name "gtk_cell_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_clist_drag_pos_get_type
+  (c-name "gtk_clist_drag_pos_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_button_action_get_type
+  (c-name "gtk_button_action_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_ctree_pos_get_type
+  (c-name "gtk_ctree_pos_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_ctree_line_style_get_type
+  (c-name "gtk_ctree_line_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_ctree_expander_style_get_type
+  (c-name "gtk_ctree_expander_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_ctree_expansion_type_get_type
+  (c-name "gtk_ctree_expansion_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_debug_flag_get_type
+  (c-name "gtk_debug_flag_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_dialog_flags_get_type
+  (c-name "gtk_dialog_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_response_type_get_type
+  (c-name "gtk_response_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_dest_defaults_get_type
+  (c-name "gtk_dest_defaults_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_target_flags_get_type
+  (c-name "gtk_target_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_anchor_type_get_type
+  (c-name "gtk_anchor_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_arrow_type_get_type
+  (c-name "gtk_arrow_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_attach_options_get_type
+  (c-name "gtk_attach_options_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_button_box_style_get_type
+  (c-name "gtk_button_box_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_curve_type_get_type
+  (c-name "gtk_curve_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_delete_type_get_type
+  (c-name "gtk_delete_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_direction_type_get_type
+  (c-name "gtk_direction_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_expander_style_get_type
+  (c-name "gtk_expander_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_size_get_type
+  (c-name "gtk_icon_size_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_side_type_get_type
+  (c-name "gtk_side_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_direction_get_type
+  (c-name "gtk_text_direction_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_justification_get_type
+  (c-name "gtk_justification_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_match_type_get_type
+  (c-name "gtk_match_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_menu_direction_type_get_type
+  (c-name "gtk_menu_direction_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_metric_type_get_type
+  (c-name "gtk_metric_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_movement_step_get_type
+  (c-name "gtk_movement_step_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_scroll_step_get_type
+  (c-name "gtk_scroll_step_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_orientation_get_type
+  (c-name "gtk_orientation_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_corner_type_get_type
+  (c-name "gtk_corner_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_pack_type_get_type
+  (c-name "gtk_pack_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_path_priority_type_get_type
+  (c-name "gtk_path_priority_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_path_type_get_type
+  (c-name "gtk_path_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_policy_type_get_type
+  (c-name "gtk_policy_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_position_type_get_type
+  (c-name "gtk_position_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_preview_type_get_type
+  (c-name "gtk_preview_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_relief_style_get_type
+  (c-name "gtk_relief_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_resize_mode_get_type
+  (c-name "gtk_resize_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_signal_run_type_get_type
+  (c-name "gtk_signal_run_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_scroll_type_get_type
+  (c-name "gtk_scroll_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_selection_mode_get_type
+  (c-name "gtk_selection_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_shadow_type_get_type
+  (c-name "gtk_shadow_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_state_type_get_type
+  (c-name "gtk_state_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_submenu_direction_get_type
+  (c-name "gtk_submenu_direction_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_submenu_placement_get_type
+  (c-name "gtk_submenu_placement_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toolbar_style_get_type
+  (c-name "gtk_toolbar_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_update_type_get_type
+  (c-name "gtk_update_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_visibility_get_type
+  (c-name "gtk_visibility_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_window_position_get_type
+  (c-name "gtk_window_position_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_window_type_get_type
+  (c-name "gtk_window_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_wrap_mode_get_type
+  (c-name "gtk_wrap_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_sort_type_get_type
+  (c-name "gtk_sort_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_im_preedit_style_get_type
+  (c-name "gtk_im_preedit_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_im_status_style_get_type
+  (c-name "gtk_im_status_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_pack_direction_get_type
+  (c-name "gtk_pack_direction_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_chooser_action_get_type
+  (c-name "gtk_file_chooser_action_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_chooser_confirmation_get_type
+  (c-name "gtk_file_chooser_confirmation_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_chooser_error_get_type
+  (c-name "gtk_file_chooser_error_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_file_filter_flags_get_type
+  (c-name "gtk_file_filter_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_lookup_flags_get_type
+  (c-name "gtk_icon_lookup_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_theme_error_get_type
+  (c-name "gtk_icon_theme_error_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_icon_view_drop_position_get_type
+  (c-name "gtk_icon_view_drop_position_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_image_type_get_type
+  (c-name "gtk_image_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_message_type_get_type
+  (c-name "gtk_message_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_buttons_type_get_type
+  (c-name "gtk_buttons_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_notebook_tab_get_type
+  (c-name "gtk_notebook_tab_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_object_flags_get_type
+  (c-name "gtk_object_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_arg_flags_get_type
+  (c-name "gtk_arg_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_print_status_get_type
+  (c-name "gtk_print_status_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_print_operation_result_get_type
+  (c-name "gtk_print_operation_result_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_print_error_get_type
+  (c-name "gtk_print_error_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_private_flags_get_type
+  (c-name "gtk_private_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_progress_bar_style_get_type
+  (c-name "gtk_progress_bar_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_progress_bar_orientation_get_type
+  (c-name "gtk_progress_bar_orientation_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_rc_flags_get_type
+  (c-name "gtk_rc_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_rc_token_type_get_type
+  (c-name "gtk_rc_token_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_size_group_mode_get_type
+  (c-name "gtk_size_group_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_spin_button_update_policy_get_type
+  (c-name "gtk_spin_button_update_policy_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_spin_type_get_type
+  (c-name "gtk_spin_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_search_flags_get_type
+  (c-name "gtk_text_search_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_text_window_type_get_type
+  (c-name "gtk_text_window_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toolbar_child_type_get_type
+  (c-name "gtk_toolbar_child_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_toolbar_space_style_get_type
+  (c-name "gtk_toolbar_space_style_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_view_mode_get_type
+  (c-name "gtk_tree_view_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_model_flags_get_type
+  (c-name "gtk_tree_model_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_view_drop_position_get_type
+  (c-name "gtk_tree_view_drop_position_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_tree_view_column_sizing_get_type
+  (c-name "gtk_tree_view_column_sizing_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_ui_manager_item_type_get_type
+  (c-name "gtk_ui_manager_item_type_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_widget_flags_get_type
+  (c-name "gtk_widget_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_widget_help_type_get_type
+  (c-name "gtk_widget_help_type_get_type")
+  (return-type "GType")
+)
+
+(define-function identifier_get_type
+  (c-name "gtk_identifier_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_type_init
+  (c-name "gtk_type_init")
+  (return-type "none")
+  (parameters
+    '("GTypeDebugFlags" "debug_flags")
+  )
+)
+
+(define-function gtk_ui_manager_get_type
+  (c-name "gtk_ui_manager_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_vbutton_box_get_type
+  (c-name "gtk_vbutton_box_get_type")
+  (return-type "GType")
+)
+
+(define-function vbutton_box_get_spacing_default
+  (c-name "gtk_vbutton_box_get_spacing_default")
+  (return-type "gint")
+)
+
+(define-function vbutton_box_set_spacing_default
+  (c-name "gtk_vbutton_box_set_spacing_default")
+  (return-type "none")
+  (parameters
+    '("gint" "spacing")
+  )
+)
+
+(define-function vbutton_box_get_layout_default
+  (c-name "gtk_vbutton_box_get_layout_default")
+  (return-type "GtkButtonBoxStyle")
+)
+
+(define-function vbutton_box_set_layout_default
+  (c-name "gtk_vbutton_box_set_layout_default")
+  (return-type "none")
+  (parameters
+    '("GtkButtonBoxStyle" "layout")
+  )
+)
+
+(define-function gtk_vbox_get_type
+  (c-name "gtk_vbox_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_viewport_get_type
+  (c-name "gtk_viewport_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_vpaned_get_type
+  (c-name "gtk_vpaned_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_vruler_get_type
+  (c-name "gtk_vruler_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_vscale_get_type
+  (c-name "gtk_vscale_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_vscrollbar_get_type
+  (c-name "gtk_vscrollbar_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_vseparator_get_type
+  (c-name "gtk_vseparator_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_widget_get_type
+  (c-name "gtk_widget_get_type")
+  (return-type "GType")
+)
+
+(define-function widget_push_colormap
+  (c-name "gtk_widget_push_colormap")
+  (return-type "none")
+  (parameters
+    '("GdkColormap*" "cmap")
+  )
+)
+
+(define-function widget_push_composite_child
+  (c-name "gtk_widget_push_composite_child")
+  (return-type "none")
+)
+
+(define-function widget_pop_composite_child
+  (c-name "gtk_widget_pop_composite_child")
+  (return-type "none")
+)
+
+(define-function widget_pop_colormap
+  (c-name "gtk_widget_pop_colormap")
+  (return-type "none")
+)
+
+(define-function widget_class_install_style_property
+  (c-name "gtk_widget_class_install_style_property")
+  (return-type "none")
+  (parameters
+    '("GtkWidgetClass*" "klass")
+    '("GParamSpec*" "pspec")
+  )
+)
+
+(define-function widget_class_install_style_property_parser
+  (c-name "gtk_widget_class_install_style_property_parser")
+  (return-type "none")
+  (parameters
+    '("GtkWidgetClass*" "klass")
+    '("GParamSpec*" "pspec")
+    '("GtkRcPropertyParser" "parser")
+  )
+)
+
+(define-function widget_class_find_style_property
+  (c-name "gtk_widget_class_find_style_property")
+  (return-type "GParamSpec*")
+  (parameters
+    '("GtkWidgetClass*" "klass")
+    '("const-gchar*" "property_name")
+  )
+)
+
+(define-function widget_class_list_style_properties
+  (c-name "gtk_widget_class_list_style_properties")
+  (return-type "GParamSpec**")
+  (parameters
+    '("guint*" "n_properties")
+  )
+)
+
+(define-function widget_get_default_style
+  (c-name "gtk_widget_get_default_style")
+  (return-type "GtkStyle*")
+)
+
+(define-function widget_set_default_colormap
+  (c-name "gtk_widget_set_default_colormap")
+  (return-type "none")
+  (parameters
+    '("GdkColormap*" "colormap")
+  )
+)
+
+(define-function widget_get_default_colormap
+  (c-name "gtk_widget_get_default_colormap")
+  (return-type "GdkColormap*")
+)
+
+(define-function widget_get_default_visual
+  (c-name "gtk_widget_get_default_visual")
+  (return-type "GdkVisual*")
+)
+
+(define-function widget_set_default_direction
+  (c-name "gtk_widget_set_default_direction")
+  (return-type "none")
+  (parameters
+    '("GtkTextDirection" "dir")
+  )
+)
+
+(define-function widget_get_default_direction
+  (c-name "gtk_widget_get_default_direction")
+  (return-type "GtkTextDirection")
+)
+
+(define-function gtk_requisition_get_type
+  (c-name "gtk_requisition_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_window_get_type
+  (c-name "gtk_window_get_type")
+  (return-type "GType")
+)
+
+(define-function window_set_default_icon_list
+  (c-name "gtk_window_set_default_icon_list")
+  (return-type "none")
+  (parameters
+    '("GList*" "list")
+  )
+)
+
+(define-function window_get_default_icon_list
+  (c-name "gtk_window_get_default_icon_list")
+  (return-type "GList*")
+)
+
+(define-function window_set_default_icon_from_file
+  (c-name "gtk_window_set_default_icon_from_file")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "filename")
+    '("GError**" "error")
+  )
+)
+
+(define-function window_set_auto_startup_notification
+  (c-name "gtk_window_set_auto_startup_notification")
+  (return-type "none")
+  (parameters
+    '("gboolean" "setting")
+  )
+)
+
+(define-function window_list_toplevels
+  (c-name "gtk_window_list_toplevels")
+  (return-type "GList*")
+)
+
+(define-function gtk_window_group_get_type
+  (c-name "gtk_window_group_get_type")
+  (return-type "GType")
+)
+
+(define-function window_set_default_icon_name
+  (c-name "gtk_window_set_default_icon_name")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function assistant_get_type
+  (c-name "gtk_assistant_get_type")
+  (return-type "GType")
+)
+
+(define-function cell_renderer_accel_get_type
+  (c-name "gtk_cell_renderer_accel_get_type")
+  (return-type "GType")
+)
+
+(define-function cell_renderer_spin_get_type
+  (c-name "gtk_cell_renderer_spin_get_type")
+  (return-type "GType")
+)
+
+(define-function link_button_get_type
+  (c-name "gtk_link_button_get_type")
+  (return-type "GType")
+)
+
+(define-function link_button_new
+  (c-name "gtk_link_button_new")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "uri")
+  )
+)
+
+(define-function link_button_set_uri_hook
+  (c-name "gtk_link_button_set_uri_hook")
+  (return-type "GtkLinkButtonUriFunc")
+  (parameters
+    '("GtkLinkButtonUriFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-function notebook_set_window_creation_hook
+  (c-name "gtk_notebook_set_window_creation_hook")
+  (return-type "none")
+  (parameters
+    '("GtkNotebookWindowCreationFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+  )
+)
+
+(define-function page_setup_get_type
+  (c-name "gtk_page_setup_get_type")
+  (return-type "GType")
+)
+
+(define-function paper_size_get_type
+  (c-name "gtk_paper_size_get_type")
+  (return-type "GType")
+)
+
+(define-function paper_size_new_from_ppd
+  (c-name "gtk_paper_size_new_from_ppd")
+  (return-type "GtkPaperSize*")
+  (parameters
+    '("const-gchar*" "ppd_name")
+    '("const-gchar*" "ppd_display_name")
+    '("gdouble" "width")
+    '("gdouble" "height")
+  )
+)
+
+(define-function paper_size_get_default
+  (c-name "gtk_paper_size_get_default")
+  (return-type "const-gchar*")
+)
+
+(define-function print_context_get_type
+  (c-name "gtk_print_context_get_type")
+  (return-type "GType")
+)
+
+(define-function print_error_quark
+  (c-name "gtk_print_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function print_operation_get_type
+  (c-name "gtk_print_operation_get_type")
+  (return-type "GType")
+)
+
+(define-function print_run_page_setup_dialog
+  (c-name "gtk_print_run_page_setup_dialog")
+  (return-type "GtkPageSetup*")
+  (parameters
+    '("GtkWindow*" "parent" (null-ok))
+    '("GtkPageSetup*" "page_setup" (null-ok))
+    '("GtkPrintSettings*" "settings")
+  )
+)
+
+(define-function print_run_page_setup_dialog_async
+  (c-name "gtk_print_run_page_setup_dialog_async")
+  (return-type "none")
+  (parameters
+    '("GtkWindow*" "parent")
+    '("GtkPageSetup*" "page_setup")
+    '("GtkPrintSettings*" "settings")
+    '("GtkPageSetupDoneFunc" "done_cb")
+    '("gpointer" "data")
+  )
+)
+
+(define-function print_operation_preview_get_type
+  (c-name "gtk_print_operation_preview_get_type")
+  (return-type "GType")
+)
+
+(define-function print_settings_get_type
+  (c-name "gtk_print_settings_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_chooser_dialog_get_type
+  (c-name "gtk_recent_chooser_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_chooser_dialog_new_for_manager
+  (c-name "gtk_recent_chooser_dialog_new_for_manager")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "title")
+    '("GtkWindow*" "parent")
+    '("GtkRecentManager*" "manager")
+    '("const-gchar*" "first_button_text")
+  )
+  (varargs #t)
+)
+
+(define-function recent_chooser_error_quark
+  (c-name "gtk_recent_chooser_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function recent_chooser_get_type
+  (c-name "gtk_recent_chooser_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_chooser_menu_get_type
+  (c-name "gtk_recent_chooser_menu_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_chooser_menu_new
+  (c-name "gtk_recent_chooser_menu_new")
+  (return-type "GtkWidget*")
+)
+
+(define-function recent_chooser_widget_get_type
+  (c-name "gtk_recent_chooser_widget_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_chooser_widget_new
+  (c-name "gtk_recent_chooser_widget_new")
+  (return-type "GtkWidget*")
+)
+
+(define-function recent_filter_get_type
+  (c-name "gtk_recent_filter_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_manager_error_quark
+  (c-name "gtk_recent_manager_error_quark")
+  (return-type "GQuark")
+)
+
+(define-function recent_manager_get_type
+  (c-name "gtk_recent_manager_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_manager_get_default
+  (c-name "gtk_recent_manager_get_default")
+  (return-type "GtkRecentManager*")
+)
+
+(define-function recent_manager_get_for_screen
+  (c-name "gtk_recent_manager_get_for_screen")
+  (return-type "GtkRecentManager*")
+  (parameters
+    '("GdkScreen*" "screen")
+  )
+)
+
+(define-function recent_info_get_type
+  (c-name "gtk_recent_info_get_type")
+  (return-type "GType")
+)
+
+(define-function target_list_add_rich_text_targets
+  (c-name "gtk_target_list_add_rich_text_targets")
+  (return-type "none")
+  (parameters
+    '("guint" "info")
+    '("gboolean" "deserializable")
+    '("GtkTextBuffer*" "buffer")
+  )
+)
+
+(define-function target_table_new_from_list
+  (c-name "gtk_target_table_new_from_list")
+  (return-type "GtkTargetEntry*")
+  (parameters
+    '("GtkTargetList*" "list")
+    '("gint*" "n_targets")
+  )
+)
+
+(define-function target_table_free
+  (c-name "gtk_target_table_free")
+  (return-type "none")
+  (parameters
+    '("GtkTargetEntry*" "targets")
+    '("gint" "n_targets")
+  )
+)
+
+(define-function targets_include_text
+  (c-name "gtk_targets_include_text")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom*" "targets")
+    '("gint" "n_targets")
+  )
+)
+
+(define-function targets_include_rich_text
+  (c-name "gtk_targets_include_rich_text")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom*" "targets")
+    '("gint" "n_targets")
+    '("GtkTextBuffer*" "buffer")
+  )
+)
+
+(define-function targets_include_image
+  (c-name "gtk_targets_include_image")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom*" "targets")
+    '("gint" "n_targets")
+    '("gboolean" "writable")
+  )
+)
+
+(define-function targets_include_uri
+  (c-name "gtk_targets_include_uri")
+  (return-type "gboolean")
+  (parameters
+    '("GdkAtom*" "targets")
+    '("gint" "n_targets")
+  )
+)
+
+(define-function target_list_get_type
+  (c-name "gtk_target_list_get_type")
+  (return-type "GType")
+)
+
+(define-function status_icon_get_type
+  (c-name "gtk_status_icon_get_type")
+  (return-type "GType")
+)
+
+(define-function status_icon_position_menu
+  (c-name "gtk_status_icon_position_menu")
+  (return-type "none")
+  (parameters
+    '("GtkMenu*" "menu")
+    '("gint*" "x")
+    '("gint*" "y")
+    '("gboolean*" "push_in")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-function assistant_page_type_get_type
+  (c-name "gtk_assistant_page_type_get_type")
+  (return-type "GType")
+)
+
+(define-function cell_renderer_accel_mode_get_type
+  (c-name "gtk_cell_renderer_accel_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function sensitivity_type_get_type
+  (c-name "gtk_sensitivity_type_get_type")
+  (return-type "GType")
+)
+
+(define-function print_pages_get_type
+  (c-name "gtk_print_pages_get_type")
+  (return-type "GType")
+)
+
+(define-function page_set_get_type
+  (c-name "gtk_page_set_get_type")
+  (return-type "GType")
+)
+
+(define-function page_orientation_get_type
+  (c-name "gtk_page_orientation_get_type")
+  (return-type "GType")
+)
+
+(define-function print_quality_get_type
+  (c-name "gtk_print_quality_get_type")
+  (return-type "GType")
+)
+
+(define-function print_duplex_get_type
+  (c-name "gtk_print_duplex_get_type")
+  (return-type "GType")
+)
+
+(define-function unit_get_type
+  (c-name "gtk_unit_get_type")
+  (return-type "GType")
+)
+
+(define-function tree_view_grid_lines_get_type
+  (c-name "gtk_tree_view_grid_lines_get_type")
+  (return-type "GType")
+)
+
+(define-function print_operation_action_get_type
+  (c-name "gtk_print_operation_action_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_sort_type_get_type
+  (c-name "gtk_recent_sort_type_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_chooser_error_get_type
+  (c-name "gtk_recent_chooser_error_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_filter_flags_get_type
+  (c-name "gtk_recent_filter_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function recent_manager_error_get_type
+  (c-name "gtk_recent_manager_error_get_type")
+  (return-type "GType")
+)
+
+(define-function text_buffer_target_info_get_type
+  (c-name "gtk_text_buffer_target_info_get_type")
+  (return-type "GType")
+)
+
+(define-function require
+  (c-name "glade_require")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "library")
+  )
+)
+
+(define-function provide
+  (c-name "glade_provide")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "library")
+  )
+)
+
+(define-function glade_xml_get_type
+  (c-name "glade_xml_get_type")
+  (return-type "GType")
+)
+
+(define-function get_widget_name
+  (c-name "glade_get_widget_name")
+  (return-type "const-char*")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function get_widget_tree
+  (c-name "glade_get_widget_tree")
+  (return-type "GladeXML*")
+  (parameters
+    '("GtkWidget*" "widget")
+  )
+)
+
+(define-function set_custom_handler
+  (c-name "glade_set_custom_handler")
+  (return-type "none")
+  (parameters
+    '("GladeXMLCustomWidgetHandler" "handler")
+    '("gpointer" "user_data")
+  )
+)
+
+(define-function bindtextdomain
+  (c-name "glade_bindtextdomain")
+  (caller-owns-return #t)
+  (return-type "char*")
+  (parameters
+    '("const-char*" "domainname")
+    '("const-char*" "dirname" (default "NULL") (null-ok))
+  )
+)
+
+(define-function textdomain
+  (c-name "glade_textdomain")
+  (caller-owns-return #t)
+  (return-type "char*")
+  (parameters
+    '("const-char*" "domainname")
+  )
+)
+
+(define-function set_custom_widget_callbacks
+  (c-name "glade_set_custom_widget_callbacks")
+  (return-type "none")
+)
+
+(define-function gtk_page_setup_unix_dialog_get_type
+  (c-name "gtk_page_setup_unix_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_printer_get_type
+  (c-name "gtk_printer_get_type")
+  (return-type "GType")
+)
+
+(define-function enumerate_printers
+  (c-name "gtk_enumerate_printers")
+  (return-type "none")
+  (parameters
+    '("GtkPrinterFunc" "func")
+    '("gpointer" "data")
+    '("GDestroyNotify" "destroy")
+    '("gboolean" "wait")
+  )
+)
+
+(define-function gtk_print_job_get_type
+  (c-name "gtk_print_job_get_type")
+  (return-type "GType")
+)
+
+(define-function print_capabilities_get_type
+  (c-name "gtk_print_capabilities_get_type")
+  (return-type "GType")
+)
+
+(define-function gtk_print_unix_dialog_get_type
+  (c-name "gtk_print_unix_dialog_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_color_get_type
+  (c-name "pango_color_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_attr_type_register
+  (c-name "pango_attr_type_register")
+  (return-type "PangoAttrType")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function pango_attr_list_get_type
+  (c-name "pango_attr_list_get_type")
+  (return-type "GType")
+)
+
+(define-function parse_markup
+  (c-name "pango_parse_markup")
+  (return-type "gboolean")
+  (parameters
+    '("const-char*" "markup_text")
+    '("int" "length")
+    '("gunichar" "accel_marker")
+    '("PangoAttrList**" "attr_list")
+    '("char**" "text")
+    '("gunichar*" "accel_char")
+    '("GError**" "error")
+  )
+)
+
+(define-function break
+  (c-name "pango_break")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "length")
+    '("PangoAnalysis*" "analysis")
+    '("PangoLogAttr*" "attrs")
+  )
+)
+
+(define-function find_paragraph_boundary
+  (c-name "pango_find_paragraph_boundary")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "length")
+    '("gint*" "paragraph_delimiter_index")
+    '("gint*" "next_paragraph_start")
+  )
+)
+
+(define-function get_log_attrs
+  (c-name "pango_get_log_attrs")
+  (return-type "none")
+  (parameters
+    '("const-char*" "text")
+    '("int" "length")
+    '("int" "level")
+    '("PangoLanguage*" "language")
+    '("PangoLogAttr*" "log_attrs")
+  )
+)
+
+(define-function default_break
+  (c-name "pango_default_break")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("int" "length")
+    '("PangoAnalysis*" "analysis")
+    '("PangoLogAttr*" "attrs")
+    '("int" "attrs_len")
+  )
+)
+
+(define-function context_get_type
+  (c-name "pango_context_get_type")
+  (return-type "GType")
+)
+
+(define-function itemize
+  (c-name "pango_itemize")
+  (return-type "GList*")
+  (parameters
+    '("PangoContext*" "context")
+    '("const-char*" "text")
+    '("int" "start_index")
+    '("int" "length")
+    '("PangoAttrList*" "attrs")
+    '("PangoAttrIterator*" "cached_iter" (default "NULL") (null-ok))
+  )
+)
+
+(define-function itemize_with_base_dir
+  (c-name "pango_itemize_with_base_dir")
+  (return-type "GList*")
+  (parameters
+    '("PangoContext*" "context")
+    '("PangoDirection" "base_dir")
+    '("const-char*" "text")
+    '("int" "start_index")
+    '("int" "length")
+    '("PangoAttrList*" "attrs")
+    '("PangoAttrIterator*" "cached_iter")
+  )
+)
+
+(define-function attr_type_get_type
+  (c-name "pango_attr_type_get_type")
+  (return-type "GType")
+)
+
+(define-function underline_get_type
+  (c-name "pango_underline_get_type")
+  (return-type "GType")
+)
+
+(define-function coverage_level_get_type
+  (c-name "pango_coverage_level_get_type")
+  (return-type "GType")
+)
+
+(define-function style_get_type
+  (c-name "pango_style_get_type")
+  (return-type "GType")
+)
+
+(define-function variant_get_type
+  (c-name "pango_variant_get_type")
+  (return-type "GType")
+)
+
+(define-function weight_get_type
+  (c-name "pango_weight_get_type")
+  (return-type "GType")
+)
+
+(define-function stretch_get_type
+  (c-name "pango_stretch_get_type")
+  (return-type "GType")
+)
+
+(define-function font_mask_get_type
+  (c-name "pango_font_mask_get_type")
+  (return-type "GType")
+)
+
+(define-function alignment_get_type
+  (c-name "pango_alignment_get_type")
+  (return-type "GType")
+)
+
+(define-function wrap_mode_get_type
+  (c-name "pango_wrap_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function ellipsize_mode_get_type
+  (c-name "pango_ellipsize_mode_get_type")
+  (return-type "GType")
+)
+
+(define-function render_part_get_type
+  (c-name "pango_render_part_get_type")
+  (return-type "GType")
+)
+
+(define-function script_get_type
+  (c-name "pango_script_get_type")
+  (return-type "GType")
+)
+
+(define-function tab_align_get_type
+  (c-name "pango_tab_align_get_type")
+  (return-type "GType")
+)
+
+(define-function direction_get_type
+  (c-name "pango_direction_get_type")
+  (return-type "GType")
+)
+
+(define-function font_description_get_type
+  (c-name "pango_font_description_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_font_descriptions_free
+  (c-name "pango_font_descriptions_free")
+  (return-type "none")
+  (parameters
+    '("PangoFontDescription**" "descs")
+    '("int" "n_descs")
+  )
+)
+
+(define-function pango_font_metrics_get_type
+  (c-name "pango_font_metrics_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_font_family_get_type
+  (c-name "pango_font_family_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_font_face_get_type
+  (c-name "pango_font_face_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_font_get_type
+  (c-name "pango_font_get_type")
+  (return-type "GType")
+)
+
+(define-function font_map_get_type
+  (c-name "pango_font_map_get_type")
+  (return-type "GType")
+)
+
+(define-function fontset_get_type
+  (c-name "pango_fontset_get_type")
+  (return-type "GType")
+)
+
+(define-function fontset_simple_get_type
+  (c-name "pango_fontset_simple_get_type")
+  (return-type "GType")
+)
+
+(define-function gravity_to_rotation
+  (c-name "pango_gravity_to_rotation")
+  (return-type "double")
+  (parameters
+    '("PangoGravity" "gravity")
+  )
+)
+
+(define-function gravity_get_for_matrix
+  (c-name "pango_gravity_get_for_matrix")
+  (return-type "PangoGravity")
+  (parameters
+    '("const-PangoMatrix*" "matrix")
+  )
+)
+
+(define-function gravity_get_for_script
+  (c-name "pango_gravity_get_for_script")
+  (return-type "PangoGravity")
+  (parameters
+    '("PangoScript" "script")
+    '("PangoGravity" "base_gravity")
+    '("PangoGravityHint" "hint")
+  )
+)
+
+(define-function pango_glyph_string_get_type
+  (c-name "pango_glyph_string_get_type")
+  (return-type "GType")
+)
+
+(define-function shape
+  (c-name "pango_shape")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "length")
+    '("PangoAnalysis*" "analysis")
+    '("PangoGlyphString*" "glyphs")
+  )
+)
+
+(define-function reorder_items
+  (c-name "pango_reorder_items")
+  (return-type "GList*")
+  (parameters
+    '("GList*" "logical_items")
+  )
+)
+
+(define-function item_get_type
+  (c-name "pango_item_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_layout_get_type
+  (c-name "pango_layout_get_type")
+  (return-type "GType")
+)
+
+(define-function layout_line_get_type
+  (c-name "pango_layout_line_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_layout_iter_get_type
+  (c-name "pango_layout_iter_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_renderer_get_type
+  (c-name "pango_renderer_get_type")
+  (return-type "GType")
+)
+
+(define-function script_for_unichar
+  (c-name "pango_script_for_unichar")
+  (return-type "PangoScript")
+  (parameters
+    '("gunichar" "ch")
+  )
+)
+
+(define-function get_sample_language
+  (c-name "pango_script_get_sample_language")
+  (return-type "PangoLanguage*")
+  (parameters
+    '("PangoScript" "script")
+  )
+)
+
+(define-function pango_tab_array_get_type
+  (c-name "pango_tab_array_get_type")
+  (return-type "GType")
+)
+
+(define-function matrix_get_type
+  (c-name "pango_matrix_get_type")
+  (return-type "GType")
+)
+
+(define-function language_get_type
+  (c-name "pango_language_get_type")
+  (return-type "GType")
+)
+
+(define-function pango_language_from_string
+  (c-name "pango_language_from_string1")
+  (return-type "PangoLanguage*")
+  (deprecated "use pango.Language instead")
+  (parameters
+    '("const-char*" "language")
+  )
+)
+
+(define-function pango_language_matches
+  (c-name "pango_language_matches1")
+  (return-type "gboolean")
+  (deprecated "use pango.Language.matches instead")
+  (parameters
+    '("PangoLanguage*" "language" (null-ok))
+    '("const-char*" "range_list")
+  )
+)
+
+(define-function get_mirror_char
+  (c-name "pango_get_mirror_char")
+  (return-type "gboolean")
+  (deprecated "deprecated")
+  (parameters
+    '("gunichar" "ch")
+    '("gunichar*" "mirrored_ch")
+  )
+)
+
+(define-function unichar_direction
+  (c-name "pango_unichar_direction")
+  (return-type "PangoDirection")
+  (parameters
+    '("gunichar" "ch")
+  )
+)
+
+(define-function find_base_dir
+  (c-name "pango_find_base_dir")
+  (return-type "PangoDirection")
+  (parameters
+    '("const-gchar*" "text")
+    '("gint" "length")
+  )
+)
+
+(define-function extents_to_pixels
+  (c-name "pango_extents_to_pixels")
+  (return-type "none")
+  (parameters
+    '("PangoRectangle*" "ink_rect")
+    '("PangoRectangle*" "logical_rect")
+  )
+)
+
+(define-function units_from_double
+  (c-name "pango_units_from_double")
+  (return-type "int")
+  (parameters
+    '("double" "d")
+  )
+)
+
+(define-function units_to_double
+  (c-name "pango_units_to_double")
+  (return-type "double")
+  (parameters
+    '("int" "i")
+  )
+)
+
+(define-function PIXELS
+  (c-name "PANGO_PIXELS")
+  (return-type "gint")
+  (parameters
+    '("gint" "size")
+  )
+)
+
+(define-function ASCENT
+  (c-name "PANGO_ASCENT")
+  (return-type "gint")
+  (parameters
+    '("PangoRectangle" "rect")
+  )
+)
+
+(define-function DESCENT
+  (c-name "PANGO_DESCENT")
+  (return-type "gint")
+  (parameters
+    '("PangoRectangle" "rect")
+  )
+)
+
+(define-function LBEARING
+  (c-name "PANGO_LBEARING")
+  (return-type "gint")
+  (parameters
+    '("PangoRectangle" "rect")
+  )
+)
+
+(define-function RBEARING
+  (c-name "PANGO_RBEARING")
+  (return-type "gint")
+  (parameters
+    '("PangoRectangle" "rect")
+  )
+)
+
+(define-function version
+  (c-name "pango_version")
+  (return-type "int")
+)
+
+(define-function version_string
+  (c-name "pango_version_string")
+  (return-type "const-char*")
+)
+
+(define-function version_check
+  (c-name "pango_version_check")
+  (return-type "const-char*")
+  (parameters
+    '("int" "required_major")
+    '("int" "required_minor")
+    '("int" "required_micro")
+  )
+)
+
+(define-function hyperlink_state_flags_get_type
+  (c-name "atk_hyperlink_state_flags_get_type")
+  (return-type "GType")
+)
+
+(define-function role_get_type
+  (c-name "atk_role_get_type")
+  (return-type "GType")
+)
+
+(define-function layer_get_type
+  (c-name "atk_layer_get_type")
+  (return-type "GType")
+)
+
+(define-function relation_type_get_type
+  (c-name "atk_relation_type_get_type")
+  (return-type "GType")
+)
+
+(define-function state_type_get_type
+  (c-name "atk_state_type_get_type")
+  (return-type "GType")
+)
+
+(define-function text_attribute_get_type
+  (c-name "atk_text_attribute_get_type")
+  (return-type "GType")
+)
+
+(define-function text_boundary_get_type
+  (c-name "atk_text_boundary_get_type")
+  (return-type "GType")
+)
+
+(define-function text_clip_type_get_type
+  (c-name "atk_text_clip_type_get_type")
+  (return-type "GType")
+)
+
+(define-function key_event_type_get_type
+  (c-name "atk_key_event_type_get_type")
+  (return-type "GType")
+)
+
+(define-function coord_type_get_type
+  (c-name "atk_coord_type_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_action_get_type
+  (c-name "atk_action_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_component_get_type
+  (c-name "atk_component_get_type")
+  (return-type "GType")
+)
+
+(define-function rectangle_get_type
+  (c-name "atk_rectangle_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_document_get_type
+  (c-name "atk_document_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_editable_text_get_type
+  (c-name "atk_editable_text_get_type")
+  (return-type "GType")
+)
+
+(define-function gobject_accessible_get_type
+  (c-name "atk_gobject_accessible_get_type")
+  (return-type "GType")
+)
+
+(define-function gobject_accessible_for_object
+  (c-name "atk_gobject_accessible_for_object")
+  (return-type "AtkObject*")
+  (parameters
+    '("GObject*" "obj")
+  )
+)
+
+(define-function atk_hyperlink_get_type
+  (c-name "atk_hyperlink_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_hyperlink_impl_get_type
+  (c-name "atk_hyperlink_impl_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_hypertext_get_type
+  (c-name "atk_hypertext_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_image_get_type
+  (c-name "atk_image_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_no_op_object_factory_get_type
+  (c-name "atk_no_op_object_factory_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_no_op_object_get_type
+  (c-name "atk_no_op_object_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_object_factory_get_type
+  (c-name "atk_object_factory_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_object_get_type
+  (c-name "atk_object_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_implementor_get_type
+  (c-name "atk_implementor_get_type")
+  (return-type "GType")
+)
+
+(define-function role_register
+  (c-name "atk_role_register")
+  (return-type "AtkRole")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function role_get_localized_name
+  (c-name "atk_role_get_localized_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("AtkRole" "role")
+  )
+)
+
+(define-function atk_registry_get_type
+  (c-name "atk_registry_get_type")
+  (return-type "GType")
+)
+
+(define-function get_default_registry
+  (c-name "atk_get_default_registry")
+  (return-type "AtkRegistry*")
+)
+
+(define-function atk_relation_get_type
+  (c-name "atk_relation_get_type")
+  (return-type "GType")
+)
+
+(define-function relation_type_register
+  (c-name "atk_relation_type_register")
+  (return-type "AtkRelationType")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function relation_type_get_name
+  (c-name "atk_relation_type_get_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("AtkRelationType" "relationship")
+  )
+)
+
+(define-function relation_type_for_name
+  (c-name "atk_relation_type_for_name")
+  (return-type "AtkRelationType")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function atk_relation_set_get_type
+  (c-name "atk_relation_set_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_selection_get_type
+  (c-name "atk_selection_get_type")
+  (return-type "GType")
+)
+
+(define-function state_type_register
+  (c-name "atk_state_type_register")
+  (return-type "AtkStateType")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function state_type_get_name
+  (c-name "atk_state_type_get_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("AtkStateType" "type")
+  )
+)
+
+(define-function state_type_for_name
+  (c-name "atk_state_type_for_name")
+  (return-type "AtkStateType")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function atk_state_set_get_type
+  (c-name "atk_state_set_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_streamable_content_get_type
+  (c-name "atk_streamable_content_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_table_get_type
+  (c-name "atk_table_get_type")
+  (return-type "GType")
+)
+
+(define-function atk_text_get_type
+  (c-name "atk_text_get_type")
+  (return-type "GType")
+)
+
+(define-function text_free_ranges
+  (c-name "atk_text_free_ranges")
+  (return-type "none")
+  (parameters
+    '("AtkTextRange**" "ranges")
+  )
+)
+
+(define-function text_attribute_get_name
+  (c-name "atk_text_attribute_get_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("AtkTextAttribute" "attr")
+  )
+)
+
+(define-function text_attribute_get_value
+  (c-name "atk_text_attribute_get_value")
+  (return-type "const-gchar*")
+  (parameters
+    '("AtkTextAttribute" "attr")
+    '("gint" "index")
+  )
+)
+
+(define-function text_attribute_register
+  (c-name "atk_text_attribute_register")
+  (return-type "AtkTextAttribute")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function text_attribute_for_name
+  (c-name "atk_text_attribute_for_name")
+  (return-type "AtkTextAttribute")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function atk_util_get_type
+  (c-name "atk_util_get_type")
+  (return-type "GType")
+)
+
+(define-function add_focus_tracker
+  (c-name "atk_add_focus_tracker")
+  (return-type "guint")
+  (parameters
+    '("AtkEventListener" "focus_tracker")
+  )
+)
+
+(define-function remove_focus_tracker
+  (c-name "atk_remove_focus_tracker")
+  (return-type "none")
+  (parameters
+    '("guint" "tracker_id")
+  )
+)
+
+(define-function focus_tracker_init
+  (c-name "atk_focus_tracker_init")
+  (return-type "none")
+  (parameters
+    '("AtkEventListenerInit" "add_function")
+  )
+)
+
+(define-function focus_tracker_notify
+  (c-name "atk_focus_tracker_notify")
+  (return-type "none")
+  (parameters
+    '("AtkObject*" "object")
+  )
+)
+
+(define-function add_global_event_listener
+  (c-name "atk_add_global_event_listener")
+  (return-type "guint")
+  (parameters
+    '("GSignalEmissionHook" "listener")
+    '("const-gchar*" "event_type")
+  )
+)
+
+(define-function remove_global_event_listener
+  (c-name "atk_remove_global_event_listener")
+  (return-type "none")
+  (parameters
+    '("guint" "listener_id")
+  )
+)
+
+(define-function add_key_event_listener
+  (c-name "atk_add_key_event_listener")
+  (return-type "guint")
+  (parameters
+    '("AtkKeySnoopFunc" "listener")
+    '("gpointer" "data")
+  )
+)
+
+(define-function remove_key_event_listener
+  (c-name "atk_remove_key_event_listener")
+  (return-type "none")
+  (parameters
+    '("guint" "listener_id")
+  )
+)
+
+(define-function get_root
+  (c-name "atk_get_root")
+  (return-type "AtkObject*")
+)
+
+(define-function get_toolkit_name
+  (c-name "atk_get_toolkit_name")
+  (return-type "const-gchar*")
+)
+
+(define-function get_toolkit_version
+  (c-name "atk_get_toolkit_version")
+  (return-type "const-gchar*")
+)
+
+(define-function get_focus_object
+  (c-name "atk_get_focus_object")
+  (return-type "AtkObject*")
+)
+
+(define-function atk_value_get_type
+  (c-name "atk_value_get_type")
+  (return-type "GType")
+)
+
+(define-function role_get_name
+  (c-name "atk_role_get_name")
+  (return-type "const-gchar*")
+  (parameters
+    '("AtkRole" "role")
+  )
+)
+
+(define-function role_for_name
+  (c-name "atk_role_for_name")
+  (return-type "AtkRole")
+  (parameters
+    '("const-gchar*" "name")
+  )
+)
+
+(define-function iter_forward_search
+  (c-name "gtk_source_iter_forward_search")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTextIter*" "iter")
+    '("const-gchar*" "str")
+    '("GtkSourceSearchFlags" "flags")
+    '("GtkTextIter*" "match_start")
+    '("GtkTextIter*" "match_end")
+    '("const-GtkTextIter*" "limit")
+  )
+)
+
+(define-function iter_backward_search
+  (c-name "gtk_source_iter_backward_search")
+  (return-type "gboolean")
+  (parameters
+    '("const-GtkTextIter*" "iter")
+    '("const-gchar*" "str")
+    '("GtkSourceSearchFlags" "flags")
+    '("GtkTextIter*" "match_start")
+    '("GtkTextIter*" "match_end")
+    '("const-GtkTextIter*" "limit")
+  )
+)
+
+(define-function language_manager_get_default
+  (c-name "gtk_source_language_manager_get_default")
+  (return-type "GtkSourceLanguageManager*")
+)
+
+(define-function style_scheme_manager_get_default
+  (c-name "gtk_source_style_scheme_manager_get_default")
+  (return-type "GtkSourceStyleSchemeManager*")
+)
+
+(define-function gtk_source_print_compositor_get_type
+  (c-name "gtk_source_print_compositor_get_type")
+  (return-type "GType")
+)
+
+(define-function print_compositor_new_from_view
+  (c-name "gtk_source_print_compositor_new_from_view")
+  (return-type "GtkSourcePrintCompositor*")
+  (parameters
+    '("GtkSourceView*" "view")
+  )
+)
+
diff --git a/tests/bindings/UnitTests.java b/tests/bindings/UnitTests.java
new file mode 100644
index 0000000..a9815c7
--- /dev/null
+++ b/tests/bindings/UnitTests.java
@@ -0,0 +1,203 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.freedesktop.bindings.Debug;
+import org.freedesktop.bindings.ValidateEnvironment;
+import org.freedesktop.bindings.ValidateInternationalization;
+import org.freedesktop.bindings.Version;
+import org.freedesktop.cairo.ValidateCairoContext;
+import org.freedesktop.cairo.ValidateCairoInternals;
+import org.freedesktop.cairo.ValidateDrawingToFile;
+import org.freedesktop.enchant.ValidateEnchantInternals;
+import org.freedesktop.icons.ValidateIconItems;
+import org.gnome.gdk.ValidateImageHandling;
+import org.gnome.gdk.ValidateKeyboardHandling;
+import org.gnome.gdk.ValidateScreensAndDisplays;
+import org.gnome.glib.ValidateConstants;
+import org.gnome.glib.ValidateGFileMethods;
+import org.gnome.glib.ValidateGListMethods;
+import org.gnome.glib.ValidateMemoryManagement;
+import org.gnome.glib.ValidateReferenceCounting;
+import org.gnome.glib.ValidateUtilityFunctions;
+import org.gnome.gtk.ValidateArrow;
+import org.gnome.gtk.ValidateAssistant;
+import org.gnome.gtk.ValidateComboBox;
+import org.gnome.gtk.ValidateEntry;
+import org.gnome.gtk.ValidateEntryCompletion;
+import org.gnome.gtk.ValidateFileChoosing;
+import org.gnome.gtk.ValidateGlobalSettings;
+import org.gnome.gtk.ValidateIconView;
+import org.gnome.gtk.ValidateInputMethods;
+import org.gnome.gtk.ValidateLinkBehaviour;
+import org.gnome.gtk.ValidateNotebookBehaviour;
+import org.gnome.gtk.ValidateOutParameters;
+import org.gnome.gtk.ValidatePacking;
+import org.gnome.gtk.ValidatePrinting;
+import org.gnome.gtk.ValidateProperties;
+import org.gnome.gtk.ValidateRadioThing;
+import org.gnome.gtk.ValidateResponseType;
+import org.gnome.gtk.ValidateScrolling;
+import org.gnome.gtk.ValidateSignalEmission;
+import org.gnome.gtk.ValidateSnapshotUtilities;
+import org.gnome.gtk.ValidateStockItems;
+import org.gnome.gtk.ValidateStyleContext;
+import org.gnome.gtk.ValidateSwitch;
+import org.gnome.gtk.ValidateTextBuffer;
+import org.gnome.gtk.ValidateTextViewBorderWindows;
+import org.gnome.gtk.ValidateTextViewProperties;
+import org.gnome.gtk.ValidateTreeModel;
+import org.gnome.gtk.ValidateTreeModelFilter;
+import org.gnome.gtk.ValidateTreeStore;
+import org.gnome.gtk.ValidateTreeView;
+import org.gnome.gtk.ValidateUnicode;
+import org.gnome.gtk.ValidateUniqueApplications;
+import org.gnome.pango.ValidatePangoAttributeUsage;
+import org.gnome.pango.ValidatePangoTextRendering;
+import org.gnome.pango.ValidatePangoWrapBehaviour;
+import org.gnome.rsvg.ValidateVectorIllustrations;
+import org.gnome.sourceview.ValidateSourceView;
+
+import com.operationaldynamics.codegen.ValidateThingUsage;
+import com.operationaldynamics.codegen.ValidateUtilityMethods;
+import com.operationaldynamics.defsparser.ValidateBlockUsage;
+import com.operationaldynamics.defsparser.ValidateDefsParsing;
+import com.operationaldynamics.junit.VerboseTestRunner;
+
+/**
+ * Top level test harness to run all JUnit unit test cases that ship with
+ * java-gnome. FUTURE: How will this extend when functional tests arrive on
+ * the scene?
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.2
+ */
+public class UnitTests
+{
+    /**
+     * Entry point from the command line, of course. Uses VerboseTestRunner to
+     * do a more pretty printing of the test output.
+     */
+    public static void main(String[] args) {
+        VerboseTestRunner.run(suite(args));
+
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.out.println("Done!");
+            System.out.flush();
+        }
+
+        try {
+            Thread.sleep(100);
+        } catch (InterruptedException e) {
+            // ignore
+        }
+        System.gc();
+        try {
+            Thread.sleep(100);
+        } catch (InterruptedException e) {
+            // ignore
+        }
+
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.out.println("Exiting.");
+        }
+    }
+
+    /**
+     * Entry point used by Eclipse's built in JUnit TestRunner
+     */
+    public static Test suite() {
+        return suite(null);
+    }
+
+    /*
+     * It is necessary to initialize GTK (and load the native library while
+     * we're at it) regardless of whether we're called via main() or via
+     * Eclipse's TestRunner. Note that all our TestCases actually extend
+     * TestCaseGtk which allows them to be used standalone and still have Gtk
+     * available.
+     */
+    private static Test suite(String[] args) {
+        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
+
+        TestSuite suite = new TestSuite("All Unit Tests for java-gnome " + Version.getAPI());
+
+        suite.addTestSuite(ValidateUtilityMethods.class);
+        suite.addTestSuite(ValidateBlockUsage.class);
+        suite.addTestSuite(ValidateDefsParsing.class);
+        suite.addTestSuite(ValidateThingUsage.class);
+        suite.addTestSuite(ValidateEnvironment.class);
+        suite.addTestSuite(ValidateInternationalization.class);
+        suite.addTestSuite(ValidateReferenceCounting.class);
+        suite.addTestSuite(ValidateMemoryManagement.class);
+        suite.addTestSuite(ValidateGFileMethods.class);
+        suite.addTestSuite(ValidateGListMethods.class);
+        suite.addTestSuite(ValidateConstants.class);
+        suite.addTestSuite(ValidateProperties.class);
+        suite.addTestSuite(ValidateUtilityFunctions.class);
+        suite.addTestSuite(ValidateSignalEmission.class);
+        suite.addTestSuite(ValidateScreensAndDisplays.class);
+        suite.addTestSuite(ValidateKeyboardHandling.class);
+        suite.addTestSuite(ValidateImageHandling.class);
+        suite.addTestSuite(ValidateGlobalSettings.class);
+        suite.addTestSuite(ValidateCairoInternals.class);
+        suite.addTestSuite(ValidateCairoContext.class);
+        suite.addTestSuite(ValidateDrawingToFile.class);
+        suite.addTestSuite(ValidateOutParameters.class);
+        suite.addTestSuite(ValidatePacking.class);
+        suite.addTestSuite(ValidateNotebookBehaviour.class);
+        suite.addTestSuite(ValidateFileChoosing.class);
+        suite.addTestSuite(ValidateStockItems.class);
+        suite.addTestSuite(ValidateIconItems.class);
+        suite.addTestSuite(ValidateResponseType.class);
+        suite.addTestSuite(ValidateTreeModel.class);
+        suite.addTestSuite(ValidateTreeStore.class);
+        suite.addTestSuite(ValidateTreeModelFilter.class);
+        suite.addTestSuite(ValidateTreeView.class);
+        suite.addTestSuite(ValidateIconView.class);
+        suite.addTestSuite(ValidateScrolling.class);
+        suite.addTestSuite(ValidateComboBox.class);
+        suite.addTestSuite(ValidateLinkBehaviour.class);
+        suite.addTestSuite(ValidateEntry.class);
+        suite.addTestSuite(ValidateEntryCompletion.class);
+        suite.addTestSuite(ValidateSnapshotUtilities.class);
+        suite.addTestSuite(ValidateAssistant.class);
+        suite.addTestSuite(ValidateTextBuffer.class);
+        suite.addTestSuite(ValidateUnicode.class);
+        suite.addTestSuite(ValidateInputMethods.class);
+        suite.addTestSuite(ValidateTextViewProperties.class);
+        suite.addTestSuite(ValidateTextViewBorderWindows.class);
+        suite.addTestSuite(ValidateArrow.class);
+        suite.addTestSuite(ValidateRadioThing.class);
+        suite.addTestSuite(ValidateSwitch.class);
+        suite.addTestSuite(ValidateStyleContext.class);
+        suite.addTestSuite(ValidatePangoTextRendering.class);
+        suite.addTestSuite(ValidatePangoAttributeUsage.class);
+        suite.addTestSuite(ValidatePangoWrapBehaviour.class);
+        suite.addTestSuite(ValidateEnchantInternals.class);
+        suite.addTestSuite(ValidatePrinting.class);
+        suite.addTestSuite(ValidateSourceView.class);
+        suite.addTestSuite(ValidateUniqueApplications.class);
+        suite.addTestSuite(ValidateVectorIllustrations.class);
+
+        return suite;
+    }
+}
diff --git a/tests/bindings/com/operationaldynamics/junit/VerboseResultPrinter.java b/tests/bindings/com/operationaldynamics/junit/VerboseResultPrinter.java
new file mode 100644
index 0000000..82af9de
--- /dev/null
+++ b/tests/bindings/com/operationaldynamics/junit/VerboseResultPrinter.java
@@ -0,0 +1,184 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.junit;
+
+/*
+ * This class imported from ObjectiveAccounts accounting package where it was
+ * originally deployed as GPL code in generic.ui.VerboseResultPrinter
+ */
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freedesktop.bindings.Debug;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+
+import com.operationaldynamics.ui.TextOutput;
+
+/**
+ * Output the test by test results of running a Test, printing the name of
+ * each test along the way. This replaces the default notion of
+ * junit.textui.ResultPrinter with an equivalent implementation of
+ * TestListener. The various callbacks here get called as test cases get
+ * started and then succeed, fail, or error. We use our
+ * {@link generic.ui.TextOutput} as a superclass to get the various useful
+ * output routines there. Instantiated by our
+ * {@link generic.junit.VerboseTestRunner}.
+ * 
+ * @author Andrew Cowie
+ */
+public class VerboseResultPrinter extends TextOutput implements TestListener
+{
+    private PrintWriter out = null;
+
+    private String currentClass = null;
+
+    private boolean failed;
+
+    private boolean haltOnBug;
+
+    /**
+     * @param haltOnBug
+     *            if the program should stop if a failure or error is
+     *            encountered
+     */
+    public VerboseResultPrinter(boolean haltOnBug) {
+        /*
+         * Calling super.toOutput(PrintStream) will wrap the PrintStream with
+         * a PrintWriter and then in turn call this.toOutput(PrintWriter).
+         * Convoluted perhaps, but might as well as it uses the abstract
+         * method we have to implement anyway.
+         */
+        super.toOutput(System.out);
+        this.haltOnBug = haltOnBug;
+    }
+
+    /**
+     * Implements abstract toOutput() from TextOutput. We don't use this as
+     * the entry point in the way that the real TextOutput subclasses do; this
+     * just sets stdout to the output stream.
+     */
+    public void toOutput(PrintWriter out) {
+        this.out = out;
+    }
+
+    public String filterTrace(Throwable t) {
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter writer = new PrintWriter(stringWriter);
+        t.printStackTrace(writer);
+
+        String trace = stringWriter.toString();
+
+        Pattern lineNumber = Pattern.compile(currentClass + ".*\\((\\w+\\.java:\\d+)\\)");
+        Matcher m = lineNumber.matcher(trace);
+        if (m.find()) {
+            // group 0 is the entire match aka group()
+            return m.group(1);
+        } else {
+            return "(No line number available)";
+        }
+
+    }
+
+    public void addError(Test test, Throwable t) {
+        if (!Debug.MEMORY_MANAGEMENT) {
+            out.println(pad("error", 10, LEFT));
+        }
+        out.println();
+        out.println("Encoutered an error at " + filterTrace(t));
+        out.println("The following exception was thrown:\n");
+        out.println("   " + t.toString());
+        out.println("\nNormally exceptions in unit tests are trapped and reported as failures;\n"
+                + "this was unexpected. It could be a bug or something deeper with your\n"
+                + "environment or setup.");
+        out.println();
+        if (haltOnBug) {
+            System.exit(VerboseTestRunner.EXCEPTION_EXIT);
+        }
+        failed = true;
+    }
+
+    public void addFailure(Test test, AssertionFailedError t) {
+        if (!Debug.MEMORY_MANAGEMENT) {
+            out.println(pad("failed", 10, LEFT));
+        }
+        out.println();
+        out.println("Unit test failed at " + filterTrace(t) + ",");
+        String msg = t.getMessage();
+        if (msg == null) {
+            out.print("[no reason given by test case]");
+        } else {
+            out.print("\"" + msg + "\"");
+        }
+        out.println("\n");
+        if (haltOnBug) {
+            System.exit(VerboseTestRunner.FAILURE_EXIT);
+        }
+        failed = true;
+    }
+
+    public void endTest(Test test) {
+        if (failed) {
+            return;
+
+        }
+        if (Debug.MEMORY_MANAGEMENT) {
+            return;
+        }
+        out.println(pad("ok", 10, LEFT));
+    }
+
+    private static Pattern regex = Pattern.compile("\\(.*\\)");
+
+    public void startTest(Test test) {
+        failed = false;
+        String testClassName = test.getClass().getName();
+
+        /*
+         * If we're in a new class, then switch our reference and print the
+         * new name.
+         */
+        if ((currentClass == null) || (!(currentClass.equals(testClassName)))) {
+            currentClass = testClassName;
+            out.println(currentClass);
+        }
+
+        /*
+         * Test.toString returns a String of the form
+         * "testCaseName(java.package.Class)". So we use a regular expression
+         * to nuke out the characters between the brackers. We then use
+         * TextOutput's static routines to trim the output to terminal width
+         * less 10 but pad it out to that width. We then let the other
+         * callbacks finish the line.
+         */
+        Matcher m = regex.matcher(test.toString());
+        String testCaseName = chomp(" - " + m.replaceFirst("()"), COLUMNS - 10);
+        if (Debug.MEMORY_MANAGEMENT) {
+            out.println(testCaseName);
+        } else {
+            out.print(pad(testCaseName, COLUMNS - 10, LEFT));
+            out.flush();
+        }
+    }
+}
diff --git a/tests/bindings/com/operationaldynamics/junit/VerboseTestRunner.java b/tests/bindings/com/operationaldynamics/junit/VerboseTestRunner.java
new file mode 100644
index 0000000..acbcd28
--- /dev/null
+++ b/tests/bindings/com/operationaldynamics/junit/VerboseTestRunner.java
@@ -0,0 +1,146 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.junit;
+
+/*
+ * This class imported from ObjectiveAccounts accounting package where it was
+ * originally deployed as GPL code in generic.ui.VerboseTestRunner
+ */
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.textui.TestRunner;
+
+/**
+ * An extension of the standard JUnit textui TestRunner which displays the
+ * name of the test being run. This class overrides the more obnoxious output
+ * methods in TestRunner, and uses our VerboseResultPrinter to output the name
+ * of the test being run instead of {.,F,E}
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * We actually ignore most of TestRunner - we just use its suite extraction
+ * method and its return constants.
+ */
+public class VerboseTestRunner extends TestRunner
+{
+    /**
+     * Create an instance of our VerboseTestRunner wrapper. It uses the
+     * default output stream (ie, System.out) but overrides JUnit's
+     * ResultPrinter with our customized VerboseResultPrinter.
+     */
+    public VerboseTestRunner() {
+        super();
+    }
+
+    /**
+     * Execute the test suite, specifiying our VerboseResultPrinter wrapper
+     * instead of TestRunner's use of the ordinary ResultPrinter.
+     */
+    /*
+     * super.doRun() blabs out output about how long execution takes, which we
+     * don't particularly care about, and we need to override the TestListener
+     * (ie, ResultPrinter) used to output results - the whole point of the
+     * exercise.
+     */
+    public TestResult doRun(Test suite) {
+        TestResult result = new TestResult();
+        result.addListener(new VerboseResultPrinter(true));
+
+        suite.run(result);
+
+        return result;
+    }
+
+    /**
+     * VerboseTestRunner's main entry point. This call's TestRunner's
+     * getTest() method to parse the command line argument to find a
+     * Test{,Suite}, and then calls our doRun() to get a TestResult from
+     * executing that Suite.
+     * 
+     * @param args
+     *            VerboseTestRunner takes one (and only one) argument, the
+     *            name of the Test{,Suite} to run. From {@link TestRunner}:
+     *            expects the name of a TestCase class as argument. If this
+     *            class defines a static <code>suite</code> method it will be
+     *            invoked and the returned test is run. Otherwise all the
+     *            methods starting with "test" having no arguments are run.
+     */
+    /*
+     * This code adapted from JUnit's TestRunner.main(), trimming it to only
+     * deal with a single argument, and folding in the code from
+     * TestRunner.start()
+     */
+    public static void main(String args[]) {
+        if (((args[0] == null) || (args[0].equals("")) || (args.length != 1))) {
+            System.err.println("You need to specicy one argument: the name of the Test{,Suite} to run.");
+            System.exit(EXCEPTION_EXIT);
+        }
+
+        VerboseTestRunner runner = new VerboseTestRunner();
+        Test suite = null;
+
+        try {
+            try {
+                suite = runner.getTest(args[0]);
+            } catch (Exception e) {
+                throw new Exception("Could not create test suite: " + e);
+            }
+
+            TestResult r = runner.doRun(suite);
+
+            int pass = r.runCount() - r.errorCount() - r.failureCount();
+            System.out.print(pass + " of " + r.runCount() + " passed");
+
+            if (r.wasSuccessful()) {
+                System.out.println();
+                System.exit(SUCCESS_EXIT);
+            } else {
+                System.out.println("; " + r.failureCount() + " tests failed, " + r.errorCount()
+                        + " unexpected errors.");
+                System.exit(FAILURE_EXIT);
+            }
+        } catch (Exception e) {
+            System.err.println(e.getMessage());
+            System.exit(EXCEPTION_EXIT);
+        }
+    }
+
+    /**
+     * Runs a single Test{,Suite} and collects its results. If you have a
+     * static Test suite() this method can be used to run it directly. For
+     * example, from a main() specific to a given class [hierarchy] you can
+     * do:
+     * 
+     * <pre>
+     * public static void main(String[] args) {
+     *     VerboseTestRunner.run(suite());
+     * }
+     * </pre>
+     * 
+     * @return a TestResult indicating the outcome of running the unit tests,
+     *         unless an unexpected ("error" in JUnit speak) Exception
+     *         propegates out of a test fixture.
+     */
+    public static TestResult run(Test test) {
+        VerboseTestRunner runner = new VerboseTestRunner();
+        return runner.doRun(test);
+    }
+}
diff --git a/tests/bindings/com/operationaldynamics/ui/Align.java b/tests/bindings/com/operationaldynamics/ui/Align.java
new file mode 100644
index 0000000..592abe8
--- /dev/null
+++ b/tests/bindings/com/operationaldynamics/ui/Align.java
@@ -0,0 +1,73 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.ui;
+
+/*
+ * This class imported from ObjectiveAccounts accounting package where it was
+ * originally deployed as GPL code in generic.ui.Align
+ */
+
+/**
+ * Alignment constants, for convenience. Use object indentity, ie
+ * 
+ * <pre>
+ *           if (justify == Align.LEFT) { ... }
+ * </pre>
+ * 
+ * or just grab a reference to use locally or statically in your class.
+ * <p>
+ * Originally created for {@link TextOutput}, now generally available for
+ * anything that needs to specifiy alignment.
+ * 
+ * @author Andrew Cowie
+ */
+public final class Align
+{
+    private String name;
+
+    private Align(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Specify that you want to align whatever you are formatting or laying to
+     * or on the left; or, use the left slot in a layout.
+     */
+    public static final Align LEFT = new Align("LEFT");
+
+    /**
+     * Indicate that you want to align whatever you are formatting with a
+     * central tendancy, or, use the center slot in a layout (assuming, of
+     * course that there is one).
+     */
+    public static final Align CENTER = new Align("CENTER");
+
+    /**
+     * Specify that you want to align whatever you are formatting or laying to
+     * or on the right; or, use the right slot in a layout.
+     */
+    public static final Align RIGHT = new Align("RIGHT");
+
+    /*
+     * Just for debugging
+     */
+    public String toString() {
+        return "Align." + name;
+    }
+}
diff --git a/tests/bindings/com/operationaldynamics/ui/Text.java b/tests/bindings/com/operationaldynamics/ui/Text.java
new file mode 100644
index 0000000..adc3824
--- /dev/null
+++ b/tests/bindings/com/operationaldynamics/ui/Text.java
@@ -0,0 +1,199 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.ui;
+
+/*
+ * This class imported from ObjectiveAccounts accounting package where it was
+ * originally deployed as GPL code in generic.ui.Text with the following
+ * headers:
+ * 
+ * Word wrap algorithm GPL code imported from xseq.ui.OverviewWindow
+ * Copyright (c) 2004-2005 Operational Dynamics Consulting Pty Ltd
+ * 
+ * Comma padding algorithm imported from pulseSession.session.cmdHandler of 
+ * SINS (SINS Is Not ShadNet) codebase, redistributable under the GNU GPL v2.
+ * Copyright (c) 1997-1998 Andrew Cowie
+ */
+
+import java.text.DecimalFormat;
+
+/**
+ * This class also has numerous static methods with useful routines for doing
+ * basic formatting on Strings.
+ * 
+ * @author Andrew Cowie
+ */
+public abstract class Text
+{
+    /**
+     * @param str
+     *            the String to pad.
+     * @param width
+     *            maximum length of the padded result.
+     * @param justify
+     *            if RIGHT, right justify. If LEFT, normal left justification.
+     * @return the padded String.
+     */
+    public static String pad(String str, int width, Align justify) {
+        String trimmed = null;
+        /*
+         * crop
+         */
+        int len;
+        if (str == null) {
+            len = 0;
+            trimmed = "";
+        } else {
+            len = str.length();
+
+            if (len > width) {
+                trimmed = str.substring(0, width);
+                len = width;
+            } else {
+                trimmed = str;
+            }
+        }
+        int spaces = width - len;
+
+        /*
+         * pad
+         */
+        StringBuffer buf = new StringBuffer("");
+        if (justify == Align.LEFT) {
+            buf.append(trimmed);
+        }
+        for (int i = 0; i < spaces; i++) {
+            buf.append(" ");
+        }
+        if (justify == Align.RIGHT) {
+            buf.append(trimmed);
+        }
+        return buf.toString();
+    }
+
+    /**
+     * If argument is longer than width, then trim it back and add three dots.
+     */
+    public static String chomp(String str, int width) {
+        if (width < 2) { // 4
+            throw new IllegalArgumentException(
+                    "Can't chomp to less than a width of 2 because of adding elipses");
+        }
+        if (str == null) {
+            return "";
+        }
+        /*
+         * crop
+         */
+        int len = str.length();
+        if (len > width) {
+            StringBuffer buf = new StringBuffer(str.substring(0, width - 1)); // 3
+            final int end = buf.length() - 1;
+            if (buf.charAt(end) == ' ') {
+                buf.deleteCharAt(end);
+            }
+            // We now use an ellipsis, … instead of "..."
+            buf.append("\u2026");
+            return buf.toString();
+        } else {
+            return str;
+        }
+    }
+
+    /**
+     * Carry out manual word wrap on a String. Normalizes all \n and \t
+     * characters to spaces, trims leading and training whitespace, and then
+     * inserts \n characters to "wrap" at the specified width boundary.
+     * <p>
+     * This code came about because unfortunately, Pango markup has no syntax
+     * for expressing auto word wrap, and worse, GtkCellRendererText has no
+     * ability to wrap text. So we (ick) do it by hand.
+     * 
+     * @return a single String with newline characters inserted at appropriate
+     *         points to cause the effect of wrapping at the specified width.
+     */
+    public static String wrap(String str, int width) {
+        StringBuffer buf = new StringBuffer(str);
+        int index;
+        /*
+         * normalize any existing IFS characters to spaces
+         */
+        while ((index = buf.indexOf("\n")) != -1) {
+            buf.setCharAt(index, ' ');
+        }
+        while ((index = buf.indexOf("\t")) != -1) {
+            buf.setCharAt(index, ' ');
+        }
+        /*
+         * trim. Yes, I know about String.trim(), but we've already done half
+         * the work it does; no need to be inefficient.
+         */
+        while (buf.charAt(0) == ' ') {
+            buf.deleteCharAt(0);
+        }
+        while (buf.charAt(buf.length() - 1) == ' ') {
+            buf.deleteCharAt(buf.length() - 1);
+        }
+
+        while ((index = buf.indexOf("  ")) != -1) {
+            buf.deleteCharAt(index);
+        }
+
+        /*
+         * word wrap.
+         */
+        int next_space = 0;
+        int line_start = 0;
+
+        while (next_space != -1) {
+            if ((next_space - line_start) > width) {
+                buf.setCharAt(next_space, '\n');
+                line_start = next_space;
+            }
+            next_space = buf.indexOf(" ", next_space + 1); // bounds?
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     * Pad and justify a long. This is useful for displaying the memory usage
+     * numbers from Runtime.freeMemory() and Runtime.totalMemory()
+     * 
+     * @param num
+     *            a number to render as a comma padded string.
+     * @return a 25 character wide string with the number right justified wnd
+     *         with comma characters at thousand marks.
+     */
+    /*
+     * from pulseSession.session.cmdHandler
+     */
+    public static String padComma(long num) {
+        DecimalFormat df = new DecimalFormat("#,###,###,###,###,###,###");
+
+        StringBuffer comma = new StringBuffer(df.format(num));
+
+        int pad = 25 - comma.length();
+        for (int i = 0; i < pad; i++) {
+            comma.insert(0, ' ');
+        }
+
+        return comma.toString();
+    }
+}
diff --git a/tests/bindings/com/operationaldynamics/ui/TextOutput.java b/tests/bindings/com/operationaldynamics/ui/TextOutput.java
new file mode 100644
index 0000000..df1ce56
--- /dev/null
+++ b/tests/bindings/com/operationaldynamics/ui/TextOutput.java
@@ -0,0 +1,95 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2005-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.ui;
+
+/*
+ * This class imported from ObjectiveAccounts accounting package where it was
+ * originally deployed as GPL code in generic.ui.TextOutput
+ */
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+import org.freedesktop.bindings.Environment;
+
+/**
+ * Base class for routines that output text to terminal. It takes care of
+ * working out and making available to subclasses an appropriate terminal
+ * width. Note that this can be set or overridden on the VM command line by
+ * setting the COLUMNS property:
+ * 
+ * <pre>
+ *  java -DCOLUMNS=70 ...
+ * </pre>
+ * 
+ * @author Andrew Cowie
+ */
+public abstract class TextOutput extends Text
+{
+    /**
+     * Terminal width, in character cells. Pulled from environment variable
+     * "COLUMNS" if it set, otherwise a default value is used.
+     */
+    public static final int COLUMNS;
+
+    private static final int COLUMNS_DEFAULT = 80;
+
+    protected static final int COLUMNS_MIN = 50;
+
+    /**
+     * Specify left alignment for whatever you are outputting or padding.
+     * Points to Align.LEFT; is here for convenience and brevity in
+     * subclasses.
+     */
+    protected static final Align LEFT = Align.LEFT;
+
+    /**
+     * Specify right alignment for whatever you are outputting or padding
+     * Actually just points at Align.RIGHT; is here for brevity in subclasses.
+     */
+    protected static final Align RIGHT = Align.RIGHT;
+
+    static {
+        String env = Environment.getEnv("COLUMNS");
+        if (env == null) {
+            COLUMNS = COLUMNS_DEFAULT;
+        } else {
+            int val = Integer.valueOf(env).intValue();
+            if (val < COLUMNS_MIN) {
+                throw new IllegalStateException("Terminal too narrow for TextOutput. Min width "
+                        + COLUMNS_MIN + " characters.");
+            }
+            COLUMNS = val;
+        }
+    }
+
+    /**
+     * Wrapper around toOutput(PrintWriter) to which you can easily pass an
+     * old school PrintStream
+     * 
+     * @param out
+     *            a PrintStream like System.out or System.err
+     */
+    public final void toOutput(PrintStream out) {
+        toOutput(new PrintWriter(out, true));
+
+    }
+
+    public abstract void toOutput(PrintWriter out);
+}
diff --git a/tests/bindings/org/freedesktop/bindings/ValidateEnvironment.java b/tests/bindings/org/freedesktop/bindings/ValidateEnvironment.java
new file mode 100644
index 0000000..9404bdc
--- /dev/null
+++ b/tests/bindings/org/freedesktop/bindings/ValidateEnvironment.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.bindings;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Make sure our reimplementaiton of fetching environment variables works.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateEnvironment extends GraphicalTestCase
+{
+    public final void testGetEnvironmentVariable() {
+        final String home;
+        String username;
+
+        home = Environment.getEnv("HOME");
+
+        assertNotNull(home);
+
+        username = Environment.getEnv("LOGNAME");
+        if (username == null) {
+            username = Environment.getEnv("USER");
+        }
+
+        if (username != null) {
+            assertTrue("How come your user name is not in your home directory location?",
+                    (home.indexOf(username) != -1));
+        }
+    }
+
+    public final void testSetEnvironmentVariable() {
+        String blah;
+        final String SOMETHING_UNIQUE = "SOMETHING_UNIQUE";
+
+        /*
+         * Ensure it's empty
+         */
+        blah = Environment.getEnv(SOMETHING_UNIQUE);
+        assertNull(blah);
+
+        Environment.setEnv(SOMETHING_UNIQUE, "Absolutely");
+
+        blah = Environment.getEnv(SOMETHING_UNIQUE);
+        assertNotNull(blah);
+        assertEquals("Absolutely", blah);
+
+        /*
+         * And test that it will overwrite
+         */
+        Environment.setEnv(SOMETHING_UNIQUE, "Fantastic");
+
+        blah = Environment.getEnv(SOMETHING_UNIQUE);
+        assertNotNull(blah);
+        assertEquals("Fantastic", blah);
+
+        /*
+         * Finally, test deleting
+         */
+        Environment.setEnv(SOMETHING_UNIQUE, null);
+        blah = Environment.getEnv(SOMETHING_UNIQUE);
+        assertNull(blah);
+    }
+
+    public final void testProcessID() {
+        int pid;
+
+        pid = Environment.getProcessID();
+
+        assertTrue(pid > 1);
+    }
+}
diff --git a/tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java b/tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java
new file mode 100644
index 0000000..624d00c
--- /dev/null
+++ b/tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java
@@ -0,0 +1,136 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.bindings;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+import static org.freedesktop.bindings.Internationalization.N_;
+import static org.freedesktop.bindings.Internationalization._;
+import static org.freedesktop.bindings.Internationalization.translateCountryName;
+import static org.freedesktop.bindings.Internationalization.translateLanguageName;
+
+/**
+ * Exercise the Internationalization setup code.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * Extends TestCaseGtk to ensure Gtk.init() has been called.
+ */
+public class ValidateInternationalization extends GraphicalTestCase
+{
+    private static String LC_ALL;
+
+    private static String LANGUAGE;
+
+    private static String LANG;
+
+    public final void testInitialization() {
+        LC_ALL = Environment.getEnv("LC_ALL");
+        LANGUAGE = Environment.getEnv("LANGUAGE");
+        LANG = Environment.getEnv("LANG");
+
+        try {
+            Internationalization.init(null, "/usr/share/locale");
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+        try {
+            Internationalization.init("", "/usr/share/locale");
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+        try {
+            Internationalization.init("tester", null);
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+        try {
+            Internationalization.init("tester", "/no/such/directory/");
+            fail("Should have thrown FatalError");
+        } catch (FatalError iae) {
+            // good
+        }
+
+    }
+
+    public final void setUp() {
+        /*
+         * The choice here of en_US is simply because _everyone_ is going to
+         * have that installed, somewhere. We are not testing changing locales
+         * here, so if an American is running this, no big deal. We just need
+         * something not the C locale.
+         */
+        Environment.setEnv("LC_ALL", "en_US.UTF-8");
+        Environment.setEnv("LANGUAGE", "en_US.UTF-8");
+        Environment.setEnv("LANG", "en_US.UTF-8");
+        Internationalization.init("unittest", "tmp/locale");
+    }
+
+    public final void testTranslation() {
+        assertEquals("Hello", _("login"));
+    }
+
+    private static final String GOODBYE = N_("logoff");
+
+    public final void testStaticWrapper() {
+        assertEquals("logoff", N_(GOODBYE));
+        assertSame(GOODBYE, N_(GOODBYE));
+        assertEquals("Goodbye", _(GOODBYE));
+    }
+
+    /*
+     * We have coded a) a check for empty Strings, and b) that in the case of
+     * no translation being available, the supplied String reference being
+     * returned as-is. This works around various gettext() limitations, and
+     * this test verfies this behaviour.
+     */
+    public final void testAvoidGettextBugs() {
+        final String insult;
+
+        assertEquals("", _(""));
+        assertSame("", _(""));
+
+        // *NOT* marked with the N_ wrapper!
+        insult = "Yo mamma";
+        assertSame(insult, _(insult));
+    }
+
+    /*
+     * Without changing to another locale, this doesn't test very much!
+     */
+    public final void testLanguageAndCountryTranslation() {
+        String language, country;
+
+        language = translateLanguageName("Spanish; Castilian");
+        country = translateCountryName("Spain");
+
+        assertEquals("Spanish; Castilian", language);
+        assertEquals("Spain", country);
+    }
+
+    public final void testRestoreEnvironment() {
+        Environment.setEnv("LC_ALL", LC_ALL);
+        Environment.setEnv("LANGUAGE", LANGUAGE);
+        Environment.setEnv("LANG", LANG);
+    }
+}
diff --git a/tests/bindings/org/freedesktop/cairo/ValidateCairoContext.java b/tests/bindings/org/freedesktop/cairo/ValidateCairoContext.java
new file mode 100644
index 0000000..b8ddd81
--- /dev/null
+++ b/tests/bindings/org/freedesktop/cairo/ValidateCairoContext.java
@@ -0,0 +1,161 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2009      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Unit tests for org.freedesktop.cairo.Context functions.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ValidateCairoContext extends GraphicalTestCase
+{
+    public final void testSaveRestore() {
+        final Context cr;
+        final ImageSurface s;
+
+        s = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(s);
+
+        /* set some parameters */
+        cr.setLineWidth(2.5);
+
+        assertEquals(2.5, cr.getLineWidth());
+
+        /* save context */
+        cr.save();
+
+        /* change parameters */
+        cr.setLineWidth(38.0);
+        assertEquals(38.0, cr.getLineWidth());
+
+        /* save again */
+        cr.save();
+
+        cr.setLineWidth(1.2);
+        assertEquals(1.2, cr.getLineWidth());
+
+        /* restore */
+        cr.restore();
+        assertEquals(38.0, cr.getLineWidth());
+
+        cr.restore();
+        assertEquals(2.5, cr.getLineWidth());
+
+        try {
+            cr.restore();
+            fail("restore() without matching save() should fail");
+        } catch (IllegalStateException e) {
+            // ok
+        }
+    }
+
+    public final void testCairoInFill() {
+        final Context cr;
+        final ImageSurface s;
+
+        s = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(s);
+
+        cr.moveTo(10.0, 10.0);
+        cr.rectangle(10.0, 10.0, 80.0, 80.0);
+
+        assertTrue(cr.inFill(50.0, 50.0));
+        assertFalse(cr.inFill(5.0, 5.0));
+        assertFalse(cr.inFill(95.0, 95.0));
+
+        /*
+         * Now, some curiousity about corner cases, established while
+         * documenting.
+         */
+
+        assertFalse(cr.inFill(0.0, 0.0));
+        assertFalse(cr.inFill(9.9, 9.9));
+        assertTrue(cr.inFill(10.1, 10.1));
+        assertTrue(cr.inFill(10.01, 10.01));
+
+        assertTrue(cr.inFill(90.0, 90.0));
+        assertFalse(cr.inFill(90.1, 90.1));
+        assertFalse(cr.inFill(90.01, 90.01));
+        assertFalse(cr.inFill(100.0, 100.0));
+    }
+
+    public final void testCairoInStroke() {
+        final Context cr;
+        final ImageSurface s;
+
+        s = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(s);
+
+        cr.moveTo(10.0, 10.0);
+        cr.setLineWidth(1.0);
+        cr.rectangle(10.0, 10.0, 80.0, 80.0);
+
+        assertFalse(cr.inStroke(50.0, 50.0));
+        assertFalse(cr.inStroke(5.0, 5.0));
+        assertFalse(cr.inStroke(95.0, 95.0));
+
+        /*
+         * Corner cases.
+         */
+
+        assertFalse(cr.inStroke(0.0, 0.0));
+        assertTrue(cr.inStroke(9.9, 9.9));
+        assertTrue(cr.inStroke(10.1, 10.1));
+        assertTrue(cr.inStroke(10.5, 10.5));
+        assertFalse(cr.inStroke(10.51, 10.51));
+
+        assertTrue(cr.inStroke(90.0, 90.0));
+        assertTrue(cr.inStroke(90.1, 90.1));
+        assertTrue(cr.inStroke(90.5, 90.5));
+        assertFalse(cr.inStroke(90.51, 90.51));
+        assertTrue(cr.inStroke(89.51, 89.51));
+        assertFalse(cr.inStroke(89.49, 89.49));
+    }
+
+    public final void testCairoFillClears() {
+        final Context cr;
+        final ImageSurface s;
+
+        s = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(s);
+
+        cr.rectangle(10.0, 10.0, 80.0, 80.0);
+
+        assertTrue(cr.inFill(50.0, 50.0));
+        cr.fill();
+        assertFalse(cr.inFill(50.0, 50.0));
+    }
+
+    public final void testCairoFillPreserve() {
+        final Context cr;
+        final ImageSurface s;
+
+        s = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(s);
+
+        cr.rectangle(10.0, 10.0, 80.0, 80.0);
+
+        assertTrue(cr.inFill(50.0, 50.0));
+        cr.fillPreserve();
+        assertTrue(cr.inFill(50.0, 50.0));
+    }
+}
diff --git a/tests/bindings/org/freedesktop/cairo/ValidateCairoInternals.java b/tests/bindings/org/freedesktop/cairo/ValidateCairoInternals.java
new file mode 100644
index 0000000..500f5c0
--- /dev/null
+++ b/tests/bindings/org/freedesktop/cairo/ValidateCairoInternals.java
@@ -0,0 +1,230 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Exercise the handling of the internals of our Plumbing infrastructure for
+ * turning Cairo sub types into concrete Java objects.
+ * 
+ * @author Andrew Cowie
+ * @author Adrian Johnson
+ */
+public class ValidateCairoInternals extends GraphicalTestCase
+{
+    public final void testPatternProxyCreation() {
+        final Context cr;
+        final ImageSurface s;
+        final Pattern p;
+
+        s = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(s);
+
+        /*
+         * Do something arbitrary.
+         */
+
+        cr.setSource(0.0, 0.0, 1.0, 0.8);
+
+        /*
+         * Call a method that returns an abstract type, in this case a
+         * Pattern.
+         */
+
+        p = cr.getSource();
+        assertNotNull(p);
+        assertTrue(p instanceof SolidPattern);
+
+        /*
+         * Note: The preceeding assertion doesn't have to be a SolidPattern.
+         * It just needs to be something concrete, and more to the point
+         * something that we didn't already have a Proxy for. Obviously we
+         * can't have instantiated a non-concrete class, but this makes the
+         * point clearly that we got something out of it that we didn't have
+         * on the Java side before.
+         */
+    }
+
+    private static byte[] readFileIntoArray(String filename) throws IOException {
+        final File source;
+        final int length;
+        final FileInputStream fis;
+        final byte[] data, overflow;
+        int actual;
+
+        source = new File(filename);
+        length = (int) source.length();
+
+        data = new byte[length];
+
+        /*
+         * Read the entire file in one go.
+         */
+
+        fis = new FileInputStream(source);
+        actual = fis.read(data, 0, length);
+
+        /*
+         * Make sure we really read the whole file; if there are any bytes
+         * left that's bad.
+         */
+
+        if (actual != length) {
+            fail();
+        }
+
+        overflow = new byte[2];
+        actual = fis.read(overflow, 0, 2);
+        if (actual != -1) {
+            fail();
+        }
+
+        /*
+         * Return file contents
+         */
+
+        return data;
+    }
+
+    private static final void assertFileContains(String target, String filename) throws IOException {
+        final byte[] data;
+        final String text;
+
+        data = readFileIntoArray(filename);
+
+        text = new String(data);
+
+        assertTrue("Output file does not contain \"" + target + "\"", text.contains(target));
+    }
+
+    public final void testUsingMimeDataExplicit() throws IOException {
+        final Surface s1, s2;
+        final Context c1, c2;
+        final Pixbuf pixbuf;
+        final byte[] data;
+
+        /*
+         * Desired output target.
+         */
+
+        s1 = new SvgSurface("tmp/tests/org/freedesktop/cairo/MimeType1.svg", 100, 100);
+        c1 = new Context(s1);
+
+        /*
+         * Get our image into a GDK Pixbuf, but instead of directly loading as
+         * usual load it into Java memory first so we can reuse it in a
+         * minute.
+         */
+
+        data = readFileIntoArray("tests/prototype/MapleSyrup.jpg");
+        pixbuf = new Pixbuf(data);
+
+        /*
+         * Intermediate surface. What a bother.
+         */
+
+        s2 = new ImageSurface(Format.ARGB32, 100, 100);
+        c2 = new Context(s2);
+
+        c2.setSource(pixbuf, 0, 0);
+        c2.paint();
+
+        s2.setMimeData(MimeType.JPEG, data);
+
+        /*
+         * Paint the image onto our real surface.
+         */
+
+        c1.setSource(s2, 0, 0);
+        c1.paint();
+
+        s1.finish();
+
+        /*
+         * Now test
+         */
+
+        assertFileContains("image/jpeg", "tmp/tests/org/freedesktop/cairo/MimeType1.svg");
+    }
+
+    /*
+     * Try and excercise the cairo_destroy_func_t callback. No promises, of
+     * course, but with this we were getting crashes until we fixed it.
+     */
+    public final void testImageDataCleanup() {
+        cycleMainLoop();
+        cycleGarbageCollector();
+    }
+
+    /**
+     * Thanks for the help of Adrian Johnson. In trying this pattern.
+     */
+    public final void testUsingMimeDataViaPattern() throws IOException {
+        final Surface surface, implicit;
+        final Context cr;
+        final Pattern pattern;
+        final byte[] data;
+        final Pixbuf pixbuf;
+
+        /*
+         * Desired output target.
+         */
+
+        surface = new SvgSurface("tmp/tests/org/freedesktop/cairo/MimeType2.svg", 100, 100);
+        cr = new Context(surface);
+
+        data = readFileIntoArray("tests/prototype/MapleSyrup.jpg");
+        pixbuf = new Pixbuf(data);
+
+        /*
+         * Set the source using the gdk_cairo_set_source_pixbuf() utility, but
+         * do NOT draw it yet.
+         */
+
+        cr.setSource(pixbuf, 0, 0);
+
+        /*
+         * Get the implicitly created Surface, and set the mime data.
+         */
+
+        pattern = cr.getSource();
+        implicit = pattern.getSurface();
+        implicit.setMimeData(MimeType.JPEG, data);
+
+        /*
+         * Now you can paint.
+         */
+
+        cr.paint();
+
+        surface.finish();
+
+        /*
+         * Now test
+         */
+
+        assertFileContains("image/jpeg", "tmp/tests/org/freedesktop/cairo/MimeType2.svg");
+    }
+}
diff --git a/tests/bindings/org/freedesktop/cairo/ValidateDrawingToFile.java b/tests/bindings/org/freedesktop/cairo/ValidateDrawingToFile.java
new file mode 100644
index 0000000..a803c76
--- /dev/null
+++ b/tests/bindings/org/freedesktop/cairo/ValidateDrawingToFile.java
@@ -0,0 +1,99 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Started life as the Cairo drawing example; evolved to a unit test. This
+ * TestCase is predicated on the assumption that PNGs are deterministic. I
+ * don't know of anything that actually guarantees or requires this to be the
+ * case, but it seems a reasonable guess, given that it is ultimately just a
+ * pixel mapping. Perhaps compression will get in the way; if so, switch this
+ * to a TIFF.
+ * 
+ * <p>
+ * As you will see, the file being compared was (can be) generated with this
+ * code, so if you need to redo this run it as an executable.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * TODO Actually do the comaprison!
+ */
+public class ValidateDrawingToFile extends GraphicalTestCase
+{
+    private static String OUTPUT_FILENAME = "tmp/tests/ValidateDrawingToFile.png";
+
+    private static void draw() {
+        final Context cr;
+        final ImageSurface surface;
+
+        surface = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(surface);
+
+        cr.setSource(0.0, 0.0, 1.0, 0.8);
+        cr.moveTo(10, 10);
+        cr.lineTo(20, 5);
+        cr.stroke();
+
+        try {
+            surface.writeToPNG(OUTPUT_FILENAME);
+        } catch (IOException e) {
+            fail("Unexpected file write error");
+        }
+
+        try {
+            surface.writeToPNG("/an/inexistent/filename");
+            fail("You should get an IOException");
+        } catch (IOException e) {
+            // ok
+        }
+    }
+
+    public final void testImageSurfaceWriteToPNG() {
+        final File target;
+
+        target = new File(OUTPUT_FILENAME);
+
+        if (target.exists()) {
+            target.delete();
+        }
+
+        draw();
+
+        assertTrue("PNG output not found", target.exists());
+
+        /*
+         * TODO compare output to some canonical example! How? Compare MD5
+         * sums? Load the two images and compare pixels? And where are we
+         * storing the other file in the tree?
+         */
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        draw();
+    }
+}
diff --git a/tests/bindings/org/freedesktop/enchant/ValidateEnchantInternals.java b/tests/bindings/org/freedesktop/enchant/ValidateEnchantInternals.java
new file mode 100644
index 0000000..1ebaa80
--- /dev/null
+++ b/tests/bindings/org/freedesktop/enchant/ValidateEnchantInternals.java
@@ -0,0 +1,345 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.enchant;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Exercise the Enchant spelling facade API.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateEnchantInternals extends GraphicalTestCase
+{
+    public final void setUp() {
+        Enchant.init();
+    }
+
+    public final void testLibraryInitialization() {
+        assertNotNull(Enchant.getDefault());
+    }
+
+    /*
+     * This is probably the worst test in here. How can we know what
+     * dictionaries are installed? In any event, this at least ensures the
+     * code path in the Override is exercised.
+     */
+    public final void testListAllDictionaries() {
+        final String[] list;
+
+        list = Enchant.listDictionaries();
+
+        assertTrue(list.length > 0);
+
+        for (String tag : list) {
+            if (tag.equals("en") || tag.startsWith("en_")) {
+                return;
+            }
+        }
+        fail("Needed to find at least \"en\" as a dictionary!");
+    }
+
+    public final void testDictionaryKnownToExist() {
+        final boolean result;
+
+        result = Enchant.existsDictionary("en") || Enchant.existsDictionary("en_GB")
+                || Enchant.existsDictionary("en_US");
+        assertTrue(result);
+    }
+
+    public final void testDictionaryKnownNotToExist() {
+        final boolean result;
+
+        result = Enchant.existsDictionary("klingon");
+        assertFalse(result);
+    }
+
+    /*
+     * Bit silly, but do all dictionaries actually exist?
+     */
+    public final void testAllDictionariesExist() {
+        final String[] list;
+        boolean result;
+
+        list = Enchant.listDictionaries();
+
+        for (String tag : list) {
+            result = Enchant.existsDictionary(tag);
+            assertTrue(result);
+        }
+    }
+
+    public final void testDictionaryCreation() {
+        final Dictionary dict;
+
+        assertNotNull(Enchant.getDefault());
+
+        dict = Enchant.requestDictionary("en");
+        assertNotNull(dict);
+    }
+
+    public final void testCreateDictionaryUnspecified() {
+        assertNotNull(Enchant.getDefault());
+
+        try {
+            Enchant.requestDictionary("");
+            fail("Can't request a Dictionary with an empty language tag");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    public final void testCreateInvalidDictionary() {
+        final Dictionary dict;
+
+        assertNotNull(Enchant.getDefault());
+
+        dict = Enchant.requestDictionary("klingon");
+        assertNull(dict);
+    }
+
+    public final void testCheckWord() {
+        final Dictionary dict;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        result = dict.check("hello");
+        assertTrue(result);
+
+        result = dict.check("insain");
+        assertFalse(result);
+    }
+
+    public final void testSuggestionsWordCorrect() {
+        final Dictionary dict;
+        String[] list;
+        int i, count;
+
+        dict = Enchant.requestDictionary("en");
+
+        /*
+         * Dramatically complicating matters, if the word is correct, you can
+         * still get suggestions.
+         */
+
+        list = dict.suggest("catamaran");
+        assertTrue(list.length > 0);
+
+        count = 0;
+        for (i = 0; i < list.length; i++) {
+            if (list[i].equals("catamaran")) {
+                count++;
+            }
+        }
+        assertEquals("Our correctly spelt word should be a suggestion!", 1, count);
+    }
+
+    public final void testSuggestionsWordIncorrect() {
+        final Dictionary dict;
+        String[] list;
+        int i, count;
+
+        dict = Enchant.requestDictionary("en");
+
+        list = dict.suggest("katamaran");
+        assertTrue(list.length > 0);
+
+        count = 0;
+        for (i = 0; i < list.length; i++) {
+            if (list[i].equals("catamaran")) {
+                count++;
+            }
+        }
+        assertEquals("Should only be one suggestion correctly spelling our word!", 1, count);
+    }
+
+    public final void testSuggestionsWordUnknown() {
+        final String bogus;
+        final Dictionary dict;
+        String[] list;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        /*
+         * Finding a word that really has no suggestions is tough. Good old
+         * supercalifragilisticexpialidocious would have been good (it offered
+         * no suggestions in gedit when writing this test) but it's still a
+         * real word. Try this one.
+         */
+
+        bogus = "metakathamrthamorosishmockinggutgoberlize";
+
+        result = dict.check(bogus);
+
+        if (result) {
+            fail("Need a better word to use, one known not to result in any suggestions");
+        }
+
+        list = dict.suggest(bogus);
+        assertNull(list);
+    }
+
+    public final void testAddingCustomWord() {
+        final String bogus;
+        final Dictionary dict;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        /*
+         * Something surely not in anyone's word list:
+         */
+
+        bogus = "bindings_java_spell_checking_test";
+
+        result = dict.check(bogus);
+        assertFalse(result);
+
+        dict.add(bogus);
+
+        result = dict.check(bogus);
+        assertTrue(result);
+
+        dict.remove(bogus);
+
+        result = dict.check(bogus);
+        assertFalse(result);
+    }
+
+    public final void testPersonalWordList() throws IOException {
+        File target;
+        Dictionary dict;
+
+        Enchant.init();
+
+        dict = null;
+        try {
+            dict = Enchant.requestPersonalWordList("");
+            fail("Should have thrown FileNotFoundException");
+            return;
+        } catch (FileNotFoundException fnfe) {
+            // good
+        }
+
+        target = new File("tmp/personalWordList.dic");
+        if (target.exists()) {
+            target.delete();
+        }
+        target.createNewFile();
+
+        try {
+            dict = Enchant.requestPersonalWordList(target.getAbsolutePath());
+        } catch (FileNotFoundException fnfe) {
+            fail("Why not found?");
+        }
+
+        assertFalse(dict.check("jazz"));
+
+        dict.add("jazz");
+        assertTrue(dict.check("jazz"));
+
+        dict.remove("jazz");
+        assertFalse(dict.check("jazz"));
+    }
+
+    public final void testWordsWithPunctuation() {
+        final Dictionary dict;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        /*
+         * Something surely not in anyone's word list:
+         */
+
+        result = dict.check("system");
+        assertTrue(result);
+
+        result = dict.check("system.");
+        assertTrue(result);
+
+        result = dict.check("systematic");
+        assertTrue(result);
+
+        result = dict.check("system.atic");
+        assertFalse(result);
+    }
+
+    /*
+     * It's nice that . is accepted [see above] but other punctuation and
+     * symbolic characters seem to be taken as a spelling mistake. Would have
+     * preferred that it could have been smarter about this.
+     */
+    public final void testWordsWithSymbols() {
+        final Dictionary dict;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        result = dict.check("correct");
+        assertTrue(result);
+
+        result = dict.check("correct)");
+        assertFalse(result);
+
+        result = dict.check("(correct");
+        assertFalse(result);
+
+        result = dict.check("(correct)");
+        assertFalse(result);
+
+        result = dict.check("correct,");
+        assertFalse(result);
+    }
+
+    public final void testContractions() {
+        final Dictionary dict;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        result = dict.check("do");
+        assertTrue(result);
+
+        result = dict.check("not");
+        assertTrue(result);
+
+        result = dict.check("do not");
+        assertFalse(result);
+
+        result = dict.check("don't");
+        assertTrue(result);
+    }
+
+    public final void testEmpty() {
+        final Dictionary dict;
+        boolean result;
+
+        dict = Enchant.requestDictionary("en");
+
+        result = dict.check("");
+        assertTrue(result);
+    }
+}
diff --git a/tests/bindings/org/freedesktop/icons/ValidateIconItems.java b/tests/bindings/org/freedesktop/icons/ValidateIconItems.java
new file mode 100644
index 0000000..c9d2e56
--- /dev/null
+++ b/tests/bindings/org/freedesktop/icons/ValidateIconItems.java
@@ -0,0 +1,66 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.icons;
+
+import junit.framework.TestCase;
+
+/**
+ * Validate the handling of Icon items.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class ValidateIconItems extends TestCase
+{
+    /*
+     * Force classloader to [re-run (sic)] static initializers by referencing
+     * the constants we're going to check against. I'm not really convinced
+     * that this is intuitive; these tests used to work without this.
+     */
+    public final void setUp() {
+        assertNotNull(PlaceIcon.USER_TRASH);
+        assertNotNull(ActionIcon.DOCUMENT_SAVE);
+    }
+
+    public final void testIconNames() {
+        String name;
+
+        name = Helper.getName(PlaceIcon.USER_TRASH);
+        assertEquals("user-trash", name);
+
+        name = Helper.getName(ActionIcon.DOCUMENT_SAVE);
+        assertEquals("document-save", name);
+
+        assertFalse(PlaceIcon.USER_TRASH == ActionIcon.DOCUMENT_SAVE);
+    }
+
+    public final void testIconRegistry() {
+        Icon icon;
+
+        icon = Helper.instanceFor("user-trash");
+        assertSame(PlaceIcon.USER_TRASH, icon);
+
+        icon = Helper.instanceFor("document-save");
+        assertSame(ActionIcon.DOCUMENT_SAVE, icon);
+    }
+
+    public final void testIconEquals() {
+        assertTrue(ActionIcon.APPLICATION_EXIT.equals(ActionIcon.APPLICATION_EXIT));
+        assertFalse(ActionIcon.APPLICATION_EXIT.equals(ActionIcon.ZOOM_ORIGINAL));
+    }
+}
diff --git a/tests/bindings/org/gnome/gdk/ValidateBoxeds.java b/tests/bindings/org/gnome/gdk/ValidateBoxeds.java
new file mode 100644
index 0000000..b1b581a
--- /dev/null
+++ b/tests/bindings/org/gnome/gdk/ValidateBoxeds.java
@@ -0,0 +1,77 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gdk;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateBoxeds extends GraphicalTestCase
+{
+    /*
+     * Given that we have a few public constants in Color, chances are that if
+     * the allocator breaks things will crash before we get to this test.
+     */
+    public final void testColorInstantiation() {
+        final RGBA blue;
+
+        blue = new RGBA(0.0, 0.0, 1.0, 1.0);
+
+        assertEquals(0, blue.getRed());
+        assertEquals(0, blue.getGreen());
+        assertEquals(1.0, blue.getBlue());
+        assertEquals(1.0, blue.getAlpha());
+    }
+
+    public final void testColorConstants() {
+        final RGBA black, white;
+
+        black = RGBA.BLACK;
+
+        assertEquals(0, black.getRed());
+        assertEquals(0, black.getGreen());
+        assertEquals(0, black.getBlue());
+
+        white = new RGBA(1.0, 1.0, 1.0, 1.0);
+        assertEquals(65535, white.getRed());
+        assertEquals(65535, white.getGreen());
+        assertEquals(65535, white.getBlue());
+
+        // Boxeds aren't unique
+        assertNotSame(white, RGBA.WHITE);
+
+        /*
+         * Test the equals override
+         */
+        assertFalse(white.equals(RGBA.BLACK));
+        assertTrue(white.equals(RGBA.WHITE));
+    }
+
+    public final void testRectangle() {
+        final Rectangle original;
+
+        original = new Rectangle(26, 127, 228, 329);
+
+        assertEquals(26, original.getX());
+        assertEquals(127, original.getY());
+        assertEquals(228, original.getWidth());
+        assertEquals(329, original.getHeight());
+    }
+}
diff --git a/tests/bindings/org/gnome/gdk/ValidateImageHandling.java b/tests/bindings/org/gnome/gdk/ValidateImageHandling.java
new file mode 100644
index 0000000..ca7157e
--- /dev/null
+++ b/tests/bindings/org/gnome/gdk/ValidateImageHandling.java
@@ -0,0 +1,223 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gdk;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.gnome.gtk.Button;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.IconSize;
+import org.gnome.gtk.Stock;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateImageHandling extends GraphicalTestCase
+{
+    public final void testPixbufFromFile() {
+        try {
+            new Pixbuf("foo.jpg");
+            fail("Should have complained not being able to find file");
+        } catch (FileNotFoundException fnfe) {
+            // good
+        }
+
+        try {
+            new Pixbuf("README.markdown");
+            fail("Specified file not an image, should have thrown");
+        } catch (RuntimeException re) {
+            // good
+        } catch (FileNotFoundException fnfe) {
+            fail("Should have found non-image file");
+        }
+
+        try {
+            new Pixbuf("src/bindings/java-gnome_Icon.png");
+        } catch (FileNotFoundException fnfe) {
+            fail("Target file should exist. Did someone refactor the logo image?");
+        }
+    }
+
+    public final void testPixbufGetPixels() {
+        final Pixbuf pixbuf;
+        final byte[] data;
+        final int width, height, num;
+
+        try {
+            pixbuf = new Pixbuf("src/bindings/java-gnome_Icon.png");
+        } catch (FileNotFoundException fnfe) {
+            fail("Target file should exist. Did someone refactor the logo image?");
+            return;
+        }
+
+        width = pixbuf.getWidth();
+        height = pixbuf.getHeight();
+        num = pixbuf.getNumChannels();
+        assertEquals("Expecting a 48x48 image", 48, width);
+        assertEquals("Expecting a 48x48 image", 48, height);
+        assertEquals("Where did the alpha channel go?", 4, num);
+
+        data = pixbuf.getPixels();
+
+        assertEquals(width * height * num, data.length);
+
+        int sum;
+
+        sum = 0;
+        for (int j = 0; j < height; j++) {
+            for (int i = 0; i < width; i++) {
+                for (int c = 0; c < num; c++) {
+                    int pixel;
+
+                    pixel = data[j * width + i * num + c] & 0xFF;
+
+                    assertTrue((pixel >= 0) && (pixel <= 255));
+
+                    sum += pixel;
+                }
+            }
+        }
+
+        /*
+         * Ok, this isn't much of a test, but it sorta catches the flavour of
+         * things, and is the sort of calculation we were doing during our
+         * performance tests.
+         */
+        assertEquals(515687, sum);
+    }
+
+    public final void testPixbufCopying() {
+        final Pixbuf original;
+        final Pixbuf copy;
+        byte[] data;
+        int O, C;
+
+        original = Gtk.renderIcon(new Button(), Stock.OK, IconSize.BUTTON);
+        data = original.getPixels();
+        O = 0;
+        for (int i = 0; i < data.length; i++) {
+            O += data[i];
+        }
+
+        copy = original.copy();
+
+        assertNotSame(copy, original);
+
+        data = copy.getPixels();
+        C = 0;
+        for (int i = 0; i < data.length; i++) {
+            C += data[i];
+        }
+
+        assertEquals(C, O);
+    }
+
+    /*
+     * Obviously we can't assess quality of transformed image, but we can at
+     * least exercise the code path.
+     */
+    public final void testPixbufScaling() {
+        final Pixbuf original;
+        final Pixbuf result;
+
+        original = Gtk.renderIcon(new Button(), Stock.HELP, IconSize.MENU);
+
+        assertTrue(original.getWidth() < 100);
+        assertTrue(original.getHeight() < 100);
+
+        result = original.scale(300, 500, InterpType.NEAREST);
+
+        assertEquals(300, result.getWidth());
+        assertEquals(500, result.getHeight());
+    }
+
+    public final void testPixbufFromData() throws IOException {
+        Pixbuf target;
+        byte[] data;
+        final FileInputStream png;
+
+        target = null;
+        data = null;
+
+        try {
+            target = new Pixbuf(data);
+            fail("Shouldn't be able to pass a null byte[]");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        data = new byte[0];
+        try {
+            target = new Pixbuf(data);
+            fail("Something should break if you pass in an empty byte[]!");
+        } catch (IOException iae) {
+            // good
+        }
+
+        try {
+            target = new Pixbuf(data);
+            fail("The byte[] isn't an image.");
+        } catch (IOException iae) {
+            // good
+        }
+
+        data = new byte[4017];
+        png = new FileInputStream("src/bindings/java-gnome_Icon.png");
+        png.read(data);
+
+        target = new Pixbuf(data);
+
+        assertEquals(48, target.getWidth());
+        assertEquals(48, target.getHeight());
+    }
+
+    public final void testPixbufInfoFromDisk() throws IOException {
+        final Pixbuf pixbuf;
+        final int loadedWidth, loadedHeight;
+        final int infoWidth, infoHeight;
+
+        /*
+         * This file specifically picked to be a non-square image.
+         */
+
+        pixbuf = new Pixbuf("tests/prototype/MapleSyrup.jpg");
+
+        loadedWidth = pixbuf.getWidth();
+        loadedHeight = pixbuf.getHeight();
+
+        assertEquals("Expecting a 200x398 image", 200, loadedWidth);
+        assertEquals("Expecting a 200x398 image", 398, loadedHeight);
+
+        /*
+         * Now test the static functions used for probing a file on disk. It's
+         * hard to imagine that this would come up with different answers than
+         * loading an image, but the point is to exercise these code paths,
+         * not validate gdk-pixbuf as such.
+         */
+
+        infoWidth = Pixbuf.getFileInfoWidth("tests/prototype/MapleSyrup.jpg");
+        infoHeight = Pixbuf.getFileInfoHeight("tests/prototype/MapleSyrup.jpg");
+
+        assertEquals("File info width should be 200", 200, infoWidth);
+        assertEquals("File info height should be 398", 398, infoHeight);
+    }
+}
diff --git a/tests/bindings/org/gnome/gdk/ValidateKeyboardHandling.java b/tests/bindings/org/gnome/gdk/ValidateKeyboardHandling.java
new file mode 100644
index 0000000..ec6a3ef
--- /dev/null
+++ b/tests/bindings/org/gnome/gdk/ValidateKeyboardHandling.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gdk;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateKeyboardHandling extends GraphicalTestCase
+{
+    public final void testTheLetterA() {
+        assertNotNull(Keyval.a);
+        assertEquals(0x61, GdkKeyvalOverride.numOf(Keyval.a));
+    }
+
+    public final void testTheUnicodeOfA() {
+        assertEquals('a', Keyval.a.toUnicode());
+        assertEquals(0, Keyval.ControlRight.toUnicode());
+    }
+
+    public final void testSubclassInstantiateByName() {
+        final Keyval i;
+        /*
+         * This is a guess of a symbol that will NEVER be exposed in
+         * java-gnome :)
+         */
+        i = new Keyval("ISO_Level3_Latch");
+        assertEquals(0xFE04, GdkKeyvalOverride.numOf(i));
+    }
+
+    /**
+     * Beware that if you output this string to terminal, you'll only get
+     * "Hello". That was unexpected, hence this test, which shows that the
+     * data after \0 isn't lost (it would be in C), but \0 will screw up your
+     * output.
+     */
+    public final void testNullInString() {
+        final StringBuilder terminated;
+
+        terminated = new StringBuilder();
+
+        terminated.append("Hello");
+        terminated.append((char) 0);
+        terminated.append("World");
+
+        assertEquals("Hello\0World", terminated.toString());
+        assertEquals(11, terminated.length());
+    }
+
+    public final void testMaskingModifierType() {
+        ModifierType one, two, three, four, five;
+
+        one = ModifierType.CONTROL_MASK;
+        two = ModifierType.or(one, ModifierType.ALT_MASK);
+
+        assertTrue(two.contains(ModifierType.CONTROL_MASK));
+        assertTrue(two.contains(ModifierType.ALT_MASK));
+
+        three = ModifierType.mask(two, ModifierType.CONTROL_MASK);
+
+        assertFalse(three.contains(ModifierType.CONTROL_MASK));
+        assertTrue(three.contains(ModifierType.ALT_MASK));
+        assertTrue(three == ModifierType.ALT_MASK);
+
+        four = ModifierType.mask(three, ModifierType.ALT_MASK);
+        assertFalse(four.contains(ModifierType.ALT_MASK));
+        assertTrue(four == ModifierType.NONE);
+
+        five = ModifierType.mask(four, ModifierType.ALT_MASK);
+        assertTrue(five == ModifierType.NONE);
+    }
+}
diff --git a/tests/bindings/org/gnome/gdk/ValidateScreensAndDisplays.java b/tests/bindings/org/gnome/gdk/ValidateScreensAndDisplays.java
new file mode 100644
index 0000000..119823e
--- /dev/null
+++ b/tests/bindings/org/gnome/gdk/ValidateScreensAndDisplays.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gdk;
+
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.Window;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateScreensAndDisplays extends GraphicalTestCase
+{
+    /*
+     * This tests the workaround employed in Gdk.c to manually increase the
+     * ref count of the default GdkScreen; if that bug ever gets fixed and the
+     * workaround removed, this test should continue to work.
+     */
+    public final void testGdkLackingRefCountToDefaultScreenBug() {
+        final Window w;
+        Screen s;
+
+        w = new Window();
+
+        cycleMainLoop();
+
+        s = w.getScreen();
+        assertTrue(s.getHeight() > 0);
+        s = null;
+        cycleMainLoop();
+
+        cycleGarbageCollector();
+        // at this point, if we haven't crashed, that's a good thing.
+    }
+}
diff --git a/tests/bindings/org/gnome/glib/ValidateConstants.java b/tests/bindings/org/gnome/glib/ValidateConstants.java
new file mode 100644
index 0000000..0f4cf27
--- /dev/null
+++ b/tests/bindings/org/gnome/glib/ValidateConstants.java
@@ -0,0 +1,144 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.glib;
+
+import org.gnome.gdk.WindowState;
+import org.gnome.gtk.Calendar;
+import org.gnome.gtk.CalendarDisplayOptions;
+import org.gnome.gtk.FileChooser;
+import org.gnome.gtk.FileChooserAction;
+import org.gnome.gtk.FileChooserButton;
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Validate the handling of enums and flags.
+ * 
+ * @author Vreixo Formoso
+ */
+/*
+ * FIXME add validator for flags
+ */
+public class ValidateConstants extends GraphicalTestCase
+{
+    public final void testEnumHandling() {
+        FileChooser fc;
+        FileChooserAction action;
+
+        fc = new FileChooserButton("Test chooser", FileChooserAction.OPEN);
+
+        action = fc.getAction();
+        assertSame(FileChooserAction.OPEN, action);
+
+        fc.setAction(FileChooserAction.SELECT_FOLDER);
+
+        action = fc.getAction();
+        assertSame(FileChooserAction.SELECT_FOLDER, action);
+    }
+
+    public final void testFlagsHandling() {
+        Calendar cal;
+        CalendarDisplayOptions flags1;
+        CalendarDisplayOptions flags2;
+
+        cal = new Calendar();
+
+        /* single flag */
+        cal.setDisplayOptions(CalendarDisplayOptions.NO_MONTH_CHANGE);
+        flags1 = cal.getDisplayOptions();
+
+        assertSame(CalendarDisplayOptions.NO_MONTH_CHANGE, flags1);
+
+        /* OR two flags together */
+        cal.setDisplayOptions(CalendarDisplayOptions.or(CalendarDisplayOptions.NO_MONTH_CHANGE,
+                CalendarDisplayOptions.SHOW_DAY_NAMES));
+        flags1 = cal.getDisplayOptions();
+
+        /* and check */
+        assertSame(CalendarDisplayOptions.or(CalendarDisplayOptions.NO_MONTH_CHANGE,
+                CalendarDisplayOptions.SHOW_DAY_NAMES), flags1);
+        assertTrue(flags1.contains(CalendarDisplayOptions.NO_MONTH_CHANGE));
+        assertTrue(flags1.contains(CalendarDisplayOptions.SHOW_DAY_NAMES));
+        assertFalse(flags1.contains(CalendarDisplayOptions.SHOW_HEADING));
+        assertFalse(flags1.contains(CalendarDisplayOptions.SHOW_WEEK_NUMBERS));
+
+        /* tree flags ORing */
+        flags2 = CalendarDisplayOptions.or(flags1, CalendarDisplayOptions.SHOW_HEADING);
+        assertNotSame(flags1, flags2);
+
+        cal.setDisplayOptions(flags2);
+
+        flags1 = cal.getDisplayOptions();
+        assertSame(flags2, flags1);
+        assertSame(CalendarDisplayOptions.or(CalendarDisplayOptions.or(
+                CalendarDisplayOptions.NO_MONTH_CHANGE, CalendarDisplayOptions.SHOW_DAY_NAMES),
+                CalendarDisplayOptions.SHOW_HEADING), flags1);
+        assertTrue(flags1.contains(CalendarDisplayOptions.NO_MONTH_CHANGE));
+        assertTrue(flags1.contains(CalendarDisplayOptions.SHOW_DAY_NAMES));
+        assertTrue(flags1.contains(CalendarDisplayOptions.SHOW_HEADING));
+        assertFalse(flags1.contains(CalendarDisplayOptions.SHOW_WEEK_NUMBERS));
+    }
+
+    public final void testFlagsORing() {
+        WindowState flag1, flag2;
+
+        flag1 = WindowState.or(WindowState.ABOVE, WindowState.ICONIFIED);
+        flag2 = WindowState.or(WindowState.ABOVE, WindowState.ICONIFIED);
+
+        /* the same flag must not be created twice */
+        assertSame(flag1, flag2);
+
+        /*
+         * TODO I would like this to change to ABOVE|ICONIFIED
+         */
+        assertEquals("WindowState.ICONIFIED|ABOVE", flag1.toString());
+
+        /* check correct ORing */
+        assertTrue(flag1.contains(WindowState.ABOVE));
+        assertTrue(flag1.contains(WindowState.ICONIFIED));
+        assertFalse(flag1.contains(WindowState.WITHDRAWN));
+        assertFalse(flag1.contains(WindowState.MAXIMIZED));
+        assertFalse(flag1.contains(WindowState.STICKY));
+        assertFalse(flag1.contains(WindowState.FULLSCREEN));
+        assertFalse(flag1.contains(WindowState.BELOW));
+
+        /* a new one... */
+        flag2 = WindowState.or(WindowState.BELOW, WindowState.ICONIFIED);
+        assertNotSame(flag1, flag2);
+
+        /* both have WindowState.ICONIFIED in common */
+        assertTrue(flag1.contains(flag2));
+
+        /* ...and a final one */
+        flag2 = WindowState.or(WindowState.BELOW, WindowState.MAXIMIZED);
+        assertFalse(flag1.contains(flag2));
+
+        /* now OR with an already OR'ed flags */
+        flag2 = WindowState.or(WindowState.FULLSCREEN, flag1);
+        assertTrue(flag1.contains(flag2));
+
+        assertTrue(flag2.contains(WindowState.ABOVE));
+        assertTrue(flag2.contains(WindowState.ICONIFIED));
+        assertFalse(flag2.contains(WindowState.WITHDRAWN));
+        assertFalse(flag2.contains(WindowState.MAXIMIZED));
+        assertFalse(flag2.contains(WindowState.STICKY));
+        assertTrue(flag2.contains(WindowState.FULLSCREEN));
+        assertFalse(flag2.contains(WindowState.BELOW));
+    }
+}
diff --git a/tests/bindings/org/gnome/glib/ValidateGFileMethods.java b/tests/bindings/org/gnome/glib/ValidateGFileMethods.java
new file mode 100644
index 0000000..3d2d213
--- /dev/null
+++ b/tests/bindings/org/gnome/glib/ValidateGFileMethods.java
@@ -0,0 +1,43 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2012 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.glib;
+
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Investigate returns from our File class.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class ValidateGFileMethods extends GraphicalTestCase
+{
+    public final void testGFileInstanciation() {
+        final File file;
+
+        file = new File("/etc");
+        assertTrue(file != null);
+    }
+
+    public final void testGFilePath() {
+        final File file;
+
+        file = new File("/etc");
+        assertEquals("/etc", file.getPath());
+    }
+}
diff --git a/tests/bindings/org/gnome/glib/ValidateGListMethods.java b/tests/bindings/org/gnome/glib/ValidateGListMethods.java
new file mode 100644
index 0000000..24f00a6
--- /dev/null
+++ b/tests/bindings/org/gnome/glib/ValidateGListMethods.java
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.glib;
+
+import org.gnome.gtk.Button;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+
+/**
+ * Validate the behavior of methods that return a GList*, verifying the
+ * behaviour of the system used by java-gnome for converting that native
+ * GList*s into Java arrays.
+ * 
+ * @author Vreixo Formoso
+ */
+public class ValidateGListMethods extends GraphicalTestCase
+{
+    public final void testGetSingleGObjectChild() {
+        Button b;
+        VBox x;
+        Widget[] children;
+
+        b = new Button("Give me a brother, mum!");
+
+        x = new VBox(false, 3);
+
+        // add the button to the box.
+        x.add(b);
+
+        children = x.getChildren();
+
+        assertEquals(1, children.length);
+        assertSame(b, children[0]);
+    }
+
+    public final void testGetEmptyGObjectChildren() {
+        VBox x;
+        Widget[] children;
+
+        x = new VBox(false, 3);
+
+        children = x.getChildren();
+
+        assertNotNull(children);
+        assertEquals(0, children.length);
+    }
+
+    public final void testMultipleGObjectChildren() {
+        Button b1, b2;
+        VBox x;
+        Widget[] children;
+
+        b1 = new Button("Button1");
+        b2 = new Button("Button2");
+
+        x = new VBox(false, 3);
+
+        // add the first button to the box.
+        x.add(b1);
+
+        children = x.getChildren();
+
+        assertEquals(1, children.length);
+        assertSame(b1, children[0]);
+
+        // add the second button to the box.
+        x.add(b2);
+
+        children = x.getChildren();
+
+        assertEquals(2, children.length);
+
+        /*
+         * Vreixo asks if we can we make any assumptions about the order? Hard
+         * to say, really. Depends on what the actual internal storage type
+         * inside GtkContainer is for the children, and whether it preserves
+         * order. It appears to be a linked list, so the following test seems
+         * valid. Vreixo's original idea to test both possibilities is always
+         * something we can revert to if we have to.
+         */
+        // assertTrue((children[0] == b1 && children[1] == b2) || (children[1]
+        // == b1 && children[0] == b2));
+        assertTrue(children[0] == b1 && children[1] == b2);
+    }
+}
diff --git a/tests/bindings/org/gnome/glib/ValidateMemoryManagement.java b/tests/bindings/org/gnome/glib/ValidateMemoryManagement.java
new file mode 100644
index 0000000..5472c2b
--- /dev/null
+++ b/tests/bindings/org/gnome/glib/ValidateMemoryManagement.java
@@ -0,0 +1,406 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007      Vreixo Formoso Lopes
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.glib;
+
+import java.util.HashSet;
+
+import org.gnome.gtk.Button;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.TreeSelection;
+import org.gnome.gtk.TreeView;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.ValidatePacking;
+import org.gnome.gtk.ValidateProperties;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Validates memory management by checking many possibly conflicting
+ * situations. Note that some situations may exist that are not verified
+ * because they cannot be automatically checked from the Java side.
+ * 
+ * FIXME we need a way to check what is being occurred on C side!!
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public class ValidateMemoryManagement extends GraphicalTestCase
+{
+
+    /**
+     * Subclass Button to simplify automatic testing
+     */
+    private static class MyButton extends Button implements Button.Clicked
+    {
+        /*
+         * we need a static field to check object finalization. Of course,
+         * this not works if many instances are created with same code!!
+         */
+        static HashSet<Integer> finalized = new HashSet<Integer>();
+
+        private int code;
+
+        public MyButton(String text, int code) {
+            super(text);
+            this.code = code;
+        }
+
+        public int getCode() {
+            return code;
+        }
+
+        protected void finalize() {
+            finalized.add(new Integer(code));
+
+            /*
+             * I prefer having this commented, because it helps ensure that we
+             * have a robust design against bad user bad practises. Perhaps
+             * another test case can validate that once do a more robust
+             * design in that regard.
+             */
+            super.finalize();
+        }
+
+        // ignore
+        public void onClicked(Button source) {}
+
+    }
+
+    private static class MyHandler implements Button.Clicked
+    {
+        /*
+         * we need a static field to check object finalization. Of course,
+         * this not works if many instances are created with same code!!
+         */
+        static HashSet<Integer> finalized = new HashSet<Integer>();
+
+        private int code;
+
+        public MyHandler(int code) {
+            this.code = code;
+        }
+
+        protected void finalize() {
+            finalized.add(new Integer(code));
+        }
+
+        // ignore
+        public void onClicked(Button source) {}
+
+    }
+
+    /**
+     * Ensures that Java object is removed in the scenario when it is created
+     * but never used and then goes out of scope.
+     */
+    public final void testObjectNeverUsedIsRemoved() {
+        MyButton b;
+
+        b = new MyButton("Live free, die young!! Like me", 1);
+        b.getClass(); // supress warning
+
+        cycleMainLoop();
+
+        /* eliminate reference so object can go out of scope */
+        b = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* check if button has been deleted */
+        assertTrue("An object created but never used is not deleted",
+                MyButton.finalized.contains(new Integer(1)));
+    }
+
+    /**
+     * Ensure that a Java Proxy is <b>not</b> removed when the GObject it is
+     * proxying is still being used on C side
+     */
+    public final void testObjectNotRemovedWhenStillGtkAlive() {
+        MyButton b;
+        final VBox x;
+
+        x = new VBox(false, 3);
+        b = new MyButton("Old rockers never die!!", 2);
+
+        /* add button to VBox */
+        x.add(b);
+
+        cycleMainLoop();
+
+        /* object gets out of scope */
+        b = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* check that button hasn't been deleted */
+        assertFalse("Object deleted in Java but still alive in GTK",
+                MyButton.finalized.contains(new Integer(2)));
+    }
+
+    /**
+     * Ensure that a Java Proxy is removed when it goes out of scope on the
+     * Java side and when GTK has dropped all of its Refs to the GObject on
+     * the C side.
+     */
+    public final void testRemovingAfterNoLongerReachableInBothSides() {
+        MyButton b;
+        final VBox x;
+
+        x = new VBox(false, 3);
+        b = new MyButton("Ready to rock", 3);
+
+        /* add button to VBox */
+        x.add(b);
+
+        cycleMainLoop();
+
+        /* out of scope in Gtk+ */
+        x.remove(b);
+
+        cycleMainLoop();
+
+        /* out of scope in Java */
+        b = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* check that button has been deleted */
+        assertTrue("Object no more needed is not deleted", MyButton.finalized.contains(new Integer(3)));
+    }
+
+    /**
+     * We have a strong Java reference from the BindingsJavaClosure use by
+     * g_signal_connect() to the Java Signal subclass passed as the handler to
+     * Plumbing.connectSignal(). If the handler is the Proxy (self
+     * delegation), then we have a cyclic reference. This test creates that
+     * situation and tries to see if finalization occurs when the GObject ref
+     * count drops to 1 (our ToggleRef)
+     */
+    public final void testAvoidCyclicReferenceFromSignalHookup() {
+        MyButton b;
+        final VBox x;
+
+        x = new VBox(false, 3);
+        b = new MyButton("I will reference myself", 4);
+
+        /* connect button to itself. cyclic ref! */
+        b.connect(b);
+
+        cycleMainLoop();
+
+        /* add button to VBox */
+        x.add(b);
+
+        cycleMainLoop();
+
+        /* out of scope in Gtk+ */
+        x.remove(b);
+
+        cycleMainLoop();
+
+        /* out of scope in Java */
+        b = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* check that button has been deleted */
+        assertTrue("Reference from the signal handler to an Object where that Object is a" + "\n"
+                + "self-delegated signal handler was not cleared! This is, in effect, a cyclic" + "\n"
+                + "reference that is not being detected by our memory management mechanism.",
+                MyButton.finalized.contains(new Integer(4)));
+    }
+
+    /**
+     * When user connects a Signal handler, this object must not be deleted so
+     * long as the underlying Gtk+ widget still exists. This test checks that
+     * effectively this is the behavior, and also verifies that the handler is
+     * deleted when no longer needed.
+     */
+    public final void testSignalHandlerDeletion() {
+        MyButton b;
+        final VBox x;
+        MyHandler h;
+
+        x = new VBox(false, 3);
+        b = new MyButton("Button to watch for", 7);
+
+        h = new MyHandler(7);
+
+        /* connect button to handler */
+        b.connect(h);
+
+        /* add button to VBox */
+        x.add(b);
+
+        /* handler gets out of scope from user point of view */
+        h = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* check that handler has not been deleted */
+        assertFalse("Signal handler deleted while still in use.",
+                MyHandler.finalized.contains(new Integer(7)));
+
+        cycleMainLoop();
+
+        /* out of scope in Gtk+ */
+        x.remove(b);
+
+        cycleMainLoop();
+
+        /* out of scope in Java */
+        b = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* check that handler has been deleted */
+        assertTrue("Signal handler not deleted but no longer needed.",
+                MyHandler.finalized.contains(new Integer(7)));
+    }
+
+    /**
+     * Ensures no denaturation occurs, i.e., the Object retrieved from a GTK
+     * call is actually the same class (the same fully derived object) as the
+     * original object. In fact, it had better be <i>that</i> object.
+     */
+    /*
+     * This test is redundant, because we need not only prevent denaturation,
+     * but indeed get the _same_ object, which is tested below. Just keep this
+     * here to known better what is the problem if any
+     */
+    public final void testNoDenaturation() {
+        MyButton b;
+        Window w;
+        Widget c;
+
+        w = new Window();
+        b = new MyButton("To be or not to be...", 5);
+
+        /* add button to Window */
+        w.add(b);
+
+        cycleMainLoop();
+
+        /* get button from window */
+        c = w.getChild();
+
+        cycleMainLoop();
+
+        assertNotNull("Retrieved null from Window.getChild()", c);
+        assertTrue("Proxy retrieved for our MyButton subclass is not an instance of Button!",
+                c instanceof Button);
+        assertTrue("Proxy retrieved is a Button, not a MyButton instance. Denaturation occurred!",
+                c instanceof MyButton);
+
+        /* and finally we check object retrieved is the _same_ */
+        assertSame("A new Proxy was created when it should have been the already existing one", b, c);
+        /* now we delete our refs */
+        b = null;
+        c = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* get button again and check */
+        c = w.getChild();
+        assertTrue("Proxy retrieved after a reference collection cycle is not our" + "\n"
+                + "MyButton instance. Denaturation occurred?", c instanceof MyButton);
+
+    }
+
+    /**
+     * A new Java object should not be created when developer retrieves a
+     * previously referenced Widget from GTK. This is actually tested all over
+     * the framework; see {@link ValidatePacking#testGetChildAndParent()} and
+     * {@link ValidateProperties#testButtonReliefStyle()}; this test ensures
+     * main loop cycling and garbage collection does not interfere.
+     */
+    public final void testNoMultipleCreation() {
+        MyButton b;
+        final Window w;
+        Widget c;
+
+        w = new Window();
+        b = new MyButton("I don't wanna be Dolly", 6);
+
+        /* add button to Window */
+        w.add(b);
+
+        cycleMainLoop();
+
+        /* get button from window */
+        c = w.getChild();
+
+        assertNotNull("Retrieved a null object", c);
+        assertTrue("Not a MyButton instance", c instanceof MyButton);
+
+        /* and finally we check object retrieved is the _same_ */
+        assertSame("A different object was created", b, c);
+
+        /* now we delete our refs */
+        b = null;
+        c = null;
+
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /* get button again and check */
+        c = w.getChild();
+
+        assertNotNull("Retrieved a null object", c);
+        assertTrue("Not a MyButton instance", c instanceof MyButton);
+
+        assertEquals("A different object was created", 6, ((MyButton) c).getCode());
+    }
+
+    /**
+     * Check that objects that are created internally in Gtk+ are correctly
+     * managed.
+     */
+    public final void testCorrectHandlingOfGtkCreatedObjects() {
+        TreeView t;
+        @SuppressWarnings("unused")
+        TreeSelection s;
+
+        t = new TreeView();
+        cycleMainLoop();
+
+        /* get the selection, a Gtk+ created object */
+        s = t.getSelection();
+        cycleMainLoop();
+
+        /* free our ref */
+        s = null;
+        cycleMainLoop();
+        cycleGarbageCollector();
+
+        /*
+         * if all was correct, we can retrieve it again.
+         */
+        s = t.getSelection();
+        cycleMainLoop();
+    }
+}
diff --git a/tests/bindings/org/gnome/glib/ValidateReferenceCounting.java b/tests/bindings/org/gnome/glib/ValidateReferenceCounting.java
new file mode 100644
index 0000000..bde43c0
--- /dev/null
+++ b/tests/bindings/org/gnome/glib/ValidateReferenceCounting.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.glib;
+
+import org.gnome.gtk.Button;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.VBox;
+
+/**
+ * @author Andrew Cowie
+ */
+/*
+ * I'm really not that sure how to test this effectively, but in the course of
+ * debugging this test I uncovered a MASSIVE bug in the GObject code path, so
+ * it was worth something :)
+ */
+public class ValidateReferenceCounting extends GraphicalTestCase
+{
+    public final void testManuallyTwistingRefCount() {
+        Button b;
+        VBox x;
+
+        b = new Button("Reference counting");
+
+        x = new VBox(false, 3);
+
+        // sink the floating reference.
+        x.add(b);
+
+        // artificially remove java-gnome's reference to b. GObject should NOT
+        // finalize the object, because it's packed into a Container.
+        GObject.removeToggleRef(b);
+
+        System.gc();
+        // should not result in object being finalized, of course since we
+        // have a Java reference to it.
+
+        GObject.addToggleRef(b);
+        x.remove(b);
+        b = null;
+
+        System.gc();
+        // and with any luck, we haven't segfaulted, and the object finalized.
+        // TODO can anyone suggest how the hell to test this better?
+    }
+}
diff --git a/tests/bindings/org/gnome/glib/ValidateUtilityFunctions.java b/tests/bindings/org/gnome/glib/ValidateUtilityFunctions.java
new file mode 100644
index 0000000..9095ddc
--- /dev/null
+++ b/tests/bindings/org/gnome/glib/ValidateUtilityFunctions.java
@@ -0,0 +1,114 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.glib;
+
+import org.freedesktop.bindings.Environment;
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Investigate returns from various GLib utility functions.
+ * 
+ * @author Serkan Kaba
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ */
+public class ValidateUtilityFunctions extends GraphicalTestCase
+{
+    public final void testGetUserName() {
+        String str;
+        final String userNameEnvironment, userNameGlib;
+
+        str = Environment.getEnv("USERNAME");
+        if (str == null) {
+            str = Environment.getEnv("USER");
+        }
+        if (str == null) {
+            str = Environment.getEnv("LOGNAME");
+        }
+        if (str == null) {
+            fail("No USERNAME or USER in environment?");
+        }
+
+        userNameEnvironment = str;
+        userNameGlib = Glib.getUserName();
+
+        assertEquals(userNameEnvironment, userNameGlib);
+    }
+
+    /*
+     * This is probably fragile; after all, the idea is that this is variable
+     * and from the environment. But it's actually one of those
+     * "you know what it is anyway" things. So be it.
+     */
+    public final void testGetUserConfigDir() {
+        final String home, conf;
+
+        home = System.getProperty("user.home");
+
+        conf = Glib.getUserConfigDir();
+
+        assertNotNull(conf);
+        assertEquals(home + "/.config", conf);
+    }
+
+    public final void testFormatSizeForDisplay() {
+        String result;
+
+        result = Glib.formatSize(1000);
+        assertEquals("1.0 kB", result);
+
+        result = Glib.formatSize(1000 * 1000);
+        assertEquals("1.0 MB", result);
+
+        result = Glib.formatSize(1000 * 1000 * 1000);
+        assertEquals("1.0 GB", result);
+
+        result = Glib.formatSize(1024, FormatSizeFlags.IEC_UNITS);
+        assertEquals("1.0 KiB", result);
+
+        result = Glib.formatSize(1024 * 1024, FormatSizeFlags.IEC_UNITS);
+        assertEquals("1.0 MiB", result);
+
+        result = Glib.formatSize(1024 * 1024 * 1024, FormatSizeFlags.IEC_UNITS);
+        assertEquals("1.0 GiB", result);
+    }
+
+    public final void testMarkupEscapeText() {
+        String result;
+
+        result = Glib.markupEscapeText("Hello");
+        assertEquals("Hello", result);
+
+        result = Glib.markupEscapeText("& World");
+        assertEquals("& World", result);
+
+        result = Glib.markupEscapeText("Team > Me");
+        assertEquals("Team > Me", result);
+
+        result = Glib.markupEscapeText("I < Team");
+        assertEquals("I < Team", result);
+    }
+
+    public final void testMarkupEscapeWhitespace() {
+        String result;
+
+        result = Glib.markupEscapeText("Goodbye\tCruel\nWorld");
+        assertEquals("Goodbye\tCruel\nWorld", result);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/GraphicalTestCase.java b/tests/bindings/org/gnome/gtk/GraphicalTestCase.java
new file mode 100644
index 0000000..884f09f
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/GraphicalTestCase.java
@@ -0,0 +1,280 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/*
+ * The virtual X server initialization code adapted from the graphical test
+ * harness in Quill and Parchment's tests/quill/ui/GraphicalTestCase.java,
+ * 
+ * Copyright © 2009-2011      Operational Dynamics Consulting, Pty Ltd and Others
+ * 
+ * and licenced under the terms of the "GNU General Public Licence, version
+ * 2" only.
+ * 
+ * Thanks to Mariano Suárez-Alvarez and Rémi Cardona for their guidance on a
+ * technique to find an available X display number.
+ */
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.freedesktop.bindings.Debug;
+import org.gnome.gdk.Event;
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+
+import static java.lang.Thread.sleep;
+
+/**
+ * Ensure that GTK has already been initialized so that things like
+ * <code>new Button()</code> don't throw <code>UnsatisfiedLinkError</code>.
+ * 
+ * @author Andrew Cowie
+ */
+public abstract class GraphicalTestCase extends TestCase
+{
+    private static boolean initialized;
+
+    private static Process virtual;
+
+    static {
+        initialized = false;
+    }
+
+    /**
+     * If you try to run a single Test Case (rather than using the top level
+     * UnitTests launcher), then you need to initialize GTK (and GLib along
+     * with it). This will take care of that as all JUnit test cases are
+     * instantiated once for each text fixture.
+     */
+    protected GraphicalTestCase() {
+        if (initialized) {
+            checkVirtualServerRunning();
+        } else {
+            setupVirtualServerAndToolkit();
+        }
+    }
+
+    private static void setupVirtualServerAndToolkit() {
+        final int MAX = 30;
+        int i;
+        File target;
+        final String DISPLAY;
+        final Runtime runtime;
+
+        try {
+            /*
+             * This seems quite the kludge, but apparently this is the
+             * algorithm used by X itself to find an available display number.
+             * It's also used by Gentoo's virtualx eclass.
+             */
+
+            for (i = 0; i < MAX; i++) {
+                target = new File("/tmp/.X" + i + "-lock");
+                if (!(target.exists())) {
+                    break;
+                }
+            }
+            if (i == MAX) {
+                fail("\n" + "Can't find an available X server display number to use");
+            }
+            DISPLAY = ":" + i;
+
+            /*
+             * Xvfb arguments:
+             * 
+             * -ac disable access control (necessary so that other program can
+             * draw there)
+             * 
+             * -wr white background
+             * 
+             * -fp built-ins workaround "fixed" font not being present.
+             * 
+             * Also, don't try to force Xvfb to 32 bits per pixed in -screen;
+             * for some reason this makes it unable to start.
+             */
+
+            runtime = Runtime.getRuntime();
+
+            virtual = runtime.exec("/usr/bin/Xvfb " + DISPLAY
+                    + " -ac -dpi 96 -screen 0 800x600x24 -wr -fp built-ins");
+
+            sleep(100);
+
+            checkVirtualServerRunning();
+
+            /*
+             * Attempt to terminate the virtual X server when the tests are
+             * complete. This is far from bullet proof. It would be better if
+             * we knew when all the tests were done running and called
+             * destroy() then.
+             */
+
+            runtime.addShutdownHook(new Thread() {
+                public void run() {
+                    if (virtual == null) {
+                        return;
+                    }
+                    try {
+                        virtual.destroy();
+                        virtual.waitFor();
+                    } catch (InterruptedException e) {
+                        // already exiting
+                    }
+                }
+            });
+
+            /*
+             * Finally, initialize GTK. We close stderr to prevent noise from
+             * Xlib (as used by GTK) about "XRANR not being available". This
+             * of course means we're missing anything else to stderr. That
+             * seems like a bad idea, but what else can we do?
+             */
+
+            System.err.close();
+
+            Gtk.init(new String[] {
+                "--display=" + DISPLAY
+            });
+
+            initialized = true;
+        } catch (IOException ioe) {
+            fail("Unexpected I/O problem: " + ioe.getMessage());
+        } catch (InterruptedException ie) {
+            fail("How did this Thread get interrupted?");
+        }
+
+    }
+
+    private static void checkVirtualServerRunning() {
+        final String msg;
+
+        msg = "\n" + "Xvfb not running!";
+
+        if (virtual == null) {
+            fail(msg);
+        }
+        try {
+            virtual.exitValue();
+            fail(msg);
+        } catch (IllegalThreadStateException itse) {
+            // good
+        }
+    }
+
+    /*
+     * If you override this and you are debugging, you'd probably better call
+     * <code>super.setUp()</code>.
+     */
+    public void setUp() {
+        System.out.flush();
+    }
+
+    public void tearDown() {
+        if (Debug.MEMORY_MANAGEMENT) {
+            System.gc();
+            System.err.flush();
+        }
+        System.out.flush();
+    }
+
+    /**
+     * Iterates the main loop through how ever many events are pending, and
+     * then returns. This way, unit tests that need to have the main loop
+     * "run" to evaluate whether or not something worked can cause those
+     * iterations to take place.
+     */
+    protected static void cycleMainLoop() {
+        /*
+         * Lead off with one iteration no matter what. Pending events aren't
+         * the only thing that the main loop does! Then continue by working
+         * off whatever has accumulated.
+         * 
+         * The business with the yields and sleeps is a bit of a stab in the
+         * dark. I'm not sure why some tests fail without this - and we keep
+         * having to tweak it further. It'd be nice not to have to mess with
+         * this (other than the fact that we shouldn't really have to do this
+         * at all except that we can't fire off a main loop for real).
+         */
+        do {
+            try {
+                Thread.yield();
+                Thread.sleep(25);
+
+                GtkMain.mainIterationDo(false);
+
+                Thread.yield();
+                Thread.sleep(25);
+            } catch (InterruptedException e) {
+                //
+            }
+        } while (GtkMain.eventsPending());
+    }
+
+    /**
+     * Iterate the garbage collector. Of course, some platforms ignore this,
+     * which is going to make the unit tests which depend on it running
+     * somewhat difficult to pass. Too bad.
+     */
+    protected static void cycleGarbageCollector() {
+        System.gc();
+        try {
+            /*
+             * this is needed because GC runs asynchronously on some
+             * platforms. So we make sure it has an opportunity to run.
+             */
+            Thread.sleep(100);
+        } catch (InterruptedException e) {
+            // ignore
+        }
+    }
+
+    /**
+     * Just for hacking... sometimes when you're creating a unit test you need
+     * to see it run to make sure it looks the way it should before probing
+     * its qualities.
+     */
+    protected static void runMainLoop(Window w) {
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+        Gtk.main();
+        System.exit(0);
+    }
+
+    /**
+     * Send a keystroke to the given Widget. It has to be packed in a Window,
+     * show()n and not minimized.
+     */
+    /*
+     * Exposing these on Test is not yet a given, so use our own direct call
+     * to the functions on GtkTest, and while we're at it throw in a few
+     * sanity checks.
+     */
+    protected static boolean sendKeystroke(Widget widget, Keyval keyval, ModifierType modifiers) {
+        assertTrue(widget.getToplevel() instanceof Window);
+        assertTrue(widget.getAllocation().getWidth() > 0);
+        return GtkTest.widgetSendKey(widget, keyval, modifiers);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateArrow.java b/tests/bindings/org/gnome/gtk/ValidateArrow.java
new file mode 100644
index 0000000..046bf8c
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateArrow.java
@@ -0,0 +1,39 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test Arrow constructor and properties.
+ * 
+ * @author Serkan Kaba
+ */
+public class ValidateArrow extends GraphicalTestCase
+{
+    public final void testArrow() {
+        final Arrow arrow;
+
+        arrow = new Arrow(ArrowType.UP, ShadowType.NONE);
+        assertEquals(arrow.getArrowType(), ArrowType.UP);
+        assertEquals(arrow.getShadowType(), ShadowType.NONE);
+        arrow.setArrowType(ArrowType.LEFT);
+        arrow.setShadowType(ShadowType.ETCHED_IN);
+        assertEquals(arrow.getArrowType(), ArrowType.LEFT);
+        assertEquals(arrow.getShadowType(), ShadowType.ETCHED_IN);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateAssistant.java b/tests/bindings/org/gnome/gtk/ValidateAssistant.java
new file mode 100644
index 0000000..650c255
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateAssistant.java
@@ -0,0 +1,186 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test setting up an Assistant. Unfortunately you can't test
+ * 
+ * @author Stefan Prelle
+ */
+public class ValidateAssistant extends GraphicalTestCase
+{
+    public final void testAddingPages() {
+        final Assistant druid;
+        final Label page1, page2, page3;
+
+        druid = new Assistant();
+        page1 = new Label("Page1");
+        page2 = new Label("Page1");
+        page3 = new Label("Page1");
+        druid.appendPage(page1);
+        druid.appendPage(page2);
+        druid.appendPage(page3);
+
+        assertEquals(3, druid.getNumPages());
+        assertEquals(page3, druid.getPage(2));
+        assertEquals(page2, druid.getPage(1));
+        assertEquals(page1, druid.getPage(0));
+
+        // Append another time
+        try {
+            druid.appendPage(page1);
+            fail("Already in Assistant - should fail");
+        } catch (Throwable e) {
+            // OK
+        }
+    }
+
+    public final void testInsertingPages() {
+        final Assistant druid;
+        final Label page1, page2, page3;
+
+        druid = new Assistant();
+        page1 = new Label("Page1");
+        page2 = new Label("Page1");
+        page3 = new Label("Page1");
+        druid.appendPage(page1);
+        druid.appendPage(page2);
+        druid.insertPage(page3, 1);
+
+        assertEquals(3, druid.getNumPages());
+        assertEquals(page1, druid.getPage(0));
+        assertEquals(page3, druid.getPage(1));
+        assertEquals(page2, druid.getPage(2));
+
+        // Append another time
+        try {
+            druid.insertPage(page1, 1);
+            fail("Already in Assistant - should fail");
+        } catch (Throwable e) {
+            // OK
+        }
+    }
+
+    public final void testPrependingPages() {
+        final Assistant druid;
+        final Label page1, page2, page3;
+
+        druid = new Assistant();
+        page1 = new Label("Page1");
+        page2 = new Label("Page1");
+        page3 = new Label("Page1");
+        druid.prependPage(page1);
+        druid.prependPage(page2);
+        druid.prependPage(page3);
+
+        assertEquals(3, druid.getNumPages());
+        assertEquals(page3, druid.getPage(0));
+        assertEquals(page2, druid.getPage(1));
+        assertEquals(page1, druid.getPage(2));
+
+        // Append another time
+        try {
+            druid.prependPage(page1);
+            fail("Already in Assistant - should fail");
+        } catch (Throwable e) {
+            // OK
+        }
+    }
+
+    public void testPrepareForDisplay() {
+        final Assistant druid;
+        final Label page1, page2, page3;
+
+        druid = new Assistant();
+        page1 = new Label("Page1");
+        page2 = new Label("Page1");
+        page3 = new Label("Page1");
+        druid.appendPage(page1);
+        druid.appendPage(page2);
+        druid.appendPage(page3);
+
+        try {
+            druid.checkReadyForDisplay();
+            fail("Should be missing types");
+        } catch (Throwable e) {
+            // OK
+        }
+
+        druid.setPageType(page3, AssistantPageType.CONFIRM);
+        druid.checkReadyForDisplay();
+
+        druid.setPageType(page3, AssistantPageType.SUMMARY);
+        druid.checkReadyForDisplay();
+
+        druid.setPageType(page3, AssistantPageType.CONTENT);
+        try {
+            druid.checkReadyForDisplay();
+            fail("Should be missing types");
+        } catch (Throwable e) {
+            // OK
+        }
+    }
+
+    public void testForwardPageSignal() {
+        final Assistant druid;
+        final Label page1, page2, page3, page4;
+        final int nextPage1, nextPage2;
+
+        druid = new Assistant();
+        page1 = new Label("Page1");
+        page2 = new Label("Page2");
+        page3 = new Label("Page3");
+        page4 = new Label("Page4");
+        druid.appendPage(page1);
+        druid.appendPage(page2);
+        druid.appendPage(page3);
+        druid.appendPage(page4);
+
+        druid.setPageType(page1, AssistantPageType.INTRO);
+        druid.setPageType(page2, AssistantPageType.CONTENT);
+        druid.setPageType(page3, AssistantPageType.CONTENT);
+        druid.setPageType(page4, AssistantPageType.SUMMARY);
+
+        druid.setForwardPageCallback(new Assistant.ForwardPage() {
+            public int onForward(Assistant source, int currentPage) {
+                int next;
+
+                switch (currentPage) {
+                case 1:
+                    next = 3;
+                    break;
+                case 2:
+                    next = 1;
+                    break;
+                default:
+                    next = (currentPage + 1);
+                    break;
+                }
+
+                return next;
+            }
+        });
+
+        nextPage1 = druid.emitForwardPage(1);
+        assertEquals(3, nextPage1);
+
+        nextPage2 = druid.emitForwardPage(2);
+        assertEquals(1, nextPage2);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateComboBox.java b/tests/bindings/org/gnome/gtk/ValidateComboBox.java
new file mode 100644
index 0000000..efc1419
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateComboBox.java
@@ -0,0 +1,149 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * ComboBox is full of insane nastiness. Test our binding of it here.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateComboBox extends GraphicalTestCase
+{
+    public final void testConstructor() {
+        final ListStore model;
+        final DataColumnString column;
+        final ComboBox combo;
+        TreeIter row;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString(),
+        });
+
+        combo = new ComboBox(model);
+
+        row = model.appendRow();
+        model.setValue(row, column, "One");
+        row = model.appendRow();
+        model.setValue(row, column, "Two");
+        row = model.appendRow();
+        model.setValue(row, column, "Three");
+
+        combo.setActive(2);
+        assertEquals(2, combo.getActive());
+
+        row = combo.getActiveIter();
+
+        assertEquals("Three", model.getValue(row, column));
+    }
+
+    public final void testComboTextSubclass() {
+        final ComboBoxText combo;
+        final TreeModel model;
+
+        combo = new ComboBoxText();
+        model = combo.getModel();
+
+        assertEquals(0, sizeOfModel(model));
+
+        combo.appendText("World");
+        assertEquals(1, sizeOfModel(model));
+
+        combo.prependText("Hello");
+        assertEquals(2, sizeOfModel(model));
+
+        combo.setActive(0);
+        assertEquals("Hello", combo.getActiveText());
+        combo.setActive(1);
+        assertEquals("World", combo.getActiveText());
+
+        combo.insertText(1, "big");
+        assertEquals("World", combo.getActiveText());
+
+        assertEquals(3, sizeOfModel(model));
+        combo.setActive(1);
+        assertEquals("big", combo.getActiveText());
+    }
+
+    private static int sizeOfModel(final TreeModel model) {
+        int size;
+        TreeIter row;
+
+        size = 0;
+
+        row = model.getIterFirst();
+        if (row == null) {
+            return 0;
+        }
+
+        do {
+            size++;
+        } while (row.iterNext());
+
+        return size;
+    }
+
+    public final void skipExtractEntry() {
+        final ComboBoxText combo1;
+        final Widget w;
+        final Entry e;
+
+        combo1 = new ComboBoxText();
+
+        combo1.appendText("espresso");
+
+        w = combo1.getChild();
+        assertTrue(w instanceof Entry);
+
+        e = (Entry) w;
+        assertEquals("", e.getText());
+
+        combo1.setActive(0);
+        assertEquals("espresso", e.getText());
+    }
+
+    public final void skipModelBackingEntry() {
+        final ListStore model;
+        final DataColumnString column;
+        TreeIter row;
+        final ComboBox combo;
+        final Entry entry;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString(),
+        });
+
+        combo = new ComboBox(model);
+
+        row = model.appendRow();
+        model.setValue(row, column, "One");
+        row = model.appendRow();
+        model.setValue(row, column, "Two");
+        row = model.appendRow();
+        model.setValue(row, column, "Three");
+
+        assertEquals(3, sizeOfModel(model));
+
+        entry = (Entry) combo.getChild();
+        assertEquals("", entry.getText());
+
+        combo.setActiveIter(row);
+        assertEquals(2, combo.getActive());
+        assertEquals("Three", entry.getText());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateEntry.java b/tests/bindings/org/gnome/gtk/ValidateEntry.java
new file mode 100644
index 0000000..53a7d90
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateEntry.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test coverage of Entry icon and progress methods.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ */
+public class ValidateEntry extends GraphicalTestCase
+{
+    public final void skipEntryIcon() {
+        final Entry entry;
+
+        entry = new Entry();
+
+        entry.setIconFromStock(EntryIconPosition.PRIMARY, Stock.FIND);
+        assertSame(Stock.FIND, entry.getIconStock(EntryIconPosition.PRIMARY));
+        assertSame(ImageType.STOCK, entry.getIconStorageType(EntryIconPosition.PRIMARY));
+
+        entry.setIconFromStock(EntryIconPosition.SECONDARY, Stock.CLEAR);
+        assertSame(Stock.CLEAR, entry.getIconStock(EntryIconPosition.SECONDARY));
+        assertSame(ImageType.STOCK, entry.getIconStorageType(EntryIconPosition.SECONDARY));
+
+        entry.setIconFromPixbuf(EntryIconPosition.PRIMARY, null);
+        assertSame(null, entry.getIconPixbuf(EntryIconPosition.PRIMARY));
+        assertSame(ImageType.EMPTY, entry.getIconStorageType(EntryIconPosition.PRIMARY));
+    }
+
+    public final void testEntryProgress() {
+        final Entry entry;
+
+        entry = new Entry();
+
+        entry.setProgressFraction(0.5);
+        assertEquals(0.5, entry.getProgressFraction());
+
+        entry.setProgressPulseStep(0.1);
+        assertEquals(0.1, entry.getProgressPulseStep());
+    }
+
+    public final void testEntryPosition() {
+        final Entry entry;
+        final int result, start, end;
+
+        entry = new Entry();
+
+        entry.setText("Hello world");
+        entry.setPosition(6);
+
+        result = entry.getPosition();
+        assertEquals(6, result);
+
+        entry.selectRegion(6, 10);
+
+        start = entry.getSelectionBoundsStart();
+        end = entry.getSelectionBoundsEnd();
+        assertEquals(6, start);
+        assertEquals(10, end);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateEntryCompletion.java b/tests/bindings/org/gnome/gtk/ValidateEntryCompletion.java
new file mode 100644
index 0000000..d7ec16a
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateEntryCompletion.java
@@ -0,0 +1,229 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test coverage of EntryCompletion object.
+ * 
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ */
+public class ValidateEntryCompletion extends GraphicalTestCase
+{
+    public final void testConstructor() {
+        final Entry entry;
+        final String[] words;
+        final EntryCompletion completion;
+        final DataColumnString column;
+        final ListStore model;
+        TreeIter row = null;
+
+        entry = new Entry();
+        completion = new EntryCompletion();
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+
+        completion.setModel(model);
+        completion.setTextColumn(column);
+        entry.setCompletion(completion);
+
+        words = new String[] {
+            "abc",
+            "def",
+            "ghi",
+            "jkl",
+            "mno",
+            "pqr",
+            "stu",
+            "vwx",
+            "yz"
+        };
+
+        for (String word : words) {
+            row = model.appendRow();
+            model.setValue(row, column, word);
+        }
+
+        assertSame(String.class, column.getType());
+        assertSame(0, column.getOrdinal());
+        assertEquals("yz", model.getValue(row, column));
+    }
+
+    public final void testExtractModel() {
+        final ListStore model;
+        final EntryCompletion completion;
+        final TreeModel extracted;
+
+        completion = new EntryCompletion();
+        assertNull(completion.getModel());
+
+        model = new ListStore(new DataColumn[] {
+            new DataColumnString()
+        });
+
+        completion.setModel(model);
+
+        extracted = completion.getModel();
+        assertNotNull(extracted);
+        assertTrue(extracted instanceof ListStore);
+        assertSame(model, extracted);
+    }
+
+    public final void testExtractEntry() {
+        final Entry entry;
+        final EntryCompletion completion;
+        final Entry extracted;
+
+        entry = new Entry();
+        completion = new EntryCompletion();
+
+        entry.setCompletion(completion);
+
+        extracted = completion.getEntry();
+        assertSame(entry, extracted);
+    }
+
+    public final void testCompleteEntry() {
+        final Entry entry;
+        final EntryCompletion completion;
+        final DataColumnString column;
+        final ListStore model;
+        final String[] words;
+        TreeIter row;
+
+        entry = new Entry();
+        completion = new EntryCompletion();
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+
+        completion.setModel(model);
+        completion.setTextColumn(column);
+        entry.setCompletion(completion);
+
+        words = new String[] {
+            "abc",
+            "def",
+            "ghi",
+            "jkl",
+            "mno",
+            "pqr",
+            "stu",
+            "vwx",
+            "yz"
+        };
+
+        for (String word : words) {
+            row = model.appendRow();
+            model.setValue(row, column, word);
+        }
+
+        assertTrue(completion.getPopupCompletion());
+        completion.setPopupCompletion(false);
+        assertFalse(completion.getPopupCompletion());
+
+        assertTrue(completion.getPopupSingleMatch());
+        completion.setPopupSingleMatch(false);
+        assertFalse(completion.getPopupSingleMatch());
+
+        assertFalse(completion.getInlineCompletion());
+        completion.setInlineCompletion(true);
+        assertTrue(completion.getInlineCompletion());
+
+        assertFalse(completion.getInlineSelection());
+        completion.setInlineSelection(true);
+        assertTrue(completion.getInlineSelection());
+        completion.setInlineSelection(false);
+        assertFalse(completion.getInlineSelection());
+
+        entry.setText("a");
+        completion.insertPrefix();
+        assertEquals("a", entry.getText());
+
+        completion.emitMatchSelected(model.getIterFirst());
+        assertEquals("abc", entry.getText());
+    }
+
+    private TreeIter completionIter;
+
+    public final void testMatching() {
+        final Entry entry;
+        final EntryCompletion completion;
+        final DataColumnString column;
+        final ListStore model;
+        final String[] words;
+        TreeIter row;
+
+        entry = new Entry();
+        completion = new EntryCompletion();
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+
+        completion.setModel(model);
+        completion.setTextColumn(column);
+        entry.setCompletion(completion);
+
+        words = new String[] {
+            "Sydney, Australia",
+            "Toronto, Canada",
+            "New York, USA",
+            "London, UK"
+        };
+
+        for (String word : words) {
+            row = model.appendRow();
+            model.setValue(row, column, word);
+        }
+
+        completion.setMatchCallback(new EntryCompletion.Match() {
+            public boolean onMatch(EntryCompletion source, String key, TreeIter iter) {
+                final String text, lower;
+                boolean result;
+
+                text = model.getValue(iter, column);
+                lower = text.toLowerCase();
+                result = lower.contains(key);
+
+                if (result) {
+                    completionIter = iter;
+                }
+
+                return result;
+            }
+        });
+
+        entry.setText("C");
+        completion.complete();
+        completion.insertPrefix();
+
+        /*
+         * Did the item we expected get selected?
+         */
+
+        assertNotNull(completionIter);
+        completion.emitMatchSelected(completionIter);
+
+        assertEquals("Toronto, Canada", entry.getText());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateFileChoosing.java b/tests/bindings/org/gnome/gtk/ValidateFileChoosing.java
new file mode 100644
index 0000000..8ff75d1
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateFileChoosing.java
@@ -0,0 +1,101 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Test the use of interface FileChooser in FileChooserButton.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateFileChoosing extends GraphicalTestCase
+{
+    public final void testCurrentFolder() {
+        final FileChooserButton fcb;
+        String dir = null;
+
+        fcb = new FileChooserButton("Testing folder selection", FileChooserAction.OPEN);
+
+        fcb.setCurrentFolder("/tmp");
+
+        cycleMainLoop();
+
+        dir = fcb.getCurrentFolder();
+        assertEquals("Directory retrieved does not match that set programatically.", "/tmp", dir);
+        /*
+         * A failure here could be because the main loop did not iterate
+         * sufficiently, or perhaps the target doesn't exist, or...
+         */
+    }
+
+    public final void testSettingFilename() {
+        final FileChooserDialog fcd;
+        String retreived;
+
+        fcd = new FileChooserDialog("", null, FileChooserAction.OPEN);
+        cycleMainLoop();
+        fcd.setCurrentFolder("/");
+        cycleMainLoop();
+        assertEquals("/", fcd.getCurrentFolder());
+
+        assertTrue(fcd.setFilename("/etc/passwd"));
+
+        cycleMainLoop();
+        assertEquals("/etc", fcd.getCurrentFolder());
+
+        do {
+            cycleMainLoop();
+            retreived = fcd.getFilename();
+        } while (retreived == null);
+        assertEquals("/etc/passwd", retreived);
+    }
+
+    public void testAbsolutePathEnforcement() throws IOException {
+        final FileChooserDialog fcd;
+        final FileChooserButton fcb;
+
+        assertEquals("/etc/passwd", new File("/etc/../etc/passwd").getCanonicalPath());
+
+        fcd = new FileChooserDialog("", null, FileChooserAction.OPEN);
+        fcd.setCurrentFolder("/etc");
+        cycleMainLoop();
+        assertEquals("/etc", fcd.getCurrentFolder());
+
+        try {
+            assertTrue(fcd.setFilename("shadow"));
+            fail("Should have thrown Exception");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        fcb = new FileChooserButton("", FileChooserAction.OPEN);
+        fcb.setCurrentFolder("/etc");
+        cycleMainLoop();
+        assertEquals("/etc", fcb.getCurrentFolder());
+
+        try {
+            assertTrue(fcb.setFilename("shadow"));
+            fail("Should have thrown Exception");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateGlobalSettings.java b/tests/bindings/org/gnome/gtk/ValidateGlobalSettings.java
new file mode 100644
index 0000000..2cc92c1
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateGlobalSettings.java
@@ -0,0 +1,129 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.lang.reflect.Method;
+
+import org.gnome.gdk.Screen;
+
+/**
+ * Test GtkSettings
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateGlobalSettings extends GraphicalTestCase
+{
+    /*
+     * Screen.getDefault() isn't public [will it ever be?].
+     */
+    private static Screen introspectDefaultScreen() {
+        final Method method;
+        java.lang.Object result;
+
+        try {
+            method = Screen.class.getDeclaredMethod("getDefault", new Class<?>[] {});
+            method.setAccessible(true);
+            result = method.invoke(null, new java.lang.Object[] {});
+            return (Screen) result;
+        } catch (Exception e) {
+            fail(e.toString());
+            return null;
+        }
+
+    }
+
+    public final void testFactory() {
+        final Settings s1, s2;
+        final Screen screen;
+
+        s1 = Gtk.getSettings();
+
+        screen = introspectDefaultScreen();
+        s2 = GtkSettings.getForScreen(screen);
+
+        assertSame(s1, s2);
+    }
+
+    public final void testShowImagesOnButtons() {
+        final Settings settings;
+
+        settings = Gtk.getSettings();
+
+        assertTrue(settings.getButtonImages());
+        settings.setButtonImages(false);
+        assertFalse(settings.getButtonImages());
+        settings.setButtonImages(true);
+        assertTrue(settings.getButtonImages());
+    }
+
+    public final void testShowImagesInMenus() {
+        final Settings settings;
+        final ImageMenuItem quit;
+
+        settings = Gtk.getSettings();
+
+        /*
+         * Amazingly, GtkSettings properties are dynamic at runtime; it's
+         * GtkImageMenuItem's gtk_image_menu_item_class_init() that installs
+         * the required property.
+         */
+
+        quit = new ImageMenuItem(Stock.QUIT);
+        quit.getName();
+
+        /*
+         * So hooray, now we should be able to call the getter and setter and
+         * not have GLib die for lack of a GParamSpec.
+         */
+
+        assertTrue(settings.getMenuImages());
+        settings.setMenuImages(false);
+        assertFalse(settings.getMenuImages());
+        settings.setMenuImages(true);
+        assertTrue(settings.getMenuImages());
+    }
+
+    public final void testShowInputMethodMenu() {
+        final Settings settings;
+
+        settings = Gtk.getSettings();
+
+        assertTrue(settings.getShowInputMethodMenu());
+
+        settings.setShowInputMethodMenu(false);
+        assertFalse(settings.getShowInputMethodMenu());
+
+        settings.setShowInputMethodMenu(true);
+        assertTrue(settings.getShowInputMethodMenu());
+    }
+
+    public final void testShowUnicodeMenu() {
+        final Settings settings;
+
+        settings = Gtk.getSettings();
+
+        assertTrue(settings.getShowUnicodeMenu());
+
+        settings.setShowUnicodeMenu(false);
+        assertFalse(settings.getShowUnicodeMenu());
+
+        settings.setShowUnicodeMenu(true);
+        assertTrue(settings.getShowUnicodeMenu());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateIconView.java b/tests/bindings/org/gnome/gtk/ValidateIconView.java
new file mode 100644
index 0000000..673d481
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateIconView.java
@@ -0,0 +1,102 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ * @author Guillaume Mazoyer
+ */
+public class ValidateIconView extends GraphicalTestCase
+{
+    public final void testValidateAutomaticProperties() {
+        final ListStore model;
+        final IconView view;
+
+        model = new ListStore(new DataColumn[] {
+            new DataColumnPixbuf(),
+            new DataColumnString()
+        });
+
+        view = new IconView(model);
+
+        try {
+            view.setColumns(-2);
+            fail("Should have thrown");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            view.setColumns(0);
+            fail("Should have thrown");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        view.setColumns(-1);
+        view.setColumns(6);
+
+        try {
+            view.setItemWidth(-2);
+            fail("Should have thrown");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            view.setItemWidth(0);
+            fail("Should have thrown");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        view.setItemWidth(-1);
+        view.setItemWidth(100);
+    }
+
+    public final void testValidateSelection() {
+        final ListStore model;
+        final IconView view;
+        final DataColumnPixbuf pixbuf;
+        final DataColumnString text;
+
+        TreeIter row;
+        TreePath path;
+
+        model = new ListStore(new DataColumn[] {
+            pixbuf = new DataColumnPixbuf(),
+            text = new DataColumnString()
+        });
+
+        view = new IconView(model);
+
+        row = model.appendRow();
+        model.setValue(row, pixbuf, null);
+        model.setValue(row, text, "test_case");
+
+        path = new TreePath("0");
+        view.selectPath(path);
+
+        assertEquals(1, view.getSelectedItems().length);
+        assertTrue(view.isSelected(path));
+
+        view.unselectPath(path);
+        assertFalse(view.isSelected(path));
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateInputMethods.java b/tests/bindings/org/gnome/gtk/ValidateInputMethods.java
new file mode 100644
index 0000000..3afdc16
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateInputMethods.java
@@ -0,0 +1,205 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.EventKey;
+import org.gnome.gdk.Keyval;
+import org.gnome.gdk.ModifierType;
+
+/**
+ * Test GTK's input methods APIs.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateInputMethods extends GraphicalTestCase
+{
+    public final void testConstructors() {
+        InputMethod im;
+
+        im = new SimpleInputMethod();
+        assertTrue(im instanceof SimpleInputMethod);
+
+        im = new MulticontextInputMethod();
+        assertTrue(im instanceof MulticontextInputMethod);
+    }
+
+    /*
+     * Test state
+     */
+
+    private boolean composed;
+
+    private String received;
+
+    /*
+     * UI variables
+     */
+
+    private InputMethod im;
+
+    private DrawingArea da;
+
+    private Window w;
+
+    private void setupWindowAndSignalHandlers() {
+        da = new DrawingArea();
+        da.setCanFocus(true);
+
+        w = new Window();
+        w.add(da);
+
+        im = new SimpleInputMethod();
+
+        da.connect(new Widget.KeyPressEvent() {
+            public boolean onKeyPressEvent(Widget source, EventKey event) {
+                if (im.filterKeypress(event)) {
+                    return true;
+                }
+                return false;
+            }
+        });
+
+        /*
+         * Connecting to release was not actually necessary to this test; it
+         * was added it after the test was already pasing. That's somewhat not
+         * cool from an isolation perspective. However, calling
+         * filterKeypress() in both Widget.KeyPressEvent AND
+         * Widget.KeyReleaseEvent is the API, so keep it here.
+         */
+        da.connect(new Widget.KeyReleaseEvent() {
+            public boolean onKeyReleaseEvent(Widget source, EventKey event) {
+                if (im.filterKeypress(event)) {
+                    return true;
+                }
+                return false;
+            }
+        });
+
+        im.connect(new InputMethod.Commit() {
+            public void onCommit(InputMethod source, String str) {
+                composed = true;
+                received = str;
+            }
+        });
+
+        w.showAll();
+
+    }
+
+    public final void failsNormalKeystrokes() {
+        boolean result;
+
+        setupWindowAndSignalHandlers();
+
+        composed = false;
+        received = null;
+
+        cycleMainLoop();
+        assertFalse(composed);
+        assertNull(received);
+
+        /*
+         * All clear. So send a keystroke!
+         */
+
+        result = sendKeystroke(da, Keyval.a, ModifierType.NONE);
+        assertTrue("Sending 'a' didn't work", result);
+
+        // but since
+        assertFalse(composed);
+        assertNull(received);
+
+        // we apparently need to
+        cycleMainLoop();
+
+        // because now ok
+        assertTrue("Compose sequence not received by InputMethod", composed);
+        assertEquals("Normal keystroke not received", "a", received);
+
+        /*
+         * Reset, and try again with a capital letter. They're funny, because
+         * they are awarded a different keyval, but the shift mask also has to
+         * be present or it is interpreted as a normal lower case key.
+         * Presumably CapsLock gets involved as an alternative case.
+         */
+
+        composed = false;
+        received = null;
+
+        result = sendKeystroke(da, Keyval.A, ModifierType.SHIFT_MASK);
+        assertTrue("Sending 'A' didn't work", result);
+        assertFalse(composed);
+        assertNull(received);
+
+        // so let it fly
+        cycleMainLoop();
+
+        // and?
+        assertTrue("Compose sequence not received by InputMethod", composed);
+        assertEquals("Shifted upper case keystroke not received", "A", received);
+    }
+
+    /*
+     * Give the Euro currency symbol compose sequence a try.
+     * 
+     * FIXME Unfortunately, this test fails in an Xvfb environment; worked
+     * fine as a normal user. Not sure what we're going to be able to do about
+     * that.
+     */
+    public final void failsComposeSequence() {
+        boolean result;
+
+        setupWindowAndSignalHandlers();
+
+        composed = false;
+        received = null;
+
+        result = sendKeystroke(da, Keyval.Compose, ModifierType.NONE);
+        assertTrue("Sending 'Compose' didn't work", result);
+        assertFalse(composed);
+        assertNull(received);
+
+        // this should be swollowed, no InputMethod.Commit yet
+        cycleMainLoop();
+        assertFalse(composed);
+        assertNull(received);
+
+        // ok, good. Now the first of the specifying keystrokes
+        result = sendKeystroke(da, Keyval.e, ModifierType.NONE);
+        assertTrue("Sending 'e' didn't work", result);
+        assertFalse(composed);
+        assertNull(received);
+        cycleMainLoop();
+
+        // still swollowing?
+        assertFalse(composed);
+        assertNull(received);
+
+        // ok, still good. Send the second keystroke in the sequence
+        result = sendKeystroke(da, Keyval.Equal, ModifierType.NONE);
+        assertTrue("Sending '=' didn't work", result);
+        assertFalse(composed);
+        assertNull(received);
+
+        // but this time, Compose + e + = should yield Euro
+        cycleMainLoop();
+        assertTrue("Compose sequence not received by InputMethod", composed);
+        assertEquals("Compose key sequence didn't result in expected codepoint", "€", received);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateLinkBehaviour.java b/tests/bindings/org/gnome/gtk/ValidateLinkBehaviour.java
new file mode 100644
index 0000000..06a1631
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateLinkBehaviour.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * Test LinkButton's visited and uri properties.
+ * 
+ * @author Serkan Kaba
+ * @author Andrew Cowie
+ */
+public class ValidateLinkBehaviour extends GraphicalTestCase
+{
+    public final void testVisited() throws URISyntaxException {
+        final URI uri;
+        final LinkButton link;
+
+        uri = new URI("http://java-gnome.sourceforge.net");
+        link = new LinkButton(uri);
+
+        assertFalse(link.getVisited());
+        link.setVisited(true);
+        assertTrue(link.getVisited());
+        link.setVisited(false);
+        assertFalse(link.getVisited());
+        assertEquals(uri, link.getURI());
+    }
+
+    /*
+     * TODO Actually calling emitClicked() results in gtk_show_uri() popping
+     * up a web browser! That's not quite going to work, is it.
+     */
+    public final void skipClicked() throws URISyntaxException {
+        final URI uri;
+        final LinkButton link;
+
+        uri = new URI("http://java-gnome.sourceforge.net");
+        link = new LinkButton(uri);
+
+        assertFalse(link.getVisited());
+        link.emitClicked();
+        assertTrue(link.getVisited());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateNotebookBehaviour.java b/tests/bindings/org/gnome/gtk/ValidateNotebookBehaviour.java
new file mode 100644
index 0000000..7d93175
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateNotebookBehaviour.java
@@ -0,0 +1,78 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Evaluate the behaviour of Notebook Containers.
+ */
+public class ValidateNotebookBehaviour extends GraphicalTestCase
+{
+    public final void testNotebookDecorations() {
+        final Notebook book;
+
+        book = new Notebook();
+
+        /*
+         * show tabs
+         */
+        assertEquals(true, GtkNotebook.getShowTabs(book));
+
+        book.setShowTabs(false);
+        assertEquals(false, GtkNotebook.getShowTabs(book));
+
+        book.setShowTabs(true);
+        assertEquals(true, GtkNotebook.getShowTabs(book));
+
+        /*
+         * show border
+         */
+
+        assertEquals(true, GtkNotebook.getShowBorder(book));
+
+        book.setShowBorder(false);
+        assertEquals(false, GtkNotebook.getShowBorder(book));
+
+        book.setShowBorder(true);
+        assertEquals(true, GtkNotebook.getShowBorder(book));
+    }
+
+    private int page = -1;
+
+    public void testSwitchPage() {
+        final Notebook notebook;
+
+        notebook = new Notebook();
+
+        notebook.appendPage(new Button(), new Label("Label 1"));
+        notebook.appendPage(new Button(), new Label("Label 2"));
+
+        assertEquals(2, notebook.getPageCount());
+
+        notebook.connect(new Notebook.SwitchPage() {
+            public void onSwitchPage(Notebook source, int pageNum) {
+                page = pageNum;
+            }
+        });
+
+        notebook.setCurrentPage(0);
+        assertEquals(0, page);
+        notebook.setCurrentPage(1);
+        assertEquals(1, page);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateOutParameters.java b/tests/bindings/org/gnome/gtk/ValidateOutParameters.java
new file mode 100644
index 0000000..92b1efb
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateOutParameters.java
@@ -0,0 +1,95 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gtk.Button;
+
+public class ValidateOutParameters extends GraphicalTestCase
+{
+    public final void testButtonAlignment() {
+        final Button b;
+
+        b = new Button("Text");
+
+        b.setAlignment(0.7f, 0.3f);
+
+        assertEquals(
+                "Stored alignment not retreived; assumptions underlying out-parameter handling may be in error",
+                0.7f, b.getAlignmentX(), 0.00001);
+        assertEquals(
+                "Stored alignment not retreived; assumptions underlying out-parameter handling may be in error",
+                0.3f, b.getAlignmentY(), 0.00001);
+    }
+
+    /*
+     * See also ValidateProperties.testAlignmentAlignmentAndScale(), a test
+     * carried out earlier in the UnitTests sequence.
+     */
+    public final void testAlignmentPadding() {
+        final Alignment a;
+
+        a = new Alignment(0.1f, 0.2f, 0.8f, 0.9f);
+        a.setPadding(2, 3, 6, 12);
+
+        assertEquals(2, a.getPaddingTop());
+        assertEquals(3, a.getPaddingBottom());
+        assertEquals(6, a.getPaddingLeft());
+        assertEquals(12, a.getPaddingRight());
+    }
+
+    public final void testCalendarSelectingDate() {
+        final Calendar c;
+
+        c = new Calendar();
+
+        c.selectMonth(9, 2001);
+        c.selectDay(11);
+
+        assertEquals(2001, c.getDateYear());
+        assertEquals(9, c.getDateMonth());
+        assertEquals(11, c.getDateDay());
+    }
+
+    public final void testCalendarRanges() {
+        final Calendar c;
+
+        c = new Calendar();
+
+        try {
+            c.selectMonth(0, 2007);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            c.selectMonth(13, 2007);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            c.selectDay(-1);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidatePacking.java b/tests/bindings/org/gnome/gtk/ValidatePacking.java
new file mode 100644
index 0000000..ee7da59
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidatePacking.java
@@ -0,0 +1,99 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Evaluate the box packing model that underlies GTK layouts
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidatePacking extends GraphicalTestCase
+{
+
+    /**
+     * Pack some widgets, and verify that getChild() and getParent() return
+     * those actual objects, by identity, and not clones.
+     */
+    public final void testGetChildAndParent() {
+        final Window w;
+        final VBox x;
+        final Button b;
+
+        w = new Window();
+
+        x = new VBox(false, 3);
+
+        b = new Button("Change Me?");
+
+        assertNull(b.getParent());
+
+        x.packStart(b, false, false, 0);
+
+        w.add(x);
+
+        assertSame(
+                "The child of a Bin (in this case, a Window) was supposed to be the VBox we packed into it!",
+                w.getChild(), x);
+
+        // "parent" is a property on Widget
+        assertSame("The parent of a Button packed into a VBox should be that box!", b.getParent(), x);
+
+        assertNull("A top level Widget should have had null as its parent!", w.getParent());
+    }
+
+    public final void testWidgetContainerHierarchies() {
+        final Button b;
+        final VBox x;
+        final Window w;
+
+        b = new Button("Hello");
+        x = new VBox(false, 0);
+
+        assertSame(b, b.getToplevel());
+        assertSame(x, x.getToplevel());
+
+        x.add(b);
+        assertSame(x, b.getToplevel());
+
+        w = new Window();
+        w.add(x);
+        assertSame(w, b.getToplevel());
+        assertSame(w, x.getToplevel());
+        assertSame(w, w.getToplevel());
+    }
+
+    public final void testBoxSpacing() {
+        final VBox box;
+
+        box = new VBox(false, 3);
+
+        assertEquals(3, box.getSpacing());
+        box.setSpacing(1);
+        assertEquals(1, box.getSpacing());
+        box.setSpacing(0);
+        assertEquals(0, box.getSpacing());
+
+        try {
+            box.setSpacing(-1);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidatePrinting.java b/tests/bindings/org/gnome/gtk/ValidatePrinting.java
new file mode 100644
index 0000000..0e4a63c
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidatePrinting.java
@@ -0,0 +1,93 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test our binding of paper size and other printing related classes.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidatePrinting extends GraphicalTestCase
+{
+    public final void testPaperSizeConstants() {
+        assertNotSame(PaperSize.A4, PaperSize.LETTER);
+        assertEquals(PaperSize.A4, new PaperSize("iso_a4"));
+        assertFalse(PaperSize.A4.equals(PaperSize.LETTER));
+        assertNotNull(PaperSize.getDefault());
+        assertEquals("A4", PaperSize.A4.getDisplayName());
+        assertEquals("A3", InternationalPaperSize.A3.getDisplayName());
+
+        assertNotNull(NorthAmericanPaperSize.LEGAL);
+        /*
+         * Is this locale dependent? If so, scratch this test.
+         */
+        assertEquals("US Legal", NorthAmericanPaperSize.LEGAL.getDisplayName());
+    }
+
+    public final void testPaperSizeDimensions() {
+        assertEquals(210.0, PaperSize.A4.getWidth(Unit.MM), 0.0000001);
+        assertEquals(297.0, PaperSize.A4.getHeight(Unit.MM), 0.0000001);
+
+        assertEquals(595, (int) PaperSize.A4.getWidth(Unit.POINTS));
+        assertEquals(841, (int) PaperSize.A4.getHeight(Unit.POINTS));
+
+        assertEquals(8.5, PaperSize.LETTER.getWidth(Unit.INCH), 0.001);
+        assertEquals(11.0, PaperSize.LETTER.getHeight(Unit.INCH), 0.001);
+    }
+
+    public final void testCustomPaperDefinition() {
+        PaperSize paper, another;
+
+        try {
+            paper = new CustomPaperSize(null, 400, 300, Unit.INCH);
+            fail("guard failed");
+            return;
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        paper = new CustomPaperSize("Blah", 400, 300, Unit.INCH);
+        assertEquals("Blah", paper.getDisplayName());
+
+        try {
+            paper = new CustomPaperSize("Failure", 400, 300, Unit.PIXEL);
+            fail("Cannot accept pixels");
+            return;
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        paper = new CustomPaperSize("Custom", 400, 300, Unit.POINTS);
+        assertEquals(400.0, paper.getWidth(Unit.POINTS), 0.001);
+        assertEquals(300.0, paper.getHeight(Unit.POINTS), 0.001);
+        assertEquals("Custom", paper.getDisplayName());
+
+        /*
+         * What happens if we attempt to reuse a name?
+         */
+
+        another = new CustomPaperSize("Custom", 500, 600, Unit.MM);
+        assertEquals(500.0, another.getWidth(Unit.MM), 0.001);
+        assertEquals(600.0, another.getHeight(Unit.MM), 0.001);
+        assertNotSame(paper, another);
+        assertEquals("Custom", paper.getDisplayName());
+
+        // it's ok, apparently
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateProperties.java b/tests/bindings/org/gnome/gtk/ValidateProperties.java
new file mode 100644
index 0000000..7b3827b
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateProperties.java
@@ -0,0 +1,411 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.io.FileNotFoundException;
+
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * Test characteristic getters and setters to ensure correct values are
+ * retrieved.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateProperties extends GraphicalTestCase
+{
+    public final void testStringValues() {
+        final Value v = new Value("Hello");
+        assertEquals("Hello", v.getString());
+    }
+
+    public final void testIntegerValues() {
+        final Value v = new Value(-42);
+        assertEquals(-42, v.getInteger());
+    }
+
+    public final void testLongValues() {
+        final Value v = new Value(600000000000L);
+        assertEquals(600000000000L, v.getLong());
+    }
+
+    public final void testBooleanValues() {
+        final Value v1, v2;
+
+        v1 = new Value(true);
+        assertEquals(true, v1.getBoolean());
+
+        v2 = new Value(false);
+        assertEquals(false, v2.getBoolean());
+    }
+
+    /*
+     * GValue.g_value_init(float) had a cut and paste bug.
+     */
+    public final void testFloatValues() {
+        final Value v = new Value(0.1f);
+        assertEquals(0.1f, v.getFloat(), 0.0001);
+    }
+
+    public final void testDoubleValues() {
+        final Value v = new Value(42.2d);
+        assertEquals(42.2d, v.getDouble(), 0.0001);
+    }
+
+    /**
+     * Test changing the label of a Button and getting the label back.
+     */
+    public final void testButtonPropertyLabel() {
+        final Button b;
+        final String originalLabel = "Hello wonderful World";
+        final String endingLabel = "Goodbye cruel World";
+
+        b = new Button(originalLabel);
+        assertEquals(
+                "The text retrieved by getLabel() was not that set by the Button <init>() constructor!",
+                b.getLabel(), originalLabel);
+
+        b.setLabel(endingLabel);
+        assertEquals(
+                "Incorrect text retrieved from Button's getLabel() following a call to setLabel() with that text!",
+                b.getLabel(), endingLabel);
+    }
+
+    /**
+     * Test ReliefStyle, a series of enum constants. Attempt to set a non-zero
+     * enum, and make sure we get it back, by identity
+     */
+    public final void testButtonReliefStyle() {
+        final Button b;
+
+        b = new Button();
+
+        // Button's getRelief() is temporarily implemented with
+        // getPropertyEnum().
+        assertSame("Default ReliefStyle is not what was expected, validity of test case is affected.",
+                b.getRelief(), ReliefStyle.NORMAL);
+
+        // NONE is #3 (ie ordinal 2, not zero)
+        ReliefStyle rs = ReliefStyle.NONE;
+        b.setRelief(rs);
+
+        // verify we get that object back.
+        assertSame("Set ReliefStyle constant is not the object that was retrieved when calling getter!",
+                b.getRelief(), rs);
+    }
+
+    public final void testAlignmentConstructorProperties() {
+        final Alignment a;
+
+        a = new Alignment(0.1f, 0.2f, 0.8f, 0.9f);
+        assertEquals(0.1f, a.getAlignmentX(), 0.001);
+        assertEquals(0.2f, a.getAlignmentY(), 0.001);
+        assertEquals(0.8f, a.getScaleX(), 0.001);
+        assertEquals(0.9f, a.getScaleY(), 0.001);
+    }
+
+    public final void testAlignmentParameterChecks() {
+        Alignment a;
+
+        try {
+            a = new Alignment(-0.1f, 0.2f, 0.8f, 0.9f);
+            fail("Should have thrown exception due to negative paramater");
+        } catch (IllegalArgumentException iae) {
+            //
+        }
+        try {
+            a = new Alignment(1.1f, 0.2f, 0.8f, 0.9f);
+            fail("Should have thrown exception due to paramater out of bounds");
+        } catch (IllegalArgumentException iae) {
+            //
+        }
+
+        a = new Alignment(0.1f, 0.2f, 0.8f, 0.9f);
+        a.setAlignment(0.3f, 0.4f, 0.5f, 0.6f);
+
+        assertEquals(0.3f, a.getAlignmentX(), 0.001);
+        assertEquals(0.4f, a.getAlignmentY(), 0.001);
+        assertEquals(0.5f, a.getScaleX(), 0.001);
+        assertEquals(0.6f, a.getScaleY(), 0.001);
+
+        try {
+            a.setAlignment(0.3f, 0.4f, 0.5f, -0.6f);
+            fail("Should have thrown exception due to paramater out of bounds");
+        } catch (IllegalArgumentException iae) {
+            //
+        }
+        assertEquals(0.6f, a.getScaleY(), 0.001);
+    }
+
+    /*
+     * Just a quick check deciding to expose some constants.
+     */
+    public final void testAlignmentConstants() {
+        assertEquals(0.0f, Alignment.LEFT, 0.0001f);
+        assertEquals(0.5f, Alignment.CENTER, 0.0001f);
+        assertEquals(1.0f, Alignment.RIGHT, 0.0001f);
+        assertEquals(0.0f, Alignment.TOP, 0.0001f);
+        assertEquals(1.0f, Alignment.BOTTOM, 0.0001f);
+    }
+
+    public final void testButtonImageMethods() {
+        final Button b;
+        final Image i;
+
+        b = new Button("Hello There!");
+        assertNull(b.getImage());
+
+        // doesn't matter that it'll be the "broken image" icon as a result
+        i = new Image("/dev/null");
+
+        b.setImage(i);
+        assertNotNull(b.getImage());
+        assertEquals(i, b.getImage());
+    }
+
+    public final void testAllocation() {
+        final Window w;
+        final Button b;
+        Allocation size;
+
+        b = new Button("Blah");
+        size = b.getAllocation();
+
+        /*
+         * These were derived empirically. A bit unexpected, but hey.
+         */
+        assertEquals(1, size.getWidth());
+        assertEquals(1, size.getHeight());
+        assertEquals(-1, size.getX());
+        assertEquals(-1, size.getY());
+
+        w = new Window();
+        w.add(b);
+
+        /*
+         * We call realize instead of show on the window to prevent the Window
+         * from popping onto the screen when the main loop runs in
+         * ValidateScreensAndDisplays. This is likely a weak workaround and
+         * not a fix, but we need the size-allocation to have happened to be
+         * able to complete this test fixture
+         */
+        b.showAll();
+        GtkWidget.realize(b);
+
+        /*
+         * Obtain the current values of the Allocation and test that they
+         * changed.
+         */
+        size = b.getAllocation();
+
+        assertTrue(size.getWidth() > 1);
+        assertTrue(size.getHeight() > 1);
+        assertTrue(size.getX() >= 0);
+        assertTrue(size.getY() >= 0);
+
+        w.hide();
+
+        /*
+         * and is it indeed still the same pointer, ie the same address, ie
+         * the same Proxy?
+         */
+        assertSame(size, b.getAllocation());
+    }
+
+    public final void testRequisitionSizeRequest() {
+        final Button b;
+        Requisition req;
+        int width, height;
+
+        b = new Button("Blah");
+
+        /*
+         * This isn't quite as isolated a test as it might be; because we've
+         * got this calling gtk_widget_size_request() on the C side if a
+         * request isn't set, we can't check that it changed due to invoking
+         * this.
+         */
+
+        req = b.getRequisition();
+
+        width = req.getWidth();
+        height = req.getHeight();
+        assertTrue(width > 1);
+        assertTrue(height > 1);
+    }
+
+    /*
+     * FUTURE Given the elaborate relationship between resize(),
+     * setDefaultSize(), and setSizeRequest(), this could probably be a lot
+     * more stringent.
+     */
+    public final void testResizeRestrictions() {
+        final Window w;
+
+        w = new Window();
+
+        try {
+            w.resize(0, 1);
+            fail("Shouldn't accept sub-minimum sizes.");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            w.resize(1, 0);
+            fail("Shouldn't accept sub-minimum sizes.");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        w.resize(1, 1);
+    }
+
+    /*
+     * TODO make this a bit more meaningful; at the moment all it is doing is
+     * making sure that no FatalErrors are blown by switching from an Image
+     * storing one type of image to another; (yes, one would expect this to
+     * Just Work; but that's the point of this test as it stands so far).
+     */
+    public final void testImageResetting() throws FileNotFoundException {
+        final Image i;
+        final Pixbuf data;
+
+        i = new Image(Stock.REFRESH, IconSize.LARGE_TOOLBAR);
+
+        data = new Pixbuf("src/bindings/java-gnome_Icon.png");
+        i.setImage(data);
+        i.clear();
+    }
+
+    public final void testEntryStyleProperties() {
+        final Entry entry;
+
+        entry = new Entry();
+
+        /*
+         * Check default
+         */
+        assertEquals(true, GtkEntry.getHasFrame(entry));
+
+        /*
+         * Check our setter
+         */
+
+        entry.setHasFrame(false);
+        assertEquals(false, GtkEntry.getHasFrame(entry));
+    }
+
+    public final void testButtonFocus() {
+        final Button button;
+
+        button = new Button("Hello");
+
+        /*
+         * Check default
+         */
+        assertEquals(true, GtkButton.getFocusOnClick(button));
+
+        /*
+         * Check our setter
+         */
+
+        button.setFocusOnClick(false);
+        assertEquals(false, GtkButton.getFocusOnClick(button));
+    }
+
+    public final void testDefaultProperty() {
+        final Button button;
+        final Window window;
+
+        button = new Button("Hello");
+
+        /*
+         * Check can-default's default :)
+         */
+
+        assertEquals(false, button.getCanDefault());
+
+        button.setCanDefault(true);
+        assertEquals(true, button.getCanDefault());
+
+        /*
+         * And make sure that this doesn't fail
+         */
+
+        window = new Window();
+        window.add(button);
+        button.grabDefault();
+    }
+
+    /*
+     * Check the default visibility of Entry and then cycle the property.
+     */
+    public final void testVisibility() {
+        final Entry entry;
+
+        entry = new Entry();
+        assertTrue(entry.getVisibility());
+
+        entry.setVisibility(false);
+        assertFalse(entry.getVisibility());
+
+        entry.setVisibility(true);
+        assertTrue(entry.getVisibility());
+    }
+
+    public final void testAdjustmentBounds() {
+        final Adjustment adj;
+
+        adj = new Adjustment(3.14, 0.0, 10.0, 0.1, 2.0, 1.0);
+        assertEquals(3.14, adj.getValue(), 0.001);
+        assertEquals(0.0, adj.getLower(), 0.001);
+        assertEquals(10.0, adj.getUpper(), 0.001);
+        assertEquals(1.0, adj.getPageSize(), 0.001);
+
+        adj.configure(1.42, 1.0, 2.0, 0.1, 1.0, 0.5);
+        assertEquals(1.42, adj.getValue(), 0.001);
+        assertEquals(1.0, adj.getLower(), 0.001);
+        assertEquals(2.0, adj.getUpper(), 0.001);
+        assertEquals(0.5, adj.getPageSize(), 0.001);
+
+        adj.setValue(1.52);
+        assertEquals(1.5, adj.getValue(), 0.001);
+
+        /*
+         * Test clamping
+         */
+
+        adj.setValue(2.52);
+        assertEquals(1.5, adj.getValue(), 0.001);
+
+        adj.setValue(0.0);
+        assertEquals(1.0, adj.getValue(), 0.001);
+
+        /*
+         * Test individual setters
+         */
+
+        adj.setLower(0.0);
+        assertEquals(0.0, adj.getLower(), 0.001);
+
+        adj.setUpper(10.0);
+        assertEquals(10.0, adj.getUpper(), 0.001);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateRadioThing.java b/tests/bindings/org/gnome/gtk/ValidateRadioThing.java
new file mode 100644
index 0000000..ec12d5a
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateRadioThing.java
@@ -0,0 +1,87 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Guillaume Mazoyer
+ * @author Andrew Cowie
+ */
+public class ValidateRadioThing extends GraphicalTestCase
+{
+    public final void testRadioMenuItemGroup() {
+        final RadioGroup group;
+        final RadioMenuItem first, second;
+        Label child;
+
+        // Create a group
+        group = new RadioGroup();
+
+        // Here, there is no member so it should be 'null'
+        assertNull(group.getMember());
+
+        // Create a first item
+        first = new RadioMenuItem(group, "First");
+
+        // Now the member of the group should not be null
+        assertNotNull(group.getMember());
+
+        // So we can create a second item
+        second = new RadioMenuItem(group, "Second");
+
+        // Check content
+        child = (Label) first.getChild();
+        assertEquals("First", child.getText());
+
+        child = (Label) second.getChild();
+        assertEquals("Second", child.getText());
+    }
+
+    public final void testRadioActionGroup() {
+        final RadioGroup group;
+        final RadioAction first, second;
+        final MenuItem one, two;
+        Label child;
+
+        // Create a group
+        group = new RadioGroup();
+
+        // Here, there is no member so it should be 'null'
+        assertNull(group.getMember());
+
+        // Create a first item
+        first = new RadioAction(group, "first", "First");
+
+        // Now the member of the group should not be null
+        assertNotNull(group.getMember());
+
+        // So we can create a second item
+        second = new RadioAction(group, "second", "Second");
+
+        // Test create menu item
+        one = first.createMenuItem();
+        two = second.createMenuItem();
+
+        // Check content
+        child = (Label) one.getChild();
+        assertEquals("First", child.getText());
+
+        child = (Label) two.getChild();
+        assertEquals("Second", child.getText());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateResponseType.java b/tests/bindings/org/gnome/gtk/ValidateResponseType.java
new file mode 100644
index 0000000..5bc34b1
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateResponseType.java
@@ -0,0 +1,80 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Validate the intricies of our custom Dialog ResponseType handling. These
+ * test cases are somewhat fragile due to their probing the underlying ordinal
+ * numbers, but it should be ok for now; NONE is known -1 and the custom
+ * response codes are +1 origin.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateResponseType extends GraphicalTestCase
+{
+    public final void testPlumbingMethodsExposedInOverride() {
+        assertEquals(-1, GtkResponseTypeOverride.numOf(ResponseType.NONE));
+        assertSame(ResponseType.NONE, GtkResponseTypeOverride.enumFor(-1));
+    }
+
+    public final void testPlumbingMethodsAvailableInProxy() {
+        final ResponseType response = ResponseType.NONE;
+
+        assertEquals(-1, response.getResponseId());
+        assertSame(ResponseType.NONE, ResponseType.constantFor(-1));
+    }
+
+    private static class LocalResponseType extends ResponseType
+    {
+        protected LocalResponseType(String nickname) {
+            super(nickname);
+        }
+
+        /**
+         * An artificial constant
+         */
+        static final LocalResponseType MAGIC = new LocalResponseType("MAGIC");
+
+        /**
+         * Another artificial constant
+         */
+        static final LocalResponseType ULTRA = new LocalResponseType("ULTRA");
+    }
+
+    public final void testArtificalConstantsInCustomSubclass() {
+        ResponseType response;
+
+        assertNotSame(LocalResponseType.MAGIC, LocalResponseType.ULTRA);
+
+        response = LocalResponseType.MAGIC;
+        assertEquals(1, response.getResponseId());
+
+        response = LocalResponseType.ULTRA;
+        assertEquals(2, response.getResponseId());
+    }
+
+    public final void testUnexpectedReponseId() {
+        try {
+            GtkResponseTypeOverride.enumFor(299);
+            fail("Should have thrown Exception");
+        } catch (IllegalArgumentException ise) {
+            // good
+        }
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateScrolling.java b/tests/bindings/org/gnome/gtk/ValidateScrolling.java
new file mode 100644
index 0000000..9d66958
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateScrolling.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateScrolling extends GraphicalTestCase
+{
+    public final void testDisallowAddWithViewportIfNative() {
+        final TreeView view;
+        final ScrolledWindow scroll;
+
+        view = new TreeView();
+        scroll = new ScrolledWindow();
+
+        try {
+            scroll.addWithViewport(view);
+            fail("Should have been prevented");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            scroll.add(view);
+        } catch (IllegalArgumentException iae) {
+            fail("Should not have thrown");
+        }
+    }
+
+    public final void testClearViewportShadowType() {
+        final ScrolledWindow scroll;
+        final Label label;
+        final Widget child;
+        final Viewport port;
+        ShadowType type;
+
+        label = new Label("Big deal");
+        scroll = new ScrolledWindow();
+
+        try {
+            scroll.add(label);
+            fail("Should have been prevented");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            scroll.addWithViewport(label);
+        } catch (IllegalArgumentException iae) {
+            fail("Should not have thrown");
+        }
+
+        child = scroll.getChild();
+        assertTrue(child instanceof Viewport);
+        port = (Viewport) child;
+
+        /*
+         * Test that our convenience in addWithViewport() indeed cleared the
+         * ShadowType in the created Viewport.
+         */
+
+        type = port.getShadowType();
+        assertSame(ShadowType.NONE, type);
+
+        /*
+         * And meanwhile,
+         */
+
+        type = scroll.getShadowType();
+        assertSame(ShadowType.NONE, type);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateSignalEmission.java b/tests/bindings/org/gnome/gtk/ValidateSignalEmission.java
new file mode 100644
index 0000000..f6ee22c
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateSignalEmission.java
@@ -0,0 +1,119 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test methods which cause signal emission.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * Originally this tested Adjustment's emitValueChanged() and emitChanged(),
+ * but I have a feeling those predate proper setters on that class.
+ */
+public class ValidateSignalEmission extends GraphicalTestCase
+{
+    private boolean result;
+
+    public void setUp() {
+        super.setUp();
+        result = false;
+    }
+
+    public final void testButtonClicked() {
+        final Button b;
+
+        assertFalse(result);
+
+        b = new Button("Hello");
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                assertEquals("Hello", source.getLabel());
+                result = true;
+            }
+        });
+        b.emitClicked();
+
+        assertTrue("Button.Clicked wasn't handled", result);
+    }
+
+    public final void testAdjustmentValueChanged() {
+        final Adjustment adj;
+
+        assertFalse(result);
+
+        adj = new Adjustment(5, 0, 100, 2, 5, 10);
+        adj.connect(new Adjustment.ValueChanged() {
+            public void onValueChanged(Adjustment source) {
+                result = true;
+            }
+        });
+        adj.emitValueChanged();
+
+        assertTrue("Adjustment.ValueChanged wasn't handled", result);
+    }
+
+    public final void testAdjustmentOtherChanged() {
+        final Adjustment adj;
+
+        assertFalse(result);
+
+        adj = new Adjustment(5, 0, 100, 2, 5, 10);
+        adj.connect(new Adjustment.Changed() {
+            public void onChanged(Adjustment source) {
+                result = true;
+            }
+        });
+        adj.emitChanged();
+
+        assertTrue("Adjustment.Changed wasn't handled", result);
+    }
+
+    public final void testAdjustmentValueChangedBySetter() {
+        final Adjustment adj;
+
+        assertFalse(result);
+
+        adj = new Adjustment(5, 0, 100, 2, 5, 10);
+        adj.connect(new Adjustment.ValueChanged() {
+            public void onValueChanged(Adjustment source) {
+                result = true;
+            }
+        });
+        adj.setValue(99.0);
+
+        assertTrue("Adjustment.ValueChanged wasn't emitted", result);
+    }
+
+    public final void testAdjustmentOtherChangedBySetter() {
+        final Adjustment adj;
+
+        assertFalse(result);
+
+        adj = new Adjustment(5, 0, 100, 2, 5, 10);
+        adj.connect(new Adjustment.Changed() {
+            public void onChanged(Adjustment source) {
+                result = true;
+            }
+        });
+        adj.setUpper(250.0);
+
+        assertTrue("Adjustment.Changed wasn't emitted", result);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateSnapshotUtilities.java b/tests/bindings/org/gnome/gtk/ValidateSnapshotUtilities.java
new file mode 100644
index 0000000..be302dc
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateSnapshotUtilities.java
@@ -0,0 +1,27 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+public class ValidateSnapshotUtilities extends GraphicalTestCase
+{
+    public void testClassToTargetFilename() {
+        assertEquals("doc/api/org/gnome/gtk/QuestionMessageDialog.png",
+                Snapshot.targetFilenameFromClass(QuestionMessageDialog.class, null));
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateStockItems.java b/tests/bindings/org/gnome/gtk/ValidateStockItems.java
new file mode 100644
index 0000000..bb88752
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateStockItems.java
@@ -0,0 +1,45 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import junit.framework.TestCase;
+
+/**
+ * Validate the handling of Stock items and other GTK constants.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateStockItems extends TestCase
+{
+    public final void testStockRegistry() {
+        assertEquals("gtk-apply", Stock.APPLY.getStockId());
+        assertEquals("gtk-quit", Stock.QUIT.getStockId());
+        assertFalse(Stock.APPLY == Stock.QUIT);
+
+        assertSame(Stock.APPLY, Stock.instanceFor("gtk-apply"));
+        assertSame(Stock.QUIT, Stock.instanceFor("gtk-quit"));
+
+        assertNull(Stock.instanceFor("boooga-boooga"));
+    }
+
+    public final void testStockEquals() {
+        assertTrue(Stock.COPY.equals(Stock.COPY));
+        assertFalse(Stock.COPY.equals(Stock.CUT));
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateStyleContext.java b/tests/bindings/org/gnome/gtk/ValidateStyleContext.java
new file mode 100644
index 0000000..a688b15
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateStyleContext.java
@@ -0,0 +1,112 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011-2013 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+package org.gnome.gtk;
+
+/**
+ * Test case for StyleContext.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class ValidateStyleContext extends GraphicalTestCase
+{
+    public final void testAddRemoveClass() {
+        final Button button;
+        final StyleContext context;
+
+        button = new Button();
+        context = button.getStyleContext();
+
+        context.addClass(StyleClass.RADIO);
+        assertTrue(context.hasClass(StyleClass.RADIO));
+
+        context.removeClass(StyleClass.RADIO);
+        assertFalse(context.hasClass(StyleClass.RADIO));
+    }
+
+    public final void testAddRemoveRegion() {
+        final Button button;
+        final StyleContext context;
+
+        button = new Button();
+        context = button.getStyleContext();
+
+        context.addRegion(StyleRegion.TAB, RegionFlags.FIRST);
+        assertEquals(RegionFlags.NULL, context.hasRegion(StyleRegion.ROW));
+        assertEquals(RegionFlags.FIRST, context.hasRegion(StyleRegion.TAB));
+
+        context.removeRegion(StyleRegion.TAB);
+        assertEquals(RegionFlags.NULL, context.hasRegion(StyleRegion.TAB));
+    }
+
+    public final void testSaveRestore() {
+        final Button button;
+        final StyleContext context;
+
+        button = new Button();
+        context = button.getStyleContext();
+
+        context.addClass(StyleClass.RADIO);
+        context.save();
+        assertTrue(context.hasClass(StyleClass.RADIO));
+
+        context.addClass(StyleClass.PRIMARY_TOOLBAR);
+        context.restore();
+        assertFalse(context.hasClass(StyleClass.PRIMARY_TOOLBAR));
+    }
+
+    public final void testListStyles() {
+        final Toolbar toolbar;
+        final StyleContext context;
+        final String[] classes, regions;
+
+        toolbar = new Toolbar();
+        context = toolbar.getStyleContext();
+
+        context.addClass(StyleClass.PRIMARY_TOOLBAR);
+        classes = context.listClasses();
+        assertEquals("primary-toolbar", classes[0]);
+
+        context.addRegion(StyleRegion.TAB, RegionFlags.LAST);
+        regions = context.listRegions();
+        assertEquals("tab", regions[0]);
+    }
+
+    public final void testJunctionSides() {
+        final Button button;
+        final StyleContext context;
+
+        button = new Button();
+        context = button.getStyleContext();
+
+        context.setJunctionSides(JunctionSides.TOP);
+        assertEquals(JunctionSides.TOP, context.getJunctionSides());
+    }
+
+    public final void testTextDirection() {
+        final Label label;
+        final StyleContext context;
+
+        label = new Label("This is a test case");
+        context = label.getStyleContext();
+
+        context.setDirection(TextDirection.RIGHT_TO_LEFT);
+        assertEquals(TextDirection.RIGHT_TO_LEFT, context.getDirection());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateSwitch.java b/tests/bindings/org/gnome/gtk/ValidateSwitch.java
new file mode 100644
index 0000000..d9bd281
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateSwitch.java
@@ -0,0 +1,37 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test Switch and its method.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class ValidateSwitch extends GraphicalTestCase
+{
+    public final void testSwitch() {
+        final Switch switchy;
+
+        switchy = new Switch();
+        assertFalse(switchy.isActive());
+
+        switchy.setActive(true);
+        assertTrue(switchy.isActive());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTextBuffer.java b/tests/bindings/org/gnome/gtk/ValidateTextBuffer.java
new file mode 100644
index 0000000..50ded2d
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTextBuffer.java
@@ -0,0 +1,705 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.io.FileNotFoundException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+
+import org.gnome.gdk.Pixbuf;
+import org.gnome.pango.Scale;
+import org.gnome.pango.Underline;
+import org.gnome.pango.Weight;
+
+/**
+ * @author Andrew Cowie
+ * @author Stefan Prelle
+ */
+public class ValidateTextBuffer extends GraphicalTestCase
+{
+    public final void testTagsAddedToTextTagTableAutomatically() {
+        final TextTagTable table;
+        final TextTag anon, bold, italic;
+
+        table = new TextTagTable();
+
+        // shouldn't crash
+        anon = new TextTag(table);
+
+        bold = new TextTag(table);
+
+        // adding another named tag is no problem
+        italic = new TextTag(table);
+
+        assertEquals(3, GtkTextTagTable.getSize(table));
+
+        // avoid warnings
+        anon.getClass();
+        bold.getClass();
+        italic.getClass();
+    }
+
+    /*
+     * This is here so that we can test the code paths through GValue for
+     * properties of type double. Repeating the setter and/or getter here for
+     * the scale property armours us against public API changes to TextTag.
+     */
+    private static class LocalTextTag extends TextTag
+    {
+        LocalTextTag() {
+            super(new TextTagTable());
+        }
+
+        public void setScale(double scale) {
+            setPropertyDouble("scale", scale);
+        }
+
+        public double getScale() {
+            return getPropertyDouble("scale");
+        }
+
+        public int getLeftMargin() {
+            return getPropertyInteger("left-margin");
+        }
+
+        public Underline getUnderline() {
+            return (Underline) getPropertyEnum("underline");
+        }
+
+    }
+
+    public final void testScalePropertyInternalCodePaths() {
+        final LocalTextTag tag;
+
+        tag = new LocalTextTag();
+
+        tag.setScale(10.2d);
+        assertEquals(10.2d, tag.getScale(), 0.0001);
+    }
+
+    public final void testStronglyTypedScaleProperty() {
+        final LocalTextTag tag;
+
+        tag = new LocalTextTag();
+
+        tag.setScale(Scale.LARGE);
+
+        /*
+         * At time of writing there is no Plumbing infrastructure to go from
+         * Class,double to DoubleConstant, so we use the getter from the
+         * LocalTextTag hack again to extract the property for testing.
+         */
+        assertEquals(GtkTextTagOverride.valueOf(Scale.LARGE), tag.getScale(), 0.0001);
+    }
+
+    public final void testUnderlineProperty() {
+        final LocalTextTag tag;
+
+        tag = new LocalTextTag();
+
+        tag.setMarginLeft(42);
+        assertEquals(42, tag.getLeftMargin());
+
+        tag.setUnderline(Underline.SINGLE);
+        assertEquals(Underline.SINGLE, tag.getUnderline());
+    }
+
+    public final void testSimpleGetAndSet() {
+        final TextBuffer buf;
+        final TextIter start, end;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        buf.setText("Hello\nWorld!");
+        start = buf.getIterStart();
+        end = buf.getIterEnd();
+        assertEquals(0, start.getLine());
+        assertEquals(0, start.getLineOffset());
+        assertEquals(1, end.getLine());
+        assertEquals(6, end.getLineOffset());
+
+        assertEquals("Hello\nWorld!", buf.getText(start, end, true));
+
+        start.setLine(1);
+        assertEquals("World!", buf.getText(start, end, true));
+    }
+
+    public final void testBasicTextInsertion() {
+        final TextBuffer buf;
+        TextIter pointer;
+        TextMark selectionBound, insert;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        buf.setText("This test");
+        pointer = buf.getIterStart();
+
+        pointer.setOffset(5);
+        buf.insert(pointer, "is a ");
+        assertEquals(buf.getText(), "This is a test");
+
+        /*
+         * Test the assumption that the cursor is at the end of the TextBuffer
+         * by default.
+         */
+
+        buf.insertAtCursor(" of the ");
+        assertEquals(buf.getText(), "This is a test of the ");
+
+        /*
+         * And, test the getSelectionBounds() bug.
+         */
+        buf.selectRange(buf.getIterStart(), buf.getIterEnd());
+
+        selectionBound = buf.getSelectionBound();
+        insert = buf.getInsert();
+        assertEquals(0, buf.getIter(selectionBound).getOffset());
+        assertEquals("This is a test of the ".length(), buf.getIter(insert).getOffset());
+
+        pointer = buf.getIterEnd();
+        buf.insert(pointer, "Emergency Broadcast System");
+        assertEquals(buf.getText(), "This is a test of the " + "Emergency Broadcast System");
+    }
+
+    public final void testTextMarkToTextIterConversion() {
+        final TextBuffer buf;
+        TextIter start, end;
+        TextMark selectionBound, insert;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        buf.setText("Hello World");
+        start = buf.getIterStart();
+
+        start.setOffset(5);
+        end = start.copy();
+        end.setOffset(8);
+
+        buf.selectRange(start, end);
+
+        selectionBound = buf.getSelectionBound();
+        insert = buf.getInsert();
+
+        assertEquals(5, selectionBound.getIter().getOffset());
+        assertEquals(8, insert.getIter().getOffset());
+    }
+
+    public void testIterFromOffset() {
+        final TextBuffer buf;
+        TextIter pointer, other;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        pointer = buf.getIterEnd();
+        assertEquals(0, pointer.getOffset());
+
+        buf.insertAtCursor("I hate spam");
+        pointer = buf.getIter(7);
+        other = pointer.copy();
+        other.forwardLine();
+        assertEquals(11, other.getOffset());
+    }
+
+    public void testEndOfBuffer() {
+        final TextBuffer buf;
+        TextIter pointer;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        pointer = buf.getIterStart();
+
+        buf.insertAtCursor("I need a bunch of lines\n");
+        buf.insertAtCursor("This is the second line\n");
+        buf.insertAtCursor("Three should be enough"); // note lack of \n
+
+        pointer = buf.getIterStart();
+
+        assertEquals(0, pointer.getLine());
+        pointer.forwardLine();
+        assertEquals(1, pointer.getLine());
+        pointer.forwardLine();
+        assertEquals(2, pointer.getLine());
+
+        /*
+         * Last line, should be at beginning of line according to docs. Then,
+         * calling forwardLine() should bump us to the end of the last line.
+         */
+
+        assertEquals(0, pointer.getLineOffset());
+        pointer.forwardLine();
+        assertEquals(22, pointer.getLineOffset());
+
+        assertEquals(buf.getIterEnd().getOffset(), pointer.getOffset());
+
+        /*
+         * Now, the question of the return value. At present we've made the
+         * signature void, because we can't figure out what we'd need it for.
+         * Does this error or invalidate the TreeIter?
+         */
+
+        pointer.forwardLine();
+        assertEquals(22, pointer.getLineOffset());
+
+        /*
+         * Apparently not. void it is.
+         */
+    }
+
+    public void testNonPrintable() {
+        final TextBuffer buf;
+        TextIter pointer;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        pointer = buf.getIterStart();
+
+        buf.insertAtCursor("I need a bunch of lines\n");
+        buf.insertAtCursor("This is the second line\n");
+        buf.insertAtCursor("and some non-ASCII: \u00e4\u00f6\u00fc\u00df");
+
+        pointer = buf.getIterStart();
+        pointer.forwardLine();
+
+        Pixbuf pixbuf = null;
+        try {
+            pixbuf = new Pixbuf("src/bindings/java-gnome_Icon.png");
+            buf.insert(pointer, pixbuf);
+        } catch (FileNotFoundException e) {
+            fail("Could not open image");
+        }
+
+        /*
+         * Assert that getChar recognizes non-character values and that moving
+         * forward and backward over such elements works
+         */
+        assertEquals('T', pointer.getChar());
+        pointer.backwardChar();
+        assertEquals(TextBuffer.OBJECT_REPLACEMENT_CHARACTER, pointer.getChar());
+
+        /*
+         * The image returned by getPixbuf() should be identical.
+         */
+        Pixbuf check = pointer.getPixbuf();
+        assertNotNull(check);
+        assertEquals(pixbuf, check);
+        assertSame(pixbuf, check);
+
+        // And where no image is, it should be null
+        pointer.forwardChar();
+        assertNull(pointer.getPixbuf());
+    }
+
+    public void testUnicodeChars() {
+        final TextBuffer buf;
+        TextIter pointer;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        /*
+         * ASCII characters only. In UTF-8 each character uses 1 byte (but we
+         * are no longer assessing bytes vs characters)
+         */
+        buf.setText("abcd");
+        pointer = buf.getIterStart();
+        assertEquals(4, pointer.getCharsInLine());
+        assertEquals(4, buf.getCharCount());
+
+        /*
+         * Now some more complicated Unicode. This represents äöüß.
+         */
+        final String COMPLEX = "Some umlauts: \u00e4\u00f6\u00fc\u00df";
+
+        buf.setText(COMPLEX);
+        assertEquals(COMPLEX, buf.getText());
+
+        pointer = buf.getIterStart();
+        assertEquals(18, COMPLEX.length());
+        assertEquals(18, pointer.getCharsInLine());
+        assertEquals(18, buf.getCharCount());
+    }
+
+    public void testEditability() {
+        final TextBuffer buf;
+        final TextTagTable table;
+        TextIter start, end;
+        TextTag nonEdit;
+
+        table = new TextTagTable();
+        nonEdit = new TextTag(table);
+        nonEdit.setEditable(false);
+
+        buf = new TextBuffer(table);
+        buf.insertAtCursor("I need a bunch of lines\n");
+        buf.insertAtCursor("This is the second line\n");
+
+        start = buf.getIter(2);
+        end = buf.getIter(6);
+        buf.applyTag(nonEdit, start, end);
+
+        // start points to begin of a non-editable block
+        assertEquals(false, start.isEditable(true));
+        // end points to end of non-editable block, which means that
+        // it is editable
+        assertEquals(true, end.isEditable(true));
+
+        // Now the other way around
+        nonEdit.setEditable(true);
+        // start points to begin of an editable block
+        assertEquals(true, start.isEditable(false));
+        // end points to end of an editable block, which means that
+        // it is non-editable
+        assertEquals(false, end.isEditable(false));
+    }
+
+    public void testWordBoundaries() {
+        final TextBuffer buf;
+        TextIter pos;
+
+        buf = new TextBuffer(new TextTagTable());
+        buf.insertAtCursor("  Give.  123 \n");
+
+        pos = buf.getIter(0);
+        assertEquals(false, pos.startsWord());
+        assertEquals(false, pos.insideWord());
+        assertEquals(false, pos.endsWord());
+
+        pos = buf.getIter(2);
+        assertEquals('G', pos.getChar());
+        assertEquals(true, pos.startsWord());
+        assertEquals(true, pos.insideWord());
+        assertEquals(false, pos.endsWord());
+        assertEquals(true, pos.startsSentence());
+
+        pos = buf.getIter(3);
+        assertEquals('i', pos.getChar());
+        assertEquals(false, pos.startsWord());
+        assertEquals(true, pos.insideWord());
+        assertEquals(false, pos.endsWord());
+        assertEquals(false, pos.startsSentence());
+        assertEquals(false, pos.endsSentence());
+
+        pos = buf.getIter(5);
+        assertEquals('e', pos.getChar());
+        assertEquals(false, pos.startsWord());
+        assertEquals(true, pos.insideWord());
+        assertEquals(false, pos.endsWord());
+        assertEquals(false, pos.startsSentence());
+        assertEquals(false, pos.endsSentence());
+
+        pos = buf.getIter(6);
+        assertEquals('.', pos.getChar());
+        assertEquals(false, pos.startsWord());
+        assertEquals(false, pos.insideWord());
+        assertEquals(true, pos.endsWord());
+        assertEquals(false, pos.endsSentence());
+
+        pos = buf.getIter(7);
+        assertEquals(true, pos.endsSentence());
+    }
+
+    public void testCharCounts() {
+        final TextBuffer buf;
+        TextIter pointer;
+
+        buf = new TextBuffer(new TextTagTable());
+
+        buf.setText("hello");
+        pointer = buf.getIterStart();
+        assertEquals(5, pointer.getCharsInLine());
+
+        buf.setText("hello\n");
+        pointer = buf.getIterStart();
+        assertEquals(6, pointer.getCharsInLine());
+
+        pointer = buf.getIter(2);
+        Pixbuf pixbuf = null;
+        try {
+            pixbuf = new Pixbuf("src/bindings/java-gnome_Icon.png");
+            buf.insert(pointer, pixbuf);
+        } catch (FileNotFoundException e) {
+            fail("Could not open image");
+        }
+        assertEquals(7, pointer.getCharsInLine());
+    }
+
+    public final void testImplicitTextTagTable() {
+        final TextBuffer buf;
+        final TextTag bold;
+        TextIter pointer;
+        final TextTag[] tags;
+
+        /*
+         * Does no-arg TextBuffer constructor exist and work? This will
+         * initialize default text tag table...
+         */
+
+        buf = new TextBuffer();
+
+        /*
+         * Well, did it?
+         */
+
+        assertSame(TextBuffer.getDefaultTable(), GtkTextBuffer.getTagTable(buf));
+
+        /*
+         * Does no-arg TextTag constructor exist and work?
+         */
+
+        bold = new TextTag();
+        bold.setWeight(Weight.BOLD);
+
+        pointer = buf.getIterStart();
+        buf.insert(pointer, "Be bold!", bold);
+
+        pointer = buf.getIter(4);
+        tags = pointer.getTags();
+
+        assertEquals(1, tags.length);
+        assertSame(bold, tags[0]);
+    }
+
+    public void testTagsAtLocation() {
+        final TextBuffer buf;
+        final TextTag blue;
+        TextIter pointer;
+
+        buf = new TextBuffer();
+
+        blue = new TextTag();
+        blue.setForeground("blue");
+
+        pointer = buf.getIterStart();
+
+        buf.insert(pointer, "Hello ");
+        buf.insert(pointer, "World", blue);
+
+        pointer = buf.getIterStart();
+        assertEquals(0, pointer.getTags().length);
+
+        assertTrue(pointer.forwardChars(8));
+        assertTrue(pointer.insideWord());
+        assertEquals(1, pointer.getTags().length);
+        assertSame(blue, pointer.getTags()[0]);
+    }
+
+    /*
+     * Validate the values of various Pango constants, mostly to ensure our
+     * documentation is accurate.
+     */
+    public final void testPangoWeight() {
+        assertEquals(400, GtkTextTagOverride.valueOf(Weight.NORMAL));
+        assertEquals(700, GtkTextTagOverride.valueOf(Weight.BOLD));
+    }
+
+    /**
+     * Verify that the checkTag() method in TextBuffer works.
+     */
+    public final void testApplyTextTagCheckTable() {
+        final TextTagTable table;
+        final TextBuffer buffer;
+        final TextTag noarg, legal;
+        final TextIter pointer;
+
+        table = new TextTagTable();
+        buffer = new TextBuffer(table);
+
+        noarg = new TextTag();
+        legal = new TextTag(table);
+
+        pointer = buffer.getIterStart();
+
+        buffer.insert(pointer, "Hello");
+
+        try {
+            buffer.insert(pointer, " World", noarg);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        buffer.insert(pointer, " World", legal);
+        // good
+
+        try {
+            buffer.applyTag(noarg, buffer.getIterStart(), buffer.getIterEnd());
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+        buffer.applyTag(legal, buffer.getIterStart(), buffer.getIterEnd());
+        // good
+    }
+
+    /**
+     * Verify that the checkTag() method in TextBuffer works, this time with
+     * TextTags using our default table.
+     */
+    public final void testApplyTextTagCheckNoArg() {
+        final TextTagTable table;
+        final TextBuffer buffer;
+        final TextTag noarg, illegal;
+        final TextIter pointer;
+
+        /*
+         * Now the reverse - we construct without a TextTagTable.
+         */
+
+        buffer = new TextBuffer();
+
+        noarg = new TextTag();
+
+        table = new TextTagTable();
+        illegal = new TextTag(table);
+
+        pointer = buffer.getIterStart();
+
+        buffer.insert(pointer, "Hello");
+
+        buffer.insert(pointer, " World", noarg);
+        try {
+            buffer.insert(pointer, " World", illegal);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        buffer.applyTag(noarg, buffer.getIterStart(), buffer.getIterEnd());
+        try {
+            buffer.applyTag(illegal, buffer.getIterStart(), buffer.getIterEnd());
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    public final void testIterationOverCharacters() {
+        final TextBuffer buffer;
+        TextIter pointer;
+        int i;
+        StringBuilder str;
+
+        /*
+         * Put in 5 characters
+         */
+
+        buffer = new TextBuffer();
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "Hello");
+
+        /*
+         * Iterate over it. Should reach a count of 5.
+         */
+
+        pointer = buffer.getIterStart();
+        i = 0;
+        str = new StringBuilder();
+
+        do {
+            i++;
+            str = str.appendCodePoint(pointer.getChar());
+        } while (pointer.forwardChar());
+
+        assertEquals(5, i);
+        assertEquals("Hello", str.toString());
+    }
+
+    public final void testInsertWithMultipleTags() {
+        final TextBuffer buffer;
+        final TextTag italic, bold, mono;
+        TextIter start;
+
+        buffer = new TextBuffer();
+
+        italic = new TextTag();
+        bold = new TextTag();
+        mono = new TextTag();
+
+        start = buffer.getIterStart();
+
+        buffer.insert(start, "Hello", new TextTag[] {
+            bold,
+            italic
+        });
+
+        start = buffer.getIterStart();
+        assertEquals(2, start.getTags().length);
+
+        ArrayList<TextTag> list;
+        list = new ArrayList<TextTag>(3);
+        list.add(italic);
+        list.add(bold);
+        list.add(mono);
+
+        buffer.insert(start, "World", list);
+
+        start = buffer.getIterStart();
+        assertEquals(3, start.getTags().length);
+    }
+
+    private int offset = -1;
+
+    public final void testReactingToCursorPositionChanges() {
+        final TextBuffer buffer;
+        final TextIter pointer;
+
+        buffer = new TextBuffer();
+
+        assertEquals(-1, offset);
+        offset = buffer.getCursorPosition();
+        assertEquals(0, offset);
+
+        buffer.connect(new TextBuffer.NotifyCursorPosition() {
+            public void onNotifyCursorPosition(TextBuffer source) {
+                offset = buffer.getCursorPosition();
+            }
+        });
+
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "Hello World");
+
+        assertEquals(11, offset);
+    }
+
+    /*
+     * Not much of a test, but at least it exercises the code path to ensure
+     * that Pango.SCALE is correctly accessed by TextTag.
+     */
+    public final void testCrossPackageConstantAccess() throws ClassNotFoundException, SecurityException,
+            NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+        final TextTag tag;
+        Class<?> cls;
+        Field fld;
+        double scale1, scale2;
+
+        tag = new TextTag();
+        tag.setRise(4.5);
+
+        cls = Class.forName("org.gnome.gtk.TextTag");
+        fld = cls.getDeclaredField("SCALE");
+        fld.setAccessible(true);
+        scale1 = fld.getDouble(tag);
+
+        cls = Class.forName("org.gnome.pango.Pango");
+        fld = cls.getDeclaredField("SCALE");
+        fld.setAccessible(true);
+        scale2 = fld.getDouble(tag);
+
+        assertEquals(scale2, scale1);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTextViewBorderWindows.java b/tests/bindings/org/gnome/gtk/ValidateTextViewBorderWindows.java
new file mode 100644
index 0000000..c6a8850
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTextViewBorderWindows.java
@@ -0,0 +1,120 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import static org.gnome.gtk.TextWindowType.LEFT;
+import static org.gnome.gtk.WrapMode.WORD;
+
+/**
+ * Evaluate the conversions between buffer co-ordinates and window
+ * co-ordinates. Also exercises some of the scrolling code.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateTextViewBorderWindows extends GraphicalTestCase
+{
+    public final void testDontAllowAddWithViewport() {
+        final TextView view;
+        final ScrolledWindow scroll;
+
+        view = new TextView();
+        scroll = new ScrolledWindow();
+
+        try {
+            scroll.addWithViewport(view);
+            fail("Should have been prevented");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    /*
+     * If you want to see what the heck this is doing, add a showAll() to the
+     * Window and a Gtk.main() towards the end. TODO Needs something that
+     * tests horizontal (x and X) as well as vertical.
+     */
+    public final void testCovertCoordinatesRoundTrip() {
+        final TextTagTable table;
+        final TextView view;
+        final TextBuffer buffer;
+        final ScrolledWindow scroll;
+        final Window window;
+        TextIter pointer;
+        int y, Y;
+
+        table = new TextTagTable();
+        buffer = new TextBuffer(table);
+        view = new TextView(buffer);
+
+        view.setBorderWindowSize(LEFT, 50);
+
+        for (int i = 0; i < 10; i++) {
+            buffer.insertAtCursor(i + ". This is a test");
+            for (int j = 0; j < 8; j++) {
+                buffer.insertAtCursor(" of the emergency broadcast system");
+            }
+            buffer.insertAtCursor("\n");
+        }
+
+        view.setWrapMode(WORD);
+
+        scroll = new ScrolledWindow();
+        scroll.setPolicy(PolicyType.NEVER, PolicyType.ALWAYS);
+        scroll.add(view);
+        window = new Window();
+        window.add(scroll);
+        window.setDefaultSize(300, 200);
+
+        pointer = buffer.getIterStart();
+        pointer.setLine(7);
+        pointer.setLineOffset(5);
+
+        buffer.placeCursor(pointer);
+        view.scrollTo(buffer.getInsert());
+
+        /*
+         * Critical to ensure that the necessary [re]calculations have
+         * occurred. Much of the TextView processing occurs in idle callbacks.
+         */
+
+        cycleMainLoop();
+
+        Y = view.getLineY(pointer);
+
+        y = view.convertBufferToWindowCoordsY(LEFT, Y);
+
+        assertTrue(Y > 0);
+        assertTrue(y <= Y);
+
+        assertEquals(Y, view.convertWindowToBufferCoordsY(LEFT, y));
+
+        /*
+         * Now test the origin. The window co-ordinate will be somewhere "off"
+         * screen to the north/up direction.
+         */
+
+        pointer = buffer.getIterStart();
+        Y = view.getLineY(pointer);
+        y = view.convertBufferToWindowCoordsY(LEFT, Y);
+
+        assertEquals(0, Y);
+        assertTrue(y <= 0);
+        assertEquals(Y, view.convertWindowToBufferCoordsY(LEFT, y));
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTextViewProperties.java b/tests/bindings/org/gnome/gtk/ValidateTextViewProperties.java
new file mode 100644
index 0000000..473d250
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTextViewProperties.java
@@ -0,0 +1,73 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Verify default values we document and other related tests.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateTextViewProperties extends GraphicalTestCase
+{
+    public final void testTabCharacter() {
+        final TextView view;
+
+        view = new TextView();
+
+        assertEquals(true, GtkTextView.getAcceptsTab(view));
+
+        view.setAcceptsTab(false);
+
+        assertEquals(false, GtkTextView.getAcceptsTab(view));
+    }
+
+    public final void testMarginSetters() {
+        final TextView view;
+
+        view = new TextView();
+
+        assertEquals(0, GtkTextView.getLeftMargin(view));
+
+        try {
+            view.setMarginLeft(-5);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        view.setMarginLeft(5);
+        assertEquals(5, GtkTextView.getLeftMargin(view));
+
+        /*
+         * Repeat for margin-right
+         */
+
+        assertEquals(0, GtkTextView.getRightMargin(view));
+
+        try {
+            view.setMarginRight(-11);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        view.setMarginRight(11);
+        assertEquals(11, GtkTextView.getRightMargin(view));
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTextViewSpelling.java b/tests/bindings/org/gnome/gtk/ValidateTextViewSpelling.java
new file mode 100644
index 0000000..cd804ff
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTextViewSpelling.java
@@ -0,0 +1,82 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Check that getting the GtkSpell helper object functions correctly.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateTextViewSpelling extends GraphicalTestCase
+{
+    public final void testAttachingDefault() {
+        final TextView view;
+
+        view = new TextView();
+
+        try {
+            view.getSpell();
+            fail("Can't get without attaching!");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+
+        view.attachSpell();
+        assertNotNull(view.getSpell());
+
+        try {
+            view.attachSpell();
+            fail("Can't attach twice");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+    }
+
+    public final void testAttachingSpecific() {
+        final TextView view;
+        final Spell helper;
+
+        view = new TextView();
+        view.attachSpell("en");
+
+        try {
+            view.attachSpell();
+            fail("Can't attach twice");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+
+        try {
+            view.attachSpell("en");
+            fail("Can't attach twice");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+
+        helper = view.getSpell();
+        assertNotNull(helper);
+
+        try {
+            helper.setLanguage("zu_LU");
+            fail("Enchant should have failed for an obviously unknown language");
+        } catch (RuntimeException iae) {
+            // good
+        }
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateThreadStability.java b/tests/bindings/org/gnome/gtk/ValidateThreadStability.java
new file mode 100644
index 0000000..34af804
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateThreadStability.java
@@ -0,0 +1,107 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2007      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.cairo.Context;
+import org.gnome.gdk.Event;
+
+/**
+ * Verify concurrent behaviour is correct. We briefly had a tentative
+ * architecture that evaluated what would happen of the GDK lock was released
+ * while signal handlers were running. This simple example that shows the
+ * problem cited by Owen Taylor as the reason that we can't do this. TODO this
+ * class needs to be refactored as a unit test.
+ * 
+ * @author Vreixo Formoso
+ */
+public final class ValidateThreadStability
+{
+    VBox x1;
+
+    VBox x2;
+
+    BadThread thread;
+
+    private ValidateThreadStability() {
+        final Window w;
+
+        w = new Window();
+
+        x1 = new VBox(false, 3);
+
+        w.add(x1);
+
+        x2 = new VBox(false, 0);
+        x1.add(x2);
+
+        w.setTitle("Exp");
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                System.out.println("I was deleted!");
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        x2.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                System.out.println("Expose event. VBOX");
+                Thread.yield();
+                return false;
+            }
+        });
+
+        w.showAll();
+
+        thread = new BadThread();
+        thread.setDaemon(true);
+        thread.start();
+
+    }
+
+    class BadThread extends Thread
+    {
+
+        public void run() {
+            while (true) {
+                Button b = new Button("Hello");
+                b.setRelief(ReliefStyle.NORMAL);
+                x1.add(b);
+                b.show();
+                Thread.yield();
+                x1.remove(b);
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new ValidateThreadStability();
+
+        Gtk.main();
+
+        System.gc();
+
+        System.out.println("Bye now.");
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTreeModel.java b/tests/bindings/org/gnome/gtk/ValidateTreeModel.java
new file mode 100644
index 0000000..716e23c
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTreeModel.java
@@ -0,0 +1,598 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateTreeModel extends GraphicalTestCase
+{
+    public final void testListStoreConstructorArguments() {
+        try {
+            new ListStore(null);
+            fail("Underlying library doesn't allow null arguments to ListStore contstructor");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            new ListStore(new DataColumn[] {});
+            fail("Underlying library doesn't allow zero columns in ListStores");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    public final void testDataColumnTreeModelConstructorInteraction() {
+        final DataColumnString name;
+        final DataColumnInteger age;
+        final DataColumnBoolean useful;
+        final DataColumn[] types;
+        final ListStore model;
+
+        types = new DataColumn[] {
+            name = new DataColumnString(),
+            age = new DataColumnInteger(),
+            useful = new DataColumnBoolean()
+        };
+
+        try {
+            name.getOrdinal();
+            fail("Should have failed check to see that this DataColumn is already added to a ListStore");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+
+        assertSame(String.class, name.getType());
+        assertSame(Integer.class, age.getType());
+        assertSame(Boolean.class, useful.getType());
+
+        model = new ListStore(types);
+
+        assertEquals(0, name.getOrdinal());
+        assertEquals(1, age.getOrdinal());
+        assertEquals(2, useful.getOrdinal());
+
+        // supress warning
+        model.getClass();
+    }
+
+    public final void testDontUseDataColumnTwice() {
+        final DataColumn[] types;
+        final DataColumnString column;
+
+        column = new DataColumnString();
+
+        types = new DataColumn[] {
+            column,
+            column
+        };
+
+        try {
+            new ListStore(types);
+            fail("Shouldn't be allowed to construct a ListStore with the same DataColumn used twice");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    /*
+     * Check the manually written code in GtkTreeIterOverride which allocates
+     * and returns us a TreeIter. Both append() and getIterFirst() call
+     * TreeIter.<init>() which invokes this code.
+     */
+    public final void testAllocateTreeIter() {
+        final ListStore model;
+        TreeIter iter;
+
+        model = new ListStore(new DataColumn[] {
+            new DataColumnString(),
+        });
+
+        iter = model.getIterFirst();
+
+        assertNull(iter);
+
+        iter = model.appendRow();
+        assertNotNull(iter);
+
+        iter = model.getIterFirst();
+        assertNotNull(iter);
+
+        iter = null;
+        cycleGarbageCollector();
+        // at this point, if we haven't crashed, that's a good thing.
+    }
+
+    public final void testSettingValueStringColumn() {
+        final ListStore model;
+        TreeIter row;
+        DataColumnString column;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, "Hello");
+
+        assertEquals("Hello", model.getValue(row, column));
+    }
+
+    public final void testSettingValueIntegerColumn() {
+        final ListStore model;
+        TreeIter row;
+        DataColumnInteger column;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnInteger(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, 42);
+
+        assertEquals(42, model.getValue(row, column));
+    }
+
+    public final void testSettingValueLongColumn() {
+        final ListStore model;
+        TreeIter row;
+        DataColumnLong column;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnLong(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, -600000000000L);
+
+        assertEquals(-600000000000L, model.getValue(row, column));
+    }
+
+    public final void testSettingValueBooleanColumn() {
+        final ListStore model;
+        TreeIter row;
+        DataColumnBoolean column;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnBoolean(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, true);
+        assertEquals(true, model.getValue(row, column));
+
+        model.setValue(row, column, false);
+        assertEquals(false, model.getValue(row, column));
+
+        model.setValue(row, column, true);
+        assertEquals(true, model.getValue(row, column));
+    }
+
+    public final void testTreePathParseCheck() {
+        try {
+            // path = new TreePath("-1");
+            TreePath.validationCheck(0L);
+            fail("TreePath constructor should have caught null condition");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    public final void testTreePathFromToString() {
+        TreePath path;
+
+        path = new TreePath("42");
+        assertEquals("42", path.toString());
+        /*
+         * That this points to the 43rd row of something is irrelevent. These
+         * are abstract until used with model.getIter()
+         */
+    }
+
+    public final void testTreeIterFromTreePath() {
+        final ListStore model;
+        final DataColumnBoolean column;
+        TreeIter row;
+        TreePath path1, path2, path3;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnBoolean(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, false);
+        row = model.appendRow();
+        model.setValue(row, column, true);
+
+        path1 = new TreePath("0");
+        row = model.getIter(path1);
+        assertEquals(false, model.getValue(row, column));
+
+        path2 = new TreePath("1");
+        row = model.getIter(path2);
+        assertEquals(true, model.getValue(row, column));
+
+        assertNotSame(path1, path2);
+        assertFalse(path1.equals(path2));
+
+        path3 = new TreePath("1");
+        assertNotSame(path2, path3);
+        assertTrue(path2.equals(path3));
+        assertTrue(path3.equals(path2));
+    }
+
+    public final void testTreePathFromTreeIter() {
+        final ListStore model;
+        final DataColumnBoolean column;
+        TreeIter row;
+        TreePath path;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnBoolean(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, false);
+        row = model.appendRow();
+        model.setValue(row, column, true);
+
+        path = model.getPath(row);
+        assertEquals("1", path.toString());
+    }
+
+    /*
+     * This could move to a TreeView test case class if we create one.
+     */
+    public final void testTreeIterFromTreeSelection() {
+        final ListStore model;
+        final DataColumnBoolean column;
+        TreeIter row;
+        TreePath path0, path1;
+        final TreeView view;
+        final TreeSelection helper;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnBoolean(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, false);
+        row = model.appendRow();
+        model.setValue(row, column, true);
+
+        /*
+         * Same setup as previous one. Now create a TreeView and see what
+         * happens if we manually select things.
+         */
+
+        view = new TreeView(model);
+        helper = view.getSelection();
+
+        /*
+         * We have commented that the default is SINGLE. If this fails, change
+         * the documentation of TreeSelection's setMode().
+         */
+
+        assertSame("GTK default behaviour changed. Adjust documentation", SelectionMode.SINGLE,
+                helper.getMode());
+
+        helper.setMode(SelectionMode.BROWSE);
+        assertSame(SelectionMode.BROWSE, helper.getMode());
+
+        path0 = new TreePath("0");
+        helper.selectRow(path0);
+
+        row = model.getIter(path0);
+        assertEquals(false, model.getValue(row, column));
+
+        row = helper.getSelected();
+        assertEquals(false, model.getValue(row, column));
+
+        path1 = new TreePath("1");
+        helper.selectRow(path0);
+
+        row = model.getIter(path1);
+        assertEquals(true, model.getValue(row, column));
+
+        // haven't moved selection yet
+        row = helper.getSelected();
+        assertEquals(false, model.getValue(row, column));
+
+        // now move it
+        helper.selectRow(path1);
+        row = helper.getSelected();
+        assertEquals(true, model.getValue(row, column));
+
+        /*
+         * And now test TreeIter form of selectRow()
+         */
+
+        row = model.getIter(path0);
+        helper.selectRow(row);
+
+        row = helper.getSelected();
+        assertEquals(false, model.getValue(row, column));
+    }
+
+    public final void testPixbufColumns() throws FileNotFoundException {
+        final ListStore model;
+        final DataColumnPixbuf column;
+        final TreeIter row;
+        final Pixbuf image;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnPixbuf(),
+        });
+
+        row = model.appendRow();
+        image = new Pixbuf("src/bindings/java-gnome_Icon.png");
+
+        model.setValue(row, column, image);
+
+        assertSame(image, model.getValue(row, column));
+    }
+
+    public final void testSettingValueReferenceColumn() {
+        final ListStore model;
+        final DataColumnReference<File> column;
+        final TreeIter row;
+        final File target;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnReference<File>(),
+        });
+
+        row = model.appendRow();
+        target = new File("/etc/passwd");
+        model.setValue(row, column, target);
+
+        assertSame(target, model.getValue(row, column));
+    }
+
+    public final void testIterationOverModel() {
+        final ListStore model;
+        final DataColumnString column;
+        TreeIter row;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString(),
+        });
+
+        for (int i = 0; i < 10; i++) {
+            row = model.appendRow();
+            model.setValue(row, column, "" + i);
+        }
+
+        /*
+         * now exercise our loop
+         */
+
+        int j = 0;
+
+        row = model.getIterFirst();
+        do {
+            assertEquals("" + j, model.getValue(row, column));
+            j++;
+        } while (row.iterNext());
+
+        assertEquals(10, j);
+    }
+
+    public final void testTreeRowReferences() {
+        final ListStore model;
+        final DataColumnString text;
+        final DataColumnInteger sort;
+        TreeIter row;
+        TreePath path;
+        final TreeView view;
+        TreeViewColumn vertical;
+        CellRendererText renderer;
+        TreeRowReference ref;
+
+        model = new ListStore(new DataColumn[] {
+            text = new DataColumnString(),
+            sort = new DataColumnInteger(),
+        });
+
+        /*
+         * Initial order: 1, 2, 3, ... 10
+         */
+        for (int i = 1; i <= 10; i++) {
+            row = model.appendRow();
+            model.setValue(row, text, Integer.toString(i));
+            model.setValue(row, sort, i);
+        }
+
+        view = new TreeView(model);
+        vertical = view.appendColumn();
+        renderer = new CellRendererText(vertical);
+        renderer.setText(text);
+
+        path = new TreePath("1");
+        row = model.getIter(path);
+        assertEquals("2", model.getValue(row, text));
+
+        ref = new TreeRowReference(model, path);
+
+        path = ref.getPath();
+        row = model.getIter(path);
+        assertEquals("2", model.getValue(row, text));
+
+        /*
+         * Rearrange things: sorting will change order to 1, 10, 2, 3, ... 9
+         */
+        vertical.setSortColumn(text);
+        vertical.emitClicked();
+
+        path = new TreePath("1");
+        row = model.getIter(path);
+        assertEquals("10", model.getValue(row, text));
+
+        /*
+         * But is reference still stable?
+         */
+        path = ref.getPath();
+        row = model.getIter(path);
+        assertEquals("2", model.getValue(row, text)); // yup
+
+        model.clear();
+        path = ref.getPath();
+        assertNull(path);
+    }
+
+    public final void testCheckIter() {
+        final ListStore model1, model2;
+        TreeIter row;
+        DataColumnString column1, column2;
+
+        model1 = new ListStore(new DataColumn[] {
+            column1 = new DataColumnString(),
+        });
+
+        model2 = new ListStore(new DataColumn[] {
+            column2 = new DataColumnString(),
+        });
+
+        row = model1.appendRow();
+        model1.setValue(row, column1, "Hello");
+
+        assertEquals("Hello", model1.getValue(row, column1));
+
+        try {
+            model2.setValue(row, column2, "Hello");
+            fail("model2 has accepted a model1 TreeIter");
+        } catch (IllegalArgumentException iae) {
+            // ok
+        }
+    }
+
+    public final void testDeleteRow() {
+        final ListStore model;
+        final DataColumnInteger column;
+        TreeIter row;
+        int i, sum;
+        boolean result;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnInteger(),
+        });
+
+        for (i = 1; i <= 5; i++) {
+            row = model.appendRow();
+            model.setValue(row, column, i);
+        }
+
+        row = model.getIterFirst();
+        sum = 0;
+        do {
+            sum += model.getValue(row, column);
+        } while (row.iterNext());
+        assertEquals(15, sum);
+
+        row = model.getIterFirst();
+
+        result = model.removeRow(row);
+        assertTrue(result);
+
+        row = model.getIterFirst();
+        sum = 0;
+        do {
+            sum += model.getValue(row, column);
+        } while (row.iterNext());
+        assertEquals(14, sum);
+
+        row = model.getIterFirst();
+        result = model.removeRow(row);
+        assertTrue(result);
+        result = model.removeRow(row);
+        assertTrue(result);
+        result = model.removeRow(row);
+        assertTrue(result);
+        result = model.removeRow(row);
+        assertFalse(result);
+    }
+
+    public final void testInsertRow() {
+        final ListStore model;
+        final DataColumnInteger column;
+        TreeIter row, sibbling;
+        int i;
+        String str;
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnInteger(),
+        });
+
+        for (i = 0; i < 10; i += 3) {
+            row = model.appendRow();
+            model.setValue(row, column, i);
+        }
+
+        try {
+            row = model.insertRow(-1);
+            fail("Should have thrown");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        str = "";
+        row = model.getIterFirst();
+        do {
+            str += model.getValue(row, column);
+        } while (row.iterNext());
+        assertEquals("0369", str);
+
+        row = model.insertRow(1);
+        model.setValue(row, column, 2);
+
+        str = "";
+        row = model.getIterFirst();
+        do {
+            str += model.getValue(row, column);
+        } while (row.iterNext());
+        assertEquals("02369", str);
+
+        row = model.insertRow(50);
+        model.setValue(row, column, 8);
+
+        str = "";
+        row = model.getIterFirst();
+        do {
+            str += model.getValue(row, column);
+        } while (row.iterNext());
+        assertEquals("023698", str);
+
+        sibbling = model.getIter(new TreePath("3"));
+        row = model.insertRow(sibbling);
+        model.setValue(row, column, 7);
+
+        str = "";
+        row = model.getIterFirst();
+        do {
+            str += model.getValue(row, column);
+        } while (row.iterNext());
+        assertEquals("0237698", str);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTreeModelFilter.java b/tests/bindings/org/gnome/gtk/ValidateTreeModelFilter.java
new file mode 100644
index 0000000..1b5713f
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTreeModelFilter.java
@@ -0,0 +1,184 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateTreeModelFilter extends GraphicalTestCase
+{
+    private final DataColumnString name;
+
+    private final DataColumnInteger age;
+
+    private final DataColumnBoolean useful;
+
+    private final ListStore base;
+
+    private final TreeModelFilter filter;
+
+    public ValidateTreeModelFilter() {
+        TreeIter row;
+
+        base = new ListStore(new DataColumn[] {
+            name = new DataColumnString(),
+            age = new DataColumnInteger(),
+            useful = new DataColumnBoolean()
+        });
+
+        row = base.appendRow();
+        base.setValue(row, name, "Peter");
+        base.setValue(row, age, 60);
+        base.setValue(row, useful, false);
+
+        row = base.appendRow();
+        base.setValue(row, name, "Paul");
+        base.setValue(row, age, 61);
+        base.setValue(row, useful, true);
+
+        row = base.appendRow();
+        base.setValue(row, name, "Mary");
+        base.setValue(row, age, 62);
+        base.setValue(row, useful, false);
+
+        assertEquals(3, sizeOfModel(base));
+        assertEquals(1, numberThatAreUseful(base, useful));
+
+        filter = new TreeModelFilter(base, null);
+    }
+
+    public final void testFiltering() {
+        TreeIter row;
+
+        filter.setVisibleCallback(new TreeModelFilter.Visible() {
+            public boolean onVisible(TreeModelFilter source, TreeModel base, TreeIter row) {
+                return base.getValue(row, useful);
+            }
+        });
+
+        /*
+         * We had a bug where we were not setting the model field of the
+         * TreeIter leading to a check failure which is why we wrote this test
+         * case. Having the callback be called yielded the exception.
+         */
+        filter.refilter();
+
+        assertEquals(1, sizeOfModel(filter));
+        row = filter.getIterFirst();
+        assertEquals("Paul", filter.getValue(row, name));
+    }
+
+    private static int sizeOfModel(TreeModel model) {
+        TreeIter pointer;
+        int i;
+
+        pointer = model.getIterFirst();
+        assertNotNull(pointer);
+
+        i = 0;
+        do {
+            i++;
+        } while (pointer.iterNext());
+
+        return i;
+    }
+
+    private static int numberThatAreUseful(TreeModel model, DataColumnBoolean usefulColumn) {
+        TreeIter pointerRow;
+        int i;
+
+        pointerRow = model.getIterFirst();
+        assertNotNull(pointerRow);
+
+        i = 0;
+        do {
+            if (model.getValue(pointerRow, usefulColumn) == true) {
+                i++;
+            }
+        } while (pointerRow.iterNext());
+
+        return i;
+    }
+
+    public final void testIterConversion() {
+        TreeIter rowInFitler, rowInBase;
+        TreePath pathInFitler, pathInBase;
+
+        filter.setVisibleCallback(new TreeModelFilter.Visible() {
+            public boolean onVisible(TreeModelFilter source, TreeModel base, TreeIter row) {
+                return (base.getValue(row, age) == 62);
+            }
+        });
+
+        filter.refilter();
+
+        assertEquals(1, sizeOfModel(filter));
+        rowInFitler = filter.getIterFirst();
+        assertEquals("Mary", filter.getValue(rowInFitler, name));
+
+        /*
+         * Ok. Now test TreeIter conversion functions
+         */
+
+        rowInBase = filter.convertIterFilterToBase(rowInFitler);
+        assertEquals("Mary", base.getValue(rowInBase, name));
+
+        rowInFitler = filter.convertIterBaseToFilter(rowInBase);
+        assertEquals("Mary", filter.getValue(rowInFitler, name));
+
+        /*
+         * What happens when the row isn't present?
+         */
+
+        rowInBase = base.getIterFirst();
+        assertEquals("Peter", base.getValue(rowInBase, name));
+
+        rowInFitler = filter.convertIterBaseToFilter(rowInBase);
+        assertNull(rowInFitler);
+
+        /*
+         * And somewhat more convoluted, the TreePath conversion functions
+         */
+
+        rowInFitler = filter.getIterFirst();
+        pathInFitler = filter.getPath(rowInFitler);
+
+        pathInBase = filter.convertPathFilterToBase(pathInFitler);
+        assertEquals("0", pathInFitler.toString());
+        assertEquals("2", pathInBase.toString());
+        assertFalse(pathInBase.equals(pathInFitler));
+
+        rowInBase = base.getIter(pathInBase);
+        assertEquals("Mary", base.getValue(rowInBase, name));
+
+        pathInFitler = filter.convertPathBaseToFilter(pathInBase);
+        rowInFitler = filter.getIter(pathInFitler);
+        assertEquals("Mary", filter.getValue(rowInFitler, name));
+
+        /*
+         * And again, what happens when the path isn't present?
+         */
+
+        rowInBase = base.getIterFirst();
+        pathInBase = base.getPath(rowInBase);
+
+        pathInFitler = filter.convertPathBaseToFilter(pathInBase);
+        assertNull(pathInFitler);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTreeModelSort.java b/tests/bindings/org/gnome/gtk/ValidateTreeModelSort.java
new file mode 100644
index 0000000..ce4b558
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTreeModelSort.java
@@ -0,0 +1,141 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateTreeModelSort extends GraphicalTestCase
+{
+    private final DataColumnString nameOfBeach;
+
+    private final DataColumnInteger lengthOfBeach;
+
+    private final ListStore base;
+
+    private final TreeModelSort sort;
+
+    public ValidateTreeModelSort() {
+        TreeIter row;
+
+        base = new ListStore(new DataColumn[] {
+            nameOfBeach = new DataColumnString(),
+            lengthOfBeach = new DataColumnInteger(),
+        });
+
+        row = base.appendRow();
+        base.setValue(row, nameOfBeach, "Hermosa");
+        base.setValue(row, lengthOfBeach, 3000);
+
+        row = base.appendRow();
+        base.setValue(row, nameOfBeach, "Manly");
+        base.setValue(row, lengthOfBeach, 1500);
+
+        row = base.appendRow();
+        base.setValue(row, nameOfBeach, "Bondi");
+        base.setValue(row, lengthOfBeach, 800);
+
+        row = base.appendRow();
+        base.setValue(row, nameOfBeach, "Seven Mile");
+        base.setValue(row, lengthOfBeach, 7 * 1601);
+
+        sort = new TreeModelSort(base);
+        sort.setSortColumn(lengthOfBeach, SortType.ASCENDING);
+    }
+
+    private static int sizeOfModel(TreeModel model) {
+        TreeIter pointer;
+        int i;
+
+        pointer = model.getIterFirst();
+        assertNotNull(pointer);
+
+        i = 0;
+        do {
+            i++;
+        } while (pointer.iterNext());
+
+        return i;
+    }
+
+    public final void testSorting() {
+        TreeIter row;
+
+        assertEquals(4, sizeOfModel(base));
+        assertEquals(4, sizeOfModel(sort));
+
+        row = base.getIterFirst();
+        assertEquals("Hermosa", base.getValue(row, nameOfBeach));
+
+        row = sort.getIterFirst();
+        assertEquals("Bondi", sort.getValue(row, nameOfBeach));
+        row.iterNext();
+        assertEquals("Manly", sort.getValue(row, nameOfBeach));
+        row.iterNext();
+        assertEquals("Hermosa", sort.getValue(row, nameOfBeach));
+        row.iterNext();
+        assertEquals("Seven Mile", sort.getValue(row, nameOfBeach));
+    }
+
+    public final void testIterConversion() {
+        TreeIter rowInSort, rowInBase;
+        TreePath pathInSort, pathInBase;
+
+        /*
+         * Test TreeIter conversion functions.
+         */
+
+        rowInSort = sort.getIterFirst();
+        assertEquals("Bondi", sort.getValue(rowInSort, nameOfBeach));
+
+        rowInBase = sort.convertIterSortToBase(rowInSort);
+        assertEquals("Bondi", base.getValue(rowInBase, nameOfBeach));
+
+        rowInSort = sort.convertIterBaseToSort(rowInBase);
+        assertEquals("Bondi", sort.getValue(rowInSort, nameOfBeach));
+
+        rowInBase = base.getIterFirst();
+        assertEquals("Hermosa", base.getValue(rowInBase, nameOfBeach));
+
+        rowInSort = sort.convertIterBaseToSort(rowInBase);
+        assertEquals("Hermosa", sort.getValue(rowInSort, nameOfBeach));
+
+        rowInBase = sort.convertIterSortToBase(rowInSort);
+        assertEquals("Hermosa", base.getValue(rowInBase, nameOfBeach));
+
+        /*
+         * Test TreePath conversion functions
+         */
+
+        rowInSort = sort.getIterFirst();
+        pathInSort = sort.getPath(rowInSort);
+
+        pathInBase = sort.convertPathSortToBase(pathInSort);
+        assertEquals("0", pathInSort.toString());
+        assertEquals("2", pathInBase.toString());
+        assertFalse(pathInBase.equals(pathInSort));
+
+        rowInBase = base.getIter(pathInBase);
+        assertEquals("Bondi", base.getValue(rowInBase, nameOfBeach));
+
+        pathInSort = sort.convertPathBaseToSort(pathInBase);
+        rowInSort = sort.getIter(pathInSort);
+        assertEquals("Bondi", sort.getValue(rowInSort, nameOfBeach));
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTreeStore.java b/tests/bindings/org/gnome/gtk/ValidateTreeStore.java
new file mode 100644
index 0000000..7b802dd
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTreeStore.java
@@ -0,0 +1,417 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ * @author Vreixo Formoso
+ * @author Stefan Prelle
+ */
+/*
+ * Some are copy/adapted from ValidateTreeModel
+ */
+public class ValidateTreeStore extends GraphicalTestCase
+{
+    public final void testTreeStoreConstructorArguments() {
+        try {
+            new TreeStore(null);
+            fail("Underlying library doesn't allow null arguments to TreeStore contstructor");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            new TreeStore(new DataColumn[] {});
+            fail("Underlying library doesn't allow zero columns in TreeStores");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    public final void testDataColumnTreeStoreConstructorInteraction() {
+        final DataColumnString name;
+        final DataColumnInteger age;
+        final DataColumnBoolean useful;
+        final DataColumn[] types;
+        final TreeStore model;
+
+        types = new DataColumn[] {
+            name = new DataColumnString(),
+            age = new DataColumnInteger(),
+            useful = new DataColumnBoolean()
+        };
+
+        try {
+            name.getOrdinal();
+            fail("Should have failed check to see that this DataColumn is already added to a ListStore");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+
+        assertSame(String.class, name.getType());
+        assertSame(Integer.class, age.getType());
+        assertSame(Boolean.class, useful.getType());
+
+        model = new TreeStore(types);
+
+        assertEquals(0, name.getOrdinal());
+        assertEquals(1, age.getOrdinal());
+        assertEquals(2, useful.getOrdinal());
+
+        // supress warning
+        model.getClass();
+    }
+
+    public final void testDontUseDataColumnTwice() {
+        final DataColumn[] types;
+        final DataColumnString column;
+
+        column = new DataColumnString();
+
+        types = new DataColumn[] {
+            column,
+            column
+        };
+
+        try {
+            new TreeStore(types);
+            fail("Shouldn't be allowed to construct a TreeStore with the same DataColumn used twice");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    /*
+     * Check the manually written code in GtkTreeIterOverride which allocates
+     * and returns us a TreeIter. Both append() and getIterFirst() call
+     * TreeIter.<init>() which invokes this code.
+     */
+    public final void testAllocateTreeIter() {
+        final TreeStore model;
+        TreeIter iter;
+
+        model = new TreeStore(new DataColumn[] {
+            new DataColumnString(),
+        });
+
+        iter = model.getIterFirst();
+
+        assertNull(iter);
+
+        iter = model.appendRow();
+        assertNotNull(iter);
+
+        iter = model.getIterFirst();
+        assertNotNull(iter);
+
+        iter = null;
+        cycleGarbageCollector();
+        // at this point, if we haven't crashed, that's a good thing.
+    }
+
+    public void testAppendRow() {
+        final TreeStore model;
+        TreeIter iter1, iter2, iter3;
+
+        model = new TreeStore(new DataColumn[] {
+            new DataColumnString(),
+        });
+
+        iter1 = model.getIterFirst();
+        assertNull(iter1);
+
+        iter1 = model.appendRow();
+        assertNotNull(iter1);
+
+        iter1 = model.getIterFirst();
+        assertNotNull(iter1);
+
+        assertFalse(iter1.iterNext());
+
+        iter1 = model.appendRow();
+        assertNotNull(iter1);
+
+        iter1 = model.getIterFirst();
+        assertNotNull(iter1);
+        assertTrue(iter1.iterNext());
+
+        iter2 = model.appendChild(iter1);
+        iter3 = iter2.copy();
+
+        assertFalse(iter3.iterNext());
+
+        iter3 = model.appendChild(iter1);
+        assertTrue(iter2.iterNext());
+        assertFalse(iter3.iterNext());
+
+        iter1 = model.getIterFirst();
+        assertNotNull(iter1);
+        assertTrue(iter1.iterNext());
+        assertFalse(iter1.iterNext());
+
+        iter1 = iter2 = null;
+        cycleGarbageCollector();
+    }
+
+    public void testIterHasChild() {
+        final TreeStore model;
+        TreeIter iter1, iter2;
+
+        model = new TreeStore(new DataColumn[] {
+            new DataColumnString(),
+        });
+
+        iter1 = model.appendRow();
+        assertNotNull(iter1);
+        assertFalse(model.iterHasChild(iter1));
+
+        iter2 = model.appendChild(iter1);
+        assertNotNull(iter2);
+
+        assertFalse(model.iterHasChild(iter2));
+        assertTrue(model.iterHasChild(iter1));
+
+        iter1 = iter2 = null;
+        cycleGarbageCollector();
+    }
+
+    public void testIterChildren() {
+        final TreeStore model;
+        final DataColumnString column;
+        TreeIter iter1, iter2;
+
+        model = new TreeStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+
+        iter1 = model.appendRow();
+        assertNotNull(iter1);
+        assertFalse(model.iterHasChild(iter1));
+        assertNull(model.iterChildren(iter1));
+
+        iter2 = model.appendChild(iter1);
+        assertNotNull(iter2);
+        assertNull(model.iterChildren(iter2));
+        assertNotNull(model.iterChildren(iter1));
+
+        model.setValue(iter2, column, "1st child");
+        iter2 = model.iterChildren(iter1);
+        assertNotNull(iter2);
+        assertEquals("1st child", model.getValue(iter2, column));
+        assertNull(model.iterChildren(iter2));
+        assertFalse(iter2.iterNext());
+
+        iter2 = model.appendChild(iter1);
+        model.setValue(iter2, column, "2nd child");
+
+        iter2 = model.iterChildren(iter1);
+        assertNotNull(iter2);
+        assertEquals("1st child", model.getValue(iter2, column));
+        assertNull(model.iterChildren(iter2));
+        assertTrue(iter2.iterNext());
+        assertEquals("2nd child", model.getValue(iter2, column));
+        assertFalse(iter2.iterNext());
+
+        iter1 = iter2 = null;
+        cycleGarbageCollector();
+    }
+
+    public void testIterParent() {
+        final TreeStore model;
+        final DataColumnString column;
+        TreeIter p1, p2, iter;
+
+        model = new TreeStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+
+        p1 = model.appendRow();
+        assertNotNull(p1);
+        assertNull(model.iterParent(p1));
+        model.setValue(p1, column, "parent1");
+
+        p2 = model.appendRow();
+        assertNotNull(p2);
+        assertNull(model.iterParent(p2));
+        model.setValue(p2, column, "parent2");
+
+        iter = model.appendChild(p1);
+        assertNotNull(iter);
+        iter = model.iterParent(iter);
+        assertEquals("parent1", model.getValue(iter, column));
+
+        iter = model.appendChild(p1);
+        assertNotNull(iter);
+        iter = model.iterParent(iter);
+        assertEquals("parent1", model.getValue(iter, column));
+
+        iter = model.appendChild(p2);
+        assertNotNull(iter);
+        iter = model.iterParent(iter);
+        assertEquals("parent2", model.getValue(iter, column));
+    }
+
+    public final void testTreeIterFromTreePath() {
+        final TreeStore model;
+        final DataColumnInteger column;
+        TreeIter row, child;
+        TreePath path1, path2, path3;
+
+        model = new TreeStore(new DataColumn[] {
+            column = new DataColumnInteger(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, 1);
+        child = model.appendChild(row);
+        model.setValue(child, column, 11);
+        row = model.appendRow();
+        model.setValue(row, column, 2);
+        child = model.appendChild(row);
+        model.setValue(child, column, 21);
+        child = model.appendChild(row);
+        model.setValue(child, column, 22);
+
+        path1 = new TreePath("0");
+        row = model.getIter(path1);
+        assertEquals(1, model.getValue(row, column));
+
+        path2 = new TreePath("1");
+        row = model.getIter(path2);
+        assertEquals(2, model.getValue(row, column));
+
+        assertNotSame(path1, path2);
+        assertFalse(path1.equals(path2));
+
+        path3 = new TreePath("1");
+        assertNotSame(path2, path3);
+        assertTrue(path2.equals(path3));
+        assertTrue(path3.equals(path2));
+
+        path1 = new TreePath("0:0");
+        row = model.getIter(path1);
+        assertEquals(11, model.getValue(row, column));
+
+        path1 = new TreePath("1:0");
+        row = model.getIter(path1);
+        assertEquals(21, model.getValue(row, column));
+
+        path1 = new TreePath("1:1");
+        row = model.getIter(path1);
+        assertEquals(22, model.getValue(row, column));
+
+        path1 = new TreePath("1:2");
+        assertNull(model.getIter(path1));
+
+        path1 = new TreePath("1:1:0");
+        assertNull(model.getIter(path1));
+
+        path1 = new TreePath("2");
+        assertNull(model.getIter(path1));
+    }
+
+    public final void testTreePathFromTreeIter() {
+        final TreeStore model;
+        final DataColumnBoolean column;
+        TreeIter row, child;
+        TreePath path;
+
+        model = new TreeStore(new DataColumn[] {
+            column = new DataColumnBoolean(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, false);
+        row = model.appendRow();
+        model.setValue(row, column, true);
+
+        path = model.getPath(row);
+        assertEquals("1", path.toString());
+
+        child = model.appendChild(row);
+        path = model.getPath(child);
+        assertEquals("1:0", path.toString());
+
+        child = model.appendChild(row);
+        path = model.getPath(child);
+        assertEquals("1:1", path.toString());
+
+        child = model.appendChild(child);
+        path = model.getPath(child);
+        assertEquals("1:1:0", path.toString());
+    }
+
+    public final void testInsertRow() {
+        final TreeStore model;
+        final DataColumnString column;
+        TreeIter row, row2, row3;
+
+        model = new TreeStore(new DataColumn[] {
+            column = new DataColumnString(),
+        });
+
+        // base data to play with
+        row = model.appendRow();
+        model.setValue(row, column, "a");
+        row2 = model.appendChild(row);
+        model.setValue(row2, column, "aa");
+        row3 = model.appendChild(row2);
+        model.setValue(row3, column, "aaa");
+        row3 = model.appendChild(row2);
+        model.setValue(row3, column, "aab");
+        row = model.appendRow();
+        model.setValue(row, column, "b");
+
+        // Insert
+        row = model.insertRow(null, 1);
+        assertNotNull(row);
+        model.setValue(row, column, "a-b");
+
+        // Insert negative is not allowed
+        try {
+            model.insertRow(null, -1);
+            fail("Negative insertion index not recognized");
+        } catch (RuntimeException e) {
+        }
+
+        // Ensure that element is inserted between 1 and 2
+        row = model.getIterFirst();
+        assertEquals("a", model.getValue(row, column));
+        assertTrue(row.iterNext());
+        assertEquals("a-b", model.getValue(row, column));
+        assertTrue(row.iterNext());
+        assertEquals("b", model.getValue(row, column));
+        assertFalse(row.iterNext());
+
+        // Now test with depth of 3
+        row2 = model.getIter(new TreePath("0:0"));
+        row3 = model.insertRow(row2, 1);
+        assertNotNull(row3);
+        model.setValue(row3, column, "aaa-b");
+
+        // Ensure that element is inserted between 1 and 2
+        row3 = model.getIter(new TreePath("0:0:0"));
+        assertEquals("aaa", model.getValue(row3, column));
+        assertTrue(row3.iterNext());
+        assertEquals("aaa-b", model.getValue(row3, column));
+        assertTrue(row3.iterNext());
+        assertEquals("aab", model.getValue(row3, column));
+        assertFalse(row3.iterNext());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateTreeView.java b/tests/bindings/org/gnome/gtk/ValidateTreeView.java
new file mode 100644
index 0000000..6f773a5
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateTreeView.java
@@ -0,0 +1,99 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateTreeView extends GraphicalTestCase
+{
+    /*
+     * This is only here to validate the comments we've made in our API
+     * documentation...
+     */
+    public final void testDefaultSelection() {
+        final TreeView view;
+        final TreeSelection selection;
+
+        view = new TreeView();
+        selection = view.getSelection();
+
+        assertEquals(SelectionMode.SINGLE, selection.getMode());
+    }
+
+    public final void testCellRendererToggleProperties() {
+        final TreeView view;
+        final TreeViewColumn vertical;
+        final CellRendererToggle renderer;
+
+        view = new TreeView();
+        vertical = view.appendColumn();
+        renderer = new CellRendererToggle(vertical);
+
+        /*
+         * Check default
+         */
+        assertEquals(false, GtkCellRendererToggle.getRadio(renderer));
+
+        /*
+         * Check setter
+         */
+
+        renderer.setRadio(true);
+        assertEquals(true, GtkCellRendererToggle.getRadio(renderer));
+
+        /*
+         * Observe bug in setter
+         */
+
+        renderer.setRadio(false);
+        assertEquals(false, GtkCellRendererToggle.getRadio(renderer));
+
+        // and fixed.
+
+        /*
+         * Now check the fixed active property. Same sequenece as above.
+         */
+
+        assertEquals(false, renderer.getActive());
+        renderer.setActive(true);
+        assertEquals(true, renderer.getActive());
+        renderer.setActive(false);
+        assertEquals(false, renderer.getActive());
+    }
+
+    /*
+     * Test if getting a column by index works as expected
+     */
+    public final void testGetColumn() {
+        final TreeView view;
+        final TreeViewColumn vertical, out;
+        final String testName = "Test";
+
+        view = new TreeView();
+        vertical = view.appendColumn();
+        vertical.setTitle(testName);
+
+        out = view.getColumn(0);
+
+        assertNotNull(out);
+        assertEquals(testName, out.getTitle());
+        assertSame(vertical, out);
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateUnicode.java b/tests/bindings/org/gnome/gtk/ValidateUnicode.java
new file mode 100644
index 0000000..3192e36
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateUnicode.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Test high range unicode characters through java-gnome layers, in this case
+ * using TextBuffer [something we know uses g_utf8_validate()].
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * DANGER: Eclipse seems to be buggy at editing lines with supplemental
+ * characters in them. This file is UTF-8, so the content is correct. And the
+ * display in Eclipse is correct. But if you try editing a line with the
+ * multi-cell n character, Bad Things™ happen. Presumably Eclipse's editor is
+ * making the assumption that String.length() == number of displayed
+ * characters.
+ */
+public class ValidateUnicode extends GraphicalTestCase
+{
+    public final void testLatin1Supplement() {
+        final TextBuffer buffer;
+        TextIter pointer;
+
+        buffer = new TextBuffer();
+
+        /*
+         * This will work, since µ is < 0xFFFF.
+         */
+
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "This character 'µ' is a micro symbol");
+        assertEquals("This character '\u00b5' is a micro symbol", buffer.getText());
+        buffer.setText("");
+        assertEquals(0, buffer.getCharCount());
+    }
+
+    public final void testMathematicalAlphanumericSymbols() {
+        final TextBuffer buffer;
+        TextIter pointer;
+
+        buffer = new TextBuffer();
+        pointer = buffer.getIterStart();
+
+        /*
+         * The 𝑛 character, however, is a three-byte unicode character in
+         * UTF-8, and needs to be represented as 2 characters in UTF-16.
+         */
+
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "This character '\ud835\udc5b' is an italic lower case n symbol");
+        assertEquals("This character '\ud835\udc5b' is an italic lower case n symbol", buffer.getText());
+        buffer.setText("");
+
+        buffer.insertAtCursor("This character '𝑛' is an italic lower case n symbol");
+        assertEquals("This character '𝑛' is an italic lower case n symbol", buffer.getText());
+        buffer.setText("");
+
+        pointer = buffer.getIterStart();
+        buffer.insert(pointer, "This character '𝑛' is an italic lower case n symbol", (TextTag) null);
+        assertEquals("This character '\ud835\udc5b' is an italic lower case n symbol", buffer.getText());
+        buffer.setText("");
+
+        buffer.insertAtCursor("This character '\ud835\udc5b' is an italic lower case n symbol");
+        assertEquals("This character '𝑛' is an italic lower case n symbol", buffer.getText());
+    }
+}
diff --git a/tests/bindings/org/gnome/gtk/ValidateUniqueApplications.java b/tests/bindings/org/gnome/gtk/ValidateUniqueApplications.java
new file mode 100644
index 0000000..cd90568
--- /dev/null
+++ b/tests/bindings/org/gnome/gtk/ValidateUniqueApplications.java
@@ -0,0 +1,122 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2013 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Evaluate the uniquness behaviour of GtkApplication
+ */
+public class ValidateUniqueApplications extends GraphicalTestCase
+{
+    public final void testNameValidation() {
+        @SuppressWarnings("unused")
+        Application app;
+
+        try {
+            app = new Application("");
+            fail("Should have thrown exception");
+            return;
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            app = new Application("MyApplication");
+            fail("Should have thrown exception");
+            return;
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            app = new Application("org.gnome.Invalid$Application");
+            fail("Should have thrown exception");
+            return;
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+    }
+
+    /*
+     * This is tricky. If we didn't ensure a unique name, and you've managed
+     * to get another one of these test cases running, and wedged, then this
+     * would fail. So we do some minimal effort to come up with a more-or-less
+     * likely-to-be-unique name.
+     */
+
+    private boolean hit;
+
+    public final void testInstantiateApplicationObject() {
+        final Application app;
+        final String name;
+
+        name = "test.java-gnome.InstantiateApplicationObject" + this.hashCode();
+        app = new Application(name);
+
+        assertEquals(name, app.getApplicationId());
+
+        hit = false;
+
+        app.connect(new Application.Startup() {
+            public void onStartup(Application source) {
+                assertFalse(app.isRemote());
+                hit = true;
+            }
+        });
+
+        app.connect(new Application.Activate() {
+            public void onActivate(Application source) {
+                source.quit();
+            }
+        });
+
+        app.run(null);
+        assertTrue(hit);
+    }
+
+    private int cookie;
+
+    public final void testApplicationInhibition() {
+        final Application app;
+        final String name;
+
+        name = "test.java-gnome.ApplicationInhibition" + this.hashCode();
+        app = new Application(name);
+
+        app.connect(new Application.Startup() {
+            public void onStartup(Application source) {
+                cookie = app.inhibit(null, ApplicationInhibitFlags.LOGOUT, "Inhibition test");
+
+                assertFalse(app.isInhibited(ApplicationInhibitFlags.SWITCH));
+                assertTrue(app.isInhibited(ApplicationInhibitFlags.LOGOUT));
+
+                app.uninhibit(cookie);
+
+                assertFalse(app.isInhibited(ApplicationInhibitFlags.LOGOUT));
+            }
+        });
+
+        app.connect(new Application.Activate() {
+            public void onActivate(Application source) {
+                source.quit();
+            }
+        });
+
+        app.run(null);
+    }
+}
diff --git a/tests/bindings/org/gnome/pango/ValidatePangoAttributeUsage.java b/tests/bindings/org/gnome/pango/ValidatePangoAttributeUsage.java
new file mode 100644
index 0000000..040cc27
--- /dev/null
+++ b/tests/bindings/org/gnome/pango/ValidatePangoAttributeUsage.java
@@ -0,0 +1,187 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ * Copyright © 2008      Vreixo Formoso
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.cairo.Context;
+import org.freedesktop.cairo.Format;
+import org.freedesktop.cairo.ImageSurface;
+import org.freedesktop.cairo.Surface;
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventFocus;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Image;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Evaluate problems relating to memory management of Pango Attribute structs.
+ * 
+ * @author Vreixo Formoso
+ * @author Andrew Cowie
+ */
+public class ValidatePangoAttributeUsage extends GraphicalTestCase
+{
+    private static Layout draw(Context cr) {
+        final Layout layout;
+        FontDescription desc;
+        final AttributeList list;
+        Attribute attr;
+
+        /*
+         * ...that we use to create a Pango Layout. The Context represents the
+         * backend where the text will be actually drawn. The Layout
+         * represents the text and its format attributes.
+         */
+        layout = new Layout(cr);
+
+        /*
+         * You can set the default font description.
+         */
+        desc = new FontDescription("DejaVu Serif, 18");
+        layout.setFontDescription(desc);
+
+        /*
+         * Build up the text and its formatting
+         */
+
+        list = new AttributeList();
+
+        layout.setText("H€lloworldPeace武道");
+
+        attr = new StyleAttribute(Style.ITALIC);
+        attr.setIndices(0, 5);
+        list.insert(attr);
+
+        desc = new FontDescription();
+        desc.setWeight(Weight.BOLD);
+
+        attr = new FontDescriptionAttribute(desc);
+        attr.setIndices(5, 10);
+        list.insert(attr);
+
+        attr = new ForegroundColorAttribute(0.9, 0.1, 0.2);
+        attr.setIndices(10, 5);
+        list.insert(attr);
+
+        attr = new StyleAttribute(Style.NORMAL);
+        attr.setIndices(10, 5);
+        list.insert(attr);
+
+        attr = new BackgroundColorAttribute(1.0, 1.0, 0.0);
+        attr.setIndices(10, 5);
+        list.insert(attr);
+
+        attr = new WeightAttribute(Weight.NORMAL);
+        attr.setIndices(11, 4);
+        list.insert(attr);
+
+        attr = new VariantAttribute(Variant.SMALL_CAPS);
+        attr.setIndices(11, 4);
+        list.insert(attr);
+
+        attr = new ForegroundColorAttribute(0.0, 0.0, 0.0);
+        attr.setIndices(15, 2);
+        list.insert(attr);
+        attr = new FallbackAttribute(false);
+        attr.setIndices(15, 2);
+        list.insert(attr);
+
+        attr = new ForegroundColorAttribute(0.1, 0.5, 0.7);
+        list.insert(attr);
+
+        layout.setAttributes(list);
+
+        /*
+         * You can set the alignment of the Layout. Note that you should set
+         * its width too.
+         */
+        layout.setWidth(290.0);
+        layout.setAlignment(Alignment.CENTER);
+
+        /*
+         * And finally, we draw the text!
+         */
+        cr.showLayout(layout);
+
+        return layout;
+    }
+
+    public static void main(String[] args) {
+        final Window w;
+        final Image i;
+
+        Gtk.init(args);
+
+        w = new Window();
+        w.setDefaultSize(300, 70);
+
+        i = new Image();
+        w.add(i);
+        w.showAll();
+
+        i.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                draw(cr);
+                return false;
+            }
+        });
+
+        /*
+         * This allows us to test the memory management problem where we were
+         * crashing the VM due to our not being aware that AttributeList's
+         * insert() steals the ownership of an Attribute.
+         */
+        w.connect(new Widget.FocusOutEvent() {
+            public boolean onFocusOutEvent(Widget source, EventFocus event) {
+                System.gc();
+                return false;
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+
+    public final void testPangoAttributeOwnership() throws InterruptedException {
+        final Surface surface;
+        final Context cr;
+        Layout layout;
+
+        System.gc();
+        Thread.sleep(50);
+
+        surface = new ImageSurface(Format.ARGB32, 150, 150);
+        cr = new Context(surface);
+        layout = draw(cr);
+
+        assertNotNull(PangoLayout.getAttributes(layout));
+        layout = null;
+
+        System.gc();
+        Thread.sleep(50);
+    }
+}
diff --git a/tests/bindings/org/gnome/pango/ValidatePangoFonts.java b/tests/bindings/org/gnome/pango/ValidatePangoFonts.java
new file mode 100644
index 0000000..704626c
--- /dev/null
+++ b/tests/bindings/org/gnome/pango/ValidatePangoFonts.java
@@ -0,0 +1,140 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.cairo.Format;
+import org.freedesktop.cairo.ImageSurface;
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * Test the Pango Font loading logic. This is a problematic test, since its
+ * outcomes depend on the following fonts being installed: DejaVu, Corefonts,
+ * Liberation, and Arkandis Gillius. FIXME None of these are "dependencies" of
+ * java-gnome so this can't run by UnitTests. Any ideas?
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidatePangoFonts extends GraphicalTestCase
+{
+    private static FontDescription loadFont(final FontDescription request) {
+        final FontDescription actual;
+        final Layout layout;
+        final org.freedesktop.cairo.Surface surface;
+        final org.freedesktop.cairo.Context cr;
+        final Context context;
+        final Font font;
+
+        /*
+         * Setup
+         */
+
+        surface = new ImageSurface(Format.RGB24, 100, 100);
+        cr = new org.freedesktop.cairo.Context(surface);
+
+        layout = new Layout(cr);
+        context = layout.getContext();
+
+        /*
+         * Now test
+         */
+
+        font = context.loadFont(request);
+        actual = font.describe();
+
+        return actual;
+    }
+
+    /*
+     * This depends on Deja Vu Sans being the actual default fallback font.
+     * Can't really assume that, can we?
+     */
+    public final void testLoadKnownFallback() {
+        final FontDescription request, actual;
+        final String family;
+        final Style style;
+
+        request = new FontDescription("Deja Vu Sans");
+        actual = loadFont(request);
+
+        assertNotSame(actual, request);
+
+        family = actual.getFamily();
+        style = actual.getStyle();
+
+        assertEquals("DejaVu Sans", family);
+        assertSame(Style.NORMAL, style);
+    }
+
+    public final void testLoadWrongName() {
+        final FontDescription request, actual;
+        final String family;
+
+        request = new FontDescription("Times New");
+        actual = loadFont(request);
+
+        family = actual.getFamily();
+
+        assertEquals("DejaVu Sans", family);
+    }
+
+    /*
+     * This depends on Microsoft Corefonts being installed. Not going to make
+     * that a prerequisite of java-gnome, are we!
+     */
+    public final void testLoadCorrectName() {
+        final FontDescription request, actual;
+        final String family;
+
+        request = new FontDescription("Times New Roman,");
+        actual = loadFont(request);
+
+        family = actual.getFamily();
+
+        assertEquals("Times New Roman", family);
+    }
+
+    /*
+     * This depends on Liberation being installed. Not unreasonable, but
+     * again, should java-gnome depend on it? No.
+     */
+    public final void testLoadMinimumName() {
+        final FontDescription request, actual;
+        final String family;
+
+        request = new FontDescription("Liberation Sans,");
+        actual = loadFont(request);
+
+        family = actual.getFamily();
+
+        assertEquals("Liberation Sans", family);
+    }
+
+    public final void testLoadMinimumGilus() {
+        final FontDescription request, actual;
+        final String family;
+
+        request = new FontDescription();
+        request.setFamily("Gillius ADF No2 Cd");
+        actual = loadFont(request);
+
+        family = actual.getFamily();
+
+        assertEquals("Gillius ADF No2 Cd", family);
+    }
+}
diff --git a/tests/bindings/org/gnome/pango/ValidatePangoTextRendering.java b/tests/bindings/org/gnome/pango/ValidatePangoTextRendering.java
new file mode 100644
index 0000000..aa32baa
--- /dev/null
+++ b/tests/bindings/org/gnome/pango/ValidatePangoTextRendering.java
@@ -0,0 +1,216 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.pango;
+
+import java.io.IOException;
+
+import org.freedesktop.cairo.Context;
+import org.freedesktop.cairo.Format;
+import org.freedesktop.cairo.ImageSurface;
+import org.freedesktop.cairo.PdfSurface;
+import org.freedesktop.cairo.Surface;
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Image;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidatePangoTextRendering extends GraphicalTestCase
+{
+    private static Layout draw(final Context cr) {
+        final Layout layout;
+
+        cr.setSource(0.1, 0.9, 0.2, 1.0);
+        cr.moveTo(10, 80);
+        layout = new Layout(cr);
+        layout.setText("Hello");
+
+        cr.showLayout(layout);
+
+        return layout;
+    }
+
+    public final void testPropertyDefaults() {
+        final Surface surface;
+        final Context cr;
+        final Layout layout;
+
+        surface = new ImageSurface(Format.ARGB32, 150, 150);
+        cr = new Context(surface);
+
+        layout = draw(cr);
+
+        /*
+         * Initial conditions
+         */
+
+        assertEquals(0.0, layout.getIndent());
+        assertEquals(false, layout.getJustify());
+        assertEquals(0.0, layout.getSpacing());
+
+        /*
+         * Round trips
+         */
+
+        layout.setIndent(5.0);
+        assertEquals(5.0, layout.getIndent());
+
+        layout.setJustify(true);
+        assertEquals(true, layout.getJustify());
+        layout.setJustify(false);
+        assertEquals(false, layout.getJustify());
+
+        layout.setSpacing(3.5);
+        assertEquals(3.5, layout.getSpacing());
+    }
+
+    /*
+     * This verifies our having normalized the co-ordinate spaces to Cairo
+     * units.
+     */
+    public final void testWidthAndHeightNormalization() throws IOException {
+        Surface surface;
+        Context cr;
+        Layout layout;
+        double units, pixels;
+
+        surface = new ImageSurface(Format.ARGB32, 150, 150);
+        cr = new Context(surface);
+
+        layout = draw(cr);
+
+        layout.setWidth(60.0);
+
+        units = layout.getSizeWidth();
+        assertEquals(units, layout.getPixelWidth(), 0.001);
+
+        /*
+         * Now test with a Surface whose device units are not integral pixels.
+         */
+
+        surface = new PdfSurface("tmp/tests/org/gnome/pango/ValidatePangoTextRendering.pdf", 150, 150);
+        cr = new Context(surface);
+
+        layout = draw(cr);
+
+        units = layout.getSizeWidth();
+        pixels = layout.getPixelWidth();
+        assertTrue(pixels > units);
+
+        // something really wide!
+        layout.setText("Big brother is watching you, though you probably didn't know. In any case, you're not that interesting so really, the shame is on the poor sod who has to stare at the footage all day.");
+
+        units = layout.getSizeWidth();
+        assertTrue(units > 150);
+
+        /*
+         * Does calling setWidth() re-layout the Layout?
+         */
+
+        layout.setWidth(120);
+
+        units = layout.getSizeWidth();
+        assertTrue(units < 120);
+
+        /*
+         * yes, it does. Impressive.
+         */
+    }
+
+    public final void testLineCount() {
+        final Surface surface;
+        final Context cr;
+        final Layout layout;
+
+        surface = new ImageSurface(Format.ARGB32, 150, 150);
+        cr = new Context(surface);
+        layout = draw(cr);
+
+        assertEquals(1, layout.getLineCount());
+    }
+
+    public static void main(String[] args) {
+        final Window w;
+        final Image i;
+
+        Gtk.init(args);
+
+        w = new Window();
+        i = new Image();
+        w.add(i);
+
+        i.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                draw(cr);
+                return false;
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+        w.showAll();
+        Gtk.main();
+    }
+
+    public final void testAttributeCreation() {
+        final FontDescription desc;
+        Attribute attr;
+
+        desc = new FontDescription("Serif, 12");
+        attr = new FontDescriptionAttribute(desc);
+
+        assertNotNull(attr);
+    }
+
+    public final void testAttributeListUse() {
+        final Attribute attr;
+        final AttributeList list;
+        final Surface surface;
+        final Context cr;
+        final Layout layout;
+
+        surface = new ImageSurface(Format.ARGB32, 150, 150);
+        cr = new Context(surface);
+        layout = new Layout(cr);
+
+        layout.setText("H€lloWorld");
+        list = new AttributeList();
+
+        /*
+         * Now set some Attributes.
+         */
+
+        attr = new StyleAttribute(Style.ITALIC);
+        attr.setIndices(5, 5);
+
+        list.insert(attr);
+        layout.setAttributes(list);
+
+        assertEquals(7, PangoAttribute.getStartIndex(attr));
+        assertEquals(12, PangoAttribute.getEndIndex(attr));
+    }
+}
diff --git a/tests/bindings/org/gnome/pango/ValidatePangoWrapBehaviour.java b/tests/bindings/org/gnome/pango/ValidatePangoWrapBehaviour.java
new file mode 100644
index 0000000..4e8a215
--- /dev/null
+++ b/tests/bindings/org/gnome/pango/ValidatePangoWrapBehaviour.java
@@ -0,0 +1,118 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.pango;
+
+import org.freedesktop.cairo.Context;
+import org.freedesktop.cairo.Format;
+import org.freedesktop.cairo.ImageSurface;
+import org.freedesktop.cairo.Surface;
+import org.gnome.gdk.Event;
+import org.gnome.gtk.DrawingArea;
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Ensure our accessors to PangoLayoutLine structs (and conversion to
+ * character offsets) is accurate.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidatePangoWrapBehaviour extends GraphicalTestCase
+{
+    private static Layout draw(Context cr) {
+        final Layout layout;
+        FontDescription desc;
+
+        layout = new Layout(cr);
+        layout.setWrapMode(WrapMode.CHAR);
+        layout.setWidth(100.0);
+
+        desc = new FontDescription("DejaVu Serif, 18");
+        layout.setFontDescription(desc);
+        layout.setText("H€lloworldPeace武道");
+
+        cr.showLayout(layout);
+
+        return layout;
+    }
+
+    public static void main(String[] args) {
+        final Window w;
+        final DrawingArea d;
+
+        Gtk.init(args);
+
+        w = new Window();
+        w.setDefaultSize(150, 150);
+
+        d = new DrawingArea();
+        w.add(d);
+        w.showAll();
+
+        d.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                draw(cr);
+                return false;
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        Gtk.main();
+    }
+
+    public final void testLayoutLineOffsetConversion() throws InterruptedException {
+        final Surface surface;
+        final Context cr;
+        final Layout layout;
+        final LayoutLine[] lines;
+        LayoutLine line;
+
+        surface = new ImageSurface(Format.ARGB32, 150, 150);
+        cr = new Context(surface);
+        layout = draw(cr);
+
+        lines = layout.getLinesReadonly();
+
+        assertNotNull(lines);
+        assertEquals(3, lines.length);
+
+        // H€lloW
+        line = lines[0];
+        assertEquals(0, line.getStartIndex());
+        assertEquals(6, line.getLength());
+
+        // orldPea
+        line = lines[1];
+        assertEquals(6, line.getStartIndex());
+        assertEquals(7, line.getLength());
+
+        // ce武道
+        line = lines[2];
+        assertEquals(13, line.getStartIndex());
+        assertEquals(4, line.getLength());
+    }
+}
diff --git a/tests/bindings/org/gnome/rsvg/Linux_Tux.svg b/tests/bindings/org/gnome/rsvg/Linux_Tux.svg
new file mode 100644
index 0000000..a7f547d
--- /dev/null
+++ b/tests/bindings/org/gnome/rsvg/Linux_Tux.svg
@@ -0,0 +1,1015 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="334.05" height="393.29">
+  <defs>
+    <linearGradient id="l1">
+      <stop style="stop-color:#000000;stop-opacity:0.50196081" offset="0"/>
+      <stop style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <marker viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="4" markerHeight="3" orient="auto">
+      <path d="M 0 0 L 10 5 L 0 10 z"/>
+    </marker>
+    <marker viewBox="0 0 10 10" refX="10" refY="5" markerUnits="strokeWidth" markerWidth="4" markerHeight="3" orient="auto">
+      <path d="M 10 0 L 0 5 L 10 10 z"/>
+    </marker>
+    <radialGradient xlink:href="#l1" cx="183.53534" cy="352.44836" fx="183.53534" fy="352.44836" r="165.38348" gradientTransform="matrix(1,0,0,0.283537,0,252.5164)" gradientUnits="userSpaceOnUse"/>
+    <radialGradient xlink:href="#l1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.283537,0,252.5164)" cx="183.53534" cy="352.44836" fx="183.53534" fy="352.44836" r="165.38348"/>
+    <radialGradient xlink:href="#l1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.283537,-3.131176e-16,252.5164)" cx="183.53534" cy="352.44836" fx="183.53534" fy="352.44836" r="165.38348"/>
+    <radialGradient xlink:href="#l1" id="r1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.283537,2.128419e-14,252.5164)" cx="183.53534" cy="352.44836" fx="183.53534" fy="352.44836" r="165.38348"/>
+  </defs>
+  <path style="opacity:1;color:#000000;fill:url(#r1);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" d="M 348.91882 352.44836 A 165.38348 46.892269 0 1 1  18.151855,352.44836 A 165.38348 46.892269 0 1 1  348.91882 352.44836 z" transform [...]
+  <path style="opacity:1;color:#000000;fill:url(#r1);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" d="M 348.91882 352.44836 A 165.38348 46.892269 0 1 1  18.151855,352.44836 A 165.38348 46.892269 0 1 1  348.91882 352.44836 z" transform [...]
+  <g>
+    <path style="stroke:none; fill:#000000" d="M 304.732 246.606C 299.98 266.19 275.86 307.086 263.044 325.086C 250.228 343.158 251.812 359.43 228.124 353.094C 204.508 346.758 197.884 347.91 173.476 349.35C 149.212 350.79 154.468 348.63 139.276 355.47C 124.156 362.31 73.3962 272.526 69.2922 255.822C 65.2602 239.118 63.3162 241.134 73.8282 223.062C 84.3402 204.99 85.8522 187.134 99.7482 165.246C 113.644 143.286 129.7 132.126 128.548 115.35C 124.012 53.0705 120.412 21.9665 148.06 7.56647C  [...]
+    <g>
+      <path style="stroke:none; fill:#666666" d="M 148.47 94.0495C 152.79 92.3215 152.062 92.0915 154.942 85.8275C 157.246 81.0035 159.27 78.9295 159.198 71.5855C 159.198 64.3855 156.966 61.9375 153.582 57.2575C 150.342 52.7935 145.158 52.5775 141.918 53.1535C 140.046 53.4415 137.598 55.8175 135.942 59.3455C 134.862 61.7215 133.998 64.7455 133.926 67.9135C 133.71 76.4095 134.43 79.6495 136.374 85.4095C 138.678 92.1775 144.294 95.7055 148.47 94.0495z"/>
+      <g>
+        <path style="stroke:none; fill:#6d6d6d" d="M 148.47 94.0228C 152.763 92.3059 152.034 92.0688 154.895 85.8451C 157.184 81.0522 159.207 78.9845 159.167 71.6816C 159.194 64.5291 157.005 61.9795 153.678 57.4802C 150.383 53.1359 145.302 52.9711 142.086 53.5277C 140.17 53.8107 137.731 56.0967 136.048 59.4954C 134.888 61.8059 134.032 64.848 133.961 68.03C 133.749 76.4682 134.508 79.7217 136.421 85.4478C 138.688 92.1779 144.321 95.6681 148.47 94.0228z"/>
+        <path style="stroke:none; fill:#757575" d="M 148.471 93.9961C 152.735 92.2903 152.005 92.0461 154.848 85.8628C 157.122 81.1009 159.144 79.0395 159.136 71.7777C 159.189 64.6727 157.044 62.0216 153.773 57.703C 150.424 53.4784 145.446 53.3648 142.254 53.9019C 140.293 54.18 137.865 56.3759 136.155 59.6453C 134.913 61.8903 134.066 64.9505 133.995 68.1466C 133.788 76.527 134.586 79.794 136.468 85.4861C 138.698 92.1783 144.348 95.6308 148.471 93.9961z"/>
+        <path style="stroke:none; fill:#7c7c7c" d="M 148.471 93.9694C 152.707 92.2747 151.977 92.0234 154.801 85.8804C 157.06 81.1496 159.081 79.0945 159.104 71.8738C 159.185 64.8163 157.084 62.0636 153.868 57.9257C 150.465 53.8208 145.59 53.7584 142.422 54.2761C 140.416 54.5492 137.998 56.6551 136.261 59.7952C 134.939 61.9747 134.1 65.053 134.029 68.2631C 133.827 76.5857 134.665 79.8662 136.515 85.5244C 138.707 92.1786 144.375 95.5934 148.471 93.9694z"/>
+        <path style="stroke:none; fill:#848484" d="M 148.471 93.9427C 152.68 92.2591 151.948 92.0007 154.754 85.8981C 156.999 81.1983 159.019 79.1495 159.073 71.9699C 159.18 64.9599 157.123 62.1057 153.964 58.1485C 150.506 54.1633 145.733 54.1521 142.589 54.6503C 140.54 54.9185 138.131 56.9343 136.367 59.9451C 134.964 62.0591 134.134 65.1555 134.064 68.3797C 133.866 76.6445 134.743 79.9385 136.562 85.5627C 138.717 92.1791 144.403 95.5561 148.471 93.9427z"/>
+        <path style="stroke:none; fill:#8c8c8c" d="M 148.471 93.916C 152.652 92.2435 151.92 91.978 154.707 85.9157C 156.937 81.247 158.956 79.2045 159.042 72.066C 159.176 65.1035 157.162 62.1477 154.059 58.3712C 150.547 54.5057 145.877 54.5457 142.757 55.0245C 140.663 55.2877 138.264 57.2135 136.473 60.095C 134.989 62.1435 134.168 65.258 134.098 68.4962C 133.905 76.7032 134.821 80.0107 136.609 85.601C 138.727 92.1795 144.43 95.5187 148.471 93.916z"/>
+        <path style="stroke:none; fill:#939393" d="M 148.472 93.8893C 152.625 92.2279 151.891 91.9553 154.66 85.9334C 156.875 81.2957 158.893 79.2595 159.01 72.1621C 159.171 65.2471 157.201 62.1898 154.155 58.594C 150.588 54.8482 146.021 54.9394 142.925 55.3987C 140.787 55.657 138.397 57.4927 136.58 60.2449C 135.015 62.2279 134.202 65.3605 134.133 68.6128C 133.944 76.762 134.899 80.083 136.656 85.6393C 138.736 92.1799 144.457 95.4814 148.472 93.8893z"/>
+        <path style="stroke:none; fill:#9b9b9b" d="M 148.472 93.8626C 152.597 92.2123 151.863 91.9326 154.613 85.951C 156.813 81.3444 158.83 79.3145 158.979 72.2582C 159.167 65.3907 157.24 62.2318 154.25 58.8167C 150.629 55.1906 146.165 55.333 143.093 55.7729C 140.91 56.0262 138.531 57.7719 136.686 60.3948C 135.04 62.3123 134.236 65.463 134.167 68.7293C 133.982 76.8207 134.977 80.1552 136.702 85.6776C 138.746 92.1803 144.484 95.444 148.472 93.8626z"/>
+        <path style="stroke:none; fill:#a3a3a3" d="M 148.472 93.8359C 152.569 92.1967 151.834 91.9099 154.566 85.9687C 156.751 81.3931 158.767 79.3695 158.948 72.3543C 159.162 65.5343 157.279 62.2739 154.345 59.0395C 150.67 55.5331 146.309 55.7267 143.261 56.1471C 141.033 56.3955 138.664 58.0511 136.792 60.5447C 135.066 62.3967 134.27 65.5655 134.201 68.8459C 134.021 76.8795 135.055 80.2275 136.749 85.7159C 138.756 92.1807 144.511 95.4067 148.472 93.8359z"/>
+        <path style="stroke:none; fill:#aaaaaa" d="M 148.472 93.8092C 152.542 92.1811 151.806 91.8872 154.519 85.9863C 156.689 81.4418 158.704 79.4245 158.916 72.4504C 159.158 65.6779 157.319 62.3159 154.441 59.2622C 150.711 55.8755 146.452 56.1203 143.428 56.5213C 141.157 56.7647 138.797 58.3303 136.898 60.6946C 135.091 62.4811 134.304 65.668 134.236 68.9624C 134.06 76.9382 135.134 80.2997 136.796 85.7542C 138.765 92.1811 144.538 95.3693 148.472 93.8092z"/>
+        <path style="stroke:none; fill:#b2b2b2" d="M 148.473 93.7825C 152.514 92.1655 151.777 91.8645 154.472 86.004C 156.627 81.4905 158.641 79.4795 158.885 72.5465C 159.153 65.8215 157.358 62.358 154.536 59.485C 150.752 56.218 146.596 56.514 143.596 56.8955C 141.28 57.134 138.93 58.6095 137.005 60.8445C 135.117 62.5655 134.338 65.7705 134.27 69.079C 134.099 76.997 135.212 80.372 136.843 85.7925C 138.775 92.1815 144.565 95.332 148.473 93.7825z"/>
+        <path style="stroke:none; fill:#bababa" d="M 148.473 93.7558C 152.487 92.1499 151.749 91.8418 154.425 86.0216C 156.565 81.5392 158.578 79.5345 158.854 72.6426C 159.149 65.9651 157.397 62.4 154.632 59.7077C 150.793 56.5604 146.74 56.9076 143.764 57.2697C 141.404 57.5032 139.063 58.8887 137.111 60.9944C 135.142 62.6499 134.372 65.873 134.305 69.1955C 134.138 77.0557 135.29 80.4442 136.89 85.8308C 138.785 92.1819 144.592 95.2946 148.473 93.7558z"/>
+        <path style="stroke:none; fill:#c1c1c1" d="M 148.473 93.7291C 152.459 92.1343 151.72 91.8191 154.378 86.0393C 156.503 81.5879 158.515 79.5895 158.823 72.7387C 159.144 66.1087 157.436 62.4421 154.727 59.9305C 150.834 56.9029 146.884 57.3013 143.932 57.6439C 141.527 57.8725 139.197 59.1679 137.217 61.1443C 135.168 62.7343 134.406 65.9755 134.339 69.3121C 134.177 77.1145 135.368 80.5165 136.937 85.8691C 138.795 92.1823 144.619 95.2573 148.473 93.7291z"/>
+        <path style="stroke:none; fill:#c9c9c9" d="M 148.473 93.7024C 152.431 92.1187 151.692 91.7964 154.331 86.0569C 156.441 81.6366 158.452 79.6445 158.791 72.8348C 159.14 66.2523 157.475 62.4841 154.822 60.1532C 150.875 57.2453 147.028 57.6949 144.1 58.0181C 141.65 58.2417 139.33 59.4471 137.323 61.2942C 135.193 62.8187 134.44 66.078 134.373 69.4286C 134.216 77.1732 135.446 80.5887 136.984 85.9074C 138.804 92.1827 144.646 95.2199 148.473 93.7024z"/>
+        <path style="stroke:none; fill:#d1d1d1" d="M 148.474 93.6757C 152.404 92.1031 151.663 91.7737 154.283 86.0746C 156.38 81.6853 158.39 79.6995 158.76 72.9309C 159.135 66.3959 157.514 62.5262 154.918 60.376C 150.916 57.5878 147.171 58.0886 144.267 58.3923C 141.774 58.611 139.463 59.7263 137.43 61.4441C 135.218 62.9031 134.473 66.1805 134.408 69.5452C 134.255 77.232 135.524 80.661 137.031 85.9457C 138.814 92.1831 144.674 95.1826 148.474 93.6757z"/>
+        <path style="stroke:none; fill:#d8d8d8" d="M 148.474 93.649C 152.376 92.0875 151.635 91.751 154.236 86.0922C 156.318 81.734 158.327 79.7545 158.729 73.027C 159.131 66.5395 157.553 62.5682 155.013 60.5987C 150.957 57.9302 147.315 58.4822 144.435 58.7665C 141.897 58.9802 139.596 60.0055 137.536 61.594C 135.244 62.9875 134.507 66.283 134.442 69.6617C 134.294 77.2907 135.602 80.7332 137.078 85.984C 138.824 92.1835 144.701 95.1452 148.474 93.649z"/>
+        <path style="stroke:none; fill:#e0e0e0" d="M 148.474 93.6223C 152.349 92.0719 151.606 91.7283 154.189 86.1099C 156.256 81.7827 158.264 79.8095 158.697 73.1231C 159.126 66.6831 157.593 62.6103 155.109 60.8215C 150.998 58.2727 147.459 58.8759 144.603 59.1407C 142.021 59.3495 139.729 60.2847 137.642 61.7439C 135.269 63.0719 134.541 66.3855 134.477 69.7783C 134.333 77.3495 135.681 80.8055 137.125 86.0223C 138.833 92.1839 144.728 95.1079 148.474 93.6223z"/>
+        <path style="stroke:none; fill:#e8e8e8" d="M 148.474 93.5956C 152.321 92.0563 151.578 91.7056 154.142 86.1275C 156.194 81.8314 158.201 79.8645 158.666 73.2192C 159.122 66.8267 157.632 62.6523 155.204 61.0442C 151.039 58.6151 147.603 59.2695 144.771 59.5149C 142.144 59.7187 139.863 60.5639 137.748 61.8938C 135.295 63.1563 134.575 66.488 134.511 69.8948C 134.371 77.4082 135.759 80.8777 137.171 86.0606C 138.843 92.1843 144.755 95.0705 148.474 93.5956z"/>
+        <path style="stroke:none; fill:#efefef" d="M 148.475 93.5689C 152.293 92.0406 151.549 91.6829 154.095 86.1452C 156.132 81.8801 158.138 79.9195 158.635 73.3153C 159.117 66.9703 157.671 62.6944 155.299 61.267C 151.08 58.9576 147.747 59.6632 144.939 59.8891C 142.267 60.088 139.996 60.843 137.855 62.0437C 135.32 63.2407 134.609 66.5905 134.545 70.0114C 134.41 77.467 135.837 80.95 137.218 86.0989C 138.853 92.1847 144.782 95.0332 148.475 93.5689z"/>
+        <path style="stroke:none; fill:#f7f7f7" d="M 148.475 93.5422C 152.266 92.0251 151.521 91.6602 154.048 86.1628C 156.07 81.9288 158.075 79.9745 158.603 73.4114C 159.113 67.1139 157.71 62.7364 155.395 61.4897C 151.121 59.3 147.89 60.0568 145.106 60.2633C 142.391 60.4572 140.129 61.1223 137.961 62.1936C 135.346 63.3251 134.643 66.693 134.58 70.1279C 134.449 77.5257 135.915 81.0222 137.265 86.1372C 138.862 92.1851 144.809 94.9958 148.475 93.5422z"/>
+      </g>
+      <path style="stroke:none; fill:#ffffff" d="M 148.475 93.5155C 152.238 92.0095 151.492 91.6375 154.001 86.1805C 156.008 81.9775 158.012 80.0295 158.572 73.5075C 159.108 67.2575 157.749 62.7785 155.49 61.7125C 151.162 59.6425 148.034 60.4505 145.274 60.6375C 142.514 60.8265 140.262 61.4015 138.067 62.3435C 135.371 63.4095 134.677 66.7955 134.614 70.2445C 134.488 77.5845 135.993 81.0945 137.312 86.1755C 138.872 92.1855 144.836 94.9585 148.475 93.5155z"/>
+    </g>
+    <path style="stroke:none; fill:#000000" d="M 144.438 64.7455C 146.598 64.7455 149.334 66.1855 150.63 68.1295C 151.998 70.0735 153.006 72.8095 153.006 75.9055C 153.006 80.5135 152.502 85.6255 149.766 87.2095C 148.902 87.7135 147.03 88.1455 145.95 88.1455C 143.502 88.1455 143.286 86.5615 140.982 84.1855C 140.19 83.3215 137.814 79.1455 137.814 75.6895C 137.814 73.5295 137.31 70.4335 139.182 67.6975C 140.478 65.6815 142.134 64.7455 144.438 64.7455z"/>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 143.862 68.6085C 144.706 67.3035 148.084 67.9185 149.312 70.6045C 150.541 73.2915 150.31 79.1265 149.466 79.4335C 147.24 80.1245 147.93 76.8995 146.011 73.9825C 144.092 71.2195 143.017 69.9145 143.862 68.6085z"/>
+      <g>
+        <path style="stroke:none; fill:#070707" d="M 143.916 68.6636C 144.749 67.3751 148.085 67.9823 149.297 70.6343C 150.511 73.2872 150.282 79.0483 149.449 79.3514C 147.251 80.0336 147.933 76.8495 146.038 73.9695C 144.143 71.2415 143.082 69.953 143.916 68.6636z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 143.97 68.7187C 144.793 67.4468 148.085 68.0461 149.282 70.6641C 150.48 73.283 150.255 78.9701 149.432 79.2693C 147.263 79.9428 147.935 76.7995 146.065 73.9565C 144.194 71.2635 143.147 69.9915 143.97 68.7187z"/>
+        <path style="stroke:none; fill:#161616" d="M 144.024 68.7738C 144.836 67.5184 148.086 68.1099 149.267 70.6939C 150.449 73.2787 150.227 78.8919 149.415 79.1872C 147.274 79.8519 147.938 76.7495 146.092 73.9435C 144.245 71.2855 143.211 70.03 144.024 68.7738z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 144.078 68.8289C 144.879 67.5901 148.086 68.1737 149.252 70.7237C 150.419 73.2745 150.199 78.8137 149.398 79.1051C 147.285 79.7611 147.94 76.6995 146.118 73.9305C 144.297 71.3075 143.276 70.0685 144.078 68.8289z"/>
+        <path style="stroke:none; fill:#262626" d="M 144.132 68.884C 144.923 67.6617 148.087 68.2375 149.237 70.7535C 150.388 73.2702 150.172 78.7355 149.381 79.023C 147.296 79.6702 147.943 76.6495 146.145 73.9175C 144.348 71.3295 143.341 70.107 144.132 68.884z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 144.186 68.9391C 144.966 67.7334 148.087 68.3013 149.222 70.7833C 150.357 73.266 150.144 78.6573 149.364 78.9409C 147.307 79.5794 147.945 76.5995 146.172 73.9045C 144.399 71.3515 143.406 70.1455 144.186 68.9391z"/>
+        <path style="stroke:none; fill:#353535" d="M 144.24 68.9942C 145.009 67.805 148.088 68.3651 149.207 70.813C 150.327 73.2617 150.116 78.5791 149.347 78.8588C 147.319 79.4885 147.948 76.5495 146.199 73.8915C 144.45 71.3735 143.47 70.184 144.24 68.9942z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 144.294 69.0493C 145.053 67.8767 148.088 68.4289 149.192 70.8429C 150.296 73.2575 150.089 78.5009 149.33 78.7767C 147.33 79.3977 147.95 76.4995 146.226 73.8785C 144.501 71.3955 143.535 70.2225 144.294 69.0493z"/>
+        <path style="stroke:none; fill:#444444" d="M 144.348 69.1044C 145.096 67.9483 148.089 68.4927 149.177 70.8727C 150.265 73.2532 150.061 78.4227 149.313 78.6946C 147.341 79.3068 147.953 76.4495 146.252 73.8655C 144.552 71.4175 143.6 70.261 144.348 69.1044z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 144.402 69.1595C 145.139 68.02 148.089 68.5565 149.162 70.9025C 150.235 73.249 150.033 78.3445 149.296 78.6125C 147.352 79.216 147.955 76.3995 146.279 73.8525C 144.603 71.4395 143.665 70.2995 144.402 69.1595z"/>
+        <path style="stroke:none; fill:#545454" d="M 144.456 69.2146C 145.182 68.0916 148.09 68.6203 149.147 70.9323C 150.204 73.2447 150.005 78.2663 149.279 78.5304C 147.363 79.1251 147.958 76.3495 146.306 73.8395C 144.654 71.4615 143.729 70.338 144.456 69.2146z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 144.51 69.2697C 145.226 68.1633 148.09 68.6841 149.132 70.9621C 150.173 73.2405 149.978 78.1881 149.262 78.4483C 147.375 79.0343 147.96 76.2995 146.333 73.8265C 144.705 71.4835 143.794 70.3765 144.51 69.2697z"/>
+        <path style="stroke:none; fill:#636363" d="M 144.564 69.3248C 145.269 68.2349 148.091 68.7479 149.117 70.9919C 150.143 73.2362 149.95 78.1099 149.245 78.3662C 147.386 78.9434 147.963 76.2495 146.36 73.8135C 144.756 71.5055 143.859 70.415 144.564 69.3248z"/>
+        <path style="stroke:none; fill:#6b6b6b" d="M 144.618 69.3799C 145.312 68.3066 148.091 68.8117 149.101 71.0217C 150.112 73.232 149.922 78.0317 149.228 78.2841C 147.397 78.8526 147.965 76.1995 146.386 73.8005C 144.808 71.5275 143.924 70.4535 144.618 69.3799z"/>
+        <path style="stroke:none; fill:#727272" d="M 144.672 69.435C 145.356 68.3782 148.092 68.8755 149.086 71.0515C 150.081 73.2277 149.895 77.9535 149.211 78.202C 147.408 78.7617 147.968 76.1495 146.413 73.7875C 144.859 71.5495 143.988 70.492 144.672 69.435z"/>
+        <path style="stroke:none; fill:#7a7a7a" d="M 144.726 69.4901C 145.399 68.4499 148.092 68.9393 149.071 71.0813C 150.051 73.2235 149.867 77.8753 149.194 78.1199C 147.419 78.6709 147.97 76.0995 146.44 73.7745C 144.91 71.5715 144.053 70.5305 144.726 69.4901z"/>
+        <path style="stroke:none; fill:#828282" d="M 144.78 69.5452C 145.442 68.5215 148.093 69.0031 149.056 71.1111C 150.02 73.2192 149.839 77.7971 149.177 78.0378C 147.431 78.58 147.973 76.0495 146.467 73.7615C 144.961 71.5935 144.118 70.569 144.78 69.5452z"/>
+        <path style="stroke:none; fill:#898989" d="M 144.834 69.6003C 145.486 68.5932 148.093 69.0669 149.041 71.1409C 149.989 73.215 149.812 77.7189 149.16 77.9557C 147.442 78.4892 147.975 75.9995 146.494 73.7485C 145.012 71.6155 144.183 70.6075 144.834 69.6003z"/>
+        <path style="stroke:none; fill:#919191" d="M 144.888 69.6554C 145.529 68.6648 148.094 69.1307 149.026 71.1707C 149.959 73.2107 149.784 77.6407 149.143 77.8736C 147.453 78.3983 147.978 75.9495 146.52 73.7355C 145.063 71.6375 144.247 70.646 144.888 69.6554z"/>
+      </g>
+      <path style="stroke:none; fill:#999999" d="M 144.942 69.7105C 145.572 68.7365 148.094 69.1945 149.011 71.2005C 149.928 73.2065 149.756 77.5625 149.126 77.7915C 147.464 78.3075 147.98 75.8995 146.547 73.7225C 145.114 71.6595 144.312 70.6845 144.942 69.7105z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#666666" d="M 193.11 94.9855C 203.91 93.8335 207.726 89.6575 209.67 82.3855C 211.398 75.9055 211.47 68.7055 206.646 60.2815C 202.11 52.2175 199.518 50.9215 192.966 50.4175C 182.886 49.5535 178.134 56.6095 175.902 61.6495C 173.526 67.1215 174.03 66.3295 174.174 73.2415C 174.318 80.5135 178.419 82.5405 180.939 87.0765C 183.459 91.5405 191.886 95.0575 193.11 94.9855z"/>
+      <g>
+        <path style="stroke:none; fill:#6d6d6d" d="M 193.115 94.944C 203.874 93.8128 207.733 89.5903 209.63 82.3751C 211.331 75.8499 211.415 68.6893 206.628 60.4628C 202.194 52.6658 199.59 51.3823 193.116 50.8823C 183.067 50.0215 178.175 56.7549 175.935 61.7562C 173.632 67.0359 174.057 66.4746 174.21 73.2954C 174.37 80.5633 178.477 82.5182 180.994 87.0558C 183.514 91.5301 191.891 95.017 193.115 94.944z"/>
+        <path style="stroke:none; fill:#757575" d="M 193.12 94.9026C 203.838 93.7921 207.74 89.5231 209.589 82.3648C 211.264 75.7944 211.359 68.6731 206.609 60.6442C 202.278 53.1142 199.662 51.8431 193.265 51.3472C 183.248 50.4895 178.216 56.9004 175.968 61.863C 173.738 66.9503 174.083 66.6198 174.246 73.3494C 174.422 80.6132 178.535 82.496 181.049 87.0351C 183.569 91.5198 191.897 94.9765 193.12 94.9026z"/>
+        <path style="stroke:none; fill:#7c7c7c" d="M 193.126 94.8611C 203.801 93.7714 207.747 89.4559 209.549 82.3544C 211.197 75.7388 211.304 68.6569 206.591 60.8255C 202.362 53.5625 199.734 52.3039 193.415 51.812C 183.429 50.9575 178.257 57.0458 176.001 61.9697C 173.844 66.8647 174.11 66.7649 174.282 73.4033C 174.475 80.663 178.592 82.4737 181.104 87.0144C 183.624 91.5094 191.902 94.936 193.126 94.8611z"/>
+        <path style="stroke:none; fill:#848484" d="M 193.131 94.8197C 203.765 93.7507 207.754 89.3887 209.508 82.3441C 211.13 75.6833 211.249 68.6407 206.572 61.0069C 202.446 54.0109 199.805 52.7647 193.564 52.2769C 183.609 51.4255 178.298 57.1913 176.034 62.0765C 173.95 66.7791 174.137 66.9101 174.318 73.4573C 174.527 80.7129 178.65 82.4515 181.159 86.9937C 183.679 91.4991 191.907 94.8955 193.131 94.8197z"/>
+        <path style="stroke:none; fill:#8c8c8c" d="M 193.136 94.7782C 203.729 93.73 207.761 89.3215 209.468 82.3337C 211.063 75.6277 211.193 68.6245 206.554 61.1882C 202.529 54.4592 199.877 53.2255 193.714 52.7417C 183.79 51.8935 178.339 57.3367 176.066 62.1832C 174.056 66.6935 174.163 67.0552 174.354 73.5112C 174.579 80.7627 178.708 82.4292 181.213 86.973C 183.733 91.4887 191.912 94.855 193.136 94.7782z"/>
+        <path style="stroke:none; fill:#939393" d="M 193.141 94.7368C 203.693 93.7093 207.768 89.2543 209.427 82.3234C 210.996 75.5722 211.138 68.6083 206.535 61.3696C 202.613 54.9076 199.949 53.6863 193.863 53.2066C 183.971 52.3615 178.38 57.4822 176.099 62.29C 174.162 66.6079 174.19 67.2004 174.39 73.5652C 174.631 80.8126 178.765 82.407 181.268 86.9523C 183.788 91.4784 191.918 94.8145 193.141 94.7368z"/>
+        <path style="stroke:none; fill:#9b9b9b" d="M 193.146 94.6953C 203.656 93.6886 207.776 89.1871 209.387 82.313C 210.929 75.5166 211.082 68.5921 206.517 61.5509C 202.697 55.3559 200.021 54.1471 194.013 53.6714C 184.152 52.8295 178.422 57.6276 176.132 62.3967C 174.268 66.5223 174.217 67.3455 174.426 73.6191C 174.683 80.8624 178.823 82.3847 181.323 86.9316C 183.843 91.468 191.923 94.774 193.146 94.6953z"/>
+        <path style="stroke:none; fill:#a3a3a3" d="M 193.151 94.6539C 203.62 93.6679 207.783 89.1199 209.347 82.3027C 210.862 75.4611 211.027 68.5759 206.498 61.7323C 202.781 55.8043 200.093 54.6079 194.163 54.1363C 184.333 53.2975 178.463 57.7731 176.165 62.5035C 174.374 66.4367 174.243 67.4907 174.462 73.6731C 174.735 80.9123 178.881 82.3625 181.378 86.9109C 183.898 91.4577 191.928 94.7335 193.151 94.6539z"/>
+        <path style="stroke:none; fill:#aaaaaa" d="M 193.157 94.6124C 203.584 93.6472 207.79 89.0527 209.306 82.2923C 210.795 75.4055 210.972 68.5597 206.48 61.9136C 202.865 56.2526 200.164 55.0687 194.312 54.6011C 184.513 53.7655 178.504 57.9185 176.198 62.6102C 174.48 66.3511 174.27 67.6358 174.498 73.727C 174.788 80.9621 178.938 82.3402 181.433 86.8902C 183.953 91.4473 191.933 94.693 193.157 94.6124z"/>
+        <path style="stroke:none; fill:#b2b2b2" d="M 193.162 94.571C 203.548 93.6265 207.797 88.9855 209.266 82.282C 210.728 75.35 210.916 68.5435 206.461 62.095C 202.949 56.701 200.236 55.5295 194.462 55.066C 184.694 54.2335 178.545 58.064 176.231 62.717C 174.586 66.2655 174.297 67.781 174.534 73.781C 174.84 81.012 178.996 82.318 181.488 86.8695C 184.008 91.437 191.939 94.6525 193.162 94.571z"/>
+        <path style="stroke:none; fill:#bababa" d="M 193.167 94.5295C 203.511 93.6058 207.804 88.9183 209.225 82.2716C 210.661 75.2944 210.861 68.5273 206.443 62.2763C 203.033 57.1493 200.308 55.9903 194.611 55.5308C 184.875 54.7015 178.586 58.2094 176.264 62.8237C 174.692 66.1799 174.323 67.9261 174.57 73.8349C 174.892 81.0618 179.054 82.2957 181.543 86.8488C 184.063 91.4266 191.944 94.612 193.167 94.5295z"/>
+        <path style="stroke:none; fill:#c1c1c1" d="M 193.172 94.4881C 203.475 93.5851 207.811 88.8511 209.185 82.2613C 210.594 75.2389 210.805 68.5111 206.424 62.4577C 203.116 57.5977 200.38 56.4511 194.761 55.9957C 185.056 55.1695 178.627 58.3549 176.296 62.9305C 174.798 66.0943 174.35 68.0713 174.606 73.8889C 174.944 81.1117 179.112 82.2735 181.597 86.8281C 184.117 91.4163 191.949 94.5715 193.172 94.4881z"/>
+        <path style="stroke:none; fill:#c9c9c9" d="M 193.177 94.4466C 203.439 93.5644 207.818 88.7839 209.144 82.2509C 210.527 75.1833 210.75 68.4949 206.406 62.639C 203.2 58.046 200.452 56.9119 194.91 56.4605C 185.237 55.6375 178.668 58.5003 176.329 63.0372C 174.904 66.0087 174.377 68.2164 174.642 73.9428C 174.996 81.1615 179.169 82.2512 181.652 86.8074C 184.172 91.4059 191.954 94.531 193.177 94.4466z"/>
+        <path style="stroke:none; fill:#d1d1d1" d="M 193.182 94.4052C 203.403 93.5437 207.825 88.7167 209.104 82.2406C 210.46 75.1278 210.695 68.4787 206.387 62.8204C 203.284 58.4944 200.523 57.3727 195.06 56.9254C 185.417 56.1055 178.709 58.6458 176.362 63.144C 175.01 65.9231 174.403 68.3616 174.678 73.9968C 175.048 81.2114 179.227 82.229 181.707 86.7867C 184.227 91.3956 191.96 94.4905 193.182 94.4052z"/>
+        <path style="stroke:none; fill:#d8d8d8" d="M 193.187 94.3637C 203.366 93.5229 207.832 88.6495 209.063 82.2302C 210.393 75.0722 210.639 68.4625 206.369 63.0017C 203.368 58.9427 200.595 57.8335 195.209 57.3902C 185.598 56.5735 178.75 58.7912 176.395 63.2507C 175.116 65.8375 174.43 68.5067 174.714 74.0507C 175.1 81.2612 179.285 82.2067 181.762 86.766C 184.282 91.3852 191.965 94.45 193.187 94.3637z"/>
+        <path style="stroke:none; fill:#e0e0e0" d="M 193.193 94.3223C 203.33 93.5023 207.839 88.5823 209.023 82.2199C 210.326 75.0167 210.584 68.4463 206.35 63.1831C 203.452 59.3911 200.667 58.2943 195.359 57.8551C 185.779 57.0415 178.791 58.9367 176.428 63.3575C 175.222 65.7519 174.457 68.6519 174.75 74.1047C 175.153 81.3111 179.342 82.1844 181.817 86.7453C 184.337 91.3749 191.97 94.4095 193.193 94.3223z"/>
+        <path style="stroke:none; fill:#e8e8e8" d="M 193.198 94.2808C 203.294 93.4816 207.846 88.5151 208.983 82.2095C 210.259 74.9611 210.528 68.4301 206.332 63.3644C 203.536 59.8394 200.739 58.7551 195.509 58.3199C 185.96 57.5095 178.832 59.0821 176.461 63.4642C 175.328 65.6663 174.483 68.797 174.786 74.1586C 175.205 81.3609 179.4 82.1622 181.872 86.7246C 184.392 91.3645 191.975 94.369 193.198 94.2808z"/>
+        <path style="stroke:none; fill:#efefef" d="M 193.203 94.2393C 203.258 93.4609 207.853 88.4479 208.942 82.1992C 210.192 74.9056 210.473 68.4139 206.313 63.5458C 203.619 60.2878 200.811 59.2159 195.658 58.7848C 186.141 57.9775 178.873 59.2276 176.493 63.571C 175.434 65.5807 174.51 68.9422 174.822 74.2126C 175.257 81.4108 179.458 82.14 181.926 86.7039C 184.446 91.3542 191.981 94.3285 193.203 94.2393z"/>
+        <path style="stroke:none; fill:#f7f7f7" d="M 193.208 94.1979C 203.221 93.4402 207.86 88.3807 208.902 82.1888C 210.125 74.85 210.418 68.3977 206.295 63.7271C 203.703 60.7361 200.882 59.6767 195.808 59.2496C 186.321 58.4455 178.914 59.373 176.526 63.6777C 175.54 65.4951 174.537 69.0873 174.858 74.2665C 175.309 81.4606 179.515 82.1177 181.981 86.6832C 184.501 91.3438 191.986 94.288 193.208 94.1979z"/>
+      </g>
+      <path style="stroke:none; fill:#ffffff" d="M 193.213 94.1565C 203.185 93.4195 207.867 88.3135 208.861 82.1785C 210.058 74.7945 210.362 68.3815 206.276 63.9085C 203.787 61.1845 200.954 60.1375 195.957 59.7145C 186.502 58.9135 178.955 59.5185 176.559 63.7845C 175.646 65.4095 174.563 69.2325 174.894 74.3205C 175.361 81.5105 179.573 82.0955 182.036 86.6625C 184.556 91.3335 191.991 94.2475 193.213 94.1565z"/>
+    </g>
+    <path style="stroke:none; fill:#000000" d="M 192.246 64.4575C 197.646 64.4575 200.814 69.2815 201.894 75.4735C 202.326 78.2815 201.678 81.5215 199.95 83.7535C 198.006 86.3455 194.55 87.9295 191.742 87.9295C 189.078 87.9295 186.054 88.3615 184.47 86.2015C 182.886 83.9695 182.526 79.0015 182.526 75.4735C 182.526 71.5135 183.678 68.7055 185.694 66.4735C 187.206 64.8175 189.942 64.4575 192.246 64.4575z"/>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 192.591 66.6795C 193.571 66.0265 195.203 66.6795 197.08 68.8015C 199.119 71.0865 200.017 72.8815 197.569 74.1865C 195.692 75.1665 195.121 72.2285 193.979 71.0045C 192.184 69.0465 190.633 67.9855 192.591 66.6795z"/>
+      <g>
+        <path style="stroke:none; fill:#070707" d="M 192.631 66.7381C 193.591 66.0891 195.204 66.7381 197.053 68.8286C 199.062 71.0797 199.918 72.8481 197.535 74.1337C 195.698 75.1107 195.132 72.2048 194.01 70.999C 192.242 69.0729 190.714 68.0333 192.631 66.7381z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 192.671 66.7968C 193.61 66.1517 195.205 66.7968 197.027 68.8558C 199.005 71.073 199.819 72.8147 197.501 74.081C 195.703 75.0549 195.143 72.1811 194.041 70.9935C 192.299 69.0993 190.794 68.0812 192.671 66.7968z"/>
+        <path style="stroke:none; fill:#161616" d="M 192.711 66.8554C 193.63 66.2143 195.206 66.8554 197 68.8829C 198.948 71.0662 199.72 72.7813 197.467 74.0282C 195.708 74.9991 195.154 72.1574 194.071 70.988C 192.356 69.1257 190.874 68.129 192.711 66.8554z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 192.751 66.9141C 193.65 66.2769 195.208 66.9141 196.973 68.9101C 198.891 71.0595 199.621 72.7479 197.433 73.9755C 195.714 74.9433 195.165 72.1337 194.102 70.9825C 192.414 69.1521 190.955 68.1769 192.751 66.9141z"/>
+        <path style="stroke:none; fill:#262626" d="M 192.791 66.9727C 193.669 66.3395 195.209 66.9727 196.946 68.9372C 198.834 71.0527 199.522 72.7145 197.399 73.9227C 195.719 74.8875 195.176 72.11 194.133 70.977C 192.471 69.1785 191.035 68.2247 192.791 66.9727z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 192.831 67.0314C 193.689 66.4021 195.21 67.0314 196.92 68.9644C 198.777 71.046 199.423 72.6811 197.365 73.87C 195.724 74.8317 195.187 72.0863 194.164 70.9715C 192.528 69.2049 191.116 68.2726 192.831 67.0314z"/>
+        <path style="stroke:none; fill:#353535" d="M 192.87 67.09C 193.708 66.4647 195.211 67.09 196.893 68.9915C 198.72 71.0392 199.324 72.6477 197.331 73.8172C 195.73 74.7759 195.198 72.0626 194.194 70.966C 192.586 69.2313 191.196 68.3204 192.87 67.09z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 192.91 67.1487C 193.728 66.5273 195.212 67.1487 196.866 69.0187C 198.663 71.0325 199.225 72.6143 197.297 73.7645C 195.735 74.7201 195.209 72.0389 194.225 70.9605C 192.643 69.2577 191.276 68.3683 192.91 67.1487z"/>
+        <path style="stroke:none; fill:#444444" d="M 192.95 67.2073C 193.748 66.5899 195.213 67.2073 196.839 69.0458C 198.606 71.0257 199.126 72.5809 197.263 73.7117C 195.74 74.6643 195.22 72.0152 194.256 70.955C 192.7 69.2841 191.357 68.4161 192.95 67.2073z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 192.99 67.266C 193.767 66.6525 195.214 67.266 196.813 69.073C 198.549 71.019 199.027 72.5475 197.229 73.659C 195.746 74.6085 195.231 71.9915 194.287 70.9495C 192.758 69.3105 191.437 68.464 192.99 67.266z"/>
+        <path style="stroke:none; fill:#545454" d="M 193.03 67.3246C 193.787 66.7151 195.215 67.3246 196.786 69.1001C 198.492 71.0122 198.928 72.5141 197.195 73.6062C 195.751 74.5527 195.242 71.9678 194.317 70.944C 192.815 69.3369 191.518 68.5118 193.03 67.3246z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 193.07 67.3833C 193.806 66.7777 195.216 67.3833 196.759 69.1273C 198.435 71.0055 198.829 72.4807 197.161 73.5535C 195.756 74.4969 195.253 71.9441 194.348 70.9385C 192.872 69.3633 191.598 68.5597 193.07 67.3833z"/>
+        <path style="stroke:none; fill:#636363" d="M 193.11 67.4419C 193.826 66.8403 195.217 67.4419 196.732 69.1544C 198.378 70.9987 198.73 72.4473 197.127 73.5007C 195.762 74.4411 195.264 71.9204 194.379 70.933C 192.93 69.3897 191.678 68.6075 193.11 67.4419z"/>
+        <path style="stroke:none; fill:#6b6b6b" d="M 193.15 67.5006C 193.846 66.9029 195.219 67.5006 196.706 69.1816C 198.321 70.992 198.631 72.4139 197.093 73.448C 195.767 74.3853 195.274 71.8967 194.41 70.9275C 192.987 69.4161 191.759 68.6554 193.15 67.5006z"/>
+        <path style="stroke:none; fill:#727272" d="M 193.19 67.5592C 193.865 66.9655 195.22 67.5592 196.679 69.2087C 198.264 70.9852 198.532 72.3805 197.059 73.3952C 195.772 74.3295 195.285 71.873 194.44 70.922C 193.044 69.4425 191.839 68.7032 193.19 67.5592z"/>
+        <path style="stroke:none; fill:#7a7a7a" d="M 193.23 67.6179C 193.885 67.0281 195.221 67.6179 196.652 69.2359C 198.207 70.9785 198.433 72.3471 197.025 73.3425C 195.778 74.2737 195.296 71.8493 194.471 70.9165C 193.102 69.4689 191.92 68.7511 193.23 67.6179z"/>
+        <path style="stroke:none; fill:#828282" d="M 193.269 67.6765C 193.904 67.0907 195.222 67.6765 196.625 69.263C 198.15 70.9717 198.334 72.3137 196.991 73.2897C 195.783 74.2179 195.307 71.8256 194.502 70.911C 193.159 69.4953 192 68.7989 193.269 67.6765z"/>
+        <path style="stroke:none; fill:#898989" d="M 193.309 67.7352C 193.924 67.1533 195.223 67.7352 196.599 69.2902C 198.093 70.965 198.235 72.2803 196.957 73.237C 195.788 74.1621 195.318 71.8019 194.533 70.9055C 193.216 69.5217 192.08 68.8468 193.309 67.7352z"/>
+        <path style="stroke:none; fill:#919191" d="M 193.349 67.7938C 193.944 67.2159 195.224 67.7938 196.572 69.3173C 198.036 70.9582 198.136 72.2469 196.923 73.1842C 195.794 74.1063 195.329 71.7782 194.563 70.9C 193.274 69.5481 192.161 68.8946 193.349 67.7938z"/>
+      </g>
+      <path style="stroke:none; fill:#999999" d="M 193.389 67.8525C 193.963 67.2785 195.225 67.8525 196.545 69.3445C 197.979 70.9515 198.037 72.2135 196.889 73.1315C 195.799 74.0505 195.34 71.7545 194.594 70.8945C 193.331 69.5745 192.241 68.9425 193.389 67.8525z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 165.498 69.9065C 167.191 69.2525 168.51 69.2165 171.128 70.9425C 174.294 73.0305 172.833 76.1875 170.348 75.5435C 168.203 74.9875 167.931 74.8625 165.958 74.4575C 162.857 73.8085 162.317 71.1345 165.498 69.9065z"/>
+      <g>
+        <path style="stroke:none; fill:#050505" d="M 165.564 70.0332C 167.222 69.4043 168.537 69.3774 171.119 71.0589C 174.185 73.0679 172.773 76.0707 170.314 75.439C 168.183 74.8916 167.969 74.7833 166.03 74.3873C 162.975 73.7534 162.443 71.2141 165.564 70.0332z"/>
+        <path style="stroke:none; fill:#0a0a0a" d="M 165.63 70.1599C 167.253 69.5562 168.564 69.5384 171.111 71.1753C 174.076 73.1053 172.713 75.954 170.281 75.3345C 168.162 74.7958 168.007 74.7042 166.102 74.317C 163.093 73.6983 162.569 71.2938 165.63 70.1599z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 165.696 70.2866C 167.283 69.708 168.591 69.6993 171.102 71.2917C 173.967 73.1427 172.653 75.8372 170.247 75.23C 168.141 74.6999 168.044 74.625 166.174 74.2469C 163.211 73.6432 162.694 71.3734 165.696 70.2866z"/>
+        <path style="stroke:none; fill:#141414" d="M 165.761 70.4133C 167.314 69.8599 168.618 69.8603 171.093 71.4081C 173.858 73.1801 172.593 75.7205 170.213 75.1255C 168.121 74.6041 168.082 74.5459 166.246 74.1767C 163.329 73.5881 162.82 71.4531 165.761 70.4133z"/>
+        <path style="stroke:none; fill:#191919" d="M 165.827 70.54C 167.345 70.0117 168.645 70.0212 171.085 71.5245C 173.749 73.2175 172.533 75.6037 170.179 75.021C 168.1 74.5082 168.12 74.4667 166.318 74.1064C 163.446 73.533 162.946 71.5327 165.827 70.54z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 165.893 70.6667C 167.376 70.1636 168.672 70.1822 171.076 71.6409C 173.64 73.2549 172.473 75.487 170.146 74.9165C 168.079 74.4124 168.157 74.3876 166.39 74.0363C 163.564 73.4779 163.071 71.6124 165.893 70.6667z"/>
+        <path style="stroke:none; fill:#232323" d="M 165.959 70.7934C 167.406 70.3154 168.699 70.3431 171.067 71.7573C 173.531 73.2923 172.412 75.3702 170.112 74.812C 168.059 74.3165 168.195 74.3084 166.461 73.9661C 163.682 73.4228 163.197 71.692 165.959 70.7934z"/>
+        <path style="stroke:none; fill:#282828" d="M 166.025 70.9201C 167.437 70.4673 168.726 70.5041 171.059 71.8737C 173.422 73.3297 172.352 75.2535 170.078 74.7075C 168.038 74.2207 168.233 74.2293 166.533 73.8959C 163.8 73.3677 163.323 71.7717 166.025 70.9201z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 166.09 71.0468C 167.468 70.6191 168.753 70.665 171.05 71.9901C 173.313 73.3671 172.292 75.1367 170.044 74.603C 168.017 74.1248 168.27 74.1501 166.605 73.8257C 163.918 73.3126 163.448 71.8513 166.09 71.0468z"/>
+        <path style="stroke:none; fill:#333333" d="M 166.156 71.1735C 167.499 70.771 168.78 70.826 171.041 72.1065C 173.204 73.4045 172.232 75.02 170.011 74.4985C 167.997 74.029 168.308 74.071 166.677 73.7555C 164.036 73.2575 163.574 71.931 166.156 71.1735z"/>
+        <path style="stroke:none; fill:#383838" d="M 166.222 71.3002C 167.529 70.9228 168.807 70.9869 171.032 72.2229C 173.095 73.4419 172.172 74.9032 169.977 74.394C 167.976 73.9331 168.346 73.9918 166.749 73.6853C 164.154 73.2024 163.7 72.0106 166.222 71.3002z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 166.288 71.4268C 167.56 71.0747 168.834 71.1479 171.024 72.3393C 172.986 73.4793 172.112 74.7865 169.943 74.2895C 167.955 73.8373 168.384 73.9127 166.821 73.6151C 164.271 73.1473 163.826 72.0903 166.288 71.4268z"/>
+        <path style="stroke:none; fill:#424242" d="M 166.354 71.5536C 167.591 71.2265 168.861 71.3088 171.015 72.4557C 172.877 73.5167 172.052 74.6697 169.909 74.185C 167.935 73.7414 168.421 73.8335 166.893 73.5449C 164.389 73.0922 163.951 72.1699 166.354 71.5536z"/>
+        <path style="stroke:none; fill:#474747" d="M 166.419 71.6803C 167.622 71.3784 168.887 71.4698 171.006 72.5721C 172.767 73.5541 171.992 74.553 169.876 74.0805C 167.914 73.6456 168.459 73.7544 166.965 73.4747C 164.507 73.0371 164.077 72.2496 166.419 71.6803z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 166.485 71.8069C 167.652 71.5302 168.914 71.6307 170.998 72.6885C 172.658 73.5915 171.932 74.4362 169.842 73.976C 167.893 73.5497 168.497 73.6752 167.037 73.4045C 164.625 72.982 164.203 72.3292 166.485 71.8069z"/>
+        <path style="stroke:none; fill:#515151" d="M 166.551 71.9337C 167.683 71.6821 168.941 71.7917 170.989 72.8049C 172.549 73.6289 171.872 74.3195 169.808 73.8715C 167.873 73.4539 168.534 73.5961 167.109 73.3343C 164.743 72.9269 164.328 72.4089 166.551 71.9337z"/>
+        <path style="stroke:none; fill:#565656" d="M 166.617 72.0604C 167.714 71.8339 168.968 71.9526 170.98 72.9213C 172.44 73.6663 171.811 74.2027 169.774 73.767C 167.852 73.358 168.572 73.5169 167.18 73.2641C 164.861 72.8718 164.454 72.4885 166.617 72.0604z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 166.683 72.1871C 167.745 71.9857 168.995 72.1136 170.972 73.0377C 172.331 73.7037 171.751 74.086 169.741 73.6625C 167.831 73.2622 168.61 73.4378 167.252 73.1939C 164.978 72.8167 164.58 72.5682 166.683 72.1871z"/>
+        <path style="stroke:none; fill:#606060" d="M 166.748 72.3138C 167.775 72.1376 169.022 72.2745 170.963 73.1541C 172.222 73.7411 171.691 73.9692 169.707 73.558C 167.811 73.1663 168.647 73.3586 167.324 73.1237C 165.096 72.7616 164.705 72.6478 166.748 72.3138z"/>
+      </g>
+      <path style="stroke:none; fill:#666666" d="M 166.814 72.4405C 167.806 72.2895 169.049 72.4355 170.954 73.2705C 172.113 73.7785 171.631 73.8525 169.673 73.4535C 167.79 73.0705 168.685 73.2795 167.396 73.0535C 165.214 72.7065 164.831 72.7275 166.814 72.4405z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#666666" d="M 159.99 128.249C 150.63 128.609 135.798 102.401 135.438 113.273C 135.15 122.489 135.654 122.345 135.654 131.273C 135.654 137.249 132.918 137.681 127.014 146.681C 123.99 151.433 121.614 156.545 119.742 161.729C 118.59 164.825 117.51 168.065 116.646 171.233C 116.286 172.817 115.638 174.473 115.278 176.057C 112.326 186.929 101.814 200.321 99.3661 211.193C 96.9181 221.993 94.0381 228.905 94.3981 243.377C 94.7581 257.849 94.9021 253.673 99.294 [...]
+      <g>
+        <path style="stroke:none; fill:#6d6d6d" d="M 159.973 129.334C 150.692 129.687 136.227 103.823 135.731 114.155C 135.415 122.91 135.831 122.833 135.761 131.402C 135.611 137.272 132.808 138.039 127.035 146.883C 124.022 151.646 121.761 156.695 120.042 161.76C 119.074 165.013 118.482 168.182 117.612 171.286C 117.197 172.928 116.115 174.473 115.427 176.328C 112.174 187.108 101.883 200.51 99.4666 211.206C 97.0009 222.015 94.0968 228.9 94.5054 243.346C 94.8719 257.346 94.9001 253.523 99. [...]
+        <path style="stroke:none; fill:#757575" d="M 159.955 130.419C 150.754 130.765 136.656 105.244 136.024 115.036C 135.68 123.331 136.008 123.32 135.868 131.53C 135.567 137.294 132.698 138.397 127.056 147.085C 124.054 151.859 121.908 156.845 120.343 161.791C 119.558 165.201 119.454 168.299 118.579 171.339C 118.108 173.038 116.593 174.472 115.576 176.598C 112.022 187.286 101.952 200.698 99.5671 211.218C 97.0837 222.037 94.1556 228.895 94.6126 243.314C 94.9857 256.843 94.8982 253.372 9 [...]
+        <path style="stroke:none; fill:#7c7c7c" d="M 159.938 131.504C 150.816 131.842 137.085 106.666 136.316 115.918C 135.946 123.751 136.185 123.808 135.975 131.659C 135.523 137.316 132.588 138.755 127.076 147.287C 124.086 152.072 122.055 156.995 120.643 161.822C 120.042 165.388 120.426 168.416 119.545 171.392C 119.018 173.148 117.07 174.472 115.724 176.869C 111.871 187.465 102.021 200.886 99.6675 211.23C 97.1666 222.059 94.2143 228.89 94.7199 243.282C 95.0995 256.34 94.8962 253.221 99 [...]
+        <path style="stroke:none; fill:#848484" d="M 159.921 132.589C 150.878 132.92 137.514 108.087 136.609 116.799C 136.211 124.172 136.362 124.295 136.082 131.787C 135.48 137.338 132.478 139.113 127.097 147.489C 124.117 152.285 122.202 157.145 120.943 161.853C 120.526 165.576 121.398 168.532 120.511 171.445C 119.929 173.258 117.548 174.471 115.873 177.139C 111.719 187.643 102.091 201.074 99.768 211.242C 97.2494 222.081 94.2731 228.885 94.8272 243.25C 95.2133 255.836 94.8943 253.07 99. [...]
+        <path style="stroke:none; fill:#8c8c8c" d="M 159.903 133.674C 150.94 133.997 137.942 109.509 136.902 117.68C 136.476 124.592 136.539 124.782 136.189 131.916C 135.436 137.361 132.368 139.47 127.118 147.691C 124.149 152.498 122.35 157.295 121.243 161.883C 121.01 165.764 122.371 168.649 121.477 171.498C 120.84 173.368 118.025 174.47 116.022 177.409C 111.567 187.822 102.16 201.262 99.8685 211.254C 97.3322 222.103 94.3318 228.88 94.9345 243.218C 95.3271 255.333 94.8923 252.919 99.2193 [...]
+        <path style="stroke:none; fill:#939393" d="M 159.886 134.759C 151.002 135.075 138.371 110.93 137.195 118.562C 136.741 125.013 136.716 125.27 136.296 132.044C 135.392 137.383 132.258 139.828 127.138 147.893C 124.181 152.711 122.497 157.445 121.544 161.914C 121.494 165.951 123.343 168.766 122.444 171.551C 121.751 173.479 118.503 174.47 116.171 177.68C 111.415 188 102.229 201.45 99.969 211.267C 97.4151 222.125 94.3906 228.875 95.0418 243.187C 95.4409 254.83 94.8904 252.768 99.2043 2 [...]
+        <path style="stroke:none; fill:#9b9b9b" d="M 159.868 135.844C 151.063 136.152 138.8 112.352 137.487 119.443C 137.006 125.434 136.893 125.757 136.402 132.173C 135.349 137.405 132.149 140.186 127.159 148.095C 124.213 152.924 122.644 157.595 121.844 161.945C 121.977 166.139 124.315 168.882 123.41 171.603C 122.661 173.589 118.98 174.469 116.319 177.95C 111.263 188.179 102.298 201.639 100.07 211.279C 97.4979 222.147 94.4493 228.87 95.149 243.155C 95.5547 254.326 94.8884 252.617 99.189 [...]
+        <path style="stroke:none; fill:#a3a3a3" d="M 159.851 136.929C 151.125 137.23 139.229 113.773 137.78 120.325C 137.271 125.854 137.07 126.244 136.509 132.301C 135.305 137.427 132.039 140.544 127.18 148.297C 124.245 153.137 122.791 157.745 122.144 161.976C 122.461 166.327 125.287 168.999 124.376 171.656C 123.572 173.699 119.457 174.468 116.468 178.22C 111.111 188.357 102.367 201.827 100.17 211.291C 97.5807 222.169 94.5081 228.865 95.2563 243.123C 95.6685 253.823 94.8864 252.466 99.1 [...]
+        <path style="stroke:none; fill:#aaaaaa" d="M 159.834 138.014C 151.187 138.307 139.658 115.195 138.073 121.206C 137.537 126.275 137.247 126.732 136.616 132.43C 135.261 137.45 131.929 140.902 127.2 148.499C 124.276 153.35 122.938 157.895 122.444 162.007C 122.945 166.514 126.259 169.116 125.342 171.709C 124.483 173.809 119.935 174.468 116.617 178.491C 110.96 188.536 102.436 202.015 100.27 211.303C 97.6636 222.191 94.5668 228.86 95.3636 243.091C 95.7823 253.32 94.8845 252.315 99.1594 [...]
+        <path style="stroke:none; fill:#b2b2b2" d="M 159.816 139.099C 151.249 139.385 140.087 116.616 138.366 122.087C 137.802 126.695 137.424 127.219 136.723 132.558C 135.218 137.472 131.819 141.259 127.221 148.701C 124.308 153.563 123.085 158.045 122.745 162.037C 123.429 166.702 127.231 169.232 126.309 171.762C 125.394 173.919 120.412 174.467 116.766 178.761C 110.808 188.714 102.505 202.203 100.371 211.315C 97.7464 222.213 94.6256 228.855 95.4709 243.059C 95.8961 252.816 94.8825 252.16 [...]
+        <path style="stroke:none; fill:#bababa" d="M 159.799 140.184C 151.311 140.463 140.516 118.038 138.658 122.969C 138.067 127.116 137.601 127.706 136.83 132.686C 135.174 137.494 131.709 141.617 127.242 148.903C 124.34 153.776 123.232 158.195 123.045 162.068C 123.913 166.89 128.203 169.349 127.275 171.815C 126.304 174.03 120.89 174.466 116.914 179.031C 110.656 188.892 102.575 202.391 100.471 211.328C 97.8292 222.235 94.6843 228.85 95.5782 243.028C 96.0099 252.313 94.8806 252.014 99.1 [...]
+        <path style="stroke:none; fill:#c1c1c1" d="M 159.781 141.269C 151.373 141.54 140.944 119.459 138.951 123.85C 138.332 127.537 137.778 128.194 136.937 132.815C 135.13 137.516 131.599 141.975 127.263 149.105C 124.372 153.989 123.379 158.345 123.345 162.099C 124.397 167.077 129.175 169.466 128.241 171.868C 127.215 174.14 121.367 174.466 117.063 179.302C 110.504 189.071 102.644 202.579 100.572 211.34C 97.912 222.257 94.7431 228.845 95.6854 242.996C 96.1237 251.81 94.8786 251.863 99.11 [...]
+        <path style="stroke:none; fill:#c9c9c9" d="M 159.764 142.354C 151.435 142.618 141.373 120.881 139.244 124.732C 138.597 127.957 137.955 128.681 137.044 132.943C 135.087 137.539 131.489 142.333 127.283 149.307C 124.404 154.202 123.526 158.495 123.645 162.13C 124.881 167.265 130.147 169.583 129.207 171.921C 128.126 174.25 121.844 174.465 117.212 179.572C 110.352 189.249 102.713 202.767 100.672 211.352C 97.9949 222.279 94.8018 228.84 95.7927 242.964C 96.2375 251.307 94.8767 251.712 9 [...]
+        <path style="stroke:none; fill:#d1d1d1" d="M 159.747 143.439C 151.497 143.695 141.802 122.302 139.537 125.613C 138.862 128.378 138.131 129.168 137.151 133.072C 135.043 137.561 131.379 142.691 127.304 149.509C 124.435 154.415 123.674 158.645 123.946 162.161C 125.365 167.453 131.12 169.699 130.174 171.973C 129.037 174.36 122.322 174.464 117.361 179.842C 110.2 189.428 102.782 202.956 100.773 211.364C 98.0777 222.301 94.8606 228.835 95.9 242.932C 96.3513 250.803 94.8747 251.561 99.08 [...]
+        <path style="stroke:none; fill:#d8d8d8" d="M 159.729 144.524C 151.559 144.773 142.231 123.724 139.829 126.494C 139.127 128.798 138.308 129.656 137.258 133.2C 134.999 137.583 131.269 143.048 127.325 149.711C 124.467 154.628 123.821 158.795 124.246 162.191C 125.849 167.64 132.092 169.816 131.14 172.026C 129.947 174.47 122.799 174.464 117.51 180.113C 110.049 189.606 102.851 203.144 100.873 211.376C 98.1605 222.323 94.9193 228.83 96.0073 242.9C 96.4651 250.3 94.8728 251.41 99.0696 25 [...]
+        <path style="stroke:none; fill:#e0e0e0" d="M 159.712 145.609C 151.621 145.85 142.66 125.145 140.122 127.376C 139.393 129.219 138.485 130.143 137.365 133.329C 134.956 137.605 131.159 143.406 127.345 149.913C 124.499 154.841 123.968 158.945 124.546 162.222C 126.333 167.828 133.064 169.933 132.106 172.079C 130.858 174.581 123.277 174.463 117.658 180.383C 109.897 189.785 102.92 203.332 100.974 211.389C 98.2434 222.345 94.9781 228.825 96.1146 242.869C 96.5789 249.797 94.8708 251.259 9 [...]
+        <path style="stroke:none; fill:#e8e8e8" d="M 159.694 146.694C 151.682 146.928 143.089 126.567 140.415 128.257C 139.658 129.64 138.662 130.63 137.471 133.457C 134.912 137.628 131.049 143.764 127.366 150.115C 124.531 155.054 124.115 159.095 124.846 162.253C 126.816 168.016 134.036 170.049 133.072 172.132C 131.769 174.691 123.754 174.462 117.807 180.653C 109.745 189.963 102.989 203.52 101.074 211.401C 98.3262 222.367 95.0368 228.82 96.2218 242.837C 96.6927 249.293 94.8689 251.108 99 [...]
+        <path style="stroke:none; fill:#efefef" d="M 159.677 147.779C 151.744 148.005 143.517 127.988 140.708 129.139C 139.923 130.06 138.839 131.118 137.578 133.586C 134.868 137.65 130.939 144.122 127.387 150.317C 124.563 155.267 124.262 159.245 125.147 162.284C 127.3 168.203 135.008 170.166 134.039 172.185C 132.68 174.801 124.231 174.462 117.956 180.924C 109.593 190.142 103.059 203.708 101.175 211.413C 98.409 222.389 95.0956 228.815 96.3291 242.805C 96.8065 248.79 94.8669 250.957 99.02 [...]
+        <path style="stroke:none; fill:#f7f7f7" d="M 159.66 148.864C 151.806 149.083 143.946 129.41 141 130.02C 140.188 130.481 139.016 131.605 137.685 133.714C 134.825 137.672 130.829 144.48 127.407 150.519C 124.594 155.48 124.409 159.395 125.447 162.315C 127.784 168.391 135.98 170.283 135.005 172.238C 133.59 174.911 124.709 174.461 118.105 181.194C 109.441 190.32 103.128 203.896 101.275 211.425C 98.4919 222.411 95.1543 228.81 96.4364 242.773C 96.9203 248.287 94.8649 250.806 99.0097 255 [...]
+      </g>
+      <path style="stroke:none; fill:#ffffff" d="M 159.642 149.949C 151.868 150.16 144.375 130.831 141.293 130.901C 140.453 130.901 139.193 132.092 137.792 133.842C 134.781 137.694 130.719 144.837 127.428 150.72C 124.626 155.692 124.556 159.544 125.747 162.345C 128.268 168.578 136.952 170.399 135.971 172.29C 134.501 175.021 125.186 174.46 118.253 181.464C 109.289 190.498 103.197 204.084 101.376 211.437C 98.5747 222.432 95.2131 228.805 96.5437 242.741C 97.0341 247.783 94.863 250.655 98.99 [...]
+    </g>
+    <path style="stroke:none; fill:#995900" d="M 164.958 78.8575C 170.214 78.2095 177.414 79.5055 180.726 81.9535C 183.822 84.2575 185.982 85.4815 188.79 86.4175C 198.222 89.5135 210.606 90.9535 210.03 99.4495C 209.382 109.601 206.43 114.137 198.006 116.801C 191.238 118.889 179.142 130.625 169.782 130.625C 165.606 130.625 159.774 130.841 156.39 129.617C 153.15 128.465 148.614 122.993 143.286 118.601C 137.958 114.281 132.99 109.673 132.846 103.625C 132.63 97.2175 136.806 95.1295 142.71 90 [...]
+    <g>
+      <path style="stroke:none; fill:#9e5f00" d="M 165.068 78.9505C 170.293 78.3065 177.452 79.5955 180.745 82.0295C 183.823 84.3195 185.971 85.5395 188.762 86.4675C 198.137 89.5455 210.491 90.9965 209.922 99.4405C 209.281 109.53 206.253 114.021 197.881 116.663C 191.158 118.736 179.113 130.252 169.81 130.303C 165.6 130.335 159.885 130.537 156.523 129.326C 153.308 128.184 148.786 122.718 143.492 118.357C 138.201 114.065 133.232 109.583 133.175 103.592C 133.021 97.3395 137.087 95.1805 142. [...]
+      <path style="stroke:none; fill:#a36400" d="M 165.177 79.0445C 170.373 78.4035 177.49 79.6845 180.764 82.1045C 183.824 84.3825 185.959 85.5985 188.735 86.5175C 198.052 89.5775 210.376 91.0395 209.813 99.4315C 209.179 109.459 206.076 113.905 197.756 116.526C 191.078 118.583 179.083 129.878 169.837 129.98C 165.595 130.044 159.995 130.232 156.657 129.035C 153.467 127.902 148.957 122.443 143.697 118.114C 138.443 113.85 133.475 109.492 133.505 103.559C 133.412 97.4605 137.368 95.2305 143 [...]
+      <path style="stroke:none; fill:#a86a00" d="M 165.287 79.1375C 170.452 78.5005 177.528 79.7745 180.783 82.1805C 183.825 84.4445 185.948 85.6565 188.707 86.5675C 197.967 89.6095 210.262 91.0825 209.705 99.4215C 209.078 109.389 205.9 113.789 197.631 116.388C 190.998 118.43 179.054 129.505 169.865 129.658C 165.589 129.754 160.106 129.928 156.79 128.744C 153.625 127.621 149.129 122.167 143.903 117.87C 138.686 113.634 133.717 109.402 133.834 103.525C 133.803 97.5815 137.649 95.2815 143.4 [...]
+      <path style="stroke:none; fill:#ad7000" d="M 165.396 79.2305C 170.531 78.5975 177.566 79.8635 180.801 82.2555C 183.826 84.5065 185.937 85.7155 188.68 86.6165C 197.882 89.6415 210.147 91.1245 209.597 99.4125C 208.977 109.318 205.723 113.673 197.505 116.25C 190.919 118.277 179.025 129.132 169.893 129.336C 165.583 129.463 160.217 129.623 156.923 128.453C 153.783 127.34 149.301 121.892 144.108 117.627C 138.928 113.419 133.96 109.312 134.163 103.492C 134.194 97.7035 137.93 95.3325 143.6 [...]
+      <path style="stroke:none; fill:#b27600" d="M 165.506 79.3245C 170.611 78.6945 177.604 79.9535 180.82 82.3315C 183.827 84.5685 185.925 85.7735 188.652 86.6665C 197.797 89.6735 210.032 91.1675 209.489 99.4035C 208.875 109.247 205.546 113.557 197.38 116.113C 190.839 118.124 178.995 128.758 169.92 129.013C 165.578 129.173 160.328 129.319 157.057 128.162C 153.942 127.059 149.473 121.617 144.314 117.383C 139.171 113.203 134.202 109.221 134.493 103.459C 134.585 97.8245 138.211 95.3835 143 [...]
+      <path style="stroke:none; fill:#b77b00" d="M 165.615 79.4175C 170.69 78.7915 177.641 80.0435 180.839 82.4065C 183.828 84.6315 185.914 85.8315 188.625 86.7165C 197.712 89.7055 209.917 91.2105 209.381 99.3945C 208.774 109.176 205.369 113.441 197.255 115.975C 190.759 117.972 178.966 128.385 169.948 128.691C 165.572 128.882 160.438 129.014 157.19 127.871C 154.1 126.777 149.644 121.341 144.519 117.139C 139.413 112.987 134.445 109.131 134.822 103.426C 134.977 97.9465 138.492 95.4335 144. [...]
+      <path style="stroke:none; fill:#bc8100" d="M 165.725 79.5105C 170.769 78.8885 177.679 80.1325 180.858 82.4825C 183.829 84.6935 185.903 85.8905 188.597 86.7665C 197.627 89.7375 209.802 91.2535 209.272 99.3855C 208.673 109.105 205.193 113.325 197.13 115.837C 190.679 117.819 178.937 128.012 169.976 128.369C 165.566 128.592 160.549 128.71 157.323 127.58C 154.258 126.496 149.816 121.066 144.725 116.896C 139.656 112.772 134.687 109.041 135.151 103.392C 135.368 98.0685 138.773 95.4845 144 [...]
+      <path style="stroke:none; fill:#c18700" d="M 165.834 79.6035C 170.848 78.9855 177.717 80.2225 180.877 82.5575C 183.83 84.7555 185.891 85.9485 188.57 86.8165C 197.542 89.7695 209.688 91.2965 209.164 99.3755C 208.571 109.035 205.016 113.209 197.005 115.699C 190.599 117.666 178.907 127.639 170.003 128.046C 165.561 128.301 160.66 128.405 157.457 127.289C 154.417 126.215 149.988 120.791 144.93 116.652C 139.898 112.556 134.93 108.951 135.48 103.359C 135.759 98.1895 139.054 95.5355 144.61 [...]
+      <path style="stroke:none; fill:#c68d00" d="M 165.944 79.6975C 170.928 79.0825 177.755 80.3115 180.896 82.6335C 183.831 84.8175 185.88 86.0075 188.542 86.8665C 197.457 89.8015 209.573 91.3395 209.056 99.3665C 208.47 108.964 204.839 113.093 196.88 115.562C 190.519 117.513 178.878 127.265 170.031 127.724C 165.555 128.011 160.77 128.101 157.59 126.998C 154.575 125.934 150.159 120.516 145.136 116.409C 140.141 112.341 135.172 108.86 135.81 103.326C 136.15 98.3115 139.335 95.5855 144.848  [...]
+      <path style="stroke:none; fill:#cc9200" d="M 166.054 79.7905C 171.007 79.1805 177.793 80.4015 180.915 82.7085C 183.833 84.8805 185.869 86.0655 188.515 86.9155C 197.373 89.8335 209.458 91.3815 208.947 99.3575C 208.369 108.893 204.662 112.977 196.755 115.424C 190.44 117.36 178.848 126.892 170.058 127.402C 165.55 127.721 160.881 127.796 157.723 126.706C 154.734 125.652 150.331 120.24 145.342 116.165C 140.383 112.125 135.414 108.77 136.139 103.292C 136.541 98.4325 139.616 95.6365 145.0 [...]
+      <path style="stroke:none; fill:#d19800" d="M 166.163 79.8835C 171.086 79.2775 177.831 80.4915 180.933 82.7845C 183.834 84.9425 185.857 86.1235 188.487 86.9655C 197.288 89.8655 209.343 91.4245 208.839 99.3485C 208.267 108.822 204.486 112.861 196.629 115.286C 190.36 117.207 178.819 126.519 170.086 127.079C 165.544 127.43 160.992 127.492 157.857 126.415C 154.892 125.371 150.503 119.965 145.547 115.921C 140.626 111.909 135.657 108.68 136.468 103.259C 136.932 98.5535 139.898 95.6875 145 [...]
+      <path style="stroke:none; fill:#d69e00" d="M 166.273 79.9775C 171.166 79.3745 177.869 80.5805 180.952 82.8595C 183.835 85.0045 185.846 86.1825 188.459 87.0155C 197.203 89.8975 209.228 91.4675 208.731 99.3395C 208.166 108.751 204.309 112.745 196.504 115.149C 190.28 117.054 178.79 126.145 170.114 126.757C 165.538 127.14 161.102 127.188 157.99 126.124C 155.05 125.09 150.674 119.69 145.753 115.678C 140.869 111.694 135.899 108.589 136.798 103.226C 137.323 98.6755 140.179 95.7375 145.561 [...]
+      <path style="stroke:none; fill:#dba300" d="M 166.382 80.0705C 171.245 79.4715 177.907 80.6705 180.971 82.9355C 183.836 85.0665 185.834 86.2405 188.432 87.0655C 197.118 89.9295 209.114 91.5105 208.623 99.3295C 208.064 108.681 204.132 112.629 196.379 115.011C 190.2 116.901 178.76 125.772 170.141 126.434C 165.533 126.849 161.213 126.883 158.124 125.833C 155.209 124.809 150.846 119.415 145.958 115.434C 141.111 111.478 136.142 108.499 137.127 103.193C 137.714 98.7975 140.46 95.7885 145. [...]
+      <path style="stroke:none; fill:#e0a900" d="M 166.492 80.1635C 171.324 79.5685 177.945 80.7595 180.99 83.0105C 183.837 85.1285 185.823 86.2995 188.404 87.1155C 197.033 89.9615 208.999 91.5535 208.515 99.3205C 207.963 108.61 203.956 112.513 196.254 114.873C 190.12 116.748 178.731 125.399 170.169 126.112C 165.527 126.559 161.324 126.579 158.257 125.542C 155.367 124.527 151.018 119.14 146.164 115.191C 141.354 111.263 136.384 108.409 137.456 103.159C 138.105 98.9185 140.741 95.8395 146. [...]
+      <path style="stroke:none; fill:#e5af00" d="M 166.601 80.2575C 171.404 79.6655 177.983 80.8495 181.009 83.0865C 183.838 85.1915 185.812 86.3575 188.377 87.1655C 196.948 89.9935 208.884 91.5965 208.406 99.3115C 207.862 108.539 203.779 112.397 196.129 114.735C 190.04 116.596 178.702 125.025 170.197 125.79C 165.521 126.268 161.434 126.274 158.39 125.251C 155.525 124.246 151.19 118.864 146.369 114.947C 141.596 111.047 136.627 108.318 137.786 103.126C 138.497 99.0405 141.022 95.8895 146. [...]
+      <path style="stroke:none; fill:#eab500" d="M 166.711 80.3505C 171.483 79.7625 178.02 80.9395 181.028 83.1615C 183.839 85.2535 185.8 86.4155 188.349 87.2155C 196.863 90.0255 208.769 91.6395 208.298 99.3025C 207.76 108.468 203.602 112.281 196.004 114.598C 189.96 116.443 178.672 124.652 170.224 125.467C 165.516 125.978 161.545 125.97 158.524 124.96C 155.684 123.965 151.361 118.589 146.575 114.703C 141.839 110.831 136.869 108.228 138.115 103.093C 138.888 99.1615 141.303 95.9405 146.511 [...]
+      <path style="stroke:none; fill:#efba00" d="M 166.82 80.4435C 171.562 79.8595 178.058 81.0285 181.046 83.2375C 183.84 85.3155 185.789 86.4745 188.322 87.2645C 196.778 90.0575 208.654 91.6815 208.19 99.2935C 207.659 108.397 203.425 112.165 195.878 114.46C 189.881 116.29 178.643 124.279 170.252 125.145C 165.51 125.687 161.656 125.665 158.657 124.669C 155.842 123.684 151.533 118.314 146.78 114.46C 142.081 110.616 137.112 108.138 138.444 103.06C 139.279 99.2825 141.584 95.9915 146.748 9 [...]
+      <path style="stroke:none; fill:#f4c000" d="M 166.93 80.5365C 171.641 79.9565 178.096 81.1185 181.065 83.3125C 183.841 85.3785 185.778 86.5325 188.294 87.3145C 196.693 90.0895 208.54 91.7245 208.081 99.2835C 207.558 108.327 203.249 112.049 195.753 114.322C 189.801 116.137 178.614 123.906 170.28 124.823C 165.504 125.397 161.767 125.361 158.79 124.378C 156 123.402 151.705 118.038 146.986 114.216C 142.324 110.4 137.354 108.048 138.773 103.027C 139.67 99.4045 141.865 96.0425 146.986 91. [...]
+      <path style="stroke:none; fill:#f9c600" d="M 167.039 80.6305C 171.721 80.0535 178.134 81.2075 181.084 83.3885C 183.842 85.4405 185.766 86.5915 188.267 87.3645C 196.608 90.1215 208.425 91.7675 207.973 99.2745C 207.456 108.256 203.072 111.933 195.628 114.185C 189.721 115.984 178.584 123.532 170.307 124.5C 165.499 125.106 161.877 125.056 158.924 124.087C 156.159 123.121 151.876 117.763 147.191 113.973C 142.566 110.185 137.597 107.957 139.103 102.993C 140.061 99.5265 142.146 96.0925 14 [...]
+    </g>
+    <path style="stroke:none; fill:#ffcc00" d="M 167.149 80.7235C 171.8 80.1505 178.172 81.2975 181.103 83.4635C 183.843 85.5025 185.755 86.6495 188.239 87.4145C 196.523 90.1535 208.31 91.8105 207.865 99.2655C 207.355 108.185 202.895 111.817 195.503 114.047C 189.641 115.831 178.555 123.159 170.335 124.178C 165.493 124.816 161.988 124.752 159.057 123.796C 156.317 122.84 152.048 117.488 147.397 113.729C 142.809 109.969 137.839 107.867 139.432 102.96C 140.452 99.6475 142.427 96.1435 147.461 [...]
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 167.982 83.6095C 168.99 85.6975 171.582 85.9855 173.31 86.9215C 174.966 87.8575 175.902 88.0735 176.55 87.7135C 177.99 86.9215 176.91 84.3295 175.47 83.3935C 174.102 82.4575 167.406 82.2415 167.982 83.6095z"/>
+      <g>
+        <path style="stroke:none; fill:#f9c600" d="M 168.125 83.6311C 169.107 85.6662 171.633 85.9469 173.318 86.8592C 174.932 87.7715 175.844 87.982 176.476 87.6311C 177.879 86.8592 176.826 84.3328 175.423 83.4205C 174.09 82.5083 167.563 82.2977 168.125 83.6311z"/>
+        <path style="stroke:none; fill:#f4c000" d="M 168.267 83.6527C 169.224 85.6349 171.685 85.9083 173.325 86.7969C 174.897 87.6855 175.786 87.8905 176.401 87.5487C 177.768 86.7969 176.743 84.3362 175.376 83.4476C 174.077 82.5591 167.72 82.354 168.267 83.6527z"/>
+        <path style="stroke:none; fill:#efba00" d="M 168.409 83.6743C 169.341 85.6036 171.736 85.8697 173.333 86.7346C 174.863 87.5995 175.727 87.799 176.326 87.4663C 177.657 86.7346 176.659 84.3395 175.328 83.4746C 174.064 82.6099 167.877 82.4102 168.409 83.6743z"/>
+        <path style="stroke:none; fill:#eab500" d="M 168.552 83.6959C 169.458 85.5723 171.787 85.8311 173.34 86.6723C 174.828 87.5135 175.669 87.7075 176.252 87.3839C 177.546 86.6723 176.575 84.3429 175.281 83.5017C 174.052 82.6607 168.034 82.4665 168.552 83.6959z"/>
+        <path style="stroke:none; fill:#e5af00" d="M 168.694 83.7175C 169.575 85.541 171.838 85.7925 173.347 86.61C 174.794 87.4275 175.611 87.616 176.177 87.3015C 177.434 86.61 176.491 84.3462 175.234 83.5287C 174.039 82.7115 168.191 82.5227 168.694 83.7175z"/>
+        <path style="stroke:none; fill:#e0a900" d="M 168.837 83.7391C 169.692 85.5097 171.889 85.7539 173.355 86.5477C 174.759 87.3415 175.553 87.5245 176.102 87.2191C 177.323 86.5477 176.408 84.3496 175.186 83.5558C 174.026 82.7623 168.348 82.579 168.837 83.7391z"/>
+        <path style="stroke:none; fill:#dba300" d="M 168.979 83.7607C 169.808 85.4784 171.941 85.7153 173.362 86.4854C 174.725 87.2555 175.494 87.433 176.028 87.1367C 177.212 86.4854 176.324 84.3529 175.139 83.5828C 174.014 82.8131 168.505 82.6352 168.979 83.7607z"/>
+        <path style="stroke:none; fill:#d69e00" d="M 169.121 83.7823C 169.925 85.4471 171.992 85.6767 173.37 86.4231C 174.69 87.1695 175.436 87.3415 175.953 87.0543C 177.101 86.4231 176.24 84.3563 175.092 83.6099C 174.001 82.8639 168.662 82.6915 169.121 83.7823z"/>
+        <path style="stroke:none; fill:#d19800" d="M 169.264 83.8039C 170.042 85.4158 172.043 85.6381 173.377 86.3608C 174.656 87.0835 175.378 87.25 175.878 86.9719C 176.99 86.3608 176.156 84.3596 175.044 83.6369C 173.988 82.9147 168.819 82.7477 169.264 83.8039z"/>
+        <path style="stroke:none; fill:#cc9200" d="M 169.406 83.8255C 170.159 85.3845 172.094 85.5995 173.385 86.2985C 174.621 86.9975 175.32 87.1585 175.804 86.8895C 176.879 86.2985 176.073 84.363 174.997 83.664C 173.976 82.9655 168.976 82.804 169.406 83.8255z"/>
+        <path style="stroke:none; fill:#c68c00" d="M 169.549 83.8471C 170.276 85.3532 172.145 85.5609 173.392 86.2362C 174.587 86.9115 175.261 87.067 175.729 86.8071C 176.768 86.2362 175.989 84.3663 174.95 83.691C 173.963 83.0163 169.133 82.8602 169.549 83.8471z"/>
+        <path style="stroke:none; fill:#c18700" d="M 169.691 83.8687C 170.393 85.3219 172.197 85.5223 173.4 86.1739C 174.552 86.8255 175.203 86.9755 175.654 86.7247C 176.656 86.1739 175.905 84.3697 174.903 83.7181C 173.95 83.0671 169.29 82.9165 169.691 83.8687z"/>
+        <path style="stroke:none; fill:#bc8100" d="M 169.833 83.8903C 170.51 85.2906 172.248 85.4837 173.407 86.1116C 174.518 86.7395 175.145 86.884 175.58 86.6423C 176.545 86.1116 175.821 84.373 174.855 83.7451C 173.938 83.1179 169.447 82.9727 169.833 83.8903z"/>
+        <path style="stroke:none; fill:#b77b00" d="M 169.976 83.9119C 170.627 85.2593 172.299 85.4451 173.414 86.0493C 174.483 86.6535 175.087 86.7925 175.505 86.5599C 176.434 86.0493 175.738 84.3764 174.808 83.7722C 173.925 83.1687 169.604 83.029 169.976 83.9119z"/>
+        <path style="stroke:none; fill:#b27500" d="M 170.118 83.9335C 170.744 85.228 172.35 85.4065 173.422 85.987C 174.449 86.5675 175.028 86.701 175.43 86.4775C 176.323 85.987 175.654 84.3797 174.761 83.7992C 173.912 83.2195 169.761 83.0852 170.118 83.9335z"/>
+        <path style="stroke:none; fill:#ad7000" d="M 170.261 83.9551C 170.861 85.1967 172.401 85.3679 173.429 85.9247C 174.414 86.4815 174.97 86.6095 175.356 86.3951C 176.212 85.9247 175.57 84.3831 174.713 83.8263C 173.9 83.2703 169.918 83.1415 170.261 83.9551z"/>
+        <path style="stroke:none; fill:#a86a00" d="M 170.403 83.9767C 170.977 85.1654 172.453 85.3293 173.437 85.8624C 174.38 86.3955 174.912 86.518 175.281 86.3127C 176.101 85.8624 175.486 84.3864 174.666 83.8533C 173.887 83.3211 170.075 83.1977 170.403 83.9767z"/>
+        <path style="stroke:none; fill:#a36400" d="M 170.545 83.9983C 171.094 85.1341 172.504 85.2907 173.444 85.8001C 174.345 86.3095 174.854 86.4265 175.206 86.2303C 175.989 85.8001 175.403 84.3898 174.619 83.8804C 173.874 83.3719 170.232 83.254 170.545 83.9983z"/>
+        <path style="stroke:none; fill:#9e5e00" d="M 170.688 84.0199C 171.211 85.1028 172.555 85.2521 173.452 85.7378C 174.311 86.2235 174.795 86.335 175.132 86.1479C 175.878 85.7378 175.319 84.3931 174.571 83.9074C 173.862 83.4227 170.389 83.3102 170.688 84.0199z"/>
+      </g>
+      <path style="stroke:none; fill:#995900" d="M 170.83 84.0415C 171.328 85.0715 172.606 85.2135 173.459 85.6755C 174.276 86.1375 174.737 86.2435 175.057 86.0655C 175.767 85.6755 175.235 84.3965 174.524 83.9345C 173.849 83.4735 170.546 83.3665 170.83 84.0415z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 152.875 86.2895C 152.55 87.1025 154.827 88.6485 155.966 87.5905C 157.187 86.5335 158.651 85.5575 159.14 85.2315C 161.336 83.7665 160.523 82.7095 156.862 83.3605C 153.2 84.0115 153.2 85.4755 152.875 86.2895z"/>
+      <g>
+        <path style="stroke:none; fill:#f9c600" d="M 152.934 86.2792C 152.616 87.0733 154.841 88.5836 155.953 87.5501C 157.146 86.5175 158.576 85.5641 159.054 85.2457C 161.199 83.8146 160.405 82.782 156.829 83.418C 153.251 84.0539 153.251 85.484 152.934 86.2792z"/>
+        <path style="stroke:none; fill:#f4c000" d="M 152.993 86.2689C 152.683 87.0442 154.854 88.5187 155.941 87.5097C 157.105 86.5016 158.501 85.5707 158.968 85.2599C 161.062 83.8627 160.287 82.8546 156.795 83.4755C 153.303 84.0964 153.303 85.4926 152.993 86.2689z"/>
+        <path style="stroke:none; fill:#efba00" d="M 153.051 86.2585C 152.749 87.015 154.868 88.4538 155.928 87.4693C 157.064 86.4856 158.426 85.5773 158.881 85.2741C 160.925 83.9108 160.168 82.9271 156.762 83.533C 153.354 84.1388 153.354 85.5011 153.051 86.2585z"/>
+        <path style="stroke:none; fill:#eab500" d="M 153.11 86.2483C 152.815 86.9859 154.882 88.3889 155.915 87.4289C 157.023 86.4697 158.351 85.5839 158.795 85.2883C 160.788 83.9589 160.05 82.9997 156.728 83.5905C 153.405 84.1813 153.405 85.5097 153.11 86.2483z"/>
+        <path style="stroke:none; fill:#e5af00" d="M 153.169 86.238C 152.882 86.9567 154.895 88.324 155.902 87.3885C 156.982 86.4537 158.276 85.5905 158.709 85.3025C 160.651 84.007 159.932 83.0722 156.694 83.648C 153.456 84.2237 153.456 85.5182 153.169 86.238z"/>
+        <path style="stroke:none; fill:#e0a900" d="M 153.228 86.2277C 152.948 86.9276 154.909 88.2591 155.889 87.3481C 156.941 86.4378 158.201 85.5971 158.622 85.3167C 160.514 84.0551 159.813 83.1448 156.661 83.7055C 153.508 84.2662 153.508 85.5268 153.228 86.2277z"/>
+        <path style="stroke:none; fill:#dba300" d="M 153.286 86.2173C 153.014 86.8984 154.922 88.1942 155.877 87.3077C 156.9 86.4218 158.127 85.6037 158.536 85.3309C 160.376 84.1032 159.695 83.2173 156.627 83.763C 153.559 84.3086 153.559 85.5353 153.286 86.2173z"/>
+        <path style="stroke:none; fill:#d69e00" d="M 153.345 86.2071C 153.081 86.8693 154.936 88.1293 155.864 87.2673C 156.859 86.4059 158.052 85.6103 158.45 85.3451C 160.239 84.1513 159.577 83.2899 156.594 83.8205C 153.61 84.3511 153.61 85.5439 153.345 86.2071z"/>
+        <path style="stroke:none; fill:#d19800" d="M 153.404 86.1968C 153.147 86.8401 154.95 88.0644 155.851 87.2269C 156.818 86.3899 157.977 85.6169 158.363 85.3593C 160.102 84.1994 159.458 83.3624 156.56 83.878C 153.661 84.3935 153.661 85.5524 153.404 86.1968z"/>
+        <path style="stroke:none; fill:#cc9200" d="M 153.463 86.1865C 153.213 86.811 154.963 87.9995 155.838 87.1865C 156.777 86.374 157.902 85.6235 158.277 85.3735C 159.965 84.2475 159.34 83.435 156.527 83.9355C 153.713 84.436 153.713 85.561 153.463 86.1865z"/>
+        <path style="stroke:none; fill:#c68c00" d="M 153.521 86.1761C 153.279 86.7818 154.977 87.9346 155.825 87.1461C 156.736 86.358 157.827 85.6301 158.191 85.3877C 159.828 84.2956 159.222 83.5075 156.493 83.993C 153.764 84.4784 153.764 85.5695 153.521 86.1761z"/>
+        <path style="stroke:none; fill:#c18700" d="M 153.58 86.1659C 153.346 86.7527 154.99 87.8697 155.813 87.1057C 156.695 86.3421 157.752 85.6367 158.105 85.4019C 159.691 84.3437 159.104 83.5801 156.46 84.0505C 153.815 84.5209 153.815 85.5781 153.58 86.1659z"/>
+        <path style="stroke:none; fill:#bc8100" d="M 153.639 86.1556C 153.412 86.7235 155.004 87.8048 155.8 87.0653C 156.654 86.3261 157.677 85.6433 158.018 85.4161C 159.554 84.3918 158.985 83.6526 156.426 84.108C 153.866 84.5633 153.866 85.5866 153.639 86.1556z"/>
+        <path style="stroke:none; fill:#b77b00" d="M 153.698 86.1453C 153.478 86.6944 155.018 87.7399 155.787 87.0249C 156.612 86.3102 157.602 85.6499 157.932 85.4303C 159.417 84.4399 158.867 83.7252 156.392 84.1655C 153.918 84.6058 153.918 85.5952 153.698 86.1453z"/>
+        <path style="stroke:none; fill:#b27500" d="M 153.756 86.1349C 153.545 86.6652 155.031 87.675 155.774 86.9845C 156.571 86.2942 157.527 85.6565 157.846 85.4445C 159.28 84.488 158.749 83.7977 156.359 84.223C 153.969 84.6482 153.969 85.6037 153.756 86.1349z"/>
+        <path style="stroke:none; fill:#ad7000" d="M 153.815 86.1247C 153.611 86.6361 155.045 87.6101 155.761 86.9441C 156.53 86.2783 157.452 85.6631 157.759 85.4587C 159.143 84.5361 158.63 83.8703 156.325 84.2805C 154.02 84.6907 154.02 85.6123 153.815 86.1247z"/>
+        <path style="stroke:none; fill:#a86a00" d="M 153.874 86.1144C 153.677 86.6069 155.058 87.5452 155.749 86.9037C 156.489 86.2623 157.377 85.6697 157.673 85.4729C 159.005 84.5842 158.512 83.9428 156.292 84.338C 154.071 84.7331 154.071 85.6208 153.874 86.1144z"/>
+        <path style="stroke:none; fill:#a36400" d="M 153.933 86.1041C 153.744 86.5778 155.072 87.4803 155.736 86.8633C 156.448 86.2464 157.302 85.6763 157.587 85.4871C 158.868 84.6323 158.394 84.0154 156.258 84.3955C 154.123 84.7756 154.123 85.6294 153.933 86.1041z"/>
+        <path style="stroke:none; fill:#9e5e00" d="M 153.991 86.0938C 153.81 86.5486 155.086 87.4154 155.723 86.8229C 156.407 86.2304 157.227 85.6829 157.5 85.5013C 158.731 84.6804 158.275 84.0879 156.225 84.453C 154.174 84.818 154.174 85.6379 153.991 86.0938z"/>
+      </g>
+      <path style="stroke:none; fill:#995900" d="M 154.05 86.0835C 153.876 86.5195 155.099 87.3505 155.71 86.7825C 156.366 86.2145 157.152 85.6895 157.414 85.5155C 158.594 84.7285 158.157 84.1605 156.191 84.5105C 154.225 84.8605 154.225 85.6465 154.05 86.0835z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 156.951 107.887C 156.722 110.745 163.294 103.601 163.694 102.972C 164.551 101.429 167.409 97.0865 167.866 95.2575C 168.723 92.0575 170.267 89.7145 169.295 86.3425C 168.952 85.2565 166.552 84.9705 165.466 85.6565C 162.38 87.4855 162.837 89.7145 162.494 91.7715C 161.351 97.6005 157.351 103.487 156.951 107.887z"/>
+      <g>
+        <path style="stroke:none; fill:#ffcc02" d="M 157.22 107.441C 157.001 110.228 163.398 103.253 163.787 102.639C 164.62 101.133 167.401 96.8942 167.843 95.1102C 168.674 91.9888 170.176 89.702 169.224 86.4157C 168.887 85.3573 166.547 85.082 165.489 85.7525C 162.483 87.5404 162.932 89.7131 162.6 91.7192C 161.495 97.4044 157.603 103.15 157.22 107.441z"/>
+        <path style="stroke:none; fill:#ffcc05" d="M 157.488 106.995C 157.279 109.71 163.502 102.904 163.88 102.305C 164.69 100.836 167.392 96.7019 167.821 94.9629C 168.625 91.9202 170.085 89.6896 169.152 86.4889C 168.823 85.4581 166.542 85.1936 165.512 85.8484C 162.586 87.5953 163.026 89.7117 162.707 91.667C 161.638 97.2083 157.855 102.813 157.488 106.995z"/>
+        <path style="stroke:none; fill:#ffcc07" d="M 157.757 106.548C 157.558 109.193 163.606 102.555 163.973 101.971C 164.759 100.54 167.383 96.5096 167.798 94.8156C 168.577 91.8515 169.994 89.6771 169.08 86.5621C 168.758 85.5589 166.537 85.3051 165.535 85.9445C 162.688 87.6502 163.121 89.7103 162.813 91.6147C 161.782 97.0122 158.107 102.476 157.757 106.548z"/>
+        <path style="stroke:none; fill:#ffcd0a" d="M 158.026 106.102C 157.837 108.675 163.71 102.206 164.066 101.637C 164.828 100.243 167.375 96.3173 167.775 94.6683C 168.528 91.7829 169.904 89.6647 169.009 86.6353C 168.693 85.6597 166.531 85.4167 165.558 86.0405C 162.791 87.7051 163.216 89.7089 162.919 91.5625C 161.925 96.8161 158.36 102.139 158.026 106.102z"/>
+        <path style="stroke:none; fill:#ffcd0c" d="M 158.294 105.655C 158.115 108.158 163.813 101.857 164.159 101.304C 164.897 99.947 167.366 96.125 167.753 94.521C 168.479 91.7142 169.813 89.6522 168.937 86.7085C 168.629 85.7605 166.526 85.5282 165.581 86.1365C 162.894 87.76 163.31 89.7075 163.025 91.5102C 162.068 96.62 158.612 101.801 158.294 105.655z"/>
+        <path style="stroke:none; fill:#ffcd0f" d="M 158.563 105.209C 158.394 107.64 163.917 101.508 164.252 100.97C 164.967 99.6505 167.358 95.9327 167.73 94.3737C 168.43 91.6456 169.722 89.6398 168.865 86.7817C 168.564 85.8613 166.521 85.6398 165.604 86.2325C 162.996 87.8149 163.405 89.7061 163.132 91.458C 162.212 96.4239 158.864 101.464 158.563 105.209z"/>
+        <path style="stroke:none; fill:#ffcd11" d="M 158.831 104.762C 158.672 107.123 164.021 101.16 164.345 100.636C 165.036 99.354 167.349 95.7404 167.707 94.2264C 168.381 91.5769 169.631 89.6273 168.794 86.8549C 168.499 85.9621 166.516 85.7513 165.627 86.3285C 163.099 87.8698 163.499 89.7047 163.238 91.4057C 162.355 96.2278 159.116 101.127 158.831 104.762z"/>
+        <path style="stroke:none; fill:#ffce14" d="M 159.1 104.316C 158.951 106.605 164.125 100.811 164.438 100.302C 165.105 99.0575 167.34 95.5481 167.685 94.0791C 168.332 91.5083 169.54 89.6149 168.722 86.9281C 168.435 86.0629 166.511 85.8629 165.65 86.4245C 163.202 87.9247 163.594 89.7033 163.344 91.3535C 162.499 96.0317 159.368 100.79 159.1 104.316z"/>
+        <path style="stroke:none; fill:#ffce16" d="M 159.369 103.869C 159.23 106.088 164.229 100.462 164.531 99.9687C 165.174 98.761 167.332 95.3558 167.662 93.9318C 168.284 91.4396 169.449 89.6024 168.65 87.0013C 168.37 86.1637 166.505 85.9744 165.673 86.5205C 163.304 87.9796 163.689 89.7019 163.45 91.3012C 162.642 95.8356 159.62 100.453 159.369 103.869z"/>
+        <path style="stroke:none; fill:#ffce19" d="M 159.637 103.423C 159.508 105.57 164.333 100.113 164.624 99.635C 165.244 98.4645 167.323 95.1635 167.639 93.7845C 168.235 91.371 169.358 89.59 168.579 87.0745C 168.305 86.2645 166.5 86.086 165.696 86.6165C 163.407 88.0345 163.783 89.7005 163.557 91.249C 162.786 95.6395 159.872 100.115 159.637 103.423z"/>
+        <path style="stroke:none; fill:#ffce1c" d="M 159.906 102.977C 159.787 105.053 164.437 99.7641 164.717 99.3012C 165.313 98.168 167.315 94.9712 167.616 93.6372C 168.186 91.3023 169.267 89.5775 168.507 87.1477C 168.24 86.3653 166.495 86.1975 165.719 86.7125C 163.51 88.0894 163.878 89.6991 163.663 91.1967C 162.929 95.4434 160.124 99.7783 159.906 102.977z"/>
+        <path style="stroke:none; fill:#ffcf1e" d="M 160.174 102.53C 160.065 104.535 164.54 99.4153 164.81 98.9675C 165.382 97.8715 167.306 94.7789 167.594 93.4899C 168.137 91.2337 169.176 89.5651 168.435 87.2209C 168.176 86.4661 166.49 86.3091 165.742 86.8085C 163.613 88.1443 163.972 89.6977 163.769 91.1445C 163.073 95.2473 160.376 99.4411 160.174 102.53z"/>
+        <path style="stroke:none; fill:#ffcf21" d="M 160.443 102.084C 160.344 104.018 164.644 99.0664 164.903 98.6337C 165.451 97.575 167.297 94.5866 167.571 93.3426C 168.088 91.165 169.085 89.5526 168.364 87.2941C 168.111 86.5669 166.485 86.4206 165.765 86.9045C 163.715 88.1992 164.067 89.6963 163.875 91.0922C 163.216 95.0512 160.628 99.1039 160.443 102.084z"/>
+        <path style="stroke:none; fill:#ffcf23" d="M 160.712 101.637C 160.623 103.5 164.748 98.7176 164.995 98.3C 165.521 97.2785 167.289 94.3943 167.548 93.1953C 168.039 91.0964 168.995 89.5402 168.292 87.3673C 168.046 86.6677 166.479 86.5322 165.787 87.0005C 163.818 88.2541 164.162 89.6949 163.982 91.04C 163.359 94.8551 160.881 98.7667 160.712 101.637z"/>
+        <path style="stroke:none; fill:#ffcf26" d="M 160.98 101.191C 160.901 102.983 164.852 98.3687 165.088 97.9662C 165.59 96.982 167.28 94.202 167.526 93.048C 167.99 91.0277 168.904 89.5277 168.22 87.4405C 167.982 86.7685 166.474 86.6437 165.81 87.0965C 163.921 88.309 164.256 89.6935 164.088 90.9877C 163.503 94.659 161.133 98.4295 160.98 101.191z"/>
+        <path style="stroke:none; fill:#ffd028" d="M 161.249 100.744C 161.18 102.465 164.956 98.0199 165.181 97.6325C 165.659 96.6855 167.272 94.0097 167.503 92.9007C 167.942 90.9591 168.813 89.5153 168.149 87.5137C 167.917 86.8693 166.469 86.7553 165.833 87.1925C 164.023 88.3639 164.351 89.6921 164.194 90.9355C 163.646 94.4629 161.385 98.0923 161.249 100.744z"/>
+        <path style="stroke:none; fill:#ffd02b" d="M 161.517 100.298C 161.458 101.948 165.06 97.671 165.274 97.2987C 165.728 96.389 167.263 93.8174 167.48 92.7534C 167.893 90.8904 168.722 89.5028 168.077 87.5869C 167.852 86.9701 166.464 86.8668 165.856 87.2885C 164.126 88.4188 164.445 89.6907 164.3 90.8832C 163.79 94.2668 161.637 97.7551 161.517 100.298z"/>
+        <path style="stroke:none; fill:#ffd02d" d="M 161.786 99.8514C 161.737 101.43 165.163 97.3222 165.367 96.965C 165.798 96.0925 167.254 93.6251 167.458 92.606C 167.844 90.8218 168.631 89.4904 168.005 87.6601C 167.788 87.0709 166.459 86.9784 165.879 87.3845C 164.229 88.4737 164.54 89.6893 164.407 90.831C 163.933 94.0707 161.889 97.4179 161.786 99.8514z"/>
+        <path style="stroke:none; fill:#ffd030" d="M 162.055 99.4049C 162.016 100.913 165.267 96.9733 165.46 96.6312C 165.867 95.796 167.246 93.4328 167.435 92.4588C 167.795 90.7531 168.54 89.4779 167.934 87.7333C 167.723 87.1717 166.453 87.0899 165.902 87.4805C 164.331 88.5286 164.635 89.6879 164.513 90.7787C 164.077 93.8746 162.141 97.0807 162.055 99.4049z"/>
+      </g>
+      <path style="stroke:none; fill:#ffd133" d="M 162.323 98.9585C 162.294 100.395 165.371 96.6245 165.553 96.2975C 165.936 95.4995 167.237 93.2405 167.412 92.3115C 167.746 90.6845 168.449 89.4655 167.862 87.8065C 167.658 87.2725 166.448 87.2015 165.925 87.5765C 164.434 88.5835 164.729 89.6865 164.619 90.7265C 164.22 93.6785 162.393 96.7435 162.323 98.9585z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 179.646 95.9935C 176.478 99.4495 174.246 102.761 172.446 104.993C 170.574 107.297 165.966 110.033 168.27 112.697C 170.214 115.073 178.206 110.753 184.398 106.145C 190.518 101.537 200.094 97.4335 195.414 92.1775C 192.966 89.5135 187.206 90.0895 184.974 91.5295C 183.246 92.6095 182.238 93.1855 179.646 95.9935z"/>
+      <g>
+        <path style="stroke:none; fill:#ffcc02" d="M 179.782 96.1469C 176.664 99.5247 174.469 102.775 172.696 104.956C 170.855 107.205 166.321 109.901 168.566 112.49C 170.459 114.8 178.29 110.547 184.361 106.021C 190.362 101.496 199.741 97.4469 195.181 92.3394C 192.795 89.7511 187.159 90.3418 184.972 91.7555C 183.28 92.8171 182.307 93.4253 179.782 96.1469z"/>
+        <path style="stroke:none; fill:#ffcc05" d="M 179.919 96.3004C 176.85 99.6 174.692 102.788 172.946 104.919C 171.136 107.112 166.675 109.769 168.861 112.283C 170.704 114.526 178.374 110.34 184.324 105.897C 190.206 101.455 199.388 97.4603 194.947 92.5014C 192.624 89.9887 187.112 90.5941 184.969 91.9816C 183.314 93.0248 182.376 93.6651 179.919 96.3004z"/>
+        <path style="stroke:none; fill:#ffcc07" d="M 180.055 96.4538C 177.036 99.6752 174.916 102.801 173.196 104.882C 171.416 107.02 167.03 109.636 169.156 112.076C 170.949 114.253 178.458 110.134 184.287 105.773C 190.049 101.414 199.035 97.4737 194.714 92.6633C 192.453 90.2263 187.065 90.8464 184.967 92.2076C 183.348 93.2324 182.445 93.9049 180.055 96.4538z"/>
+        <path style="stroke:none; fill:#ffcd0a" d="M 180.191 96.6073C 177.221 99.7505 175.139 102.814 173.446 104.845C 171.697 106.927 167.384 109.504 169.452 111.868C 171.195 113.979 178.542 109.927 184.25 105.649C 189.893 101.373 198.682 97.4871 194.481 92.8253C 192.282 90.4639 187.018 91.0987 184.964 92.4337C 183.382 93.4401 182.513 94.1447 180.191 96.6073z"/>
+        <path style="stroke:none; fill:#ffcd0c" d="M 180.327 96.7607C 177.407 99.8257 175.362 102.827 173.696 104.808C 171.978 106.835 167.739 109.372 169.747 111.661C 171.44 113.705 178.625 109.721 184.213 105.525C 189.737 101.331 198.329 97.5005 194.247 92.9872C 192.11 90.7015 186.971 91.351 184.962 92.6597C 183.416 93.6477 182.582 94.3845 180.327 96.7607z"/>
+        <path style="stroke:none; fill:#ffcd0f" d="M 180.464 96.9142C 177.593 99.901 175.585 102.84 173.946 104.771C 172.259 106.742 168.093 109.239 170.043 111.454C 171.685 113.432 178.709 109.514 184.176 105.401C 189.58 101.29 197.976 97.5139 194.014 93.1492C 191.939 90.9391 186.924 91.6033 184.959 92.8858C 183.45 93.8554 182.651 94.6243 180.464 96.9142z"/>
+        <path style="stroke:none; fill:#ffcd11" d="M 180.6 97.0676C 177.779 99.9762 175.808 102.853 174.196 104.734C 172.539 106.65 168.448 109.107 170.338 111.246C 171.93 113.158 178.793 109.308 184.139 105.277C 189.424 101.249 197.624 97.5273 193.78 93.3111C 191.768 91.1767 186.878 91.8556 184.957 93.1118C 183.484 94.063 182.72 94.8641 180.6 97.0676z"/>
+        <path style="stroke:none; fill:#ffce14" d="M 180.736 97.2211C 177.965 100.051 176.031 102.866 174.446 104.697C 172.82 106.557 168.802 108.975 170.633 111.039C 172.175 112.884 178.877 109.101 184.102 105.153C 189.268 101.208 197.271 97.5407 193.547 93.4731C 191.597 91.4143 186.831 92.1079 184.955 93.3379C 183.518 94.2707 182.789 95.1039 180.736 97.2211z"/>
+        <path style="stroke:none; fill:#ffce16" d="M 180.872 97.3745C 178.15 100.127 176.255 102.879 174.696 104.66C 173.101 106.465 169.157 108.842 170.929 110.832C 172.42 112.611 178.961 108.895 184.065 105.029C 189.111 101.167 196.918 97.5541 193.314 93.635C 191.426 91.6519 186.784 92.3602 184.952 93.5639C 183.552 94.4783 182.857 95.3437 180.872 97.3745z"/>
+        <path style="stroke:none; fill:#ffce19" d="M 181.009 97.528C 178.336 100.202 176.478 102.892 174.946 104.623C 173.382 106.372 169.511 108.71 171.224 110.624C 172.665 112.337 179.045 108.688 184.028 104.905C 188.955 101.125 196.565 97.5675 193.08 93.797C 191.255 91.8895 186.737 92.6125 184.95 93.79C 183.586 94.686 182.926 95.5835 181.009 97.528z"/>
+        <path style="stroke:none; fill:#ffce1c" d="M 181.145 97.6814C 178.522 100.277 176.701 102.906 175.196 104.586C 173.662 106.279 169.866 108.578 171.52 110.417C 172.91 112.063 179.129 108.482 183.991 104.781C 188.799 101.084 196.212 97.5809 192.847 93.9589C 191.084 92.1271 186.69 92.8648 184.947 94.016C 183.62 94.8936 182.995 95.8233 181.145 97.6814z"/>
+        <path style="stroke:none; fill:#ffcf1e" d="M 181.281 97.8349C 178.708 100.352 176.924 102.919 175.446 104.549C 173.943 106.187 170.22 108.445 171.815 110.21C 173.155 111.79 179.212 108.275 183.954 104.657C 188.643 101.043 195.859 97.5943 192.613 94.1209C 190.912 92.3647 186.643 93.1171 184.945 94.2421C 183.654 95.1013 183.064 96.0631 181.281 97.8349z"/>
+        <path style="stroke:none; fill:#ffcf21" d="M 181.417 97.9883C 178.894 100.428 177.147 102.932 175.696 104.512C 174.224 106.094 170.575 108.313 172.11 110.003C 173.4 111.516 179.296 108.069 183.917 104.533C 188.486 101.002 195.506 97.6077 192.38 94.2828C 190.741 92.6023 186.596 93.3694 184.942 94.4681C 183.688 95.3089 183.133 96.3029 181.417 97.9883z"/>
+        <path style="stroke:none; fill:#ffcf23" d="M 181.554 98.1418C 179.079 100.503 177.37 102.945 175.946 104.475C 174.505 106.002 170.929 108.181 172.406 109.795C 173.646 111.242 179.38 107.862 183.88 104.409C 188.33 100.961 195.153 97.6211 192.147 94.4448C 190.57 92.8399 186.549 93.6217 184.94 94.6942C 183.721 95.5166 183.201 96.5427 181.554 98.1418z"/>
+        <path style="stroke:none; fill:#ffcf26" d="M 181.69 98.2952C 179.265 100.578 177.593 102.958 176.196 104.438C 174.785 105.909 171.284 108.048 172.701 109.588C 173.891 110.969 179.464 107.656 183.843 104.285C 188.174 100.919 194.8 97.6345 191.913 94.6067C 190.399 93.0775 186.502 93.874 184.937 94.9202C 183.755 95.7242 183.27 96.7825 181.69 98.2952z"/>
+        <path style="stroke:none; fill:#ffd028" d="M 181.826 98.4487C 179.451 100.653 177.817 102.971 176.446 104.401C 175.066 105.817 171.638 107.916 172.997 109.381C 174.136 110.695 179.548 107.449 183.806 104.161C 188.017 100.878 194.447 97.6479 191.68 94.7687C 190.228 93.3151 186.455 94.1263 184.935 95.1463C 183.789 95.9319 183.339 97.0223 181.826 98.4487z"/>
+        <path style="stroke:none; fill:#ffd02b" d="M 181.962 98.6021C 179.637 100.729 178.04 102.984 176.696 104.364C 175.347 105.724 171.993 107.784 173.292 109.173C 174.381 110.421 179.632 107.243 183.769 104.037C 187.861 100.837 194.094 97.6613 191.446 94.9306C 190.057 93.5527 186.408 94.3786 184.933 95.3723C 183.823 96.1395 183.408 97.2621 181.962 98.6021z"/>
+        <path style="stroke:none; fill:#ffd02d" d="M 182.099 98.7556C 179.823 100.804 178.263 102.997 176.946 104.327C 175.628 105.632 172.347 107.651 173.587 108.966C 174.626 110.148 179.715 107.036 183.732 103.913C 187.705 100.796 193.741 97.6747 191.213 95.0926C 189.885 93.7903 186.361 94.6309 184.93 95.5984C 183.857 96.3472 183.477 97.5019 182.099 98.7556z"/>
+        <path style="stroke:none; fill:#ffd030" d="M 182.235 98.909C 180.008 100.879 178.486 103.01 177.196 104.29C 175.908 105.539 172.702 107.519 173.883 108.759C 174.871 109.874 179.799 106.83 183.695 103.789C 187.548 100.755 193.388 97.6881 190.98 95.2545C 189.714 94.0279 186.314 94.8832 184.928 95.8244C 183.891 96.5548 183.545 97.7417 182.235 98.909z"/>
+      </g>
+      <path style="stroke:none; fill:#ffd133" d="M 182.371 99.0625C 180.194 100.954 178.709 103.023 177.446 104.253C 176.189 105.446 173.056 107.386 174.178 108.551C 175.116 109.6 179.883 106.623 183.658 103.665C 187.392 100.713 193.035 97.7015 190.746 95.4165C 189.543 94.2655 186.267 95.1355 184.925 96.0505C 183.925 96.7625 183.614 97.9815 182.371 99.0625z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffffff" d="M 186.414 168.569C 187.278 165.761 215.286 159.137 219.894 161.297C 224.43 163.457 246.174 195.065 242.286 196.793C 238.398 198.449 230.046 186.281 217.878 180.665C 205.71 175.049 185.55 171.449 186.414 168.569z"/>
+      <g>
+        <path style="stroke:none; fill:#f9f9f9" d="M 187.239 168.626C 188.087 165.865 215.384 159.55 219.929 161.629C 224.405 163.708 245.697 194.526 241.873 196.22C 238.049 197.845 229.908 185.874 217.932 180.346C 205.956 174.819 186.391 171.456 187.239 168.626z"/>
+        <path style="stroke:none; fill:#f4f4f4" d="M 188.063 168.683C 188.895 165.969 215.481 159.963 219.963 161.961C 224.38 163.959 245.221 193.987 241.46 195.646C 237.7 197.24 229.77 185.466 217.986 180.027C 206.203 174.589 187.231 171.462 188.063 168.683z"/>
+        <path style="stroke:none; fill:#efefef" d="M 188.888 168.74C 189.703 166.072 215.579 160.376 219.998 162.293C 224.355 164.21 244.744 193.448 241.047 195.072C 237.351 196.635 229.631 185.058 218.04 179.708C 206.449 174.359 188.072 171.469 188.888 168.74z"/>
+        <path style="stroke:none; fill:#eaeaea" d="M 189.712 168.797C 190.512 166.176 215.676 160.788 220.032 162.624C 224.331 164.461 244.267 192.909 240.635 194.498C 237.002 196.03 229.493 184.651 218.094 179.389C 206.695 174.128 188.913 171.475 189.712 168.797z"/>
+        <path style="stroke:none; fill:#e5e5e5" d="M 190.537 168.853C 191.32 166.28 215.773 161.201 220.067 162.956C 224.306 164.712 243.79 192.37 240.222 193.924C 236.653 195.425 229.355 184.243 218.148 179.07C 206.942 173.898 189.753 171.481 190.537 168.853z"/>
+        <path style="stroke:none; fill:#e0e0e0" d="M 191.361 168.91C 192.129 166.383 215.871 161.614 220.101 163.288C 224.281 164.963 243.313 191.831 239.809 193.351C 236.304 194.82 229.217 183.835 218.202 178.751C 207.188 173.668 190.594 171.488 191.361 168.91z"/>
+        <path style="stroke:none; fill:#dbdbdb" d="M 192.186 168.967C 192.937 166.487 215.968 162.026 220.136 163.62C 224.256 165.213 242.837 191.291 239.396 192.777C 235.955 194.215 229.078 183.428 218.256 178.432C 207.434 173.438 191.434 171.494 192.186 168.967z"/>
+        <path style="stroke:none; fill:#d6d6d6" d="M 193.01 169.024C 193.745 166.591 216.066 162.439 220.17 163.951C 224.231 165.464 242.36 190.752 238.983 192.203C 235.606 193.61 228.94 183.02 218.31 178.113C 207.681 173.207 192.275 171.501 193.01 169.024z"/>
+        <path style="stroke:none; fill:#d1d1d1" d="M 193.835 169.081C 194.554 166.694 216.163 162.852 220.205 164.283C 224.206 165.715 241.883 190.213 238.57 191.629C 235.257 193.005 228.802 182.612 218.364 177.794C 207.927 172.977 193.116 171.507 193.835 169.081z"/>
+        <path style="stroke:none; fill:#cccccc" d="M 194.659 169.137C 195.362 166.798 216.261 163.264 220.239 164.615C 224.181 165.966 241.406 189.674 238.157 191.055C 234.908 192.4 228.664 182.204 218.418 177.475C 208.173 172.747 193.956 171.513 194.659 169.137z"/>
+        <path style="stroke:none; fill:#c6c6c6" d="M 195.484 169.194C 196.171 166.902 216.358 163.677 220.274 164.947C 224.156 166.217 240.929 189.135 237.744 190.482C 234.559 191.796 228.525 181.797 218.472 177.156C 208.419 172.517 194.797 171.52 195.484 169.194z"/>
+        <path style="stroke:none; fill:#c1c1c1" d="M 196.308 169.251C 196.979 167.005 216.456 164.09 220.308 165.278C 224.131 166.468 240.453 188.596 237.331 189.908C 234.21 191.191 228.387 181.389 218.526 176.837C 208.666 172.286 195.637 171.526 196.308 169.251z"/>
+        <path style="stroke:none; fill:#bcbcbc" d="M 197.133 169.308C 197.787 167.109 216.553 164.503 220.343 165.61C 224.106 166.719 239.976 188.057 236.918 189.334C 233.861 190.586 228.249 180.981 218.58 176.518C 208.912 172.056 196.478 171.533 197.133 169.308z"/>
+        <path style="stroke:none; fill:#b7b7b7" d="M 197.957 169.365C 198.596 167.213 216.65 164.915 220.377 165.942C 224.082 166.969 239.499 187.517 236.506 188.76C 233.512 189.981 228.111 180.574 218.634 176.199C 209.158 171.826 197.319 171.539 197.957 169.365z"/>
+        <path style="stroke:none; fill:#b2b2b2" d="M 198.782 169.421C 199.404 167.316 216.748 165.328 220.412 166.274C 224.057 167.22 239.022 186.978 236.093 188.186C 233.163 189.376 227.972 180.166 218.688 175.88C 209.405 171.596 198.159 171.545 198.782 169.421z"/>
+        <path style="stroke:none; fill:#adadad" d="M 199.606 169.478C 200.213 167.42 216.845 165.741 220.446 166.605C 224.032 167.471 238.545 186.439 235.68 187.613C 232.814 188.771 227.834 179.758 218.742 175.561C 209.651 171.365 199 171.552 199.606 169.478z"/>
+        <path style="stroke:none; fill:#a8a8a8" d="M 200.431 169.535C 201.021 167.524 216.943 166.153 220.481 166.937C 224.007 167.722 238.069 185.9 235.267 187.039C 232.465 188.166 227.696 179.351 218.796 175.242C 209.897 171.135 199.84 171.558 200.431 169.535z"/>
+        <path style="stroke:none; fill:#a3a3a3" d="M 201.255 169.592C 201.829 167.627 217.04 166.566 220.515 167.269C 223.982 167.973 237.592 185.361 234.854 186.465C 232.116 187.561 227.558 178.943 218.85 174.923C 210.144 170.905 200.681 171.565 201.255 169.592z"/>
+        <path style="stroke:none; fill:#9e9e9e" d="M 202.08 169.649C 202.638 167.731 217.138 166.979 220.55 167.601C 223.957 168.224 237.115 184.822 234.441 185.891C 231.767 186.956 227.419 178.535 218.904 174.604C 210.39 170.675 201.522 171.571 202.08 169.649z"/>
+      </g>
+      <path style="stroke:none; fill:#999999" d="M 202.904 169.705C 203.446 167.834 217.235 167.391 220.584 167.932C 223.932 168.474 236.638 184.282 234.028 185.317C 231.418 186.351 227.281 178.127 218.958 174.285C 210.636 170.444 202.362 171.577 202.904 169.705z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffffff" d="M 151.134 211.625C 154.014 211.769 151.278 227.897 151.278 244.529C 151.278 261.161 153.51 266.993 151.422 269.081C 149.334 271.169 145.734 263.681 145.734 247.049C 145.734 230.417 148.254 211.481 151.134 211.625z"/>
+      <g>
+        <path style="stroke:none; fill:#f9f9f9" d="M 151.105 212.016C 153.888 212.178 151.215 228.068 151.202 244.435C 151.19 260.802 153.389 266.643 151.366 268.673C 149.346 270.701 145.805 263.289 145.82 246.92C 145.832 230.553 148.322 211.855 151.105 212.016z"/>
+        <path style="stroke:none; fill:#f4f4f4" d="M 151.075 212.407C 153.761 212.586 151.151 228.239 151.126 244.34C 151.102 260.442 153.268 266.292 151.31 268.264C 149.357 270.232 145.876 262.897 145.905 246.791C 145.93 230.689 148.39 212.228 151.075 212.407z"/>
+        <path style="stroke:none; fill:#efefef" d="M 151.046 212.798C 153.634 212.995 151.087 228.41 151.05 244.246C 151.013 260.082 153.147 265.941 151.254 267.856C 149.368 269.763 145.946 262.505 145.991 246.661C 146.028 230.825 148.458 212.602 151.046 212.798z"/>
+        <path style="stroke:none; fill:#eaeaea" d="M 151.017 213.189C 153.508 213.403 151.024 228.58 150.974 244.151C 150.925 259.722 153.026 265.59 151.198 267.447C 149.38 269.295 146.017 262.113 146.076 246.532C 146.125 230.961 148.526 212.975 151.017 213.189z"/>
+        <path style="stroke:none; fill:#e5e5e5" d="M 150.987 213.58C 153.381 213.811 150.96 228.751 150.898 244.057C 150.837 259.363 152.905 265.239 151.142 267.039C 149.391 268.826 146.088 261.72 146.162 246.402C 146.223 231.097 148.593 213.349 150.987 213.58z"/>
+        <path style="stroke:none; fill:#e0e0e0" d="M 150.958 213.971C 153.255 214.22 150.896 228.922 150.822 243.962C 150.748 259.003 152.784 264.888 151.086 266.63C 149.403 268.357 146.158 261.328 146.247 246.273C 146.321 231.233 148.661 213.722 150.958 213.971z"/>
+        <path style="stroke:none; fill:#dbdbdb" d="M 150.928 214.362C 153.128 214.628 150.833 229.093 150.747 243.868C 150.66 258.643 152.662 264.537 151.029 266.222C 149.414 267.889 146.229 260.936 146.333 246.144C 146.419 231.368 148.729 214.096 150.928 214.362z"/>
+        <path style="stroke:none; fill:#d6d6d6" d="M 150.899 214.753C 153.001 215.036 150.769 229.263 150.671 243.773C 150.572 258.283 152.541 264.186 150.973 265.813C 149.425 267.42 146.3 260.544 146.418 246.014C 146.517 231.504 148.797 214.469 150.899 214.753z"/>
+        <path style="stroke:none; fill:#d1d1d1" d="M 150.87 215.144C 152.875 215.445 150.705 229.434 150.595 243.679C 150.483 257.924 152.42 263.835 150.917 265.404C 149.437 266.952 146.37 260.152 146.504 245.885C 146.614 231.64 148.865 214.843 150.87 215.144z"/>
+        <path style="stroke:none; fill:#cccccc" d="M 150.84 215.535C 152.748 215.853 150.642 229.605 150.519 243.584C 150.395 257.564 152.299 263.484 150.861 264.996C 149.448 266.483 146.441 259.759 146.589 245.755C 146.712 231.776 148.933 215.216 150.84 215.535z"/>
+        <path style="stroke:none; fill:#c6c6c6" d="M 150.811 215.926C 152.622 216.261 150.578 229.776 150.443 243.49C 150.307 257.204 152.178 263.133 150.805 264.587C 149.46 266.014 146.512 259.367 146.675 245.626C 146.81 231.912 149.001 215.59 150.811 215.926z"/>
+        <path style="stroke:none; fill:#c1c1c1" d="M 150.781 216.317C 152.495 216.67 150.514 229.946 150.367 243.395C 150.219 256.844 152.057 262.782 150.749 264.179C 149.471 265.546 146.583 258.975 146.76 245.497C 146.908 232.048 149.068 215.963 150.781 216.317z"/>
+        <path style="stroke:none; fill:#bcbcbc" d="M 150.752 216.708C 152.368 217.078 150.451 230.117 150.291 243.301C 150.13 256.485 151.936 262.431 150.693 263.77C 149.482 265.077 146.653 258.583 146.846 245.367C 147.006 232.184 149.136 216.337 150.752 216.708z"/>
+        <path style="stroke:none; fill:#b7b7b7" d="M 150.723 217.099C 152.242 217.486 150.387 230.288 150.215 243.206C 150.042 256.125 151.815 262.08 150.637 263.362C 149.494 264.608 146.724 258.191 146.931 245.238C 147.103 232.319 149.204 216.71 150.723 217.099z"/>
+        <path style="stroke:none; fill:#b2b2b2" d="M 150.693 217.49C 152.115 217.895 150.323 230.459 150.139 243.112C 149.954 255.765 151.694 261.729 150.581 262.953C 149.505 264.14 146.795 257.798 147.017 245.108C 147.201 232.455 149.272 217.084 150.693 217.49z"/>
+        <path style="stroke:none; fill:#adadad" d="M 150.664 217.881C 151.989 218.303 150.26 230.629 150.063 243.017C 149.865 255.405 151.573 261.378 150.525 262.545C 149.517 263.671 146.865 257.406 147.102 244.979C 147.299 232.591 149.34 217.457 150.664 217.881z"/>
+        <path style="stroke:none; fill:#a8a8a8" d="M 150.634 218.272C 151.862 218.711 150.196 230.8 149.987 242.923C 149.777 255.046 151.451 261.027 150.468 262.136C 149.528 263.202 146.936 257.014 147.188 244.85C 147.397 232.727 149.408 217.831 150.634 218.272z"/>
+        <path style="stroke:none; fill:#a3a3a3" d="M 150.605 218.663C 151.735 219.12 150.132 230.971 149.911 242.828C 149.689 254.686 151.33 260.676 150.412 261.728C 149.539 262.734 147.007 256.622 147.273 244.72C 147.495 232.863 149.475 218.204 150.605 218.663z"/>
+        <path style="stroke:none; fill:#9e9e9e" d="M 150.576 219.054C 151.609 219.528 150.069 231.142 149.835 242.734C 149.6 254.326 151.209 260.325 150.356 261.319C 149.551 262.265 147.077 256.23 147.359 244.591C 147.592 232.999 149.543 218.578 150.576 219.054z"/>
+      </g>
+      <path style="stroke:none; fill:#999999" d="M 150.546 219.444C 151.482 219.936 150.005 231.312 149.759 242.639C 149.512 253.966 151.088 259.974 150.3 260.91C 149.562 261.796 147.148 255.837 147.444 244.461C 147.69 233.134 149.611 218.951 150.546 219.444z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffffff" d="M 157.434 167.161C 159.17 167.353 169.871 164.943 170.257 165.907C 170.642 166.679 163.605 168.8 161.291 171.21C 160.52 171.981 158.495 173.813 157.242 173.62C 156.278 173.524 155.699 171.499 154.253 169.956C 150.782 166.486 148.565 166.775 149.24 165.425C 149.818 164.365 154.446 166.871 157.434 167.161z"/>
+      <g>
+        <path style="stroke:none; fill:#fbfbfb" d="M 157.479 167.201C 159.179 167.389 169.655 165.03 170.033 165.974C 170.41 166.729 163.521 168.806 161.255 171.165C 160.5 171.92 158.518 173.714 157.291 173.525C 156.348 173.431 155.781 171.448 154.365 169.938C 150.967 166.541 148.797 166.823 149.458 165.502C 150.023 164.464 154.554 166.917 157.479 167.201z"/>
+        <path style="stroke:none; fill:#f8f8f8" d="M 157.525 167.241C 159.188 167.425 169.439 165.117 169.808 166.04C 170.177 166.779 163.436 168.811 161.219 171.12C 160.481 171.859 158.541 173.614 157.341 173.429C 156.417 173.337 155.862 171.397 154.477 169.919C 151.152 166.595 149.028 166.871 149.675 165.578C 150.229 164.563 154.662 166.963 157.525 167.241z"/>
+        <path style="stroke:none; fill:#f5f5f5" d="M 157.57 167.281C 159.196 167.461 169.222 165.203 169.584 166.106C 169.945 166.829 163.352 168.817 161.183 171.075C 160.461 171.797 158.564 173.514 157.39 173.333C 156.487 173.243 155.944 171.346 154.589 169.9C 151.337 166.649 149.26 166.919 149.893 165.655C 150.434 164.662 154.77 167.009 157.57 167.281z"/>
+        <path style="stroke:none; fill:#f2f2f2" d="M 157.615 167.321C 159.205 167.497 169.006 165.29 169.36 166.173C 169.712 166.879 163.267 168.822 161.148 171.029C 160.441 171.736 158.587 173.414 157.439 173.237C 156.556 173.149 156.026 171.294 154.701 169.881C 151.522 166.703 149.492 166.967 150.11 165.731C 150.639 164.76 154.878 167.055 157.615 167.321z"/>
+        <path style="stroke:none; fill:#efefef" d="M 157.66 167.361C 159.214 167.533 168.79 165.376 169.135 166.239C 169.48 166.929 163.182 168.828 161.112 170.984C 160.422 171.674 158.609 173.314 157.488 173.141C 156.625 173.055 156.107 171.243 154.813 169.862C 151.707 166.757 149.723 167.015 150.327 165.807C 150.845 164.859 154.986 167.101 157.66 167.361z"/>
+        <path style="stroke:none; fill:#ebebeb" d="M 157.705 167.401C 159.222 167.569 168.573 165.463 168.911 166.305C 169.247 166.979 163.098 168.833 161.076 170.939C 160.402 171.613 158.632 173.214 157.537 173.045C 156.695 172.961 156.189 171.192 154.925 169.843C 151.892 166.811 149.955 167.063 150.545 165.884C 151.05 164.958 155.094 167.147 157.705 167.401z"/>
+        <path style="stroke:none; fill:#e8e8e8" d="M 157.751 167.441C 159.231 167.605 168.357 165.549 168.686 166.372C 169.015 167.029 163.013 168.839 161.04 170.894C 160.382 171.551 158.655 173.114 157.587 172.949C 156.764 172.867 156.271 171.14 155.038 169.825C 152.078 166.865 150.187 167.111 150.762 165.96C 151.255 165.056 155.202 167.193 157.751 167.441z"/>
+        <path style="stroke:none; fill:#e5e5e5" d="M 157.796 167.481C 159.24 167.641 168.141 165.636 168.462 166.438C 168.782 167.079 162.929 168.844 161.004 170.848C 160.363 171.49 158.678 173.014 157.636 172.853C 156.834 172.773 156.352 171.089 155.15 169.806C 152.263 166.919 150.418 167.159 150.98 166.037C 151.461 165.155 155.31 167.239 157.796 167.481z"/>
+        <path style="stroke:none; fill:#e2e2e2" d="M 157.841 167.521C 159.248 167.677 167.924 165.722 168.238 166.504C 168.55 167.129 162.844 168.85 160.968 170.803C 160.343 171.428 158.701 172.914 157.685 172.757C 156.903 172.679 156.434 171.038 155.262 169.787C 152.448 166.973 150.65 167.207 151.197 166.113C 151.666 165.254 155.418 167.285 157.841 167.521z"/>
+        <path style="stroke:none; fill:#dfdfdf" d="M 157.886 167.56C 159.257 167.712 167.708 165.809 168.013 166.57C 168.317 167.179 162.76 168.855 160.932 170.758C 160.323 171.367 158.724 172.814 157.734 172.661C 156.973 172.585 156.516 170.986 155.374 169.768C 152.633 167.027 150.882 167.255 151.415 166.189C 151.871 165.352 155.526 167.331 157.886 167.56z"/>
+        <path style="stroke:none; fill:#dbdbdb" d="M 157.931 167.6C 159.266 167.748 167.492 165.896 167.789 166.637C 168.085 167.229 162.675 168.86 160.896 170.713C 160.303 171.306 158.747 172.714 157.783 172.566C 157.042 172.492 156.597 170.935 155.486 169.749C 152.818 167.082 151.113 167.303 151.632 166.266C 152.076 165.451 155.634 167.377 157.931 167.6z"/>
+        <path style="stroke:none; fill:#d8d8d8" d="M 157.977 167.64C 159.275 167.784 167.276 165.982 167.564 166.703C 167.852 167.279 162.591 168.866 160.86 170.667C 160.284 171.244 158.769 172.614 157.833 172.47C 157.112 172.398 156.679 170.884 155.598 169.73C 153.003 167.136 151.345 167.351 151.85 166.342C 152.282 165.55 155.742 167.423 157.977 167.64z"/>
+        <path style="stroke:none; fill:#d5d5d5" d="M 158.022 167.68C 159.283 167.82 167.059 166.069 167.34 166.769C 167.62 167.329 162.506 168.871 160.824 170.622C 160.264 171.183 158.792 172.514 157.882 172.374C 157.181 172.304 156.761 170.833 155.71 169.711C 153.188 167.19 151.577 167.399 152.067 166.419C 152.487 165.649 155.85 167.469 158.022 167.68z"/>
+        <path style="stroke:none; fill:#d2d2d2" d="M 158.067 167.72C 159.292 167.856 166.843 166.155 167.116 166.836C 167.387 167.379 162.421 168.877 160.789 170.577C 160.244 171.121 158.815 172.414 157.931 172.278C 157.25 172.21 156.842 170.781 155.822 169.693C 153.373 167.244 151.808 167.447 152.284 166.495C 152.692 165.747 155.958 167.515 158.067 167.72z"/>
+        <path style="stroke:none; fill:#cfcfcf" d="M 158.112 167.76C 159.301 167.892 166.627 166.242 166.891 166.902C 167.155 167.429 162.337 168.882 160.753 170.532C 160.225 171.06 158.838 172.314 157.98 172.182C 157.32 172.116 156.924 170.73 155.934 169.674C 153.558 167.298 152.04 167.495 152.502 166.571C 152.898 165.846 156.066 167.561 158.112 167.76z"/>
+        <path style="stroke:none; fill:#cccccc" d="M 158.157 167.8C 159.309 167.928 166.41 166.328 166.667 166.968C 166.922 167.479 162.252 168.888 160.717 170.486C 160.205 170.998 158.861 172.214 158.029 172.086C 157.389 172.022 157.006 170.679 156.046 169.655C 153.743 167.352 152.272 167.543 152.719 166.648C 153.103 165.945 156.174 167.607 158.157 167.8z"/>
+        <path style="stroke:none; fill:#c8c8c8" d="M 158.203 167.84C 159.318 167.964 166.194 166.415 166.442 167.035C 166.69 167.529 162.168 168.893 160.681 170.441C 160.185 170.937 158.884 172.114 158.079 171.99C 157.459 171.928 157.087 170.627 156.158 169.636C 153.928 167.406 152.503 167.591 152.937 166.724C 153.308 166.043 156.282 167.653 158.203 167.84z"/>
+        <path style="stroke:none; fill:#c5c5c5" d="M 158.248 167.88C 159.327 168 165.978 166.501 166.218 167.101C 166.457 167.579 162.083 168.899 160.645 170.396C 160.166 170.875 158.906 172.014 158.128 171.894C 157.528 171.834 157.169 170.576 156.27 169.617C 154.113 167.46 152.735 167.639 153.154 166.801C 153.514 166.142 156.39 167.699 158.248 167.88z"/>
+        <path style="stroke:none; fill:#c2c2c2" d="M 158.293 167.92C 159.335 168.036 165.761 166.588 165.994 167.167C 166.225 167.629 161.999 168.904 160.609 170.351C 160.146 170.814 158.929 171.914 158.177 171.798C 157.598 171.74 157.251 170.525 156.382 169.598C 154.298 167.514 152.967 167.687 153.372 166.877C 153.719 166.241 156.498 167.745 158.293 167.92z"/>
+      </g>
+      <path style="stroke:none; fill:#bfbfbf" d="M 158.338 167.959C 159.344 168.071 165.545 166.674 165.769 167.233C 165.992 167.679 161.914 168.909 160.573 170.305C 160.126 170.752 158.952 171.814 158.226 171.702C 157.667 171.646 157.332 170.473 156.494 169.579C 154.483 167.568 153.198 167.735 153.589 166.953C 153.924 166.339 156.606 167.791 158.338 167.959z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 194.253 11.9225C 193.031 14.5535 190.441 35.1365 194.005 32.8145C 197.598 30.4735 207.575 27.5025 213.89 25.8015C 220.894 23.9145 196.703 6.33847 194.253 11.9225z"/>
+      <g>
+        <path style="stroke:none; fill:#060606" d="M 194.485 12.307C 193.275 14.901 190.781 34.562 194.251 32.3147C 197.742 30.0521 207.328 27.2147 213.29 25.5324C 219.88 23.6273 196.854 6.92261 194.485 12.307z"/>
+        <path style="stroke:none; fill:#0c0c0c" d="M 194.717 12.6915C 193.518 15.2486 191.122 33.9875 194.496 31.8149C 197.886 29.6307 207.082 26.9269 212.69 25.2634C 218.867 23.3403 197.006 7.50677 194.717 12.6915z"/>
+        <path style="stroke:none; fill:#131313" d="M 194.949 13.076C 193.762 15.5961 191.462 33.413 194.742 31.3151C 198.03 29.2093 206.835 26.6391 212.09 24.9943C 217.853 23.0532 197.157 8.09091 194.949 13.076z"/>
+        <path style="stroke:none; fill:#191919" d="M 195.181 13.4605C 194.005 15.9437 191.802 32.8385 194.988 30.8153C 198.175 28.7879 206.588 26.3513 211.49 24.7253C 216.839 22.7661 197.308 8.67508 195.181 13.4605z"/>
+        <path style="stroke:none; fill:#1f1f1f" d="M 195.413 13.845C 194.249 16.2912 192.143 32.264 195.233 30.3155C 198.319 28.3665 206.341 26.0635 210.89 24.4562C 215.825 22.479 197.46 9.25922 195.413 13.845z"/>
+        <path style="stroke:none; fill:#262626" d="M 195.645 14.2295C 194.492 16.6388 192.483 31.6895 195.479 29.8157C 198.463 27.9451 206.095 25.7757 210.29 24.1872C 214.811 22.1919 197.611 9.84338 195.645 14.2295z"/>
+        <path style="stroke:none; fill:#2c2c2c" d="M 195.878 14.614C 194.736 16.9863 192.823 31.115 195.725 29.3159C 198.607 27.5237 205.848 25.4879 209.69 23.9181C 213.798 21.9048 197.762 10.4275 195.878 14.614z"/>
+        <path style="stroke:none; fill:#333333" d="M 196.11 14.9985C 194.979 17.3339 193.164 30.5405 195.97 28.8161C 198.751 27.1023 205.601 25.2001 209.09 23.6491C 212.784 21.6177 197.914 11.0117 196.11 14.9985z"/>
+        <path style="stroke:none; fill:#393939" d="M 196.342 15.383C 195.223 17.6814 193.504 29.966 196.216 28.3163C 198.895 26.6809 205.354 24.9123 208.49 23.38C 211.77 21.3306 198.065 11.5958 196.342 15.383z"/>
+        <path style="stroke:none; fill:#3f3f3f" d="M 196.574 15.7675C 195.466 18.029 193.844 29.3915 196.462 27.8165C 199.039 26.2595 205.108 24.6245 207.89 23.111C 210.756 21.0435 198.216 12.18 196.574 15.7675z"/>
+        <path style="stroke:none; fill:#464646" d="M 196.806 16.152C 195.71 18.3765 194.184 28.817 196.707 27.3167C 199.183 25.8381 204.861 24.3367 207.29 22.8419C 209.742 20.7564 198.367 12.7641 196.806 16.152z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 197.038 16.5365C 195.953 18.7241 194.525 28.2425 196.953 26.8169C 199.327 25.4167 204.614 24.0489 206.69 22.5729C 208.729 20.4693 198.519 13.3483 197.038 16.5365z"/>
+        <path style="stroke:none; fill:#525252" d="M 197.27 16.921C 196.197 19.0716 194.865 27.668 197.199 26.3171C 199.471 24.9953 204.367 23.7611 206.09 22.3038C 207.715 20.1822 198.67 13.9324 197.27 16.921z"/>
+        <path style="stroke:none; fill:#595959" d="M 197.502 17.3055C 196.44 19.4192 195.205 27.0935 197.444 25.8173C 199.616 24.5739 204.121 23.4733 205.49 22.0348C 206.701 19.8951 198.821 14.5166 197.502 17.3055z"/>
+        <path style="stroke:none; fill:#5f5f5f" d="M 197.734 17.69C 196.684 19.7667 195.546 26.519 197.69 25.3175C 199.76 24.1525 203.874 23.1855 204.89 21.7657C 205.687 19.608 198.973 15.1007 197.734 17.69z"/>
+        <path style="stroke:none; fill:#666666" d="M 197.966 18.0745C 196.927 20.1143 195.886 25.9445 197.936 24.8177C 199.904 23.7311 203.627 22.8977 204.29 21.4967C 204.673 19.3209 199.124 15.6849 197.966 18.0745z"/>
+        <path style="stroke:none; fill:#6c6c6c" d="M 198.198 18.459C 197.171 20.4618 196.226 25.37 198.181 24.3179C 200.048 23.3097 203.38 22.6099 203.69 21.2276C 203.66 19.0338 199.275 16.269 198.198 18.459z"/>
+        <path style="stroke:none; fill:#727272" d="M 198.43 18.8435C 197.414 20.8094 196.567 24.7955 198.427 23.8181C 200.192 22.8883 203.134 22.3221 203.09 20.9586C 202.646 18.7467 199.427 16.8532 198.43 18.8435z"/>
+        <path style="stroke:none; fill:#797979" d="M 198.662 19.228C 197.658 21.1569 196.907 24.221 198.673 23.3183C 200.336 22.4669 202.887 22.0343 202.49 20.6895C 201.632 18.4596 199.578 17.4373 198.662 19.228z"/>
+      </g>
+      <path style="stroke:none; fill:#7f7f7f" d="M 198.894 19.6125C 197.901 21.5045 197.247 23.6465 198.918 22.8185C 200.48 22.0455 202.64 21.7465 201.89 20.4205C 200.618 18.1725 199.729 18.0215 198.894 19.6125z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 143.502 46.3855C 142.782 48.5455 152.214 51.4975 154.302 53.3695C 157.11 55.8895 157.326 60.8575 160.638 58.8415C 162.798 57.5455 161.142 54.6655 157.182 50.2735C 151.35 43.7935 144.15 44.5855 143.502 46.3855z"/>
+      <g>
+        <path style="stroke:none; fill:#050505" d="M 143.991 46.5822C 143.275 48.6554 152.266 51.482 154.327 53.323C 157.072 55.7796 157.288 60.5716 160.473 58.6358C 162.567 57.3815 160.923 54.5638 157.131 50.3553C 151.556 44.1528 144.639 44.8511 143.991 46.5822z"/>
+        <path style="stroke:none; fill:#0a0a0a" d="M 144.479 46.7789C 143.769 48.7654 152.318 51.4666 154.352 53.2765C 157.034 55.6697 157.25 60.2858 160.308 58.4301C 162.337 57.2176 160.703 54.4621 157.081 50.4371C 151.761 44.5122 145.127 45.1167 144.479 46.7789z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 144.967 46.9756C 144.262 48.8753 152.37 51.4511 154.377 53.23C 156.997 55.5598 157.212 59.9999 160.142 58.2244C 162.106 57.0536 160.484 54.3604 157.03 50.5189C 151.967 44.8715 145.616 45.3823 144.967 46.9756z"/>
+        <path style="stroke:none; fill:#141414" d="M 145.456 47.1723C 144.755 48.9853 152.422 51.4357 154.402 53.1835C 156.959 55.4499 157.175 59.7141 159.977 58.0187C 161.875 56.8897 160.264 54.2587 156.979 50.6007C 152.172 45.2309 146.105 45.6479 145.456 47.1723z"/>
+        <path style="stroke:none; fill:#191919" d="M 145.944 47.369C 145.248 49.0952 152.474 51.4202 154.427 53.137C 156.921 55.34 157.137 59.4282 159.812 57.813C 161.645 56.7257 160.044 54.157 156.928 50.6825C 152.377 45.5902 146.593 45.9135 145.944 47.369z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 146.433 47.5657C 145.741 49.2052 152.526 51.4048 154.452 53.0905C 156.883 55.2301 157.099 59.1424 159.646 57.6073C 161.414 56.5618 159.825 54.0553 156.877 50.7643C 152.583 45.9496 147.082 46.1791 146.433 47.5657z"/>
+        <path style="stroke:none; fill:#232323" d="M 146.921 47.7624C 146.235 49.3151 152.578 51.3893 154.478 53.044C 156.845 55.1202 157.061 58.8565 159.481 57.4016C 161.183 56.3978 159.605 53.9536 156.827 50.8461C 152.788 46.3089 147.571 46.4447 146.921 47.7624z"/>
+        <path style="stroke:none; fill:#282828" d="M 147.409 47.9591C 146.728 49.4251 152.63 51.3739 154.503 52.9975C 156.807 55.0103 157.023 58.5707 159.316 57.1959C 160.953 56.2339 159.386 53.8519 156.776 50.9279C 152.994 46.6683 148.059 46.7103 147.409 47.9591z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 147.898 48.1558C 147.221 49.535 152.682 51.3584 154.528 52.951C 156.77 54.9004 156.985 58.2848 159.15 56.9902C 160.722 56.0699 159.166 53.7502 156.725 51.0097C 153.199 47.0276 148.548 46.9759 147.898 48.1558z"/>
+        <path style="stroke:none; fill:#333333" d="M 148.386 48.3525C 147.714 49.645 152.734 51.343 154.553 52.9045C 156.732 54.7905 156.947 57.999 158.985 56.7845C 160.491 55.906 158.947 53.6485 156.674 51.0915C 153.405 47.387 149.037 47.2415 148.386 48.3525z"/>
+        <path style="stroke:none; fill:#383838" d="M 148.875 48.5492C 148.207 49.7549 152.786 51.3275 154.578 52.858C 156.694 54.6806 156.909 57.7131 158.82 56.5788C 160.26 55.742 158.727 53.5468 156.623 51.1733C 153.61 47.7463 149.525 47.5071 148.875 48.5492z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 149.363 48.7459C 148.701 49.8649 152.838 51.3121 154.603 52.8115C 156.656 54.5707 156.871 57.4273 158.655 56.3731C 160.03 55.5781 158.508 53.4451 156.573 51.2551C 153.816 48.1057 150.014 47.7727 149.363 48.7459z"/>
+        <path style="stroke:none; fill:#424242" d="M 149.851 48.9426C 149.194 49.9748 152.89 51.2966 154.628 52.765C 156.618 54.4608 156.833 57.1414 158.489 56.1674C 159.799 55.4141 158.288 53.3434 156.522 51.3369C 154.021 48.465 150.503 48.0383 149.851 48.9426z"/>
+        <path style="stroke:none; fill:#474747" d="M 150.34 49.1393C 149.687 50.0848 152.942 51.2812 154.653 52.7185C 156.58 54.3509 156.796 56.8556 158.324 55.9617C 159.568 55.2502 158.068 53.2417 156.471 51.4187C 154.226 48.8244 150.991 48.3039 150.34 49.1393z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 150.828 49.336C 150.18 50.1947 152.994 51.2657 154.678 52.672C 156.542 54.241 156.758 56.5697 158.159 55.756C 159.338 55.0862 157.849 53.14 156.42 51.5005C 154.432 49.1837 151.48 48.5695 150.828 49.336z"/>
+        <path style="stroke:none; fill:#515151" d="M 151.317 49.5327C 150.673 50.3047 153.046 51.2503 154.703 52.6255C 156.505 54.1311 156.72 56.2839 157.993 55.5503C 159.107 54.9223 157.629 53.0383 156.369 51.5823C 154.637 49.5431 151.969 48.8351 151.317 49.5327z"/>
+        <path style="stroke:none; fill:#565656" d="M 151.805 49.7294C 151.167 50.4146 153.098 51.2348 154.728 52.579C 156.467 54.0212 156.682 55.998 157.828 55.3446C 158.876 54.7583 157.41 52.9366 156.319 51.6641C 154.843 49.9024 152.457 49.1007 151.805 49.7294z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 152.293 49.9261C 151.66 50.5246 153.15 51.2194 154.753 52.5325C 156.429 53.9113 156.644 55.7122 157.663 55.1389C 158.646 54.5944 157.19 52.8349 156.268 51.7459C 155.048 50.2618 152.946 49.3663 152.293 49.9261z"/>
+        <path style="stroke:none; fill:#606060" d="M 152.782 50.1228C 152.153 50.6345 153.202 51.2039 154.778 52.486C 156.391 53.8014 156.606 55.4263 157.497 54.9332C 158.415 54.4304 156.971 52.7332 156.217 51.8277C 155.254 50.6211 153.435 49.6319 152.782 50.1228z"/>
+      </g>
+      <path style="stroke:none; fill:#666666" d="M 153.27 50.3195C 152.646 50.7445 153.254 51.1885 154.803 52.4395C 156.353 53.6915 156.568 55.1405 157.332 54.7275C 158.184 54.2665 156.751 52.6315 156.166 51.9095C 155.459 50.9805 153.923 49.8975 153.27 50.3195z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 193.47 45.5935C 193.398 46.6735 196.422 47.3215 198.366 48.0415C 200.31 48.6895 204.126 51.2815 205.926 53.2975C 207.726 55.2415 211.614 61.0015 212.478 59.4895C 213.342 58.1215 210.462 54.1615 209.67 52.5055C 208.878 50.8495 206.43 47.2495 202.542 46.0255C 199.158 45.0175 193.542 44.7295 193.47 45.5935z"/>
+      <g>
+        <path style="stroke:none; fill:#060606" d="M 193.779 45.6702C 193.708 46.7204 196.648 47.3548 198.537 48.0577C 200.427 48.6906 204.135 51.2183 205.882 53.1798C 207.629 55.0728 211.417 60.6728 212.258 59.2067C 213.097 57.8788 210.322 54.033 209.519 52.4111C 208.719 50.7894 206.344 47.3207 202.567 46.1105C 199.286 45.1146 193.85 44.83 193.779 45.6702z"/>
+        <path style="stroke:none; fill:#0c0c0c" d="M 194.088 45.7469C 194.017 46.7674 196.873 47.3882 198.708 48.074C 200.544 48.6918 204.143 51.1552 205.839 53.0622C 207.531 54.9042 211.22 60.3442 212.037 58.9239C 212.851 57.6363 210.181 53.9046 209.367 52.3168C 208.559 50.7293 206.257 47.392 202.591 46.1955C 199.413 45.2118 194.158 44.9305 194.088 45.7469z"/>
+        <path style="stroke:none; fill:#131313" d="M 194.397 45.8236C 194.326 46.8143 197.099 47.4215 198.879 48.0902C 200.661 48.6929 204.151 51.092 205.795 52.9445C 207.434 54.7355 211.023 60.0155 211.817 58.6411C 212.605 57.3936 210.041 53.7761 209.215 52.2224C 208.399 50.6692 206.171 47.4632 202.616 46.2805C 199.541 45.3089 194.466 45.031 194.397 45.8236z"/>
+        <path style="stroke:none; fill:#191919" d="M 194.706 45.9003C 194.636 46.8613 197.324 47.4549 199.051 48.1065C 200.778 48.6941 204.16 51.0289 205.751 52.8269C 207.337 54.5669 210.826 59.6869 211.596 58.3583C 212.36 57.1511 209.9 53.6477 209.064 52.1281C 208.24 50.6091 206.085 47.5345 202.64 46.3655C 199.669 45.4061 194.775 45.1315 194.706 45.9003z"/>
+        <path style="stroke:none; fill:#1f1f1f" d="M 195.015 45.977C 194.945 46.9082 197.55 47.4882 199.222 48.1227C 200.894 48.6952 204.168 50.9657 205.708 52.7092C 207.239 54.3982 210.629 59.3582 211.376 58.0755C 212.114 56.9084 209.76 53.5192 208.912 52.0337C 208.08 50.549 205.998 47.6057 202.665 46.4505C 199.796 45.5032 195.083 45.232 195.015 45.977z"/>
+        <path style="stroke:none; fill:#262626" d="M 195.324 46.0537C 195.255 46.9552 197.775 47.5216 199.393 48.139C 201.011 48.6964 204.177 50.9026 205.664 52.5916C 207.142 54.2296 210.432 59.0296 211.155 57.7927C 211.869 56.6659 209.619 53.3908 208.76 51.9394C 207.921 50.4889 205.912 47.677 202.689 46.5355C 199.924 45.6004 195.391 45.3325 195.324 46.0537z"/>
+        <path style="stroke:none; fill:#2c2c2c" d="M 195.632 46.1304C 195.564 47.0021 198.001 47.5549 199.564 48.1552C 201.128 48.6975 204.185 50.8394 205.62 52.4739C 207.044 54.0609 210.235 58.7009 210.935 57.5099C 211.623 56.4233 209.479 53.2623 208.609 51.845C 207.761 50.4288 205.826 47.7482 202.714 46.6205C 200.052 45.6975 195.699 45.433 195.632 46.1304z"/>
+        <path style="stroke:none; fill:#333333" d="M 195.941 46.2071C 195.873 47.0491 198.226 47.5883 199.735 48.1715C 201.245 48.6987 204.193 50.7763 205.577 52.3563C 206.947 53.8923 210.038 58.3723 210.715 57.2271C 211.377 56.1807 209.338 53.1339 208.457 51.7507C 207.601 50.3687 205.739 47.8195 202.739 46.7055C 200.179 45.7947 196.007 45.5335 195.941 46.2071z"/>
+        <path style="stroke:none; fill:#393939" d="M 196.25 46.2838C 196.183 47.096 198.452 47.6216 199.906 48.1877C 201.362 48.6998 204.202 50.7131 205.533 52.2386C 206.85 53.7236 209.841 58.0436 210.494 56.9443C 211.132 55.9381 209.198 53.0054 208.305 51.6563C 207.442 50.3086 205.653 47.8907 202.763 46.7905C 200.307 45.8918 196.315 45.634 196.25 46.2838z"/>
+        <path style="stroke:none; fill:#3f3f3f" d="M 196.559 46.3605C 196.492 47.143 198.677 47.655 200.077 48.204C 201.479 48.701 204.21 50.65 205.489 52.121C 206.752 53.555 209.644 57.715 210.274 56.6615C 210.886 55.6955 209.057 52.877 208.154 51.562C 207.282 50.2485 205.567 47.962 202.788 46.8755C 200.435 45.989 196.623 45.7345 196.559 46.3605z"/>
+        <path style="stroke:none; fill:#464646" d="M 196.868 46.4372C 196.802 47.1899 198.903 47.6883 200.248 48.2202C 201.596 48.7021 204.219 50.5868 205.445 52.0033C 206.655 53.3863 209.447 57.3863 210.053 56.3787C 210.641 55.4529 208.917 52.7485 208.002 51.4676C 207.123 50.1884 205.48 48.0332 202.812 46.9605C 200.562 46.0861 196.931 45.835 196.868 46.4372z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 197.177 46.5139C 197.111 47.2369 199.128 47.7217 200.419 48.2365C 201.712 48.7033 204.227 50.5237 205.402 51.8857C 206.557 53.2177 209.25 57.0577 209.833 56.0959C 210.395 55.2103 208.776 52.6201 207.85 51.3733C 206.963 50.1283 205.394 48.1045 202.837 47.0455C 200.69 46.1833 197.239 45.9355 197.177 46.5139z"/>
+        <path style="stroke:none; fill:#525252" d="M 197.486 46.5906C 197.42 47.2838 199.354 47.755 200.59 48.2527C 201.829 48.7044 204.235 50.4605 205.358 51.768C 206.46 53.049 209.053 56.729 209.612 55.8131C 210.149 54.9677 208.636 52.4916 207.699 51.2789C 206.803 50.0682 205.308 48.1757 202.861 47.1305C 200.818 46.2804 197.547 46.036 197.486 46.5906z"/>
+        <path style="stroke:none; fill:#595959" d="M 197.795 46.6673C 197.73 47.3308 199.579 47.7884 200.762 48.269C 201.946 48.7056 204.244 50.3974 205.314 51.6504C 206.363 52.8804 208.856 56.4004 209.392 55.5303C 209.904 54.7251 208.495 52.3632 207.547 51.1846C 206.644 50.0081 205.221 48.247 202.886 47.2155C 200.945 46.3776 197.856 46.1365 197.795 46.6673z"/>
+        <path style="stroke:none; fill:#5f5f5f" d="M 198.104 46.744C 198.039 47.3777 199.805 47.8217 200.933 48.2852C 202.063 48.7067 204.252 50.3342 205.271 51.5327C 206.265 52.7117 208.659 56.0717 209.171 55.2475C 209.658 54.4825 208.355 52.2347 207.395 51.0902C 206.484 49.948 205.135 48.3182 202.91 47.3005C 201.073 46.4747 198.164 46.237 198.104 46.744z"/>
+        <path style="stroke:none; fill:#666666" d="M 198.413 46.8207C 198.349 47.4247 200.03 47.8551 201.104 48.3015C 202.18 48.7079 204.261 50.2711 205.227 51.4151C 206.168 52.5431 208.462 55.7431 208.951 54.9647C 209.413 54.2399 208.214 52.1063 207.244 50.9959C 206.325 49.8879 205.049 48.3895 202.935 47.3855C 201.201 46.5719 198.472 46.3375 198.413 46.8207z"/>
+        <path style="stroke:none; fill:#6c6c6c" d="M 198.721 46.8974C 198.658 47.4716 200.256 47.8884 201.275 48.3177C 202.297 48.709 204.269 50.2079 205.183 51.2974C 206.07 52.3744 208.265 55.4144 208.731 54.6819C 209.167 53.9973 208.074 51.9778 207.092 50.9015C 206.165 49.8278 204.962 48.4607 202.96 47.4705C 201.328 46.669 198.78 46.438 198.721 46.8974z"/>
+        <path style="stroke:none; fill:#727272" d="M 199.03 46.9741C 198.967 47.5186 200.481 47.9218 201.446 48.334C 202.413 48.7102 204.277 50.1448 205.14 51.1798C 205.973 52.2058 208.068 55.0858 208.51 54.3991C 208.921 53.7547 207.933 51.8494 206.94 50.8072C 206.005 49.7677 204.876 48.532 202.984 47.5555C 201.456 46.7662 199.088 46.5385 199.03 46.9741z"/>
+        <path style="stroke:none; fill:#797979" d="M 199.339 47.0508C 199.277 47.5656 200.707 47.9551 201.617 48.3503C 202.53 48.7113 204.286 50.0816 205.096 51.0621C 205.876 52.0371 207.871 54.7571 208.29 54.1163C 208.676 53.5121 207.793 51.7209 206.789 50.7128C 205.846 49.7076 204.79 48.6032 203.009 47.6405C 201.584 46.8633 199.396 46.639 199.339 47.0508z"/>
+      </g>
+      <path style="stroke:none; fill:#7f7f7f" d="M 199.648 47.1275C 199.586 47.6125 200.932 47.9885 201.788 48.3665C 202.647 48.7125 204.294 50.0185 205.052 50.9445C 205.778 51.8685 207.674 54.4285 208.069 53.8335C 208.43 53.2695 207.652 51.5925 206.637 50.6185C 205.686 49.6475 204.703 48.6745 203.033 47.7255C 201.711 46.9605 199.704 46.7395 199.648 47.1275z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#995900" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 309.03 331.649 297.942 339.209C 283.974 348.785 279.15 353.033 274.614 357.569C 267.558 364.625 260.862 367.001 250.134 367.001C 239.406 367.001 234.582 364.769 231.27 361.817C 227.958 358.937 224.286 351.593 224.6 [...]
+      <g>
+        <path style="stroke:none; fill:#9e5e00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.926 331.613 297.787 339.065C 283.902 348.436 278.884 352.605 274.265 356.968C 267.353 363.707 260.851 366.051 250.35 365.986C 239.939 365.939 235.234 363.805 231.936 360.867C 228.639 358.001 225.006 350.902 2 [...]
+        <path style="stroke:none; fill:#a36400" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.821 331.577 297.633 338.921C 283.83 348.087 278.617 352.177 273.916 356.367C 267.148 362.789 260.841 365.101 250.566 364.971C 240.472 364.877 235.885 362.84 232.602 359.917C 229.319 357.065 225.726 350.211 22 [...]
+        <path style="stroke:none; fill:#a86a00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.717 331.541 297.478 338.777C 283.758 347.738 278.351 351.748 273.567 355.766C 266.943 361.871 260.83 364.15 250.782 363.956C 241.005 363.815 236.537 361.875 233.268 358.966C 229.999 356.129 226.446 349.52 226 [...]
+        <path style="stroke:none; fill:#ad7000" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.613 331.505 297.323 338.633C 283.686 347.389 278.085 351.32 273.217 355.165C 266.737 360.953 260.819 363.2 250.998 362.941C 241.537 362.753 237.189 360.91 233.934 358.016C 230.68 355.193 227.166 348.829 227.3 [...]
+        <path style="stroke:none; fill:#b27500" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.508 331.469 297.168 338.489C 283.614 347.039 277.818 350.891 272.868 354.563C 266.532 360.035 260.808 362.249 251.214 361.925C 242.07 361.691 237.84 359.945 234.6 357.065C 231.36 354.257 227.886 348.137 228.0 [...]
+        <path style="stroke:none; fill:#b77b00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.404 331.433 297.013 338.345C 283.542 346.69 277.552 350.463 272.519 353.962C 266.327 359.117 260.797 361.299 251.43 360.91C 242.603 360.629 238.492 358.981 235.266 356.115C 232.041 353.321 228.606 347.446 228 [...]
+        <path style="stroke:none; fill:#bc8100" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.299 331.397 296.859 338.201C 283.47 346.341 277.285 350.035 272.17 353.361C 266.122 358.199 260.787 360.349 251.646 359.895C 243.136 359.567 239.143 358.016 235.932 355.165C 232.721 352.385 229.326 346.755 22 [...]
+        <path style="stroke:none; fill:#c18700" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.195 331.361 296.704 338.057C 283.398 345.992 277.019 349.606 271.821 352.76C 265.917 357.281 260.776 359.398 251.862 358.88C 243.669 358.505 239.795 357.051 236.598 354.214C 233.401 351.449 230.046 346.064 23 [...]
+        <path style="stroke:none; fill:#c68c00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 308.091 331.325 296.549 337.913C 283.326 345.643 276.753 349.178 271.471 352.159C 265.711 356.363 260.765 358.448 252.078 357.865C 244.201 357.443 240.447 356.086 237.264 353.264C 234.082 350.513 230.766 345.373  [...]
+        <path style="stroke:none; fill:#cc9200" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.986 331.289 296.394 337.769C 283.254 345.293 276.486 348.749 271.122 351.557C 265.506 355.445 260.754 357.497 252.294 356.849C 244.734 356.381 241.098 355.121 237.93 352.313C 234.762 349.577 231.486 344.681 2 [...]
+        <path style="stroke:none; fill:#d19800" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.882 331.253 296.239 337.625C 283.182 344.944 276.22 348.321 270.773 350.956C 265.301 354.527 260.743 356.547 252.51 355.834C 245.267 355.319 241.75 354.157 238.596 351.363C 235.443 348.641 232.206 343.99 232. [...]
+        <path style="stroke:none; fill:#d69e00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.777 331.217 296.085 337.481C 283.11 344.595 275.953 347.893 270.424 350.355C 265.096 353.609 260.733 355.597 252.726 354.819C 245.8 354.257 242.401 353.192 239.262 350.413C 236.123 347.705 232.926 343.299 232 [...]
+        <path style="stroke:none; fill:#dba300" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.673 331.181 295.93 337.337C 283.038 344.246 275.687 347.464 270.075 349.754C 264.891 352.691 260.722 354.646 252.942 353.804C 246.333 353.195 243.053 352.227 239.928 349.462C 236.803 346.769 233.646 342.608 2 [...]
+        <path style="stroke:none; fill:#e0a900" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.569 331.145 295.775 337.193C 282.966 343.897 275.421 347.036 269.725 349.153C 264.685 351.773 260.711 353.696 253.158 352.789C 246.865 352.133 243.705 351.262 240.594 348.512C 237.484 345.833 234.366 341.917  [...]
+        <path style="stroke:none; fill:#e5af00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.464 331.109 295.62 337.049C 282.894 343.547 275.154 346.607 269.376 348.551C 264.48 350.855 260.7 352.745 253.374 351.773C 247.398 351.071 244.356 350.297 241.26 347.561C 238.164 344.897 235.086 341.225 234.7 [...]
+        <path style="stroke:none; fill:#eab500" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.36 331.073 295.465 336.905C 282.822 343.198 274.888 346.179 269.027 347.95C 264.275 349.937 260.689 351.795 253.59 350.758C 247.931 350.009 245.008 349.333 241.926 346.611C 238.845 343.961 235.806 340.534 235 [...]
+        <path style="stroke:none; fill:#efba00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.255 331.037 295.311 336.761C 282.75 342.849 274.621 345.751 268.678 347.349C 264.07 349.019 260.679 350.845 253.806 349.743C 248.464 348.947 245.659 348.368 242.592 345.661C 239.525 343.025 236.526 339.843 23 [...]
+        <path style="stroke:none; fill:#f4c000" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.151 331.001 295.156 336.617C 282.678 342.5 274.355 345.322 268.329 346.748C 263.865 348.101 260.668 349.894 254.022 348.728C 248.997 347.885 246.311 347.403 243.258 344.71C 240.205 342.089 237.246 339.152 236 [...]
+        <path style="stroke:none; fill:#f9c600" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 307.047 330.965 295.001 336.473C 282.606 342.151 274.089 344.894 267.979 346.147C 263.659 347.183 260.657 348.944 254.238 347.713C 249.529 346.823 246.963 346.438 243.924 343.76C 240.886 341.153 237.966 338.461 2 [...]
+      </g>
+      <path style="stroke:none; fill:#ffcc00" d="M 303.63 262.529C 308.094 269.009 303.486 277.433 306.726 282.617C 312.054 291.113 322.782 299.681 326.886 302.057C 329.838 303.857 334.014 305.585 333.87 310.841C 333.654 316.817 330.702 318.401 329.046 320.057C 325.734 323.369 306.942 330.929 294.846 336.329C 282.534 341.801 273.822 344.465 267.63 345.545C 263.454 346.265 260.646 347.993 254.454 346.697C 250.062 345.761 247.614 345.473 244.59 342.809C 241.566 340.217 238.686 337.769 238. [...]
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 236.263 275.762C 235.554 275.505 232.332 260.554 234.072 259.523C 237.423 257.526 238.325 257.203 242.449 257.203C 246.573 257.203 248.506 257.526 249.795 258.814C 251.921 260.941 248.635 265.516 247.346 266.805C 243.609 270.478 236.972 276.02 236.263 275.762z"/>
+      <g>
+        <path style="stroke:none; fill:#ffcc02" d="M 236.492 275.285C 235.722 274.96 232.39 260.567 234.124 259.543C 237.468 257.552 238.402 257.332 242.446 257.332C 246.57 257.332 248.422 257.601 249.728 258.934C 251.834 261.07 248.609 265.507 247.33 266.786C 243.603 270.449 237.249 275.598 236.492 275.285z"/>
+        <path style="stroke:none; fill:#ffcc05" d="M 236.721 274.809C 235.889 274.416 232.448 260.58 234.175 259.562C 237.513 257.578 238.48 257.461 242.443 257.461C 246.567 257.461 248.339 257.675 249.66 259.053C 251.747 261.199 248.584 265.497 247.314 266.767C 243.596 270.42 237.526 275.176 236.721 274.809z"/>
+        <path style="stroke:none; fill:#ffcc07" d="M 236.949 274.332C 236.057 273.871 232.506 260.593 234.227 259.582C 237.558 257.604 238.557 257.59 242.44 257.59C 246.564 257.59 248.255 257.749 249.592 259.172C 251.66 261.328 248.558 265.488 247.298 266.747C 243.59 270.391 237.803 274.754 236.949 274.332z"/>
+        <path style="stroke:none; fill:#ffcd0a" d="M 237.178 273.855C 236.224 273.327 232.564 260.606 234.278 259.601C 237.604 257.629 238.634 257.719 242.436 257.719C 246.56 257.719 248.171 257.823 249.525 259.291C 251.573 261.457 248.532 265.478 247.282 266.728C 243.583 270.362 238.08 274.332 237.178 273.855z"/>
+        <path style="stroke:none; fill:#ffcd0c" d="M 237.407 273.378C 236.392 272.782 232.622 260.619 234.33 259.62C 237.649 257.655 238.712 257.848 242.433 257.848C 246.557 257.848 248.087 257.897 249.457 259.411C 251.486 261.586 248.506 265.468 247.266 266.709C 243.577 270.333 238.357 273.91 237.407 273.378z"/>
+        <path style="stroke:none; fill:#ffcd0f" d="M 237.636 272.901C 236.559 272.238 232.68 260.632 234.381 259.64C 237.694 257.681 238.789 257.977 242.43 257.977C 246.554 257.977 248.004 257.971 249.389 259.53C 251.399 261.715 248.481 265.459 247.25 266.689C 243.57 270.304 238.634 273.488 237.636 272.901z"/>
+        <path style="stroke:none; fill:#ffcd11" d="M 237.864 272.424C 236.727 271.693 232.738 260.645 234.433 259.659C 237.739 257.707 238.866 258.106 242.427 258.106C 246.551 258.106 247.92 258.045 249.322 259.649C 251.313 261.843 248.455 265.449 247.233 266.67C 243.564 270.275 238.912 273.066 237.864 272.424z"/>
+        <path style="stroke:none; fill:#ffce14" d="M 238.093 271.948C 236.895 271.149 232.796 260.658 234.485 259.678C 237.784 257.732 238.944 258.235 242.424 258.235C 246.548 258.235 247.836 258.119 249.254 259.768C 251.226 261.972 248.429 265.439 247.217 266.651C 243.558 270.246 239.189 272.644 238.093 271.948z"/>
+        <path style="stroke:none; fill:#ffce16" d="M 238.322 271.471C 237.062 270.604 232.854 260.671 234.536 259.698C 237.829 257.758 239.021 258.364 242.42 258.364C 246.544 258.364 247.752 258.193 249.186 259.888C 251.139 262.101 248.403 265.43 247.201 266.631C 243.551 270.217 239.466 272.222 238.322 271.471z"/>
+        <path style="stroke:none; fill:#ffce19" d="M 238.551 270.994C 237.23 270.06 232.912 260.683 234.588 259.717C 237.874 257.784 239.098 258.492 242.417 258.492C 246.541 258.492 247.669 258.267 249.119 260.007C 251.052 262.23 248.378 265.42 247.185 266.612C 243.545 270.188 239.743 271.799 238.551 270.994z"/>
+        <path style="stroke:none; fill:#ffce1c" d="M 238.779 270.517C 237.397 269.515 232.97 260.696 234.639 259.736C 237.919 257.81 239.175 258.621 242.414 258.621C 246.538 258.621 247.585 258.342 249.051 260.126C 250.965 262.359 248.352 265.41 247.169 266.593C 243.538 270.159 240.02 271.377 238.779 270.517z"/>
+        <path style="stroke:none; fill:#ffcf1e" d="M 239.008 270.04C 237.565 268.971 233.028 260.709 234.691 259.756C 237.964 257.835 239.253 258.75 242.411 258.75C 246.535 258.75 247.501 258.416 248.983 260.245C 250.878 262.488 248.326 265.401 247.153 266.573C 243.532 270.13 240.297 270.955 239.008 270.04z"/>
+        <path style="stroke:none; fill:#ffcf21" d="M 239.237 269.563C 237.732 268.426 233.086 260.722 234.742 259.775C 238.009 257.861 239.33 258.879 242.408 258.879C 246.532 258.879 247.417 258.49 248.916 260.365C 250.791 262.617 248.3 265.391 247.137 266.554C 243.525 270.101 240.574 270.533 239.237 269.563z"/>
+        <path style="stroke:none; fill:#ffcf23" d="M 239.466 269.087C 237.9 267.882 233.144 260.735 234.794 259.794C 238.055 257.887 239.407 259.008 242.404 259.008C 246.528 259.008 247.334 258.564 248.848 260.484C 250.704 262.745 248.275 265.381 247.121 266.535C 243.519 270.072 240.851 270.111 239.466 269.087z"/>
+        <path style="stroke:none; fill:#ffcf26" d="M 239.694 268.61C 238.067 267.337 233.202 260.748 234.845 259.814C 238.1 257.913 239.485 259.137 242.401 259.137C 246.525 259.137 247.25 258.638 248.78 260.603C 250.617 262.874 248.249 265.372 247.105 266.515C 243.512 270.044 241.128 269.689 239.694 268.61z"/>
+        <path style="stroke:none; fill:#ffd028" d="M 239.923 268.133C 238.235 266.793 233.26 260.761 234.897 259.833C 238.145 257.938 239.562 259.266 242.398 259.266C 246.522 259.266 247.166 258.712 248.713 260.722C 250.53 263.003 248.223 265.362 247.089 266.496C 243.506 270.015 241.405 269.267 239.923 268.133z"/>
+        <path style="stroke:none; fill:#ffd02b" d="M 240.152 267.656C 238.403 266.248 233.318 260.774 234.949 259.852C 238.19 257.964 239.639 259.395 242.395 259.395C 246.519 259.395 247.082 258.786 248.645 260.842C 250.443 263.132 248.197 265.352 247.072 266.477C 243.5 269.986 241.682 268.845 240.152 267.656z"/>
+        <path style="stroke:none; fill:#ffd02d" d="M 240.381 267.179C 238.57 265.703 233.376 260.787 235 259.872C 238.235 257.99 239.717 259.524 242.392 259.524C 246.516 259.524 246.999 258.86 248.577 260.961C 250.356 263.261 248.172 265.343 247.056 266.457C 243.493 269.957 241.959 268.423 240.381 267.179z"/>
+        <path style="stroke:none; fill:#ffd030" d="M 240.609 266.702C 238.738 265.159 233.434 260.8 235.052 259.891C 238.28 258.016 239.794 259.653 242.388 259.653C 246.512 259.653 246.915 258.934 248.51 261.08C 250.269 263.39 248.146 265.333 247.04 266.438C 243.487 269.928 242.236 268.001 240.609 266.702z"/>
+      </g>
+      <path style="stroke:none; fill:#ffd133" d="M 240.838 266.225C 238.905 264.614 233.492 260.812 235.103 259.91C 238.325 258.041 239.871 259.781 242.385 259.781C 246.509 259.781 246.831 259.008 248.442 261.199C 250.182 263.518 248.12 265.323 247.024 266.418C 243.48 269.899 242.513 267.579 240.838 266.225z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 302.769 263.374C 306.511 268.834 302.708 276.134 305.407 280.49C 298.598 274.233 295.469 271.656 286.083 280.858C 288.66 277.116 289.212 274.601 290.807 271.043C 291.911 268.589 295.162 261.473 295.837 261.473C 296.45 261.473 300.561 260.123 302.769 263.374z"/>
+      <g>
+        <path style="stroke:none; fill:#ffcc02" d="M 302.73 263.412C 306.385 268.747 302.765 276.013 305.308 280.135C 298.64 274.038 295.579 271.469 286.4 280.458C 288.821 276.93 289.426 274.363 291.006 270.865C 292.128 268.404 295.249 261.564 295.957 261.555C 296.584 261.548 300.573 260.237 302.73 263.412z"/>
+        <path style="stroke:none; fill:#ffcc05" d="M 302.691 263.449C 306.259 268.659 302.823 275.891 305.208 279.781C 298.681 273.844 295.689 271.282 286.716 280.059C 288.983 276.744 289.639 274.125 291.204 270.687C 292.344 268.219 295.336 261.655 296.077 261.636C 296.718 261.622 300.584 260.351 302.691 263.449z"/>
+        <path style="stroke:none; fill:#ffcc07" d="M 302.652 263.487C 306.132 268.572 302.88 275.769 305.109 279.426C 298.723 273.649 295.799 271.095 287.033 279.659C 289.144 276.559 289.852 273.887 291.402 270.509C 292.56 268.034 295.423 261.746 296.197 261.717C 296.852 261.697 300.596 260.464 302.652 263.487z"/>
+        <path style="stroke:none; fill:#ffcd0a" d="M 302.614 263.524C 306.006 268.484 302.937 275.647 305.01 279.072C 298.765 273.455 295.909 270.908 287.35 279.26C 289.305 276.373 290.066 273.649 291.601 270.331C 292.777 267.849 295.511 261.837 296.317 261.798C 296.987 261.771 300.608 260.578 302.614 263.524z"/>
+        <path style="stroke:none; fill:#ffcd0c" d="M 302.575 263.562C 305.88 268.397 302.994 275.526 304.91 278.717C 298.806 273.26 296.019 270.721 287.666 278.86C 289.466 276.187 290.279 273.411 291.799 270.153C 292.993 267.664 295.598 261.928 296.436 261.879C 297.121 261.845 300.619 260.691 302.575 263.562z"/>
+        <path style="stroke:none; fill:#ffcd0f" d="M 302.536 263.599C 305.754 268.309 303.052 275.404 304.811 278.363C 298.848 273.065 296.129 270.534 287.983 278.461C 289.627 276.001 290.493 273.173 291.998 269.975C 293.21 267.479 295.685 262.019 296.556 261.96C 297.255 261.92 300.631 260.805 302.536 263.599z"/>
+        <path style="stroke:none; fill:#ffcd11" d="M 302.497 263.637C 305.627 268.222 303.109 275.282 304.712 278.009C 298.89 272.871 296.239 270.347 288.3 278.061C 289.789 275.816 290.706 272.936 292.196 269.797C 293.426 267.294 295.772 262.11 296.676 262.041C 297.389 261.994 300.643 260.919 302.497 263.637z"/>
+        <path style="stroke:none; fill:#ffce14" d="M 302.458 263.674C 305.501 268.134 303.166 275.161 304.612 277.654C 298.931 272.676 296.349 270.16 288.616 277.662C 289.95 275.63 290.919 272.698 292.395 269.619C 293.642 267.109 295.859 262.201 296.796 262.122C 297.523 262.069 300.654 261.032 302.458 263.674z"/>
+        <path style="stroke:none; fill:#ffce16" d="M 302.419 263.712C 305.375 268.047 303.223 275.039 304.513 277.3C 298.973 272.482 296.459 269.973 288.933 277.263C 290.111 275.444 291.133 272.46 292.593 269.441C 293.859 266.924 295.946 262.292 296.916 262.203C 297.657 262.143 300.666 261.146 302.419 263.712z"/>
+        <path style="stroke:none; fill:#ffce19" d="M 302.38 263.749C 305.249 267.959 303.281 274.917 304.414 276.945C 299.015 272.287 296.569 269.786 289.25 276.863C 290.272 275.258 291.346 272.222 292.792 269.263C 294.075 266.739 296.033 262.383 297.036 262.284C 297.791 262.217 300.678 261.259 302.38 263.749z"/>
+        <path style="stroke:none; fill:#ffce1c" d="M 302.341 263.787C 305.122 267.871 303.338 274.795 304.314 276.591C 299.056 272.093 296.679 269.599 289.566 276.464C 290.433 275.073 291.56 271.984 292.99 269.085C 294.292 266.554 296.12 262.474 297.156 262.365C 297.925 262.292 300.689 261.373 302.341 263.787z"/>
+        <path style="stroke:none; fill:#ffcf1e" d="M 302.302 263.824C 304.996 267.784 303.395 274.674 304.215 276.236C 299.098 271.898 296.789 269.411 289.883 276.064C 290.595 274.887 291.773 271.746 293.189 268.907C 294.508 266.369 296.207 262.565 297.275 262.446C 298.059 262.366 300.701 261.487 302.302 263.824z"/>
+        <path style="stroke:none; fill:#ffcf21" d="M 302.263 263.862C 304.87 267.696 303.452 274.552 304.116 275.882C 299.14 271.704 296.899 269.224 290.2 275.665C 290.756 274.701 291.986 271.508 293.387 268.729C 294.724 266.184 296.294 262.656 297.395 262.527C 298.193 262.441 300.713 261.6 302.263 263.862z"/>
+        <path style="stroke:none; fill:#ffcf23" d="M 302.225 263.899C 304.744 267.609 303.51 274.43 304.016 275.527C 299.181 271.509 297.009 269.037 290.516 275.265C 290.917 274.515 292.2 271.271 293.585 268.551C 294.941 265.999 296.382 262.747 297.515 262.608C 298.328 262.515 300.724 261.714 302.225 263.899z"/>
+        <path style="stroke:none; fill:#ffcf26" d="M 302.186 263.937C 304.617 267.521 303.567 274.308 303.917 275.173C 299.223 271.315 297.119 268.85 290.833 274.866C 291.078 274.33 292.413 271.033 293.784 268.373C 295.157 265.814 296.469 262.838 297.635 262.689C 298.462 262.589 300.736 261.827 302.186 263.937z"/>
+        <path style="stroke:none; fill:#ffd028" d="M 302.147 263.974C 304.491 267.434 303.624 274.187 303.818 274.819C 299.265 271.12 297.229 268.663 291.15 274.466C 291.239 274.144 292.627 270.795 293.982 268.195C 295.374 265.629 296.556 262.929 297.755 262.77C 298.596 262.664 300.748 261.941 302.147 263.974z"/>
+        <path style="stroke:none; fill:#ffd02b" d="M 302.108 264.012C 304.365 267.346 303.681 274.065 303.718 274.464C 299.306 270.926 297.339 268.476 291.466 274.067C 291.401 273.958 292.84 270.557 294.181 268.017C 295.59 265.444 296.643 263.02 297.875 262.851C 298.73 262.738 300.759 262.055 302.108 264.012z"/>
+        <path style="stroke:none; fill:#ffd02d" d="M 302.069 264.049C 304.239 267.259 303.739 273.943 303.619 274.11C 299.348 270.731 297.449 268.289 291.783 273.668C 291.562 273.772 293.053 270.319 294.379 267.839C 295.806 265.259 296.73 263.111 297.994 262.932C 298.864 262.813 300.771 262.168 302.069 264.049z"/>
+        <path style="stroke:none; fill:#ffd030" d="M 302.03 264.087C 304.112 267.171 303.796 273.822 303.52 273.755C 299.389 270.536 297.559 268.102 292.1 273.268C 291.723 273.587 293.267 270.081 294.578 267.661C 296.023 265.074 296.817 263.202 298.114 263.013C 298.998 262.887 300.783 262.282 302.03 264.087z"/>
+      </g>
+      <path style="stroke:none; fill:#ffd133" d="M 301.991 264.124C 303.986 267.083 303.853 273.7 303.42 273.401C 299.431 270.342 297.669 267.915 292.416 272.869C 291.884 273.401 293.48 269.843 294.776 267.483C 296.239 264.889 296.904 263.293 298.234 263.094C 299.132 262.961 300.794 262.395 301.991 264.124z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 305.862 283.481C 311.838 291.329 322.926 299.753 326.886 302.057C 329.766 303.713 333.942 305.657 333.87 310.841C 333.726 316.745 330.702 318.401 329.046 320.057C 325.734 323.369 306.87 331.001 294.846 336.329C 282.606 341.729 273.75 344.537 267.63 345.545C 263.526 346.193 260.574 347.921 254.454 346.697C 250.134 345.833 247.542 345.401 244.59 342.809C 241.638 340.289 238.614 337.625 238.182 333.449C 236.958 323.081 241.854 316.529 246.6 [...]
+      <g>
+        <path style="stroke:none; fill:#ffcc02" d="M 305.81 283.554C 311.772 291.384 322.834 299.788 326.785 302.087C 329.658 303.739 333.824 305.678 333.753 310.85C 333.609 316.74 330.592 318.392 328.94 320.045C 325.636 323.349 306.6 331.038 294.7 336.134C 282.441 341.309 274.052 344.007 267.898 345.092C 263.821 345.776 260.742 347.486 254.64 346.269C 250.337 345.414 247.874 345.037 244.933 342.458C 241.994 339.948 239.177 337.496 238.749 333.34C 237.538 323 242.114 316.683 246.793 307. [...]
+        <path style="stroke:none; fill:#ffcc05" d="M 305.759 283.628C 311.706 291.439 322.742 299.823 326.684 302.116C 329.55 303.764 333.707 305.699 333.635 310.859C 333.492 316.735 330.482 318.384 328.834 320.032C 325.537 323.328 306.329 331.075 294.554 335.939C 282.275 340.888 274.353 343.477 268.166 344.638C 264.115 345.359 260.91 347.051 254.825 345.84C 250.539 344.994 248.206 344.673 245.275 342.107C 242.351 339.606 239.739 337.366 239.316 333.23C 238.118 322.918 242.374 316.836 24 [...]
+        <path style="stroke:none; fill:#ffcc07" d="M 305.707 283.701C 311.641 291.493 322.65 299.858 326.583 302.146C 329.442 303.79 333.589 305.72 333.517 310.868C 333.374 316.73 330.372 318.375 328.727 320.019C 325.439 323.308 306.059 331.112 294.408 335.744C 282.11 340.468 274.655 342.947 268.434 344.185C 264.41 344.941 261.077 346.616 255.011 345.411C 250.742 344.574 248.539 344.31 245.618 341.756C 242.707 339.264 240.301 337.237 239.883 333.121C 238.698 322.836 242.633 316.989 247.1 [...]
+        <path style="stroke:none; fill:#ffcd0a" d="M 305.655 283.774C 311.575 291.548 322.559 299.893 326.481 302.175C 329.334 303.816 333.471 305.741 333.4 310.877C 333.257 316.725 330.262 318.366 328.621 320.006C 325.34 323.287 305.789 331.149 294.262 335.549C 281.945 340.047 274.956 342.417 268.702 343.731C 264.705 344.524 261.245 346.181 255.196 344.982C 250.944 344.154 248.871 343.946 245.96 341.405C 243.063 338.923 240.864 337.107 240.45 333.012C 239.278 322.755 242.893 317.143 247 [...]
+        <path style="stroke:none; fill:#ffcd0c" d="M 305.603 283.847C 311.509 291.603 322.467 299.928 326.38 302.205C 329.226 303.841 333.353 305.762 333.282 310.886C 333.14 316.72 330.151 318.357 328.515 319.993C 325.242 323.266 305.518 331.186 294.116 335.354C 281.779 339.627 275.258 341.887 268.969 343.278C 264.999 344.107 261.413 345.746 255.382 344.554C 251.147 343.734 249.203 343.582 246.303 341.054C 243.42 338.581 241.426 336.978 241.016 332.902C 239.858 322.673 243.153 317.296 24 [...]
+        <path style="stroke:none; fill:#ffcd0f" d="M 305.551 283.92C 311.443 291.657 322.375 299.963 326.279 302.234C 329.118 303.867 333.236 305.783 333.165 310.894C 333.023 316.715 330.041 318.348 328.409 319.98C 325.143 323.246 305.248 331.223 293.97 335.159C 281.614 339.206 275.559 341.357 269.237 342.824C 265.294 343.69 261.581 345.311 255.567 344.125C 251.349 343.314 249.535 343.218 246.645 340.703C 243.776 338.239 241.989 336.848 241.583 332.793C 240.438 322.591 243.413 317.449 24 [...]
+        <path style="stroke:none; fill:#ffcd11" d="M 305.5 283.993C 311.377 291.712 322.283 299.997 326.178 302.264C 329.011 303.892 333.118 305.804 333.047 310.903C 332.905 316.71 329.931 318.339 328.302 319.968C 325.045 323.225 304.978 331.26 293.824 334.964C 281.449 338.786 275.861 340.827 269.505 342.371C 265.588 343.272 261.748 344.876 255.753 343.696C 251.552 342.894 249.867 342.854 246.988 340.352C 244.132 337.898 242.551 336.719 242.15 332.683C 241.018 322.51 243.672 317.602 247. [...]
+        <path style="stroke:none; fill:#ffce14" d="M 305.448 284.066C 311.311 291.767 322.191 300.032 326.077 302.293C 328.903 303.918 333 305.825 332.929 310.912C 332.788 316.705 329.821 318.33 328.196 319.955C 324.946 323.205 304.707 331.297 293.678 334.768C 281.283 338.365 276.162 340.297 269.773 341.917C 265.883 342.855 261.916 344.441 255.939 343.267C 251.755 342.474 250.199 342.49 247.33 340.001C 244.489 337.556 243.113 336.589 242.717 332.574C 241.598 322.428 243.932 317.756 248.1 [...]
+        <path style="stroke:none; fill:#ffce16" d="M 305.396 284.139C 311.246 291.821 322.099 300.067 325.975 302.322C 328.795 303.943 332.882 305.846 332.812 310.921C 332.671 316.7 329.711 318.321 328.09 319.942C 324.848 323.184 304.437 331.334 293.532 334.573C 281.118 337.945 276.464 339.767 270.041 341.464C 266.178 342.438 262.084 344.006 256.124 342.839C 251.957 342.055 250.532 342.126 247.673 339.65C 244.845 337.214 243.676 336.459 243.284 332.464C 242.178 322.346 244.192 317.909 24 [...]
+        <path style="stroke:none; fill:#ffce19" d="M 305.344 284.212C 311.18 291.876 322.007 300.102 325.874 302.352C 328.687 303.969 332.765 305.867 332.694 310.93C 332.554 316.695 329.601 318.312 327.984 319.929C 324.749 323.163 304.167 331.371 293.386 334.378C 280.953 337.524 276.765 339.237 270.309 341.01C 266.472 342.02 262.252 343.571 256.31 342.41C 252.16 341.635 250.864 341.762 248.015 339.299C 245.201 336.873 244.238 336.33 243.851 332.355C 242.758 322.265 244.452 318.062 248.47 [...]
+        <path style="stroke:none; fill:#ffce1c" d="M 305.292 284.285C 311.114 291.931 321.915 300.137 325.773 302.381C 328.579 303.995 332.647 305.888 332.577 310.939C 332.436 316.69 329.491 318.303 327.877 319.916C 324.651 323.143 303.896 331.408 293.24 334.183C 280.787 337.104 277.067 338.707 270.577 340.557C 266.767 341.603 262.419 343.136 256.495 341.981C 252.362 341.215 251.196 341.398 248.358 338.948C 245.557 336.531 244.801 336.2 244.418 332.245C 243.338 322.183 244.711 318.216 24 [...]
+        <path style="stroke:none; fill:#ffcf1e" d="M 305.241 284.358C 311.048 291.985 321.823 300.172 325.672 302.411C 328.471 304.02 332.529 305.909 332.459 310.947C 332.319 316.685 329.38 318.294 327.771 319.904C 324.552 323.122 303.626 331.445 293.094 333.988C 280.622 336.683 277.368 338.177 270.844 340.103C 267.061 341.186 262.587 342.701 256.681 341.552C 252.565 340.795 251.528 341.034 248.7 338.597C 245.914 336.189 245.363 336.071 244.984 332.136C 243.918 322.101 244.971 318.369 24 [...]
+        <path style="stroke:none; fill:#ffcf21" d="M 305.189 284.431C 310.982 292.04 321.731 300.207 325.571 302.44C 328.363 304.046 332.411 305.93 332.341 310.956C 332.202 316.68 329.27 318.285 327.665 319.891C 324.454 323.102 303.356 331.482 292.948 333.793C 280.457 336.263 277.67 337.647 271.112 339.65C 267.356 340.769 262.755 342.266 256.866 341.124C 252.767 340.375 251.86 340.67 249.043 338.246C 246.27 335.848 245.925 335.941 245.551 332.027C 244.498 322.02 245.231 318.522 249.035 3 [...]
+        <path style="stroke:none; fill:#ffcf23" d="M 305.137 284.504C 310.916 292.094 321.64 300.241 325.469 302.47C 328.255 304.071 332.294 305.951 332.224 310.965C 332.085 316.675 329.16 318.276 327.559 319.878C 324.355 323.081 303.085 331.519 292.801 333.598C 280.291 335.842 277.971 337.117 271.38 339.196C 267.651 340.351 262.923 341.83 257.052 340.695C 252.97 339.955 252.192 340.306 249.385 337.895C 246.626 335.506 246.488 335.812 246.118 331.917C 245.078 321.938 245.491 318.676 249. [...]
+        <path style="stroke:none; fill:#ffcf26" d="M 305.085 284.578C 310.85 292.149 321.548 300.276 325.368 302.499C 328.147 304.097 332.176 305.972 332.106 310.974C 331.967 316.67 329.05 318.267 327.452 319.865C 324.257 323.06 302.815 331.556 292.655 333.402C 280.126 335.422 278.273 336.587 271.648 338.743C 267.945 339.934 263.09 341.395 257.237 340.266C 253.172 339.535 252.524 339.942 249.728 337.544C 246.983 335.164 247.05 335.682 246.685 331.808C 245.658 321.856 245.75 318.829 249.4 [...]
+        <path style="stroke:none; fill:#ffd028" d="M 305.033 284.651C 310.785 292.204 321.456 300.311 325.267 302.529C 328.039 304.122 332.058 305.993 331.989 310.983C 331.85 316.665 328.94 318.258 327.346 319.852C 324.158 323.04 302.545 331.593 292.509 333.207C 279.961 335.001 278.574 336.057 271.916 338.289C 268.24 339.517 263.258 340.96 257.423 339.837C 253.375 339.115 252.857 339.578 250.07 337.193C 247.339 334.823 247.613 335.553 247.252 331.698C 246.238 321.775 246.01 318.982 249.5 [...]
+        <path style="stroke:none; fill:#ffd02b" d="M 304.982 284.724C 310.719 292.258 321.364 300.346 325.166 302.558C 327.931 304.148 331.94 306.014 331.871 310.991C 331.733 316.66 328.83 318.25 327.24 319.84C 324.06 323.019 302.274 331.63 292.363 333.012C 279.795 334.581 278.876 335.527 272.184 337.836C 268.534 339.099 263.426 340.525 257.609 339.409C 253.578 338.696 253.189 339.214 250.413 336.842C 247.695 334.481 248.175 335.423 247.819 331.589C 246.818 321.693 246.27 319.135 249.783 [...]
+        <path style="stroke:none; fill:#ffd02d" d="M 304.93 284.797C 310.653 292.313 321.272 300.381 325.065 302.587C 327.823 304.174 331.823 306.035 331.753 311C 331.616 316.655 328.719 318.241 327.134 319.827C 323.961 322.999 302.004 331.667 292.217 332.817C 279.63 334.16 279.177 334.996 272.451 337.382C 268.829 338.682 263.594 340.09 257.794 338.98C 253.78 338.276 253.521 338.85 250.755 336.491C 248.052 334.139 248.737 335.294 248.385 331.479C 247.398 321.611 246.53 319.289 249.969 31 [...]
+        <path style="stroke:none; fill:#ffd030" d="M 304.878 284.87C 310.587 292.368 321.18 300.416 324.963 302.617C 327.715 304.199 331.705 306.056 331.636 311.009C 331.498 316.65 328.609 318.232 327.027 319.814C 323.863 322.978 301.734 331.704 292.071 332.622C 279.465 333.74 279.479 334.466 272.719 336.929C 269.124 338.265 263.761 339.655 257.98 338.551C 253.983 337.856 253.853 338.486 251.098 336.14C 248.408 333.798 249.3 335.164 248.952 331.37C 247.978 321.53 246.789 319.442 250.156  [...]
+      </g>
+      <path style="stroke:none; fill:#ffd133" d="M 304.826 284.943C 310.521 292.422 321.088 300.451 324.862 302.646C 327.607 304.225 331.587 306.077 331.518 311.018C 331.381 316.645 328.499 318.223 326.921 319.801C 323.764 322.957 301.463 331.741 291.925 332.427C 279.299 333.319 279.78 333.936 272.987 336.475C 269.418 337.848 263.929 339.22 258.165 338.122C 254.185 337.436 254.185 338.122 251.44 335.789C 248.764 333.456 249.862 335.034 249.519 331.26C 248.558 321.448 247.049 319.595 250. [...]
+    </g>
+    <g>
+      <path style="stroke:none; fill:#995900" d="M 52.4941 273.617C 46.0141 278.297 29.5981 277.865 25.4221 283.337C 21.3181 288.809 25.5661 296.729 25.4941 311.417C 25.4941 317.681 24.4141 322.433 23.6941 326.249C 22.6861 331.073 22.0381 334.457 24.0541 337.913C 27.7261 344.033 33.6301 345.545 67.3981 352.601C 85.4701 356.345 102.534 366.065 113.982 367.001C 125.43 367.865 127.878 364.049 134.862 357.857C 141.774 351.665 144.006 353.609 143.79 340.001C 143.574 326.465 134.862 322.433 12 [...]
+      <g>
+        <path style="stroke:none; fill:#9e5e00" d="M 52.5985 273.905C 46.2013 278.607 30.1237 277.693 25.5373 283.417C 21.3829 288.831 25.7641 296.693 25.6345 311.371C 25.6093 317.602 24.4825 322.253 23.6977 326.249C 22.6609 331.12 22.0201 334.45 24.0469 337.867C 27.8341 344.03 33.7417 344.991 67.5025 352.036C 85.5637 355.773 102.044 365.342 113.845 366.148C 125.031 366.94 127.41 363.319 134.308 357.188C 141.205 350.992 143.333 352.911 143.167 339.782C 143.092 326.26 134.862 322.433 124. [...]
+        <path style="stroke:none; fill:#a36400" d="M 52.7029 274.193C 46.3885 278.917 30.6493 277.52 25.6525 283.496C 21.4477 288.853 25.9621 296.657 25.7749 311.324C 25.7245 317.523 24.5509 322.073 23.7013 326.249C 22.6357 331.167 22.0021 334.443 24.0397 337.82C 27.9421 344.026 33.8533 344.437 67.6069 351.471C 85.6573 355.201 101.555 364.618 113.708 365.295C 124.631 366.015 126.942 362.588 133.753 356.518C 140.637 350.319 142.66 352.213 142.545 339.562C 142.609 326.055 134.862 322.433 1 [...]
+        <path style="stroke:none; fill:#a86a00" d="M 52.8073 274.481C 46.5757 279.226 31.1749 277.347 25.7677 283.575C 21.5125 288.874 26.1601 296.621 25.9153 311.277C 25.8397 317.444 24.6193 321.893 23.7049 326.249C 22.6105 331.214 21.9841 334.436 24.0325 337.773C 28.0501 344.023 33.9649 343.882 67.7113 350.906C 85.7509 354.628 101.065 363.895 113.572 364.442C 124.231 365.09 126.474 361.857 133.199 355.849C 140.068 349.646 141.987 351.514 141.922 339.343C 142.127 325.85 134.862 322.433  [...]
+        <path style="stroke:none; fill:#ad7000" d="M 52.9117 274.769C 46.7629 279.536 31.7005 277.174 25.8829 283.654C 21.5773 288.896 26.3581 296.585 26.0557 311.23C 25.9549 317.365 24.6877 321.713 23.7085 326.249C 22.5853 331.261 21.9661 334.429 24.0253 337.726C 28.1581 344.019 34.0765 343.328 67.8157 350.341C 85.8445 354.056 100.576 363.171 113.435 363.589C 123.832 364.165 126.006 361.126 132.645 355.179C 139.499 348.973 141.313 350.816 141.299 339.123C 141.645 325.645 134.862 322.433 [...]
+        <path style="stroke:none; fill:#b27500" d="M 53.0161 275.057C 46.9501 279.845 32.2261 277.001 25.9981 283.733C 21.6421 288.917 26.5561 296.549 26.1961 311.183C 26.0701 317.285 24.7561 321.533 23.7121 326.249C 22.5601 331.307 21.9481 334.421 24.0181 337.679C 28.2661 344.015 34.1881 342.773 67.9201 349.775C 85.9381 353.483 100.086 362.447 113.298 362.735C 123.432 363.239 125.538 360.395 132.09 354.509C 138.93 348.299 140.64 350.117 140.676 338.903C 141.162 325.439 134.862 322.433 1 [...]
+        <path style="stroke:none; fill:#b77b00" d="M 53.1205 275.345C 47.1373 280.155 32.7517 276.829 26.1133 283.813C 21.7069 288.939 26.7541 296.513 26.3365 311.137C 26.1853 317.206 24.8245 321.353 23.7157 326.249C 22.5349 331.354 21.9301 334.414 24.0109 337.633C 28.3741 344.012 34.2997 342.219 68.0245 349.21C 86.0317 352.911 99.5965 361.724 113.161 361.882C 123.033 362.314 125.07 359.665 131.536 353.84C 138.361 347.626 139.967 349.419 140.053 338.684C 140.68 325.234 134.862 322.433 12 [...]
+        <path style="stroke:none; fill:#bc8100" d="M 53.2249 275.633C 47.3245 280.465 33.2773 276.656 26.2285 283.892C 21.7717 288.961 26.9521 296.477 26.4769 311.09C 26.3005 317.127 24.8929 321.173 23.7193 326.249C 22.5097 331.401 21.9121 334.407 24.0037 337.586C 28.4821 344.008 34.4113 341.665 68.1289 348.645C 86.1253 352.339 99.1069 361 113.024 361.029C 122.633 361.389 124.602 358.934 130.981 353.17C 137.793 346.953 139.294 348.721 139.431 338.464C 140.197 325.029 134.862 322.433 124. [...]
+        <path style="stroke:none; fill:#c18700" d="M 53.3293 275.921C 47.5117 280.774 33.8029 276.483 26.3437 283.971C 21.8365 288.982 27.1501 296.441 26.6173 311.043C 26.4157 317.048 24.9613 320.993 23.7229 326.249C 22.4845 331.448 21.8941 334.4 23.9965 337.539C 28.5901 344.005 34.5229 341.11 68.2333 348.08C 86.2189 351.766 98.6173 360.277 112.888 360.176C 122.233 360.464 124.134 358.203 130.427 352.501C 137.224 346.28 138.621 348.022 138.808 338.245C 139.715 324.824 134.862 322.433 124 [...]
+        <path style="stroke:none; fill:#c68c00" d="M 53.4337 276.209C 47.6989 281.084 34.3285 276.31 26.4589 284.05C 21.9013 289.004 27.3481 296.405 26.7577 310.996C 26.5309 316.969 25.0297 320.813 23.7265 326.249C 22.4593 331.495 21.8761 334.393 23.9893 337.492C 28.6981 344.001 34.6345 340.556 68.3377 347.515C 86.3125 351.194 98.1277 359.553 112.751 359.323C 121.834 359.539 123.666 357.472 129.873 351.831C 136.655 345.607 137.947 347.324 138.185 338.025C 139.233 324.619 134.862 322.433  [...]
+        <path style="stroke:none; fill:#cc9200" d="M 53.5381 276.497C 47.8861 281.393 34.8541 276.137 26.5741 284.129C 21.9661 289.025 27.5461 296.369 26.8981 310.949C 26.6461 316.889 25.0981 320.633 23.7301 326.249C 22.4341 331.541 21.8581 334.385 23.9821 337.445C 28.8061 343.997 34.7461 340.001 68.4421 346.949C 86.4061 350.621 97.6381 358.829 112.614 358.469C 121.434 358.613 123.198 356.741 129.318 351.161C 136.086 344.933 137.274 346.625 137.562 337.805C 138.75 324.413 134.862 322.433 [...]
+        <path style="stroke:none; fill:#d19800" d="M 53.6425 276.785C 48.0733 281.703 35.3797 275.965 26.6893 284.209C 22.0309 289.047 27.7441 296.333 27.0385 310.903C 26.7613 316.81 25.1665 320.453 23.7337 326.249C 22.4089 331.588 21.8401 334.378 23.9749 337.399C 28.9141 343.994 34.8577 339.447 68.5465 346.384C 86.4997 350.049 97.1485 358.106 112.477 357.616C 121.035 357.688 122.73 356.011 128.764 350.492C 135.517 344.26 136.601 345.927 136.939 337.586C 138.268 324.208 134.862 322.433 1 [...]
+        <path style="stroke:none; fill:#d69e00" d="M 53.7469 277.073C 48.2605 282.013 35.9053 275.792 26.8045 284.288C 22.0957 289.069 27.9421 296.297 27.1789 310.856C 26.8765 316.731 25.2349 320.273 23.7373 326.249C 22.3837 331.635 21.8221 334.371 23.9677 337.352C 29.0221 343.99 34.9693 338.893 68.6509 345.819C 86.5933 349.477 96.6589 357.382 112.34 356.763C 120.635 356.763 122.262 355.28 128.209 349.822C 134.949 343.587 135.928 345.229 136.317 337.366C 137.785 324.003 134.862 322.433 1 [...]
+        <path style="stroke:none; fill:#dba300" d="M 53.8513 277.361C 48.4477 282.322 36.4309 275.619 26.9197 284.367C 22.1605 289.09 28.1401 296.261 27.3193 310.809C 26.9917 316.652 25.3033 320.093 23.7409 326.249C 22.3585 331.682 21.8041 334.364 23.9605 337.305C 29.1301 343.987 35.0809 338.338 68.7553 345.254C 86.6869 348.904 96.1693 356.659 112.204 355.91C 120.235 355.838 121.794 354.549 127.655 349.153C 134.38 342.914 135.255 344.53 135.694 337.147C 137.303 323.798 134.862 322.433 12 [...]
+        <path style="stroke:none; fill:#e0a900" d="M 53.9557 277.649C 48.6349 282.632 36.9565 275.446 27.0349 284.446C 22.2253 289.112 28.3381 296.225 27.4597 310.762C 27.1069 316.573 25.3717 319.913 23.7445 326.249C 22.3333 331.729 21.7861 334.357 23.9533 337.258C 29.2381 343.983 35.1925 337.784 68.8597 344.689C 86.7805 348.332 95.6797 355.935 112.067 355.057C 119.836 354.913 121.326 353.818 127.101 348.483C 133.811 342.241 134.581 343.832 135.071 336.927C 136.821 323.593 134.862 322.43 [...]
+        <path style="stroke:none; fill:#e5af00" d="M 54.0601 277.937C 48.8221 282.941 37.4821 275.273 27.1501 284.525C 22.2901 289.133 28.5361 296.189 27.6001 310.715C 27.2221 316.493 25.4401 319.733 23.7481 326.249C 22.3081 331.775 21.7681 334.349 23.9461 337.211C 29.3461 343.979 35.3041 337.229 68.9641 344.123C 86.8741 347.759 95.1901 355.211 111.93 354.203C 119.436 353.987 120.858 353.087 126.546 347.813C 133.242 341.567 133.908 343.133 134.448 336.707C 136.338 323.387 134.862 322.433 [...]
+        <path style="stroke:none; fill:#eab500" d="M 54.1645 278.225C 49.0093 283.251 38.0077 275.101 27.2653 284.605C 22.3549 289.155 28.7341 296.153 27.7405 310.669C 27.3373 316.414 25.5085 319.553 23.7517 326.249C 22.2829 331.822 21.7501 334.342 23.9389 337.165C 29.4541 343.976 35.4157 336.675 69.0685 343.558C 86.9677 347.187 94.7005 354.488 111.793 353.35C 119.036 353.062 120.39 352.357 125.992 347.144C 132.673 340.894 133.235 342.435 133.825 336.488C 135.856 323.182 134.862 322.433  [...]
+        <path style="stroke:none; fill:#efba00" d="M 54.2689 278.513C 49.1965 283.561 38.5333 274.928 27.3805 284.684C 22.4197 289.177 28.9321 296.117 27.8809 310.622C 27.4525 316.335 25.5769 319.373 23.7553 326.249C 22.2577 331.869 21.7321 334.335 23.9317 337.118C 29.5621 343.972 35.5273 336.121 69.1729 342.993C 87.0613 346.615 94.2109 353.764 111.656 352.497C 118.637 352.137 119.922 351.626 125.437 346.474C 132.105 340.221 132.562 341.737 133.203 336.268C 135.373 322.977 134.862 322.43 [...]
+        <path style="stroke:none; fill:#f4c000" d="M 54.3733 278.801C 49.3837 283.87 39.0589 274.755 27.4957 284.763C 22.4845 289.198 29.1301 296.081 28.0213 310.575C 27.5677 316.256 25.6453 319.193 23.7589 326.249C 22.2325 331.916 21.7141 334.328 23.9245 337.071C 29.6701 343.969 35.6389 335.566 69.2773 342.428C 87.1549 346.042 93.7213 353.041 111.52 351.644C 118.237 351.212 119.454 350.895 124.883 345.805C 131.536 339.548 131.889 341.038 132.58 336.049C 134.891 322.772 134.862 322.433 1 [...]
+        <path style="stroke:none; fill:#f9c600" d="M 54.4777 279.089C 49.5709 284.18 39.5845 274.582 27.6109 284.842C 22.5493 289.22 29.3281 296.045 28.1617 310.528C 27.6829 316.177 25.7137 319.013 23.7625 326.249C 22.2073 331.963 21.6961 334.321 23.9173 337.024C 29.7781 343.965 35.7505 335.012 69.3817 341.863C 87.2485 345.47 93.2317 352.317 111.383 350.791C 117.838 350.287 118.986 350.164 124.329 345.135C 130.967 338.875 131.215 340.34 131.957 335.829C 134.409 322.567 134.862 322.433 12 [...]
+      </g>
+      <path style="stroke:none; fill:#ffcc00" d="M 54.5821 279.377C 49.7581 284.489 40.1101 274.409 27.7261 284.921C 22.6141 289.241 29.5261 296.009 28.3021 310.481C 27.7981 316.097 25.7821 318.833 23.7661 326.249C 22.1821 332.009 21.6781 334.313 23.9101 336.977C 29.8861 343.961 35.8621 334.457 69.4861 341.297C 87.3421 344.897 92.7421 351.593 111.246 349.937C 117.438 349.361 118.518 349.433 123.774 344.465C 130.398 338.201 130.542 339.641 131.334 335.609C 133.926 322.361 134.862 322.433  [...]
+    </g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 57.7008 285.003C 53.4225 289.541 39.421 283.642 32.8092 288.633C 28.0773 292.134 35.2076 296.542 34.2353 309.506C 33.8464 314.432 30.4108 315.34 31.8369 322.146C 32.939 327.267 34.1058 327.137 36.0503 329.471C 41.3656 335.694 40.1342 331.156 70.4057 337.249C 86.4166 340.491 91.3432 346.519 108.002 345.028C 113.577 344.51 114.614 344.574 119.281 340.102C 125.245 334.527 122.198 335.694 122.846 332.129C 125.115 320.266 123.3 318.192 114.41 [...]
+      <g>
+        <path style="stroke:none; fill:#ffcc02" d="M 57.9951 285.094C 53.5339 289.796 39.3903 283.898 32.9349 288.8C 28.2341 292.313 35.5132 296.849 34.5438 309.479C 34.1429 314.376 30.8106 315.356 32.0855 322.113C 33.0725 327.206 34.4436 327.051 36.4194 329.314C 42.1055 335.445 41.0927 331.14 70.5386 337.057C 86.457 340.268 91.3542 346.272 107.911 344.79C 113.452 344.277 114.389 344.327 119.066 339.941C 124.931 334.534 121.925 335.654 122.478 331.884C 124.545 320.096 122.921 317.902 114 [...]
+        <path style="stroke:none; fill:#ffcc05" d="M 58.2893 285.185C 53.6452 290.051 39.3596 284.154 33.0607 288.966C 28.3909 292.493 35.8187 297.157 34.8523 309.453C 34.4395 314.32 31.2104 315.371 32.3341 322.079C 33.206 327.145 34.7814 326.965 36.7884 329.157C 42.8454 335.197 42.0512 331.125 70.6716 336.866C 86.4973 340.045 91.3652 346.025 107.82 344.551C 113.328 344.045 114.165 344.08 118.85 339.781C 124.618 334.541 121.653 335.614 122.11 331.64C 123.975 319.925 122.542 317.613 114.1 [...]
+        <path style="stroke:none; fill:#ffcc07" d="M 58.5836 285.276C 53.7566 290.306 39.3288 284.41 33.1864 289.132C 28.5477 292.673 36.1243 297.464 35.1608 309.426C 34.7361 314.264 31.6102 315.387 32.5827 322.046C 33.3396 327.084 35.1193 326.879 37.1575 329C 43.5854 334.949 43.0097 331.109 70.8045 336.674C 86.5377 339.822 91.3762 345.777 107.729 344.313C 113.204 343.812 113.94 343.833 118.635 339.62C 124.304 334.548 121.38 335.574 121.742 331.396C 123.405 319.754 122.162 317.323 114.03 [...]
+        <path style="stroke:none; fill:#ffcd0a" d="M 58.8779 285.367C 53.868 290.561 39.2981 284.666 33.3122 289.298C 28.7045 292.852 36.4299 297.772 35.4693 309.399C 35.0326 314.208 32.0101 315.403 32.8312 322.012C 33.4731 327.023 35.4571 326.793 37.5266 328.843C 44.3253 334.7 43.9682 331.093 70.9375 336.482C 86.5781 339.6 91.3872 345.53 107.638 344.075C 113.079 343.58 113.715 343.586 118.42 339.46C 123.99 334.555 121.107 335.534 121.374 331.152C 122.836 319.583 121.783 317.033 113.902  [...]
+        <path style="stroke:none; fill:#ffcd0c" d="M 59.1722 285.457C 53.9794 290.816 39.2674 284.922 33.4379 289.465C 28.8612 293.032 36.7355 298.079 35.7778 309.373C 35.3292 314.152 32.4099 315.418 33.0798 321.979C 33.6066 326.961 35.7949 326.707 37.8957 328.686C 45.0652 334.452 44.9267 331.077 71.0704 336.29C 86.6185 339.377 91.3983 345.283 107.547 343.836C 112.955 343.348 113.49 343.339 118.204 339.299C 123.676 334.562 120.834 335.494 121.006 330.907C 122.266 319.413 121.404 316.744  [...]
+        <path style="stroke:none; fill:#ffcd0f" d="M 59.4665 285.548C 54.0908 291.071 39.2367 285.178 33.5636 289.631C 29.018 293.212 37.041 298.387 36.0863 309.346C 35.6257 314.096 32.8097 315.434 33.3284 321.945C 33.7402 326.9 36.1328 326.621 38.2647 328.529C 45.8051 334.204 45.8852 331.061 71.2033 336.098C 86.6589 339.154 91.4093 345.036 107.456 343.598C 112.831 343.115 113.266 343.092 117.989 339.139C 123.363 334.569 120.561 335.454 120.638 330.663C 121.696 319.242 121.025 316.454 11 [...]
+        <path style="stroke:none; fill:#ffcd11" d="M 59.7607 285.639C 54.2022 291.326 39.206 285.434 33.6894 289.797C 29.1748 293.391 37.3466 298.694 36.3948 309.319C 35.9223 314.04 33.2095 315.45 33.577 321.912C 33.8737 326.839 36.4706 326.535 38.6338 328.372C 46.5451 333.955 46.8438 331.046 71.3363 335.906C 86.6992 338.932 91.4203 344.789 107.364 343.36C 112.706 342.883 113.041 342.845 117.773 338.979C 123.049 334.576 120.289 335.414 120.27 330.419C 121.126 319.071 120.645 316.164 113. [...]
+        <path style="stroke:none; fill:#ffce14" d="M 60.055 285.73C 54.3136 291.581 39.1753 285.69 33.8151 289.963C 29.3316 293.571 37.6522 299.002 36.7034 309.293C 36.2189 313.984 33.6093 315.465 33.8256 321.878C 34.0072 326.778 36.8084 326.449 39.0029 328.215C 47.285 333.707 47.8023 331.03 71.4692 335.714C 86.7396 338.709 91.4313 344.541 107.273 343.121C 112.582 342.65 112.816 342.598 117.558 338.818C 122.735 334.583 120.016 335.374 119.902 330.175C 120.556 318.901 120.266 315.875 113. [...]
+        <path style="stroke:none; fill:#ffce16" d="M 60.3493 285.821C 54.4249 291.836 39.1446 285.946 33.9409 290.13C 29.4884 293.751 37.9578 299.309 37.0119 309.266C 36.5154 313.928 34.0091 315.481 34.0742 321.845C 34.1407 326.717 37.1462 326.363 39.372 328.058C 48.0249 333.459 48.7608 331.014 71.6022 335.522C 86.78 338.486 91.4423 344.294 107.182 342.883C 112.458 342.418 112.592 342.351 117.342 338.658C 122.421 334.59 119.743 335.334 119.534 329.93C 119.986 318.73 119.887 315.585 113.2 [...]
+        <path style="stroke:none; fill:#ffce19" d="M 60.6436 285.911C 54.5363 292.091 39.1139 286.202 34.0666 290.296C 29.6452 293.93 38.2633 299.617 37.3204 309.24C 36.812 313.872 34.4089 315.497 34.3227 321.812C 34.2743 326.656 37.4841 326.277 39.741 327.901C 48.7648 333.21 49.7193 330.998 71.7351 335.33C 86.8204 338.264 91.4533 344.047 107.091 342.645C 112.333 342.186 112.367 342.104 117.127 338.497C 122.107 334.597 119.47 335.294 119.166 329.686C 119.416 318.559 119.508 315.295 113.1 [...]
+        <path style="stroke:none; fill:#ffce1c" d="M 60.9379 286.002C 54.6477 292.346 39.0832 286.458 34.1924 290.462C 29.8019 294.11 38.5689 299.924 37.6289 309.213C 37.1085 313.816 34.8088 315.512 34.5713 321.778C 34.4078 326.595 37.8219 326.191 40.1101 327.743C 49.5048 332.962 50.6778 330.983 71.8681 335.138C 86.8608 338.041 91.4643 343.8 107 342.406C 112.209 341.953 112.142 341.857 116.912 338.337C 121.794 334.604 119.198 335.254 118.799 329.442C 118.846 318.389 119.128 315.006 112.9 [...]
+        <path style="stroke:none; fill:#ffcf1e" d="M 61.2321 286.093C 54.7591 292.602 39.0525 286.714 34.3181 290.628C 29.9587 294.29 38.8745 300.232 37.9374 309.186C 37.4051 313.76 35.2086 315.528 34.8199 321.745C 34.5413 326.534 38.1597 326.105 40.4792 327.586C 50.2447 332.714 51.6363 330.967 72.001 334.946C 86.9011 337.818 91.4754 343.553 106.909 342.168C 112.085 341.721 111.917 341.61 116.696 338.176C 121.48 334.611 118.925 335.214 118.431 329.198C 118.276 318.218 118.749 314.716 112 [...]
+        <path style="stroke:none; fill:#ffcf21" d="M 61.5264 286.184C 54.8705 292.857 39.0217 286.969 34.4439 290.795C 30.1155 294.469 39.1801 300.54 38.2459 309.16C 37.7017 313.704 35.6084 315.544 35.0685 321.711C 34.6749 326.472 38.4976 326.019 40.8483 327.429C 50.9846 332.465 52.5948 330.951 72.134 334.754C 86.9415 337.595 91.4864 343.305 106.818 341.93C 111.96 341.489 111.693 341.363 116.481 338.016C 121.166 334.618 118.652 335.174 118.063 328.953C 117.706 318.047 118.37 314.426 112. [...]
+        <path style="stroke:none; fill:#ffcf23" d="M 61.8207 286.275C 54.9819 293.112 38.991 287.225 34.5696 290.961C 30.2723 294.649 39.4856 300.847 38.5544 309.133C 37.9982 313.648 36.0082 315.559 35.3171 321.678C 34.8084 326.411 38.8354 325.933 41.2173 327.272C 51.7245 332.217 53.5533 330.935 72.2669 334.562C 86.9819 337.373 91.4974 343.058 106.727 341.691C 111.836 341.256 111.468 341.116 116.265 337.856C 120.852 334.625 118.379 335.134 117.695 328.709C 117.136 317.876 117.991 314.137 [...]
+        <path style="stroke:none; fill:#ffcf26" d="M 62.115 286.366C 55.0933 293.367 38.9603 287.481 34.6954 291.127C 30.4291 294.828 39.7912 301.155 38.8629 309.106C 38.2948 313.592 36.408 315.575 35.5657 321.644C 34.9419 326.35 39.1732 325.847 41.5864 327.115C 52.4645 331.968 54.5118 330.919 72.3999 334.37C 87.0223 337.15 91.5084 342.811 106.636 341.453C 111.712 341.024 111.243 340.869 116.05 337.695C 120.539 334.631 118.107 335.094 117.327 328.465C 116.566 317.706 117.611 313.847 112. [...]
+        <path style="stroke:none; fill:#ffd028" d="M 62.4093 286.456C 55.2046 293.622 38.9296 287.737 34.8211 291.293C 30.5859 295.008 40.0968 301.462 39.1714 309.08C 38.5913 313.536 36.8078 315.591 35.8142 321.611C 35.0755 326.289 39.5111 325.761 41.9555 326.958C 53.2044 331.72 55.4703 330.904 72.5328 334.178C 87.0627 336.927 91.5194 342.564 106.545 341.215C 111.588 340.791 111.018 340.622 115.834 337.535C 120.225 334.638 117.834 335.054 116.959 328.221C 115.996 317.535 117.232 313.557  [...]
+        <path style="stroke:none; fill:#ffd02b" d="M 62.7035 286.547C 55.316 293.877 38.8989 287.993 34.9468 291.46C 30.7427 295.188 40.4024 301.77 39.4799 309.053C 38.8879 313.48 37.2076 315.606 36.0628 321.577C 35.209 326.228 39.8489 325.675 42.3246 326.801C 53.9443 331.472 56.4288 330.888 72.6657 333.986C 87.103 336.705 91.5304 342.316 106.453 340.977C 111.463 340.559 110.794 340.374 115.619 337.374C 119.911 334.645 117.561 335.014 116.591 327.977C 115.427 317.364 116.853 313.268 112. [...]
+        <path style="stroke:none; fill:#ffd02d" d="M 62.9978 286.638C 55.4274 294.132 38.8682 288.249 35.0726 291.626C 30.8994 295.367 40.7079 302.077 39.7885 309.026C 39.1845 313.424 37.6075 315.622 36.3114 321.544C 35.3425 326.167 40.1867 325.589 42.6936 326.644C 54.6842 331.223 57.3874 330.872 72.7987 333.794C 87.1434 336.482 91.5415 342.069 106.362 340.738C 111.339 340.327 110.569 340.127 115.404 337.214C 119.597 334.652 117.288 334.974 116.223 327.732C 114.857 317.194 116.474 312.97 [...]
+        <path style="stroke:none; fill:#ffd030" d="M 63.2921 286.729C 55.5388 294.387 38.8375 288.505 35.1983 291.792C 31.0562 295.547 41.0135 302.385 40.097 309C 39.481 313.368 38.0073 315.638 36.56 321.51C 35.4761 326.106 40.5246 325.503 43.0627 326.487C 55.4242 330.975 58.3459 330.856 72.9316 333.602C 87.1838 336.259 91.5525 341.822 106.271 340.5C 111.215 340.094 110.344 339.88 115.188 337.053C 119.283 334.659 117.016 334.934 115.855 327.488C 114.287 317.023 116.094 312.688 111.962 30 [...]
+      </g>
+      <path style="stroke:none; fill:#ffd133" d="M 63.5864 286.82C 55.6502 294.642 38.8068 288.761 35.3241 291.958C 31.213 295.727 41.3191 302.692 40.4055 308.973C 39.7776 313.312 38.4071 315.653 36.8086 321.477C 35.6096 326.045 40.8624 325.416 43.4318 326.33C 56.1641 330.727 59.3044 330.841 73.0646 333.41C 87.2242 336.036 91.5635 341.575 106.18 340.262C 111.09 339.862 110.12 339.633 114.973 336.893C 118.97 334.666 116.743 334.894 115.487 327.244C 113.717 316.852 115.715 312.399 111.833  [...]
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 88.7821 218.681C 87.8461 220.769 87.0541 238.697 91.7341 245.681C 96.4141 252.593 95.0461 256.553 89.8621 251.297C 84.4621 246.185 80.9341 238.481 80.8621 233.153C 80.8621 230.057 83.2381 217.313 84.1741 215.945C 85.1821 214.505 89.5021 217.097 88.7821 218.681z"/>
+      <g>
+        <path style="stroke:none; fill:#030303" d="M 88.6921 219.031C 87.7885 221.371 87.0361 238.73 91.7017 245.699C 96.3673 252.601 94.8877 256.19 89.8621 251.056C 84.6313 246.059 81.2545 238.586 81.1213 233.269C 81.0781 230.155 83.3569 217.85 84.2533 216.478C 85.2145 215.085 89.3797 217.468 88.6921 219.031z"/>
+        <path style="stroke:none; fill:#070707" d="M 88.6021 219.38C 87.7309 221.972 87.0181 238.762 91.6693 245.717C 96.3205 252.608 94.7293 255.826 89.8621 250.815C 84.8005 245.933 81.5749 238.69 81.3805 233.384C 81.2941 230.252 83.4757 218.386 84.3325 217.011C 85.2469 215.665 89.2573 217.839 88.6021 219.38z"/>
+        <path style="stroke:none; fill:#0b0b0b" d="M 88.5121 219.729C 87.6733 222.573 87.0001 238.795 91.6369 245.735C 96.2737 252.615 94.5709 255.463 89.8621 250.574C 84.9697 245.807 81.8953 238.795 81.6397 233.499C 81.5101 230.349 83.5945 218.923 84.4117 217.544C 85.2793 216.244 89.1349 218.21 88.5121 219.729z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 88.4221 220.078C 87.6157 223.174 86.9821 238.827 91.6045 245.753C 96.2269 252.622 94.4125 255.099 89.8621 250.333C 85.1389 245.681 82.2157 238.899 81.8989 233.614C 81.7261 230.446 83.7133 219.459 84.4909 218.077C 85.3117 216.824 89.0125 218.581 88.4221 220.078z"/>
+        <path style="stroke:none; fill:#131313" d="M 88.3321 220.427C 87.5581 223.775 86.9641 238.859 91.5721 245.771C 96.1801 252.629 94.2541 254.735 89.8621 250.091C 85.3081 245.555 82.5361 239.003 82.1581 233.729C 81.9421 230.543 83.8321 219.995 84.5701 218.609C 85.3441 217.403 88.8901 218.951 88.3321 220.427z"/>
+        <path style="stroke:none; fill:#161616" d="M 88.2421 220.777C 87.5005 224.377 86.9461 238.892 91.5397 245.789C 96.1333 252.637 94.0957 254.372 89.8621 249.85C 85.4773 245.429 82.8565 239.108 82.4173 233.845C 82.1581 230.641 83.9509 220.532 84.6493 219.142C 85.3765 217.983 88.7677 219.322 88.2421 220.777z"/>
+        <path style="stroke:none; fill:#1a1a1a" d="M 88.1521 221.126C 87.4429 224.978 86.9281 238.924 91.5073 245.807C 96.0865 252.644 93.9373 254.008 89.8621 249.609C 85.6465 245.303 83.1769 239.212 82.6765 233.96C 82.3741 230.738 84.0697 221.068 84.7285 219.675C 85.4089 218.563 88.6453 219.693 88.1521 221.126z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 88.0621 221.475C 87.3853 225.579 86.9101 238.957 91.4749 245.825C 96.0397 252.651 93.7789 253.645 89.8621 249.368C 85.8157 245.177 83.4973 239.317 82.9357 234.075C 82.5901 230.835 84.1885 221.605 84.8077 220.208C 85.4413 219.142 88.5229 220.064 88.0621 221.475z"/>
+        <path style="stroke:none; fill:#222222" d="M 87.9721 221.824C 87.3277 226.18 86.8921 238.989 91.4425 245.843C 95.9929 252.658 93.6205 253.281 89.8621 249.127C 85.9849 245.051 83.8177 239.421 83.1949 234.19C 82.8061 230.932 84.3073 222.141 84.8869 220.741C 85.4737 219.722 88.4005 220.435 87.9721 221.824z"/>
+        <path style="stroke:none; fill:#262626" d="M 87.8821 222.173C 87.2701 226.781 86.8741 239.021 91.4101 245.861C 95.9461 252.665 93.4621 252.917 89.8621 248.885C 86.1541 244.925 84.1381 239.525 83.4541 234.305C 83.0221 231.029 84.4261 222.677 84.9661 221.273C 85.5061 220.301 88.2781 220.805 87.8821 222.173z"/>
+        <path style="stroke:none; fill:#2a2a2a" d="M 87.7921 222.523C 87.2125 227.383 86.8561 239.054 91.3777 245.879C 95.8993 252.673 93.3037 252.554 89.8621 248.644C 86.3233 244.799 84.4585 239.63 83.7133 234.421C 83.2381 231.127 84.5449 223.214 85.0453 221.806C 85.5385 220.881 88.1557 221.176 87.7921 222.523z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 87.7021 222.872C 87.1549 227.984 86.8381 239.086 91.3453 245.897C 95.8525 252.68 93.1453 252.19 89.8621 248.403C 86.4925 244.673 84.7789 239.734 83.9725 234.536C 83.4541 231.224 84.6637 223.75 85.1245 222.339C 85.5709 221.461 88.0333 221.547 87.7021 222.872z"/>
+        <path style="stroke:none; fill:#313131" d="M 87.6121 223.221C 87.0973 228.585 86.8201 239.119 91.3129 245.915C 95.8057 252.687 92.9869 251.827 89.8621 248.162C 86.6617 244.547 85.0993 239.839 84.2317 234.651C 83.6701 231.321 84.7825 224.287 85.2037 222.872C 85.6033 222.04 87.9109 221.918 87.6121 223.221z"/>
+        <path style="stroke:none; fill:#353535" d="M 87.5221 223.57C 87.0397 229.186 86.8021 239.151 91.2805 245.933C 95.7589 252.694 92.8285 251.463 89.8621 247.921C 86.8309 244.421 85.4197 239.943 84.4909 234.766C 83.8861 231.418 84.9013 224.823 85.2829 223.405C 85.6357 222.62 87.7885 222.289 87.5221 223.57z"/>
+        <path style="stroke:none; fill:#393939" d="M 87.4321 223.919C 86.9821 229.787 86.7841 239.183 91.2481 245.951C 95.7121 252.701 92.6701 251.099 89.8621 247.679C 87.0001 244.295 85.7401 240.047 84.7501 234.881C 84.1021 231.515 85.0201 225.359 85.3621 223.937C 85.6681 223.199 87.6661 222.659 87.4321 223.919z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 87.3421 224.269C 86.9245 230.389 86.7661 239.216 91.2157 245.969C 95.6653 252.709 92.5117 250.736 89.8621 247.438C 87.1693 244.169 86.0605 240.152 85.0093 234.997C 84.3181 231.613 85.1389 225.896 85.4413 224.47C 85.7005 223.779 87.5437 223.03 87.3421 224.269z"/>
+        <path style="stroke:none; fill:#414141" d="M 87.2521 224.618C 86.8669 230.99 86.7481 239.248 91.1833 245.987C 95.6185 252.716 92.3533 250.372 89.8621 247.197C 87.3385 244.043 86.3809 240.256 85.2685 235.112C 84.5341 231.71 85.2577 226.432 85.5205 225.003C 85.7329 224.359 87.4213 223.401 87.2521 224.618z"/>
+        <path style="stroke:none; fill:#444444" d="M 87.1621 224.967C 86.8093 231.591 86.7301 239.281 91.1509 246.005C 95.5717 252.723 92.1949 250.009 89.8621 246.956C 87.5077 243.917 86.7013 240.361 85.5277 235.227C 84.7501 231.807 85.3765 226.969 85.5997 225.536C 85.7653 224.938 87.2989 223.772 87.1621 224.967z"/>
+        <path style="stroke:none; fill:#484848" d="M 87.0721 225.316C 86.7517 232.192 86.7121 239.313 91.1185 246.023C 95.5249 252.73 92.0365 249.645 89.8621 246.715C 87.6769 243.791 87.0217 240.465 85.7869 235.342C 84.9661 231.904 85.4953 227.505 85.6789 226.069C 85.7977 225.518 87.1765 224.143 87.0721 225.316z"/>
+      </g>
+      <path style="stroke:none; fill:#4c4c4c" d="M 86.9821 225.665C 86.6941 232.793 86.6941 239.345 91.0861 246.041C 95.4781 252.737 91.8781 249.281 89.8621 246.473C 87.8461 243.665 87.3421 240.569 86.0461 235.457C 85.1821 232.001 85.6141 228.041 85.7581 226.601C 85.8301 226.097 87.0541 224.513 86.9821 225.665z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 88.7821 218.681C 93.1021 209.249 95.4781 199.097 101.67 189.233C 107.79 179.441 105.342 175.625 100.806 180.593C 96.2701 185.561 91.3021 196.073 91.3021 196.073C 91.3021 196.073 85.4701 205.289 84.1741 215.945C 83.9581 217.745 88.0621 220.193 88.7821 218.681z"/>
+      <g>
+        <path style="stroke:none; fill:#020202" d="M 88.9672 218.071C 93.2468 208.571 95.5828 198.824 101.553 189.269C 107.455 179.781 105.162 175.99 100.79 180.797C 96.3866 185.644 91.4884 196.033 91.4218 196.178C 91.4218 196.178 85.7845 205.17 84.5442 215.417C 84.336 217.188 88.2651 219.562 88.9672 218.071z"/>
+        <path style="stroke:none; fill:#050505" d="M 89.1524 217.46C 93.3916 207.893 95.6874 198.551 101.436 189.304C 107.119 180.121 104.983 176.354 100.773 181.001C 96.5032 185.726 91.6747 195.992 91.5415 196.283C 91.5415 196.283 86.0989 205.05 84.9144 214.888C 84.7139 216.63 88.4681 218.93 89.1524 217.46z"/>
+        <path style="stroke:none; fill:#070707" d="M 89.3376 216.849C 93.5364 207.215 95.7921 198.277 101.319 189.339C 106.784 180.461 104.803 176.718 100.757 181.204C 96.6197 185.809 91.8611 195.952 91.6613 196.388C 91.6613 196.388 86.4134 204.93 85.2845 214.36C 85.0919 216.072 88.6711 218.298 89.3376 216.849z"/>
+        <path style="stroke:none; fill:#0a0a0a" d="M 89.5227 216.238C 93.6811 206.537 95.8968 198.004 101.202 189.374C 106.449 180.801 104.624 177.082 100.741 181.408C 96.7363 185.891 92.0474 195.911 91.781 196.493C 91.781 196.493 86.7278 204.81 85.6547 213.831C 85.4698 215.514 88.8741 217.666 89.5227 216.238z"/>
+        <path style="stroke:none; fill:#0c0c0c" d="M 89.7079 215.627C 93.8259 205.859 96.0015 197.73 101.084 189.409C 106.113 181.141 104.444 177.447 100.724 181.612C 96.8528 185.973 92.2337 195.871 91.9007 196.597C 91.9007 196.597 87.0423 204.69 86.0248 213.303C 85.8477 214.956 89.0771 217.034 89.7079 215.627z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 89.893 215.017C 93.9707 205.181 96.1062 197.457 100.967 189.444C 105.778 181.481 104.264 177.811 100.708 181.815C 96.9694 186.056 92.42 195.83 92.0204 196.702C 92.0204 196.702 87.3567 204.57 86.395 212.774C 86.2257 214.398 89.2801 216.402 89.893 215.017z"/>
+        <path style="stroke:none; fill:#111111" d="M 90.0782 214.406C 94.1154 204.503 96.2109 197.183 100.85 189.479C 105.443 181.821 104.085 178.175 100.691 182.019C 97.0859 186.138 92.6064 195.79 92.1402 196.807C 92.1402 196.807 87.6711 204.451 86.7651 212.246C 86.6036 213.84 89.4831 215.77 90.0782 214.406z"/>
+        <path style="stroke:none; fill:#141414" d="M 90.2634 213.795C 94.2602 203.825 96.3156 196.91 100.733 189.514C 105.107 182.161 103.905 178.539 100.675 182.223C 97.2025 186.221 92.7927 195.749 92.2599 196.912C 92.2599 196.912 87.9856 204.331 87.1353 211.717C 86.9815 213.282 89.6861 215.138 90.2634 213.795z"/>
+        <path style="stroke:none; fill:#161616" d="M 90.4485 213.184C 94.405 203.147 96.4202 196.636 100.616 189.549C 104.772 182.501 103.726 178.904 100.659 182.426C 97.319 186.303 92.979 195.709 92.3796 197.017C 92.3796 197.017 88.3 204.211 87.5054 211.189C 87.3595 212.724 89.8891 214.506 90.4485 213.184z"/>
+        <path style="stroke:none; fill:#191919" d="M 90.6337 212.573C 94.5497 202.468 96.5249 196.363 100.499 189.584C 104.437 182.841 103.546 179.268 100.642 182.63C 97.4356 186.385 93.1653 195.668 92.4993 197.121C 92.4993 197.121 88.6144 204.091 87.8756 210.66C 87.7374 212.166 90.0921 213.874 90.6337 212.573z"/>
+        <path style="stroke:none; fill:#1c1c1c" d="M 90.8188 211.963C 94.6945 201.79 96.6296 196.09 100.382 189.619C 104.102 183.181 103.366 179.632 100.626 182.834C 97.5521 186.468 93.3517 195.627 92.6191 197.226C 92.6191 197.226 88.9289 203.971 88.2457 210.132C 88.1153 211.608 90.2951 213.243 90.8188 211.963z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 91.004 211.352C 94.8393 201.112 96.7343 195.816 100.265 189.654C 103.766 183.521 103.187 179.996 100.609 183.037C 97.6687 186.55 93.538 195.587 92.7388 197.331C 92.7388 197.331 89.2433 203.851 88.6159 209.603C 88.4932 211.05 90.4981 212.611 91.004 211.352z"/>
+        <path style="stroke:none; fill:#212121" d="M 91.1892 210.741C 94.984 200.434 96.839 195.543 100.147 189.689C 103.431 183.861 103.007 180.361 100.593 183.241C 97.7852 186.633 93.7243 195.546 92.8585 197.436C 92.8585 197.436 89.5577 203.731 88.986 209.075C 88.8712 210.492 90.7011 211.979 91.1892 210.741z"/>
+        <path style="stroke:none; fill:#232323" d="M 91.3743 210.13C 95.1288 199.756 96.9437 195.269 100.03 189.724C 103.096 184.201 102.827 180.725 100.577 183.445C 97.9018 186.715 93.9106 195.506 92.9782 197.541C 92.9782 197.541 89.8722 203.612 89.3562 208.546C 89.2491 209.934 90.9041 211.347 91.3743 210.13z"/>
+        <path style="stroke:none; fill:#262626" d="M 91.5595 209.519C 95.2736 199.078 97.0484 194.996 99.9132 189.759C 102.76 184.541 102.648 181.089 100.56 183.648C 98.0183 186.797 94.097 195.465 93.098 197.645C 93.098 197.645 90.1866 203.492 89.7263 208.018C 89.627 209.376 91.1072 210.715 91.5595 209.519z"/>
+        <path style="stroke:none; fill:#282828" d="M 91.7446 208.909C 95.4183 198.4 97.153 194.722 99.7961 189.794C 102.425 184.881 102.468 181.453 100.544 183.852C 98.1349 186.88 94.2833 195.425 93.2177 197.75C 93.2177 197.75 90.501 203.372 90.0965 207.489C 90.005 208.818 91.3102 210.083 91.7446 208.909z"/>
+        <path style="stroke:none; fill:#2b2b2b" d="M 91.9298 208.298C 95.5631 197.722 97.2577 194.449 99.679 189.829C 102.09 185.221 102.289 181.818 100.527 184.056C 98.2514 186.962 94.4696 195.384 93.3374 197.855C 93.3374 197.855 90.8155 203.252 90.4666 206.961C 90.3829 208.26 91.5132 209.451 91.9298 208.298z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 92.115 207.687C 95.7079 197.044 97.3624 194.175 99.5618 189.864C 101.754 185.561 102.109 182.182 100.511 184.259C 98.368 187.045 94.6559 195.344 93.4571 197.96C 93.4571 197.96 91.1299 203.132 90.8368 206.432C 90.7608 207.702 91.7162 208.819 92.115 207.687z"/>
+        <path style="stroke:none; fill:#303030" d="M 92.3001 207.076C 95.8526 196.366 97.4671 193.902 99.4447 189.899C 101.419 185.901 101.929 182.546 100.495 184.463C 98.4845 187.127 94.8423 195.303 93.5769 198.065C 93.5769 198.065 91.4443 203.012 91.2069 205.904C 91.1387 207.144 91.9192 208.187 92.3001 207.076z"/>
+      </g>
+      <path style="stroke:none; fill:#333333" d="M 92.4853 206.465C 95.9974 195.687 97.5718 193.628 99.3276 189.934C 101.084 186.24 101.75 182.91 100.478 184.666C 98.6011 187.209 95.0286 195.262 93.6966 198.169C 93.6966 198.169 91.7588 202.892 91.5771 205.375C 91.5167 206.586 92.1222 207.555 92.4853 206.465z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 273.03 225.593C 275.118 219.689 274.902 204.641 269.574 194.921C 267.702 191.393 265.902 187.289 264.822 187.073C 263.67 186.857 261.582 189.161 261.798 189.521C 262.086 190.097 271.806 203.777 269.79 222.353C 269.646 223.865 272.526 226.961 273.03 225.593z"/>
+      <g>
+        <path style="stroke:none; fill:#030303" d="M 272.936 224.831C 274.962 219.112 274.689 204.451 269.593 195.168C 267.777 191.761 266.057 187.794 264.998 187.578C 263.876 187.364 261.873 189.6 262.073 189.945C 262.331 190.507 271.678 203.723 269.802 221.697C 269.672 223.185 272.448 226.154 272.936 224.831z"/>
+        <path style="stroke:none; fill:#070707" d="M 272.841 224.068C 274.807 218.535 274.477 204.26 269.613 195.414C 267.851 192.128 266.212 188.299 265.173 188.082C 264.082 187.871 262.164 190.038 262.348 190.369C 262.575 190.917 271.55 203.668 269.814 221.041C 269.697 222.505 272.37 225.346 272.841 224.068z"/>
+        <path style="stroke:none; fill:#0b0b0b" d="M 272.747 223.305C 274.651 217.958 274.264 204.07 269.632 195.66C 267.926 192.495 266.367 188.804 265.349 188.587C 264.288 188.377 262.454 190.476 262.623 190.793C 262.82 191.327 271.422 203.613 269.826 220.385C 269.723 221.825 272.292 224.538 272.747 223.305z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 272.652 222.542C 274.495 217.38 274.051 203.879 269.651 195.906C 268.001 192.862 266.521 189.308 265.524 189.091C 264.494 188.884 262.745 190.914 262.898 191.217C 263.065 191.737 271.294 203.558 269.839 219.728C 269.748 221.145 272.214 223.73 272.652 222.542z"/>
+        <path style="stroke:none; fill:#131313" d="M 272.558 221.779C 274.339 216.803 273.838 203.689 269.67 196.153C 268.075 193.23 266.676 189.813 265.7 189.596C 264.7 189.391 263.036 191.352 263.173 191.641C 263.309 192.147 271.166 203.503 269.851 219.072C 269.773 220.465 272.136 222.922 272.558 221.779z"/>
+        <path style="stroke:none; fill:#161616" d="M 272.463 221.016C 274.183 216.226 273.626 203.498 269.689 196.399C 268.15 193.597 266.831 190.318 265.875 190.1C 264.906 189.897 263.327 191.791 263.448 192.065C 263.554 192.557 271.038 203.448 269.863 218.416C 269.799 219.785 272.058 222.114 272.463 221.016z"/>
+        <path style="stroke:none; fill:#1a1a1a" d="M 272.369 220.254C 274.028 215.649 273.413 203.308 269.709 196.645C 268.225 193.964 266.986 190.823 266.051 190.605C 265.113 190.404 263.617 192.229 263.724 192.489C 263.799 192.967 270.909 203.393 269.875 217.76C 269.824 219.104 271.981 221.306 272.369 220.254z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 272.274 219.491C 273.872 215.071 273.2 203.117 269.728 196.891C 268.299 194.331 267.141 191.327 266.227 191.109C 265.319 190.911 263.908 192.667 263.999 192.913C 264.043 193.377 270.781 203.338 269.887 217.103C 269.85 218.424 271.903 220.498 272.274 219.491z"/>
+        <path style="stroke:none; fill:#222222" d="M 272.18 218.728C 273.716 214.494 272.987 202.927 269.747 197.138C 268.374 194.699 267.295 191.832 266.402 191.614C 265.525 191.417 264.199 193.105 264.274 193.337C 264.288 193.787 270.653 203.283 269.899 216.447C 269.875 217.744 271.825 219.69 272.18 218.728z"/>
+        <path style="stroke:none; fill:#262626" d="M 272.085 217.965C 273.56 213.917 272.775 202.736 269.766 197.384C 268.449 195.066 267.45 192.337 266.578 192.118C 265.731 191.924 264.49 193.543 264.549 193.76C 264.533 194.196 270.525 203.228 269.911 215.791C 269.901 217.064 271.747 218.882 272.085 217.965z"/>
+        <path style="stroke:none; fill:#2a2a2a" d="M 271.991 217.202C 273.404 213.34 272.562 202.546 269.785 197.63C 268.523 195.433 267.605 192.842 266.753 192.622C 265.937 192.431 264.78 193.982 264.824 194.184C 264.777 194.606 270.397 203.173 269.923 215.135C 269.926 216.384 271.669 218.075 271.991 217.202z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 271.896 216.439C 273.249 212.762 272.349 202.355 269.805 197.876C 268.598 195.8 267.76 193.346 266.929 193.127C 266.143 192.937 265.071 194.42 265.099 194.608C 265.022 195.016 270.269 203.118 269.935 214.478C 269.952 215.704 271.591 217.267 271.896 216.439z"/>
+        <path style="stroke:none; fill:#313131" d="M 271.802 215.676C 273.093 212.185 272.136 202.165 269.824 198.123C 268.673 196.168 267.915 193.851 267.104 193.631C 266.349 193.444 265.362 194.858 265.374 195.032C 265.267 195.426 270.141 203.063 269.947 213.822C 269.977 215.024 271.513 216.459 271.802 215.676z"/>
+        <path style="stroke:none; fill:#353535" d="M 271.707 214.914C 272.937 211.608 271.924 201.974 269.843 198.369C 268.747 196.535 268.069 194.356 267.28 194.136C 266.555 193.951 265.653 195.296 265.649 195.456C 265.511 195.836 270.013 203.008 269.96 213.166C 270.002 214.343 271.435 215.651 271.707 214.914z"/>
+        <path style="stroke:none; fill:#393939" d="M 271.613 214.151C 272.781 211.031 271.711 201.784 269.862 198.615C 268.822 196.902 268.224 194.861 267.455 194.64C 266.761 194.457 265.943 195.734 265.924 195.88C 265.756 196.246 269.885 202.953 269.972 212.51C 270.028 213.663 271.357 214.843 271.613 214.151z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 271.518 213.388C 272.625 210.453 271.498 201.593 269.881 198.861C 268.897 197.269 268.379 195.365 267.631 195.145C 266.967 194.964 266.234 196.173 266.199 196.304C 266.001 196.656 269.757 202.898 269.984 211.853C 270.053 212.983 271.279 214.035 271.518 213.388z"/>
+        <path style="stroke:none; fill:#414141" d="M 271.424 212.625C 272.47 209.876 271.285 201.403 269.901 199.108C 268.971 197.637 268.534 195.87 267.807 195.649C 267.173 195.471 266.525 196.611 266.474 196.728C 266.245 197.066 269.628 202.843 269.996 211.197C 270.079 212.303 271.201 213.227 271.424 212.625z"/>
+        <path style="stroke:none; fill:#444444" d="M 271.329 211.862C 272.314 209.299 271.073 201.212 269.92 199.354C 269.046 198.004 268.689 196.375 267.982 196.154C 267.379 195.977 266.816 197.049 266.749 197.152C 266.49 197.476 269.5 202.788 270.008 210.541C 270.104 211.623 271.123 212.419 271.329 211.862z"/>
+        <path style="stroke:none; fill:#484848" d="M 271.235 211.099C 272.158 208.722 270.86 201.022 269.939 199.6C 269.121 198.371 268.843 196.88 268.158 196.658C 267.585 196.484 267.106 197.487 267.024 197.576C 266.735 197.886 269.372 202.733 270.02 209.885C 270.13 210.943 271.045 211.611 271.235 211.099z"/>
+      </g>
+      <path style="stroke:none; fill:#4c4c4c" d="M 271.14 210.336C 272.002 208.144 270.647 200.831 269.958 199.846C 269.195 198.738 268.998 197.384 268.333 197.162C 267.791 196.99 267.397 197.925 267.299 197.999C 266.979 198.295 269.244 202.678 270.032 209.228C 270.155 210.262 270.967 210.803 271.14 210.336z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 264.822 187.073C 254.598 173.105 241.35 168.569 242.718 172.961C 242.718 172.961 252.87 178.721 261.798 189.521C 263.526 191.609 266.406 189.233 264.822 187.073z"/>
+      <g>
+        <path style="stroke:none; fill:#030303" d="M 264.372 186.687C 254.448 173.192 241.478 168.775 242.833 172.987C 242.85 172.999 252.734 178.601 261.442 189.058C 263.12 191.074 265.909 188.773 264.372 186.687z"/>
+        <path style="stroke:none; fill:#070707" d="M 263.922 186.3C 254.298 173.278 241.605 168.981 242.947 173.013C 242.983 173.036 252.599 178.48 261.086 188.595C 262.714 190.538 265.411 188.312 263.922 186.3z"/>
+        <path style="stroke:none; fill:#0b0b0b" d="M 263.472 185.913C 254.148 173.364 241.733 169.187 243.062 173.039C 243.115 173.073 252.463 178.359 260.73 188.132C 262.308 190.003 264.913 187.852 263.472 185.913z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 263.022 185.527C 253.998 173.45 241.86 169.393 243.176 173.065C 243.247 173.11 252.327 178.239 260.374 187.669C 261.902 189.467 264.416 187.391 263.022 185.527z"/>
+        <path style="stroke:none; fill:#131313" d="M 262.571 185.14C 253.848 173.537 241.988 169.599 243.291 173.091C 243.379 173.147 252.192 178.118 260.018 187.205C 261.496 188.931 263.918 186.93 262.571 185.14z"/>
+        <path style="stroke:none; fill:#161616" d="M 262.121 184.753C 253.698 173.623 242.115 169.805 243.405 173.117C 243.511 173.184 252.056 177.997 259.662 186.742C 261.09 188.396 263.421 186.47 262.121 184.753z"/>
+        <path style="stroke:none; fill:#1a1a1a" d="M 261.671 184.367C 253.547 173.709 242.243 170.011 243.52 173.143C 243.644 173.221 251.92 177.877 259.305 186.279C 260.684 187.86 262.923 186.009 261.671 184.367z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 261.221 183.98C 253.397 173.795 242.371 170.217 243.634 173.169C 243.776 173.258 251.785 177.756 258.949 185.816C 260.278 187.324 262.425 185.549 261.221 183.98z"/>
+        <path style="stroke:none; fill:#222222" d="M 260.771 183.593C 253.247 173.882 242.498 170.423 243.749 173.195C 243.908 173.295 251.649 177.635 258.593 185.353C 259.872 186.789 261.928 185.088 260.771 183.593z"/>
+        <path style="stroke:none; fill:#262626" d="M 260.321 183.206C 253.097 173.968 242.626 170.628 243.863 173.221C 244.04 173.332 251.513 177.514 258.237 184.889C 259.466 186.253 261.43 184.627 260.321 183.206z"/>
+        <path style="stroke:none; fill:#2a2a2a" d="M 259.871 182.82C 252.947 174.054 242.753 170.834 243.978 173.247C 244.172 173.369 251.377 177.394 257.881 184.426C 259.06 185.717 260.933 184.167 259.871 182.82z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 259.42 182.433C 252.797 174.14 242.881 171.04 244.092 173.273C 244.305 173.406 251.242 177.273 257.525 183.963C 258.654 185.182 260.435 183.706 259.42 182.433z"/>
+        <path style="stroke:none; fill:#313131" d="M 258.97 182.046C 252.647 174.227 243.008 171.246 244.207 173.299C 244.437 173.443 251.106 177.152 257.169 183.5C 258.248 184.646 259.937 183.246 258.97 182.046z"/>
+        <path style="stroke:none; fill:#353535" d="M 258.52 181.66C 252.497 174.313 243.136 171.452 244.321 173.325C 244.569 173.48 250.97 177.032 256.813 183.037C 257.841 184.11 259.44 182.785 258.52 181.66z"/>
+        <path style="stroke:none; fill:#393939" d="M 258.07 181.273C 252.347 174.399 243.263 171.658 244.436 173.351C 244.701 173.517 250.835 176.911 256.457 182.573C 257.435 183.575 258.942 182.324 258.07 181.273z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 257.62 180.886C 252.197 174.485 243.391 171.864 244.55 173.377C 244.833 173.554 250.699 176.79 256.101 182.11C 257.029 183.039 258.445 181.864 257.62 180.886z"/>
+        <path style="stroke:none; fill:#414141" d="M 257.17 180.5C 252.046 174.572 243.519 172.07 244.665 173.403C 244.966 173.591 250.563 176.67 255.744 181.647C 256.623 182.503 257.947 181.403 257.17 180.5z"/>
+        <path style="stroke:none; fill:#444444" d="M 256.719 180.113C 251.896 174.658 243.646 172.276 244.779 173.429C 245.098 173.628 250.428 176.549 255.388 181.184C 256.217 181.968 257.449 180.943 256.719 180.113z"/>
+        <path style="stroke:none; fill:#484848" d="M 256.269 179.726C 251.746 174.744 243.774 172.482 244.894 173.455C 245.23 173.665 250.292 176.428 255.032 180.721C 255.811 181.432 256.952 180.482 256.269 179.726z"/>
+      </g>
+      <path style="stroke:none; fill:#4c4c4c" d="M 255.819 179.339C 251.596 174.83 243.901 172.687 245.008 173.48C 245.362 173.702 250.156 176.307 254.676 180.257C 255.405 180.896 256.454 180.021 255.819 179.339z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 273.03 225.593C 273.174 231.857 267.27 247.841 265.038 247.265C 262.518 246.689 265.542 242.009 267.846 234.089C 268.782 230.777 269.502 222.641 269.79 222.353C 270.726 221.417 273.03 224.081 273.03 225.593z"/>
+      <g>
+        <path style="stroke:none; fill:#050505" d="M 272.846 226.115C 272.949 232.198 267.209 247.709 265.05 247.133C 262.628 246.566 265.597 241.987 267.864 234.205C 268.763 231.028 269.459 223.258 269.751 222.956C 270.664 222.029 272.897 224.483 272.846 226.115z"/>
+        <path style="stroke:none; fill:#0a0a0a" d="M 272.662 226.637C 272.724 232.539 267.148 247.576 265.061 247.001C 262.738 246.443 265.653 241.965 267.882 234.32C 268.743 231.279 269.416 223.874 269.712 223.559C 270.601 222.641 272.765 224.885 272.662 226.637z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 272.478 227.158C 272.499 232.88 267.087 247.443 265.073 246.869C 262.849 246.32 265.708 241.943 267.9 234.436C 268.724 231.529 269.373 224.49 269.674 224.162C 270.539 223.252 272.632 225.287 272.478 227.158z"/>
+        <path style="stroke:none; fill:#141414" d="M 272.294 227.68C 272.274 233.22 267.026 247.31 265.084 246.737C 262.959 246.196 265.763 241.921 267.919 234.551C 268.705 231.78 269.331 225.106 269.635 224.765C 270.476 223.864 272.499 225.689 272.294 227.68z"/>
+        <path style="stroke:none; fill:#191919" d="M 272.11 228.201C 272.048 233.561 266.965 247.178 265.096 246.605C 263.069 246.073 265.818 241.899 267.937 234.667C 268.685 232.03 269.288 225.722 269.596 225.368C 270.414 224.475 272.366 226.091 272.11 228.201z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 271.926 228.723C 271.823 233.902 266.904 247.045 265.107 246.473C 263.179 245.95 265.873 241.877 267.955 234.782C 268.666 232.281 269.245 226.338 269.557 225.971C 270.351 225.087 272.233 226.493 271.926 228.723z"/>
+        <path style="stroke:none; fill:#232323" d="M 271.742 229.245C 271.598 234.243 266.842 246.912 265.119 246.341C 263.289 245.826 265.929 241.855 267.973 234.898C 268.646 232.531 269.202 226.954 269.518 226.573C 270.289 225.698 272.101 226.894 271.742 229.245z"/>
+        <path style="stroke:none; fill:#282828" d="M 271.558 229.766C 271.373 234.583 266.781 246.779 265.131 246.209C 263.399 245.703 265.984 241.833 267.991 235.013C 268.627 232.782 269.159 227.57 269.479 227.176C 270.227 226.31 271.968 227.296 271.558 229.766z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 271.374 230.288C 271.148 234.924 266.72 246.647 265.142 246.077C 263.51 245.58 266.039 241.811 268.009 235.129C 268.608 233.032 269.116 228.186 269.441 227.779C 270.164 226.921 271.835 227.698 271.374 230.288z"/>
+        <path style="stroke:none; fill:#333333" d="M 271.19 230.809C 270.923 235.265 266.659 246.514 265.154 245.945C 263.62 245.456 266.094 241.789 268.027 235.244C 268.588 233.283 269.073 228.802 269.402 228.382C 270.102 227.533 271.702 228.1 271.19 230.809z"/>
+        <path style="stroke:none; fill:#383838" d="M 271.006 231.331C 270.698 235.606 266.598 246.381 265.165 245.813C 263.73 245.333 266.149 241.767 268.045 235.36C 268.569 233.534 269.03 229.418 269.363 228.985C 270.039 228.145 271.569 228.502 271.006 231.331z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 270.822 231.853C 270.472 235.946 266.537 246.248 265.177 245.681C 263.84 245.21 266.205 241.745 268.063 235.475C 268.549 233.784 268.987 230.034 269.324 229.588C 269.977 228.756 271.437 228.904 270.822 231.853z"/>
+        <path style="stroke:none; fill:#424242" d="M 270.638 232.374C 270.247 236.287 266.476 246.116 265.188 245.549C 263.95 245.087 266.26 241.723 268.081 235.591C 268.53 234.035 268.944 230.65 269.285 230.191C 269.914 229.368 271.304 229.306 270.638 232.374z"/>
+        <path style="stroke:none; fill:#474747" d="M 270.454 232.896C 270.022 236.628 266.415 245.983 265.2 245.417C 264.06 244.963 266.315 241.701 268.1 235.706C 268.511 234.285 268.902 231.266 269.246 230.793C 269.852 229.979 271.171 229.707 270.454 232.896z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 270.27 233.417C 269.797 236.969 266.354 245.85 265.211 245.285C 264.17 244.84 266.37 241.679 268.118 235.822C 268.491 234.536 268.859 231.882 269.207 231.396C 269.789 230.591 271.038 230.109 270.27 233.417z"/>
+        <path style="stroke:none; fill:#515151" d="M 270.086 233.939C 269.572 237.309 266.293 245.717 265.223 245.153C 264.281 244.717 266.425 241.657 268.136 235.937C 268.472 234.786 268.816 232.498 269.169 231.999C 269.727 231.202 270.905 230.511 270.086 233.939z"/>
+        <path style="stroke:none; fill:#565656" d="M 269.902 234.461C 269.347 237.65 266.231 245.585 265.235 245.021C 264.391 244.593 266.481 241.635 268.154 236.053C 268.452 235.037 268.773 233.114 269.13 232.602C 269.665 231.814 270.773 230.913 269.902 234.461z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 269.718 234.982C 269.121 237.991 266.17 245.452 265.246 244.889C 264.501 244.47 266.536 241.613 268.172 236.168C 268.433 235.287 268.73 233.73 269.091 233.205C 269.602 232.425 270.64 231.315 269.718 234.982z"/>
+        <path style="stroke:none; fill:#606060" d="M 269.534 235.504C 268.896 238.332 266.109 245.319 265.258 244.757C 264.611 244.347 266.591 241.591 268.19 236.284C 268.414 235.538 268.687 234.346 269.052 233.808C 269.54 233.037 270.507 231.717 269.534 235.504z"/>
+      </g>
+      <path style="stroke:none; fill:#666666" d="M 269.35 236.025C 268.671 238.672 266.048 245.186 265.269 244.624C 264.721 244.223 266.646 241.568 268.208 236.399C 268.394 235.788 268.644 234.962 269.013 234.41C 269.477 233.648 270.374 232.118 269.35 236.025z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 251.07 187.865C 249.533 189.487 248.167 197.856 252.009 200.759C 255.852 203.577 262.598 198.368 262.598 195.379C 262.512 188.633 252.607 186.157 251.07 187.865z"/>
+      <g>
+        <path style="stroke:none; fill:#010101" d="M 251.207 188.006C 249.648 189.617 248.331 197.828 252.064 200.672C 255.796 203.436 262.413 198.399 262.448 195.393C 262.401 188.818 252.767 186.311 251.207 188.006z"/>
+        <path style="stroke:none; fill:#030303" d="M 251.344 188.146C 249.762 189.747 248.495 197.8 252.119 200.585C 255.739 203.294 262.228 198.43 262.297 195.407C 262.289 189.003 252.926 186.464 251.344 188.146z"/>
+        <path style="stroke:none; fill:#050505" d="M 251.481 188.287C 249.877 189.876 248.658 197.771 252.173 200.498C 255.683 203.152 262.042 198.461 262.147 195.421C 262.178 189.188 253.086 186.618 251.481 188.287z"/>
+        <path style="stroke:none; fill:#070707" d="M 251.617 188.427C 249.991 190.006 248.822 197.743 252.228 200.411C 255.626 203.01 261.857 198.492 261.996 195.435C 262.067 189.373 253.245 186.771 251.617 188.427z"/>
+        <path style="stroke:none; fill:#090909" d="M 251.754 188.567C 250.105 190.135 248.986 197.714 252.283 200.324C 255.57 202.868 261.672 198.523 261.846 195.449C 261.955 189.558 253.405 186.925 251.754 188.567z"/>
+        <path style="stroke:none; fill:#0b0b0b" d="M 251.891 188.708C 250.22 190.265 249.15 197.686 252.337 200.237C 255.513 202.726 261.487 198.554 261.695 195.463C 261.844 189.743 253.564 187.078 251.891 188.708z"/>
+        <path style="stroke:none; fill:#0d0d0d" d="M 252.028 188.848C 250.334 190.394 249.313 197.657 252.392 200.15C 255.457 202.585 261.301 198.584 261.545 195.477C 261.733 189.928 253.724 187.232 252.028 188.848z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 252.165 188.989C 250.449 190.524 249.477 197.629 252.447 200.063C 255.4 202.443 261.116 198.615 261.395 195.491C 261.621 190.113 253.883 187.385 252.165 188.989z"/>
+        <path style="stroke:none; fill:#111111" d="M 252.301 189.129C 250.563 190.653 249.641 197.6 252.501 199.976C 255.344 202.301 260.931 198.646 261.244 195.505C 261.51 190.298 254.043 187.539 252.301 189.129z"/>
+        <path style="stroke:none; fill:#131313" d="M 252.438 189.269C 250.678 190.783 249.805 197.572 252.556 199.888C 255.287 202.159 260.746 198.677 261.094 195.519C 261.399 190.483 254.202 187.692 252.438 189.269z"/>
+        <path style="stroke:none; fill:#151515" d="M 252.575 189.41C 250.792 190.913 249.968 197.544 252.611 199.801C 255.231 202.017 260.56 198.708 260.943 195.533C 261.287 190.668 254.362 187.846 252.575 189.41z"/>
+        <path style="stroke:none; fill:#161616" d="M 252.712 189.55C 250.907 191.042 250.132 197.515 252.666 199.714C 255.174 201.875 260.375 198.739 260.793 195.547C 261.176 190.853 254.521 187.999 252.712 189.55z"/>
+        <path style="stroke:none; fill:#181818" d="M 252.849 189.691C 251.021 191.172 250.296 197.487 252.72 199.627C 255.118 201.733 260.19 198.77 260.642 195.561C 261.065 191.038 254.681 188.153 252.849 189.691z"/>
+        <path style="stroke:none; fill:#1a1a1a" d="M 252.985 189.831C 251.135 191.301 250.46 197.458 252.775 199.54C 255.061 201.592 260.005 198.8 260.492 195.575C 260.953 191.223 254.84 188.306 252.985 189.831z"/>
+        <path style="stroke:none; fill:#1c1c1c" d="M 253.122 189.971C 251.25 191.431 250.623 197.43 252.83 199.453C 255.005 201.45 259.819 198.831 260.341 195.589C 260.842 191.408 255 188.46 253.122 189.971z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 253.259 190.112C 251.364 191.56 250.787 197.401 252.884 199.366C 254.948 201.308 259.634 198.862 260.191 195.603C 260.731 191.593 255.159 188.613 253.259 190.112z"/>
+        <path style="stroke:none; fill:#202020" d="M 253.396 190.252C 251.479 191.69 250.951 197.373 252.939 199.279C 254.892 201.166 259.449 198.893 260.041 195.617C 260.619 191.778 255.319 188.767 253.396 190.252z"/>
+        <path style="stroke:none; fill:#222222" d="M 253.533 190.393C 251.593 191.819 251.115 197.344 252.994 199.192C 254.835 201.024 259.264 198.924 259.89 195.631C 260.508 191.963 255.478 188.92 253.533 190.393z"/>
+        <path style="stroke:none; fill:#242424" d="M 253.669 190.533C 251.708 191.949 251.278 197.316 253.048 199.105C 254.779 200.882 259.078 198.955 259.74 195.645C 260.397 192.148 255.638 189.074 253.669 190.533z"/>
+      </g>
+      <path style="stroke:none; fill:#262626" d="M 253.806 190.673C 251.822 192.078 251.442 197.287 253.103 199.017C 254.722 200.74 258.893 198.985 259.589 195.659C 260.285 192.333 255.797 189.227 253.806 190.673z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 250.71 256.697C 252.222 258.209 253.518 254.465 255.03 253.241C 256.542 252.017 258.99 249.353 263.886 249.353C 268.782 249.353 268.422 249.209 268.206 247.337C 268.062 245.537 266.622 245.681 262.302 246.329C 257.982 246.905 255.102 249.137 253.374 251.153C 251.718 253.097 249.846 255.833 250.71 256.697z"/>
+      <g>
+        <path style="stroke:none; fill:#050505" d="M 251.043 256.33C 252.502 257.78 253.746 254.21 255.248 253.023C 256.749 251.837 259.178 249.291 263.887 249.291C 268.597 249.29 268.302 249.163 268.096 247.351C 267.958 245.608 266.553 245.758 262.347 246.372C 258.14 246.915 255.318 249.074 253.635 251.02C 252.02 252.898 250.198 255.495 251.043 256.33z"/>
+        <path style="stroke:none; fill:#0a0a0a" d="M 251.376 255.962C 252.782 257.35 253.975 253.954 255.465 252.805C 256.956 251.656 259.366 249.229 263.889 249.228C 268.411 249.227 268.182 249.117 267.985 247.365C 267.853 245.678 266.484 245.835 262.391 246.414C 258.299 246.924 255.534 249.01 253.896 250.886C 252.322 252.698 250.549 255.157 251.376 255.962z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 251.709 255.594C 253.063 256.921 254.203 253.699 255.683 252.587C 257.163 251.475 259.554 249.166 263.89 249.165C 268.226 249.163 268.061 249.071 267.875 247.379C 267.749 245.748 266.415 245.912 262.436 246.456C 258.457 246.934 255.75 248.947 254.156 250.753C 252.624 252.498 250.9 254.818 251.709 255.594z"/>
+        <path style="stroke:none; fill:#141414" d="M 252.042 255.226C 253.343 256.491 254.431 253.443 255.9 252.369C 257.37 251.294 259.742 249.104 263.891 249.102C 268.041 249.1 267.941 249.025 267.764 247.393C 267.645 245.818 266.345 245.989 262.48 246.498C 258.615 246.943 255.966 248.883 254.417 250.619C 252.927 252.298 251.252 254.48 252.042 255.226z"/>
+        <path style="stroke:none; fill:#191919" d="M 252.374 254.859C 253.623 256.061 254.659 253.188 256.118 252.151C 257.576 251.114 259.93 249.042 263.892 249.039C 267.855 249.036 267.821 248.979 267.653 247.407C 267.54 245.888 266.276 246.066 262.525 246.54C 258.774 246.953 256.181 248.819 254.678 250.485C 253.229 252.098 251.603 254.141 252.374 254.859z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 252.707 254.491C 253.903 255.632 254.888 252.932 256.335 251.933C 257.783 250.933 260.118 248.979 263.894 248.976C 267.67 248.973 267.7 248.933 267.543 247.421C 267.436 245.959 266.207 246.143 262.569 246.582C 258.932 246.962 256.397 248.756 254.939 250.352C 253.531 251.898 251.955 253.803 252.707 254.491z"/>
+        <path style="stroke:none; fill:#232323" d="M 253.04 254.123C 254.183 255.202 255.116 252.677 256.553 251.714C 257.99 250.752 260.306 248.917 263.895 248.914C 267.484 248.91 267.58 248.887 267.432 247.434C 267.332 246.029 266.138 246.22 262.614 246.624C 259.09 246.972 256.613 248.692 255.199 250.218C 253.833 251.698 252.306 253.464 253.04 254.123z"/>
+        <path style="stroke:none; fill:#282828" d="M 253.373 253.755C 254.463 254.772 255.344 252.421 256.771 251.496C 258.197 250.571 260.494 248.855 263.896 248.851C 267.299 248.846 267.46 248.841 267.322 247.448C 267.227 246.099 266.069 246.297 262.658 246.666C 259.249 246.981 256.829 248.628 255.46 250.085C 254.135 251.498 252.657 253.126 253.373 253.755z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 253.706 253.388C 254.744 254.343 255.572 252.166 256.988 251.278C 258.404 250.391 260.682 248.792 263.897 248.788C 267.114 248.783 267.339 248.795 267.211 247.462C 267.123 246.169 265.999 246.374 262.703 246.708C 259.407 246.991 257.045 248.565 255.721 249.951C 254.437 251.298 253.009 252.787 253.706 253.388z"/>
+        <path style="stroke:none; fill:#333333" d="M 254.039 253.02C 255.024 253.913 255.801 251.91 257.206 251.06C 258.611 250.21 260.87 248.73 263.899 248.725C 266.928 248.719 267.219 248.748 267.101 247.476C 267.019 246.239 265.93 246.451 262.747 246.75C 259.565 247 257.261 248.501 255.982 249.817C 254.739 251.098 253.36 252.449 254.039 253.02z"/>
+        <path style="stroke:none; fill:#383838" d="M 254.372 252.652C 255.304 253.483 256.029 251.654 257.423 250.842C 258.818 250.029 261.058 248.668 263.9 248.662C 266.743 248.656 267.099 248.702 266.99 247.49C 266.914 246.31 265.861 246.528 262.792 246.793C 259.723 247.01 257.477 248.437 256.242 249.684C 255.041 250.898 253.712 252.111 254.372 252.652z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 254.704 252.284C 255.584 253.054 256.257 251.399 257.641 250.624C 259.024 249.848 261.246 248.605 263.901 248.599C 266.557 248.593 266.979 248.656 266.88 247.504C 266.81 246.38 265.792 246.605 262.836 246.835C 259.882 247.019 257.692 248.374 256.503 249.55C 255.343 250.698 254.063 251.772 254.704 252.284z"/>
+        <path style="stroke:none; fill:#424242" d="M 255.037 251.917C 255.864 252.624 256.485 251.143 257.858 250.406C 259.231 249.668 261.434 248.543 263.902 248.536C 266.372 248.529 266.858 248.61 266.769 247.518C 266.706 246.45 265.723 246.682 262.881 246.877C 260.04 247.029 257.908 248.31 256.764 249.417C 255.645 250.498 254.414 251.434 255.037 251.917z"/>
+        <path style="stroke:none; fill:#474747" d="M 255.37 251.549C 256.144 252.194 256.714 250.888 258.076 250.187C 259.438 249.487 261.621 248.481 263.904 248.474C 266.187 248.466 266.738 248.564 266.658 247.531C 266.601 246.52 265.653 246.759 262.925 246.919C 260.198 247.038 258.124 248.246 257.025 249.283C 255.948 250.298 254.766 251.095 255.37 251.549z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 255.703 251.181C 256.424 251.765 256.942 250.632 258.293 249.969C 259.645 249.306 261.809 248.418 263.905 248.411C 266.001 248.402 266.618 248.518 266.548 247.545C 266.497 246.59 265.584 246.836 262.97 246.961C 260.357 247.048 258.34 248.183 257.285 249.149C 256.25 250.098 255.117 250.757 255.703 251.181z"/>
+        <path style="stroke:none; fill:#515151" d="M 256.036 250.813C 256.705 251.335 257.17 250.377 258.511 249.751C 259.852 249.125 261.997 248.356 263.906 248.348C 265.816 248.339 266.497 248.472 266.437 247.559C 266.393 246.661 265.515 246.913 263.014 247.003C 260.515 247.057 258.556 248.119 257.546 249.016C 256.552 249.898 255.469 250.418 256.036 250.813z"/>
+        <path style="stroke:none; fill:#565656" d="M 256.369 250.446C 256.985 250.905 257.398 250.121 258.729 249.533C 260.059 248.945 262.185 248.294 263.907 248.285C 265.63 248.276 266.377 248.426 266.327 247.573C 266.288 246.731 265.446 246.99 263.059 247.045C 260.673 247.067 258.772 248.055 257.807 248.882C 256.854 249.698 255.82 250.08 256.369 250.446z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 256.701 250.078C 257.265 250.476 257.627 249.866 258.946 249.315C 260.265 248.764 262.373 248.231 263.909 248.222C 265.445 248.212 266.257 248.38 266.216 247.587C 266.184 246.801 265.377 247.067 263.103 247.087C 260.832 247.076 258.987 247.992 258.068 248.749C 257.156 249.498 256.171 249.741 256.701 250.078z"/>
+        <path style="stroke:none; fill:#606060" d="M 257.034 249.71C 257.545 250.046 257.855 249.61 259.164 249.097C 260.472 248.583 262.561 248.169 263.91 248.159C 265.26 248.149 266.136 248.334 266.106 247.601C 266.08 246.871 265.307 247.144 263.148 247.129C 260.99 247.086 259.203 247.928 258.328 248.615C 257.458 249.298 256.523 249.403 257.034 249.71z"/>
+      </g>
+      <path style="stroke:none; fill:#666666" d="M 257.367 249.342C 257.825 249.616 258.083 249.354 259.381 248.878C 260.679 248.402 262.749 248.106 263.911 248.096C 265.074 248.085 266.016 248.287 265.995 247.614C 265.975 246.941 265.238 247.221 263.192 247.171C 261.148 247.095 259.419 247.864 258.589 248.481C 257.76 249.098 256.874 249.064 257.367 249.342z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 270.222 247.265C 270.222 249.569 274.902 250.361 279.366 251.009C 283.758 251.657 287.286 252.521 287.502 257.129C 287.718 261.665 286.566 264.905 288.582 264.545C 292.902 263.753 294.486 259.073 294.414 256.913C 294.414 254.753 291.246 250.865 285.558 248.705C 281.382 247.121 278.358 246.401 274.686 246.257C 269.79 246.041 270.222 247.265 270.222 247.265z"/>
+      <g>
+        <path style="stroke:none; fill:#030303" d="M 270.348 247.304C 270.36 249.543 274.991 250.274 279.397 250.943C 283.749 251.617 287.147 252.453 287.508 256.945C 287.852 261.36 286.654 264.459 288.643 264.134C 292.788 263.394 294.331 258.933 294.251 256.802C 294.236 254.65 291.133 250.891 285.517 248.763C 281.388 247.199 278.407 246.465 274.777 246.311C 270.023 246.094 270.339 247.263 270.348 247.304z"/>
+        <path style="stroke:none; fill:#070707" d="M 270.474 247.342C 270.498 249.516 275.08 250.187 279.427 250.876C 283.739 251.577 287.008 252.384 287.514 256.761C 287.985 261.055 286.743 264.012 288.704 263.723C 292.674 263.034 294.176 258.793 294.088 256.69C 294.059 254.546 291.019 250.917 285.477 248.82C 281.395 247.277 278.455 246.529 274.868 246.364C 270.256 246.146 270.456 247.26 270.474 247.342z"/>
+        <path style="stroke:none; fill:#0b0b0b" d="M 270.6 247.38C 270.635 249.489 275.169 250.1 279.458 250.81C 283.729 251.537 286.869 252.316 287.52 256.576C 288.119 260.75 286.831 263.565 288.765 263.312C 292.56 262.675 294.022 258.652 293.925 256.578C 293.881 254.442 290.906 250.943 285.436 248.878C 281.401 247.355 278.504 246.593 274.959 246.418C 270.489 246.199 270.574 247.257 270.6 247.38z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 270.726 247.419C 270.773 249.462 275.258 250.013 279.488 250.743C 283.72 251.497 286.73 252.247 287.527 256.392C 288.252 260.444 286.919 263.119 288.826 262.901C 292.447 262.315 293.867 258.512 293.762 256.466C 293.703 254.338 290.792 250.969 285.395 248.935C 281.407 247.433 278.553 246.657 275.05 246.471C 270.722 246.251 270.691 247.254 270.726 247.419z"/>
+        <path style="stroke:none; fill:#131313" d="M 270.852 247.457C 270.911 249.435 275.347 249.926 279.519 250.676C 283.71 251.457 286.591 252.178 287.533 256.208C 288.386 260.139 287.007 262.672 288.887 262.49C 292.333 261.955 293.712 258.372 293.599 256.354C 293.525 254.235 290.679 250.995 285.354 248.993C 281.413 247.511 278.601 246.721 275.141 246.524C 270.955 246.303 270.808 247.251 270.852 247.457z"/>
+        <path style="stroke:none; fill:#161616" d="M 270.978 247.495C 271.049 249.408 275.436 249.839 279.549 250.61C 283.7 251.417 286.452 252.11 287.539 256.023C 288.519 259.834 287.095 262.225 288.948 262.079C 292.219 261.596 293.557 258.231 293.436 256.243C 293.348 254.131 290.565 251.021 285.313 249.05C 281.42 247.589 278.65 246.785 275.232 246.578C 271.188 246.356 270.925 247.248 270.978 247.495z"/>
+        <path style="stroke:none; fill:#1a1a1a" d="M 271.104 247.534C 271.186 249.381 275.526 249.752 279.58 250.543C 283.691 251.376 286.314 252.041 287.545 255.839C 288.653 259.529 287.184 261.779 289.009 261.668C 292.105 261.236 293.402 258.091 293.273 256.131C 293.17 254.027 290.452 251.047 285.273 249.108C 281.426 247.666 278.698 246.848 275.324 246.631C 271.42 246.408 271.042 247.245 271.104 247.534z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 271.23 247.572C 271.324 249.354 275.615 249.665 279.611 250.477C 283.681 251.336 286.175 251.972 287.551 255.655C 288.787 259.223 287.272 261.332 289.07 261.257C 291.991 260.876 293.247 257.951 293.11 256.019C 292.992 253.923 290.339 251.073 285.232 249.165C 281.432 247.744 278.747 246.912 275.415 246.685C 271.653 246.461 271.159 247.242 271.23 247.572z"/>
+        <path style="stroke:none; fill:#222222" d="M 271.356 247.61C 271.462 249.327 275.704 249.578 279.641 250.41C 283.671 251.296 286.036 251.904 287.557 255.47C 288.92 258.918 287.36 260.885 289.131 260.846C 291.877 260.517 293.093 257.81 292.947 255.907C 292.814 253.82 290.225 251.099 285.191 249.223C 281.438 247.822 278.796 246.976 275.506 246.738C 271.886 246.513 271.277 247.239 271.356 247.61z"/>
+        <path style="stroke:none; fill:#262626" d="M 271.482 247.648C 271.6 249.3 275.793 249.49 279.672 250.343C 283.662 251.256 285.897 251.835 287.563 255.286C 289.054 258.613 287.448 260.438 289.192 260.435C 291.763 260.157 292.938 257.67 292.784 255.795C 292.637 253.716 290.112 251.124 285.15 249.28C 281.445 247.9 278.844 247.04 275.597 246.791C 272.119 246.565 271.394 247.236 271.482 247.648z"/>
+        <path style="stroke:none; fill:#2a2a2a" d="M 271.608 247.687C 271.737 249.274 275.882 249.403 279.702 250.277C 283.652 251.216 285.758 251.766 287.569 255.102C 289.187 258.308 287.536 259.992 289.253 260.024C 291.649 259.797 292.783 257.53 292.621 255.684C 292.459 253.612 289.998 251.15 285.109 249.337C 281.451 247.978 278.893 247.104 275.688 246.845C 272.352 246.618 271.511 247.234 271.608 247.687z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 271.734 247.725C 271.875 249.247 275.971 249.316 279.733 250.21C 283.642 251.176 285.619 251.698 287.575 254.917C 289.321 258.002 287.625 259.545 289.314 259.613C 291.535 259.438 292.628 257.389 292.458 255.572C 292.281 253.508 289.885 251.176 285.069 249.395C 281.457 248.056 278.941 247.168 275.779 246.898C 272.585 246.67 271.628 247.231 271.734 247.725z"/>
+        <path style="stroke:none; fill:#313131" d="M 271.86 247.763C 272.013 249.22 276.06 249.229 279.763 250.144C 283.633 251.136 285.48 251.629 287.581 254.733C 289.454 257.697 287.713 259.098 289.375 259.202C 291.421 259.078 292.473 257.249 292.295 255.46C 292.103 253.405 289.771 251.202 285.028 249.452C 281.463 248.134 278.99 247.232 275.87 246.952C 272.818 246.723 271.745 247.228 271.86 247.763z"/>
+        <path style="stroke:none; fill:#353535" d="M 271.986 247.802C 272.151 249.193 276.149 249.142 279.794 250.077C 283.623 251.095 285.341 251.56 287.588 254.549C 289.588 257.392 287.801 258.652 289.435 258.791C 291.308 258.718 292.318 257.109 292.132 255.348C 291.926 253.301 289.658 251.228 284.987 249.51C 281.47 248.211 279.039 247.295 275.961 247.005C 273.051 246.775 271.862 247.225 271.986 247.802z"/>
+        <path style="stroke:none; fill:#393939" d="M 272.112 247.84C 272.288 249.166 276.238 249.055 279.824 250.01C 283.613 251.055 285.202 251.492 287.594 254.364C 289.721 257.087 287.889 258.205 289.496 258.38C 291.194 258.359 292.163 256.968 291.969 255.236C 291.748 253.197 289.544 251.254 284.946 249.567C 281.476 248.289 279.087 247.359 276.052 247.058C 273.284 246.827 271.979 247.222 272.112 247.84z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 272.238 247.878C 272.426 249.139 276.327 248.968 279.855 249.944C 283.604 251.015 285.063 251.423 287.6 254.18C 289.855 256.781 287.977 257.758 289.557 257.969C 291.08 257.999 292.009 256.828 291.806 255.125C 291.57 253.093 289.431 251.28 284.905 249.625C 281.482 248.367 279.136 247.423 276.143 247.112C 273.517 246.88 272.097 247.219 272.238 247.878z"/>
+        <path style="stroke:none; fill:#414141" d="M 272.364 247.917C 272.564 249.112 276.416 248.881 279.886 249.877C 283.594 250.975 284.924 251.354 287.606 253.996C 289.989 256.476 288.066 257.312 289.618 257.558C 290.966 257.639 291.854 256.688 291.643 255.013C 291.392 252.99 289.318 251.306 284.865 249.682C 281.488 248.445 279.184 247.487 276.234 247.165C 273.749 246.932 272.214 247.216 272.364 247.917z"/>
+        <path style="stroke:none; fill:#444444" d="M 272.49 247.955C 272.702 249.085 276.505 248.794 279.916 249.811C 283.584 250.935 284.785 251.286 287.612 253.811C 290.122 256.171 288.154 256.865 289.679 257.147C 290.852 257.28 291.699 256.547 291.48 254.901C 291.215 252.886 289.204 251.332 284.824 249.74C 281.495 248.523 279.233 247.551 276.325 247.219C 273.982 246.985 272.331 247.213 272.49 247.955z"/>
+        <path style="stroke:none; fill:#484848" d="M 272.616 247.993C 272.839 249.058 276.594 248.707 279.947 249.744C 283.575 250.895 284.646 251.217 287.618 253.627C 290.256 255.866 288.242 256.418 289.74 256.736C 290.738 256.92 291.544 256.407 291.317 254.789C 291.037 252.782 289.091 251.358 284.783 249.797C 281.501 248.601 279.282 247.615 276.416 247.272C 274.215 247.037 272.448 247.21 272.616 247.993z"/>
+      </g>
+      <path style="stroke:none; fill:#4c4c4c" d="M 272.742 248.031C 272.977 249.031 276.683 248.619 279.977 249.677C 283.565 250.854 284.507 251.148 287.624 253.442C 290.389 255.56 288.33 255.971 289.801 256.325C 290.624 256.56 291.389 256.266 291.154 254.677C 290.859 252.678 288.977 251.383 284.742 249.854C 281.507 248.678 279.33 247.678 276.507 247.325C 274.448 247.089 272.565 247.207 272.742 248.031z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#4c4c4c" d="M 287.565 252.854C 289.212 253.854 288.918 254.913 289.977 255.619C 290.506 255.971 291.389 255.971 290.859 254.619C 290.153 253.031 289.565 252.148 285.918 250.677C 283.565 249.736 284.036 250.736 287.565 252.854z"/>
+      <g>
+        <path style="stroke:none; fill:#505050" d="M 287.609 252.867C 289.215 253.842 288.929 254.875 289.962 255.564C 290.478 255.907 291.339 255.907 290.822 254.588C 290.133 253.039 289.56 252.178 286.002 250.743C 283.707 249.825 284.166 250.801 287.609 252.867z"/>
+        <path style="stroke:none; fill:#545454" d="M 287.652 252.879C 289.219 253.83 288.939 254.837 289.946 255.508C 290.449 255.843 291.289 255.843 290.785 254.557C 290.114 253.047 289.554 252.207 286.086 250.808C 283.848 249.914 284.296 250.865 287.652 252.879z"/>
+        <path style="stroke:none; fill:#575757" d="M 287.696 252.891C 289.222 253.817 288.95 254.799 289.931 255.453C 290.421 255.779 291.239 255.779 290.748 254.526C 290.094 253.055 289.549 252.237 286.17 250.874C 283.99 250.002 284.426 250.929 287.696 252.891z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 287.74 252.903C 289.225 253.805 288.96 254.76 289.915 255.397C 290.393 255.715 291.189 255.715 290.711 254.495C 290.074 253.063 289.544 252.266 286.254 250.939C 284.132 250.091 284.557 250.993 287.74 252.903z"/>
+        <path style="stroke:none; fill:#5f5f5f" d="M 287.783 252.915C 289.229 253.793 288.971 254.722 289.9 255.341C 290.364 255.65 291.139 255.65 290.674 254.464C 290.054 253.07 289.538 252.296 286.338 251.005C 284.273 250.179 284.687 251.057 287.783 252.915z"/>
+        <path style="stroke:none; fill:#636363" d="M 287.827 252.927C 289.232 253.78 288.981 254.684 289.884 255.286C 290.336 255.586 291.089 255.586 290.637 254.433C 290.035 253.078 289.533 252.325 286.422 251.07C 284.415 250.268 284.817 251.121 287.827 252.927z"/>
+        <path style="stroke:none; fill:#676767" d="M 287.871 252.94C 289.235 253.768 288.992 254.645 289.869 255.23C 290.307 255.522 291.039 255.522 290.6 254.402C 290.015 253.086 289.528 252.355 286.506 251.136C 284.557 250.356 284.947 251.185 287.871 252.94z"/>
+        <path style="stroke:none; fill:#6b6b6b" d="M 287.914 252.952C 289.239 253.756 289.002 254.607 289.854 255.175C 290.279 255.458 290.989 255.458 290.563 254.371C 289.995 253.094 289.522 252.384 286.59 251.201C 284.698 250.445 285.077 251.249 287.914 252.952z"/>
+        <path style="stroke:none; fill:#6e6e6e" d="M 287.958 252.964C 289.242 253.743 289.013 254.569 289.838 255.119C 290.251 255.394 290.939 255.394 290.526 254.34C 289.975 253.102 289.517 252.414 286.674 251.267C 284.84 250.533 285.207 251.313 287.958 252.964z"/>
+        <path style="stroke:none; fill:#727272" d="M 288.002 252.976C 289.245 253.731 289.023 254.53 289.823 255.063C 290.222 255.329 290.889 255.329 290.489 254.308C 289.956 253.109 289.512 252.443 286.758 251.332C 284.982 250.622 285.337 251.377 288.002 252.976z"/>
+        <path style="stroke:none; fill:#767676" d="M 288.045 252.988C 289.248 253.719 289.034 254.492 289.807 255.008C 290.194 255.265 290.839 255.265 290.452 254.277C 289.936 253.117 289.506 252.472 286.842 251.398C 285.123 250.711 285.467 251.441 288.045 252.988z"/>
+        <path style="stroke:none; fill:#7a7a7a" d="M 288.089 253C 289.252 253.706 289.044 254.454 289.792 254.952C 290.165 255.201 290.789 255.201 290.415 254.246C 289.916 253.125 289.501 252.502 286.926 251.463C 285.265 250.799 285.597 251.505 288.089 253z"/>
+        <path style="stroke:none; fill:#7e7e7e" d="M 288.133 253.012C 289.255 253.694 289.055 254.416 289.776 254.897C 290.137 255.137 290.738 255.137 290.378 254.215C 289.896 253.133 289.496 252.531 287.01 251.529C 285.407 250.888 285.727 251.569 288.133 253.012z"/>
+        <path style="stroke:none; fill:#828282" d="M 288.176 253.025C 289.258 253.682 289.065 254.377 289.761 254.841C 290.109 255.073 290.688 255.073 290.34 254.184C 289.877 253.141 289.49 252.561 287.094 251.594C 285.548 250.976 285.858 251.633 288.176 253.025z"/>
+        <path style="stroke:none; fill:#858585" d="M 288.22 253.037C 289.262 253.669 289.076 254.339 289.745 254.785C 290.08 255.008 290.638 255.008 290.303 254.153C 289.857 253.148 289.485 252.59 287.178 251.66C 285.69 251.065 285.988 251.697 288.22 253.037z"/>
+        <path style="stroke:none; fill:#898989" d="M 288.264 253.049C 289.265 253.657 289.086 254.301 289.73 254.73C 290.052 254.944 290.588 254.944 290.266 254.122C 289.837 253.156 289.48 252.62 287.262 251.725C 285.832 251.153 286.118 251.761 288.264 253.049z"/>
+        <path style="stroke:none; fill:#8d8d8d" d="M 288.307 253.061C 289.268 253.645 289.097 254.262 289.715 254.674C 290.023 254.88 290.538 254.88 290.229 254.091C 289.817 253.164 289.474 252.649 287.346 251.791C 285.973 251.242 286.248 251.825 288.307 253.061z"/>
+        <path style="stroke:none; fill:#919191" d="M 288.351 253.073C 289.272 253.632 289.107 254.224 289.699 254.619C 289.995 254.816 290.488 254.816 290.192 254.06C 289.798 253.172 289.469 252.679 287.43 251.856C 286.115 251.33 286.378 251.889 288.351 253.073z"/>
+        <path style="stroke:none; fill:#959595" d="M 288.395 253.085C 289.275 253.62 289.118 254.186 289.684 254.563C 289.967 254.752 290.438 254.752 290.155 254.029C 289.778 253.18 289.464 252.708 287.514 251.922C 286.257 251.419 286.508 251.953 288.395 253.085z"/>
+      </g>
+      <path style="stroke:none; fill:#999999" d="M 288.438 253.097C 289.278 253.607 289.128 254.147 289.668 254.507C 289.938 254.687 290.388 254.687 290.118 253.997C 289.758 253.187 289.458 252.737 287.598 251.987C 286.398 251.507 286.638 252.017 288.438 253.097z"/>
+    </g>
+    <g>
+      <path style="stroke:none; fill:#000000" d="M 222.275 107.427C 221.537 108.329 222.849 115.792 227.687 120.712C 232.526 125.55 235.478 125.55 237.446 123.418C 241.218 119.4 238.184 115.627 235.888 113.003C 233.592 110.379 230.64 111.281 227.933 108.657C 225.227 106.033 223.341 106.197 222.275 107.427z"/>
+      <g>
+        <path style="stroke:none; fill:#050505" d="M 222.345 107.494C 221.613 108.389 222.915 115.794 227.715 120.676C 232.517 125.477 235.446 125.477 237.399 123.361C 241.141 119.374 238.131 115.631 235.853 113.027C 233.575 110.423 230.645 111.318 227.96 108.715C 225.275 106.111 223.403 106.274 222.345 107.494z"/>
+        <path style="stroke:none; fill:#0a0a0a" d="M 222.416 107.561C 221.689 108.449 222.981 115.796 227.744 120.64C 232.507 125.403 235.414 125.403 237.351 123.304C 241.064 119.348 238.078 115.634 235.817 113.051C 233.557 110.467 230.651 111.355 227.986 108.772C 225.322 106.189 223.465 106.35 222.416 107.561z"/>
+        <path style="stroke:none; fill:#0f0f0f" d="M 222.486 107.628C 221.765 108.509 223.047 115.798 227.772 120.604C 232.498 125.329 235.381 125.329 237.304 123.246C 240.988 119.322 238.024 115.637 235.782 113.074C 233.539 110.511 230.656 111.392 228.012 108.83C 225.369 106.267 223.527 106.427 222.486 107.628z"/>
+        <path style="stroke:none; fill:#141414" d="M 222.556 107.695C 221.841 108.569 223.113 115.8 227.8 120.567C 232.489 125.255 235.349 125.255 237.256 123.189C 240.911 119.296 237.971 115.64 235.746 113.098C 233.522 110.555 230.661 111.429 228.039 108.887C 225.417 106.344 223.589 106.503 222.556 107.695z"/>
+        <path style="stroke:none; fill:#191919" d="M 222.627 107.762C 221.917 108.629 223.178 115.802 227.829 120.531C 232.479 125.181 235.317 125.181 237.208 123.132C 240.834 119.27 237.918 115.643 235.711 113.121C 233.504 110.599 230.667 111.466 228.065 108.944C 225.464 106.422 223.651 106.58 222.627 107.762z"/>
+        <path style="stroke:none; fill:#1e1e1e" d="M 222.697 107.829C 221.993 108.689 223.244 115.804 227.857 120.495C 232.47 125.107 235.285 125.107 237.161 123.074C 240.757 119.244 237.864 115.647 235.675 113.145C 233.487 110.643 230.672 111.503 228.091 109.002C 225.512 106.5 223.713 106.656 222.697 107.829z"/>
+        <path style="stroke:none; fill:#232323" d="M 222.767 107.896C 222.07 108.749 223.31 115.806 227.885 120.458C 232.461 125.033 235.252 125.033 237.113 123.017C 240.68 119.217 237.811 115.65 235.64 113.169C 233.469 110.687 230.677 111.54 228.118 109.059C 225.559 106.578 223.775 106.733 222.767 107.896z"/>
+        <path style="stroke:none; fill:#282828" d="M 222.838 107.963C 222.146 108.809 223.376 115.808 227.914 120.422C 232.451 124.959 235.22 124.959 237.066 122.96C 240.603 119.191 237.758 115.653 235.605 113.192C 233.451 110.731 230.683 111.577 228.144 109.116C 225.606 106.655 223.837 106.809 222.838 107.963z"/>
+        <path style="stroke:none; fill:#2d2d2d" d="M 222.908 108.03C 222.222 108.869 223.442 115.81 227.942 120.386C 232.442 124.885 235.188 124.885 237.018 122.902C 240.527 119.165 237.704 115.656 235.569 113.216C 233.434 110.775 230.688 111.614 228.17 109.174C 225.654 106.733 223.899 106.886 222.908 108.03z"/>
+        <path style="stroke:none; fill:#333333" d="M 222.978 108.096C 222.298 108.928 223.508 115.811 227.97 120.349C 232.433 124.811 235.156 124.811 236.971 122.845C 240.45 119.139 237.651 115.659 235.534 113.239C 233.416 110.819 230.693 111.651 228.197 109.231C 225.701 106.811 223.961 106.962 222.978 108.096z"/>
+        <path style="stroke:none; fill:#383838" d="M 223.048 108.163C 222.374 108.988 223.574 115.813 227.998 120.313C 232.423 124.738 235.123 124.738 236.923 122.788C 240.373 119.113 237.598 115.663 235.498 113.263C 233.399 110.863 230.698 111.688 228.223 109.288C 225.749 106.889 224.023 107.038 223.048 108.163z"/>
+        <path style="stroke:none; fill:#3d3d3d" d="M 223.119 108.23C 222.45 109.048 223.639 115.815 228.027 120.277C 232.414 124.664 235.091 124.664 236.876 122.73C 240.296 119.087 237.545 115.666 235.463 113.287C 233.381 110.907 230.704 111.725 228.249 109.346C 225.796 106.966 224.085 107.115 223.119 108.23z"/>
+        <path style="stroke:none; fill:#424242" d="M 223.189 108.297C 222.526 109.108 223.705 115.817 228.055 120.241C 232.405 124.59 235.059 124.59 236.828 122.673C 240.219 119.061 237.491 115.669 235.427 113.31C 233.363 110.951 230.709 111.762 228.276 109.403C 225.843 107.044 224.147 107.191 223.189 108.297z"/>
+        <path style="stroke:none; fill:#474747" d="M 223.259 108.364C 222.602 109.168 223.771 115.819 228.083 120.204C 232.395 124.516 235.027 124.516 236.78 122.616C 240.142 119.034 237.438 115.672 235.392 113.334C 233.346 110.995 230.714 111.799 228.302 109.46C 225.891 107.122 224.209 107.268 223.259 108.364z"/>
+        <path style="stroke:none; fill:#4c4c4c" d="M 223.33 108.431C 222.678 109.228 223.837 115.821 228.112 120.168C 232.386 124.442 234.994 124.442 236.733 122.558C 240.065 119.008 237.385 115.675 235.356 113.357C 233.328 111.039 230.72 111.836 228.328 109.518C 225.938 107.2 224.271 107.344 223.33 108.431z"/>
+        <path style="stroke:none; fill:#515151" d="M 223.4 108.498C 222.754 109.288 223.903 115.823 228.14 120.132C 232.377 124.368 234.962 124.368 236.685 122.501C 239.989 118.982 237.331 115.679 235.321 113.381C 233.311 111.083 230.725 111.873 228.355 109.575C 225.986 107.277 224.333 107.421 223.4 108.498z"/>
+        <path style="stroke:none; fill:#565656" d="M 223.47 108.565C 222.83 109.348 223.969 115.825 228.168 120.095C 232.367 124.294 234.93 124.294 236.638 122.444C 239.912 118.956 237.278 115.682 235.286 113.405C 233.293 111.127 230.73 111.91 228.381 109.632C 226.033 107.355 224.395 107.497 223.47 108.565z"/>
+        <path style="stroke:none; fill:#5b5b5b" d="M 223.541 108.632C 222.906 109.408 224.034 115.827 228.197 120.059C 232.358 124.22 234.898 124.22 236.59 122.386C 239.835 118.93 237.225 115.685 235.25 113.428C 233.275 111.171 230.736 111.947 228.407 109.69C 226.08 107.433 224.457 107.574 223.541 108.632z"/>
+        <path style="stroke:none; fill:#606060" d="M 223.611 108.699C 222.982 109.468 224.1 115.829 228.225 120.023C 232.349 124.146 234.865 124.146 236.543 122.329C 239.758 118.904 237.171 115.688 235.215 113.452C 233.258 111.215 230.741 111.984 228.434 109.747C 226.128 107.511 224.519 107.65 223.611 108.699z"/>
+      </g>
+      <path style="stroke:none; fill:#666666" d="M 223.681 108.765C 223.058 109.527 224.166 115.83 228.253 119.986C 232.339 124.072 234.833 124.072 236.495 122.271C 239.681 118.877 237.118 115.691 235.179 113.475C 233.24 111.258 230.746 112.02 228.46 109.804C 226.175 107.588 224.581 107.726 223.681 108.765z"/>
+    </g>
+  </g>
+  <g>
+    <g>
+      <path style="stroke:none; fill:#ffcc00" d="M 137.79 109.277C 139.767 110.643 139.821 110.884 142.738 112.791C 147.378 116.559 155.623 117.407 159.66 117.541C 168.893 119.008 185.398 110.38 191.933 106.43C 195.224 103.967 201.313 98.8795 203.593 98.7935C 204.998 100.279 202.932 100.585 200.006 102.569C 196.099 105.348 192.756 107.725 186.834 111.084C 180.496 114.4 170.756 119.878 158.286 119.138C 151.744 118.179 151.719 118.114 147.679 116.052C 145.279 114.319 139.778 111.443 137.79 [...]
+      <g>
+        <defs>
+          <linearGradient id="1" x1="137.742" y1="108.994" x2="203.998" y2="108.994" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#fac700"/>
+            <stop offset="0.415" style="stop-color:#f7c400"/>
+            <stop offset="1" style="stop-color:#f7c400"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#1)" d="M 137.742 109.259C 139.668 110.533 139.907 110.902 142.825 112.813C 147.441 116.547 155.541 117.429 159.621 117.576C 168.986 119.028 185.671 110.282 191.977 106.417C 195.335 103.911 201.321 98.9195 203.572 98.8134C 204.937 100.285 202.844 100.581 199.884 102.628C 195.995 105.381 192.764 107.693 186.912 111.011C 180.622 114.302 170.834 119.806 158.376 119.115C 151.815 118.17 151.525 118.045 147.618 116.036C 145.15 114.28 139.742 111.448 1 [...]
+        <defs>
+          <linearGradient id="2" x1="137.693" y1="108.988" x2="203.953" y2="108.988" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#f6c200"/>
+            <stop offset="0.415" style="stop-color:#efbc00"/>
+            <stop offset="1" style="stop-color:#efbc00"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#2)" d="M 137.693 109.24C 139.569 110.423 139.993 110.92 142.911 112.835C 147.504 116.535 155.459 117.451 159.581 117.611C 169.079 119.048 185.945 110.183 192.021 106.404C 195.446 103.854 201.329 98.9595 203.55 98.8333C 204.876 100.29 202.755 100.576 199.761 102.688C 195.891 105.413 192.771 107.661 186.991 110.938C 180.748 114.204 170.913 119.734 158.466 119.092C 151.886 118.161 151.332 117.975 147.557 116.019C 145.021 114.24 139.705 111.452 137 [...]
+        <defs>
+          <linearGradient id="3" x1="137.645" y1="108.983" x2="203.909" y2="108.983" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#f1bd00"/>
+            <stop offset="0.415" style="stop-color:#e8b500"/>
+            <stop offset="1" style="stop-color:#e8b500"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#3)" d="M 137.645 109.222C 139.47 110.313 140.079 110.937 142.997 112.857C 147.566 116.522 155.377 117.472 159.541 117.646C 169.172 119.068 186.218 110.084 192.065 106.391C 195.556 103.797 201.337 98.9995 203.528 98.8532C 204.815 100.295 202.667 100.571 199.639 102.746C 195.787 105.445 192.779 107.628 187.069 110.865C 180.874 114.106 170.991 119.662 158.556 119.068C 151.957 118.152 151.138 117.905 147.496 116.002C 144.892 114.201 139.669 111.456 [...]
+        <defs>
+          <linearGradient id="4" x1="137.596" y1="108.978" x2="203.865" y2="108.978" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#edb800"/>
+            <stop offset="0.415" style="stop-color:#e0ad00"/>
+            <stop offset="1" style="stop-color:#e0ad00"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#4)" d="M 137.596 109.203C 139.371 110.203 140.165 110.955 143.084 112.879C 147.629 116.51 155.295 117.494 159.502 117.68C 169.265 119.088 186.491 109.985 192.11 106.378C 195.667 103.741 201.346 99.0395 203.507 98.8731C 204.754 100.3 202.579 100.566 199.516 102.805C 195.683 105.477 192.787 107.596 187.147 110.791C 180.999 114.008 171.069 119.59 158.646 119.045C 152.027 118.143 150.944 117.835 147.436 115.986C 144.763 114.161 139.632 111.461 137. [...]
+        <defs>
+          <linearGradient id="5" x1="137.548" y1="108.973" x2="203.822" y2="108.973" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#e9b300"/>
+            <stop offset="0.415" style="stop-color:#d8a500"/>
+            <stop offset="1" style="stop-color:#d8a500"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#5)" d="M 137.548 109.184C 139.271 110.093 140.251 110.972 143.17 112.901C 147.692 116.498 155.213 117.516 159.462 117.715C 169.358 119.108 186.764 109.886 192.154 106.365C 195.778 103.684 201.354 99.0795 203.485 98.893C 204.693 100.305 202.49 100.561 199.393 102.865C 195.579 105.509 192.794 107.563 187.225 110.718C 181.125 113.91 171.148 119.518 158.736 119.021C 152.098 118.134 150.75 117.765 147.375 115.969C 144.634 114.121 139.596 111.465 137 [...]
+        <defs>
+          <linearGradient id="6" x1="137.499" y1="108.968" x2="203.779" y2="108.968" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#e4ae00"/>
+            <stop offset="0.415" style="stop-color:#d19e00"/>
+            <stop offset="1" style="stop-color:#d19e00"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#6)" d="M 137.499 109.166C 139.172 109.983 140.337 110.99 143.256 112.923C 147.755 116.485 155.131 117.537 159.422 117.75C 169.451 119.128 187.037 109.787 192.198 106.352C 195.889 103.627 201.362 99.1195 203.463 98.9129C 204.632 100.31 202.402 100.557 199.271 102.923C 195.475 105.541 192.802 107.531 187.303 110.645C 181.251 113.812 171.226 119.446 158.826 118.998C 152.169 118.125 150.556 117.695 147.314 115.952C 144.505 114.082 139.559 111.469 1 [...]
+        <defs>
+          <linearGradient id="7" x1="137.451" y1="108.964" x2="203.737" y2="108.964" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#e0a900"/>
+            <stop offset="0.415" style="stop-color:#c99600"/>
+            <stop offset="1" style="stop-color:#c99600"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#7)" d="M 137.451 109.147C 139.073 109.873 140.423 111.007 143.343 112.945C 147.817 116.473 155.048 117.559 159.383 117.785C 169.544 119.147 187.311 109.688 192.242 106.338C 195.999 103.571 201.37 99.1595 203.442 98.9328C 204.572 100.315 202.314 100.552 199.148 102.982C 195.371 105.574 192.809 107.499 187.382 110.571C 181.377 113.714 171.304 119.374 158.916 118.975C 152.24 118.116 150.363 117.625 147.253 115.936C 144.376 114.042 139.523 111.474  [...]
+        <defs>
+          <linearGradient id="8" x1="137.403" y1="108.96" x2="203.696" y2="108.96" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#dca400"/>
+            <stop offset="0.415" style="stop-color:#c18e00"/>
+            <stop offset="1" style="stop-color:#c18e00"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#8)" d="M 137.403 109.129C 138.974 109.763 140.509 111.025 143.429 112.967C 147.88 116.461 154.966 117.581 159.343 117.819C 169.637 119.167 187.584 109.589 192.286 106.325C 196.11 103.514 201.378 99.1995 203.42 98.9527C 204.511 100.32 202.225 100.547 199.026 103.041C 195.267 105.606 192.817 107.466 187.46 110.498C 181.503 113.616 171.383 119.302 159.006 118.951C 152.311 118.107 150.169 117.555 147.192 115.919C 144.247 114.002 139.486 111.478 137 [...]
+        <defs>
+          <linearGradient id="9" x1="137.354" y1="108.956" x2="203.655" y2="108.956" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#d79f00"/>
+            <stop offset="0.415" style="stop-color:#ba8700"/>
+            <stop offset="1" style="stop-color:#ba8700"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#9)" d="M 137.354 109.11C 138.875 109.653 140.595 111.042 143.515 112.989C 147.943 116.448 154.884 117.602 159.303 117.854C 169.73 119.187 187.857 109.49 192.33 106.312C 196.221 103.457 201.386 99.2395 203.398 98.9726C 204.45 100.325 202.137 100.542 198.903 103.1C 195.163 105.638 192.825 107.434 187.538 110.425C 181.628 113.518 171.461 119.23 159.096 118.928C 152.381 118.098 149.975 117.485 147.131 115.902C 144.118 113.963 139.45 111.482 137.354 [...]
+        <defs>
+          <linearGradient id="10" x1="137.306" y1="108.953" x2="203.615" y2="108.953" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#d39b00"/>
+            <stop offset="0.415" style="stop-color:#b27f00"/>
+            <stop offset="1" style="stop-color:#b27f00"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#10)" d="M 137.306 109.091C 138.776 109.542 140.681 111.06 143.602 113.01C 148.006 116.436 154.802 117.624 159.264 117.889C 169.823 119.207 188.13 109.391 192.374 106.299C 196.332 103.4 201.394 99.2795 203.377 98.9925C 204.389 100.33 202.049 100.537 198.781 103.159C 195.059 105.67 192.832 107.401 187.616 110.351C 181.754 113.419 171.539 119.158 159.186 118.904C 152.452 118.088 149.781 117.415 147.07 115.885C 143.989 113.923 139.413 111.486 137.3 [...]
+        <defs>
+          <linearGradient id="11" x1="137.257" y1="108.949" x2="203.576" y2="108.949" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#cf9600"/>
+            <stop offset="0.415" style="stop-color:#aa7700"/>  <stop offset="1" style="stop-color:#aa7700"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#11)" d="M 137.257 109.073C 138.677 109.432 140.767 111.078 143.688 113.032C 148.068 116.424 154.72 117.646 159.224 117.924C 169.916 119.227 188.403 109.293 192.418 106.286C 196.442 103.344 201.402 99.3195 203.355 99.0124C 204.328 100.335 201.96 100.533 198.658 103.218C 194.955 105.702 192.84 107.369 187.694 110.278C 181.88 113.321 171.617 119.086 159.276 118.881C 152.523 118.079 149.587 117.346 147.009 115.869C 143.86 113.883 139.377 111.491 13 [...]
+        <defs>
+          <linearGradient id="12" x1="137.209" y1="108.947" x2="203.537" y2="108.947" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#ca9100"/>
+            <stop offset="0.415" style="stop-color:#a37000"/>
+            <stop offset="1" style="stop-color:#a37000"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#12)" d="M 137.209 109.054C 138.577 109.322 140.853 111.095 143.774 113.054C 148.131 116.411 154.638 117.667 159.184 117.958C 170.009 119.247 188.677 109.194 192.462 106.273C 196.553 103.287 201.41 99.3595 203.333 99.0323C 204.267 100.34 201.872 100.528 198.536 103.277C 194.851 105.734 192.847 107.337 187.773 110.205C 182.006 113.223 171.696 119.014 159.366 118.858C 152.594 118.07 149.394 117.276 146.948 115.852C 143.731 113.844 139.34 111.495 1 [...]
+        <defs>
+          <linearGradient id="13" x1="137.16" y1="108.944" x2="203.499" y2="108.944" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#c68c00"/>
+            <stop offset="0.415" style="stop-color:#9b6800"/>
+            <stop offset="1" style="stop-color:#9b6800"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#13)" d="M 137.16 109.036C 138.478 109.212 140.939 111.113 143.861 113.076C 148.194 116.399 154.556 117.689 159.145 117.993C 170.102 119.267 188.95 109.095 192.506 106.26C 196.664 103.23 201.418 99.3995 203.312 99.0522C 204.206 100.345 201.784 100.523 198.413 103.336C 194.747 105.766 192.855 107.304 187.851 110.132C 182.132 113.125 171.774 118.942 159.456 118.834C 152.665 118.061 149.2 117.206 146.887 115.835C 143.602 113.804 139.304 111.499 137 [...]
+        <defs>
+          <linearGradient id="14" x1="137.112" y1="108.942" x2="203.461" y2="108.942" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#c28700"/>
+            <stop offset="0.415" style="stop-color:#936000"/>
+            <stop offset="1" style="stop-color:#936000"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#14)" d="M 137.112 109.017C 138.379 109.102 141.024 111.13 143.947 113.098C 148.257 116.387 154.474 117.711 159.105 118.028C 170.195 119.286 189.223 108.996 192.551 106.246C 196.775 103.174 201.427 99.4395 203.29 99.0721C 204.145 100.35 201.695 100.518 198.29 103.395C 194.642 105.799 192.863 107.272 187.929 110.058C 182.257 113.027 171.852 118.87 159.546 118.811C 152.735 118.052 149.006 117.136 146.827 115.819C 143.473 113.764 139.267 111.504 13 [...]
+        <defs>
+          <linearGradient id="15" x1="137.063" y1="108.94" x2="203.425" y2="108.94" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#bd8200"/>
+            <stop offset="0.415" style="stop-color:#8c5900"/>
+            <stop offset="1" style="stop-color:#8c5900"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#15)" d="M 137.063 108.998C 138.28 108.992 141.11 111.148 144.033 113.12C 148.319 116.374 154.392 117.732 159.065 118.063C 170.288 119.306 189.496 108.897 192.595 106.233C 196.885 103.117 201.435 99.4795 203.268 99.092C 204.084 100.355 201.607 100.513 198.168 103.454C 194.538 105.831 192.87 107.239 188.007 109.985C 182.383 112.929 171.931 118.798 159.636 118.787C 152.806 118.043 148.812 117.066 146.766 115.802C 143.344 113.725 139.231 111.508 13 [...]
+        <defs>
+          <linearGradient id="16" x1="137.015" y1="108.938" x2="203.389" y2="108.938" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#b97d00"/>
+            <stop offset="0.415" style="stop-color:#845100"/>
+            <stop offset="1" style="stop-color:#845100"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#16)" d="M 137.015 108.98C 138.181 108.882 141.196 111.165 144.12 113.142C 148.382 116.362 154.31 117.754 159.026 118.097C 170.381 119.326 189.769 108.798 192.639 106.22C 196.996 103.06 201.443 99.5195 203.247 99.1119C 204.023 100.36 201.519 100.509 198.045 103.513C 194.434 105.863 192.878 107.207 188.085 109.912C 182.509 112.831 172.009 118.726 159.726 118.764C 152.877 118.034 148.618 116.996 146.705 115.785C 143.215 113.685 139.194 111.512 137 [...]
+        <defs>
+          <linearGradient id="17" x1="136.967" y1="108.936" x2="203.353" y2="108.936" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#b57800"/>
+            <stop offset="0.415" style="stop-color:#7c4900"/>
+            <stop offset="1" style="stop-color:#7c4900"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#17)" d="M 136.967 108.961C 138.082 108.772 141.282 111.183 144.206 113.164C 148.445 116.35 154.227 117.776 158.986 118.132C 170.474 119.346 190.043 108.699 192.683 106.207C 197.107 103.004 201.451 99.5595 203.225 99.1318C 203.962 100.365 201.43 100.504 197.923 103.572C 194.33 105.895 192.885 107.175 188.164 109.838C 182.635 112.733 172.087 118.654 159.816 118.741C 152.948 118.025 148.425 116.926 146.644 115.769C 143.086 113.645 139.158 111.517  [...]
+        <defs>
+          <linearGradient id="18" x1="136.918" y1="108.934" x2="203.319" y2="108.934" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#b07300"/>
+            <stop offset="0.415" style="stop-color:#754200"/>
+            <stop offset="1" style="stop-color:#754200"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#18)" d="M 136.918 108.943C 137.982 108.662 141.368 111.2 144.292 113.186C 148.508 116.337 154.145 117.797 158.946 118.167C 170.567 119.366 190.316 108.6 192.727 106.194C 197.218 102.947 201.459 99.5995 203.203 99.1517C 203.901 100.37 201.342 100.499 197.8 103.631C 194.226 105.927 192.893 107.142 188.242 109.765C 182.761 112.635 172.166 118.582 159.906 118.717C 153.019 118.016 148.231 116.856 146.583 115.752C 142.957 113.606 139.121 111.521 136. [...]
+        <defs>
+          <linearGradient id="19" x1="136.87" y1="108.933" x2="203.284" y2="108.933" gradientUnits="userSpaceOnUse">
+            <stop offset="0" style="stop-color:#ac6e00"/>
+            <stop offset="0.415" style="stop-color:#6d3a00"/>
+            <stop offset="1" style="stop-color:#6d3a00"/>
+          </linearGradient>
+        </defs>
+        <path style="stroke:none; fill:url(#19)" d="M 136.87 108.924C 137.883 108.552 141.454 111.218 144.379 113.208C 148.57 116.325 154.063 117.819 158.907 118.202C 170.66 119.386 190.589 108.501 192.771 106.181C 197.328 102.89 201.467 99.6395 203.182 99.1716C 203.84 100.375 201.254 100.494 197.678 103.69C 194.122 105.959 192.901 107.11 188.32 109.692C 182.886 112.537 172.244 118.51 159.996 118.694C 153.089 118.007 148.037 116.786 146.522 115.735C 142.828 113.566 139.085 111.525 136.87 [...]
+      </g>
+      <defs  id="defs1801">
+        <linearGradient id="20" x1="136.821" y1="108.931" x2="203.251" y2="108.931" gradientUnits="userSpaceOnUse">
+          <stop offset="0" style="stop-color:#a86a00"/>
+          <stop offset="0.415" style="stop-color:#663200"/>
+          <stop offset="1" style="stop-color:#663200"/>
+        </linearGradient>
+      </defs>
+      <path style="stroke:none; fill:url(#20)" d="M 136.821 108.905C 137.784 108.441 141.54 111.235 144.465 113.229C 148.633 116.312 153.981 117.84 158.867 118.236C 170.753 119.405 190.862 108.402 192.815 106.167C 197.439 102.833 201.475 99.6795 203.16 99.1915C 203.779 100.38 201.165 100.489 197.555 103.749C 194.018 105.991 192.908 107.077 188.398 109.618C 183.012 112.438 172.322 118.438 160.086 118.67C 153.16 117.997 147.843 116.716 146.461 115.718C 142.699 113.526 139.048 111.529 136.8 [...]
+    </g>
+  </g>
+</svg>
diff --git a/tests/bindings/org/gnome/rsvg/ValidateVectorIllustrations.java b/tests/bindings/org/gnome/rsvg/ValidateVectorIllustrations.java
new file mode 100644
index 0000000..c3dab1c
--- /dev/null
+++ b/tests/bindings/org/gnome/rsvg/ValidateVectorIllustrations.java
@@ -0,0 +1,117 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.rsvg;
+
+/*
+ * Inspired by org.gnome.gdk.ValidateImageHandling
+ */
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.freedesktop.cairo.Context;
+import org.freedesktop.cairo.Format;
+import org.freedesktop.cairo.ImageSurface;
+import org.freedesktop.cairo.Surface;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gtk.GraphicalTestCase;
+
+/**
+ * @author Andrew Cowie
+ */
+public class ValidateVectorIllustrations extends GraphicalTestCase
+{
+    /*
+     * Is this actually necessary?
+     */
+    public final void testInitializing() {
+        Rsvg.init();
+    }
+
+    public final void testLoadingFromFile() {
+        try {
+            new Handle("Linux_Tux.svg");
+            fail("Should have complained not being able to find file");
+        } catch (FileNotFoundException fnfe) {
+            // good
+        }
+
+        try {
+            new Handle("README.markdown");
+            fail("Specified file not an image, should have thrown");
+        } catch (RuntimeException re) {
+            // good
+        } catch (FileNotFoundException fnfe) {
+            fail("Should have found non-image file");
+        }
+
+        try {
+            new Handle("tests/bindings/org/gnome/rsvg/Linux_Tux.svg");
+        } catch (FileNotFoundException fnfe) {
+            fail("Target file should exist. Did someone move the test image?");
+        }
+    }
+
+    public final void testHandleMethods() throws IOException {
+        final Handle graphic;
+        final DimensionData dim;
+
+        graphic = new Handle("tests/bindings/org/gnome/rsvg/Linux_Tux.svg");
+        dim = graphic.getDimensions();
+        assertEquals(334, dim.getWidth());
+        assertEquals(393, dim.getHeight());
+
+        assertEquals(90.0, graphic.getDPIX());
+        assertEquals(90.0, graphic.getDPIY());
+    }
+
+    public final void testHandleRendering() throws IOException {
+        final Handle graphic;
+        final Surface surface;
+        final Context cr;
+        final File target;
+        final int width;
+
+        surface = new ImageSurface(Format.ARGB32, 400, 500);
+        cr = new Context(surface);
+
+        graphic = new Handle("tests/bindings/org/gnome/rsvg/Linux_Tux.svg");
+        cr.showHandle(graphic);
+
+        /*
+         * Ok, so we've exercised the code paths. How can we actually validate
+         * it? TODO This isn't much of a test; as written it just traverses
+         * the Cairo ImageSurface logic which isn't anything to do with
+         * whether or not our graphic got rendered to it.
+         */
+
+        target = new File("tmp/tests/org/gnome/rsvg/Linux_Tux.png");
+        if (target.exists()) {
+            target.delete();
+        }
+
+        surface.writeToPNG("tmp/tests/org/gnome/rsvg/Linux_Tux.png");
+        surface.finish();
+
+        assertTrue(target.exists());
+        width = Pixbuf.getFileInfoWidth("tmp/tests/org/gnome/rsvg/Linux_Tux.png");
+        assertEquals(400, width);
+    }
+}
diff --git a/tests/bindings/org/gnome/sourceview/ValidateSourceView.java b/tests/bindings/org/gnome/sourceview/ValidateSourceView.java
new file mode 100644
index 0000000..efd1f31
--- /dev/null
+++ b/tests/bindings/org/gnome/sourceview/ValidateSourceView.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.sourceview;
+
+import org.gnome.gtk.GraphicalTestCase;
+import org.gnome.gtk.TextTagTable;
+
+/**
+ * TestCase for the GtkSourceView library.
+ * 
+ * @author Stefan Schweizer
+ */
+public class ValidateSourceView extends GraphicalTestCase
+{
+    public void testGetLanguage() {
+        final LanguageManager manager;
+        Language lang;
+
+        manager = LanguageManager.getDefault();
+
+        lang = manager.getLanguage("unknownID");
+        assertNull(lang);
+
+        lang = manager.getLanguage("java");
+        assertEquals("java", lang.getID());
+        assertEquals("Java", lang.getName());
+    }
+
+    public void testCreateSourceViewWithHighlight() {
+        final SourceView view;
+        final SourceBuffer buffer;
+        final TextTagTable tagTable;
+
+        tagTable = new TextTagTable();
+        buffer = new SourceBuffer(tagTable);
+        buffer.setLanguage(LanguageManager.getDefault().getLanguage("java"));
+        view = new SourceView(buffer);
+
+        assertNotNull(view);
+        assertTrue(buffer.getHighlightSyntax());
+    }
+}
diff --git a/tests/defs/AtkCoordType.defs b/tests/defs/AtkCoordType.defs
new file mode 100644
index 0000000..7b750d3
--- /dev/null
+++ b/tests/defs/AtkCoordType.defs
@@ -0,0 +1,10 @@
+(define-enum CoordType
+  (in-module "Atk")
+  (c-name "AtkCoordType")
+  (gtype-id "ATK_TYPE_COORD_TYPE")
+  (values
+    '("screen" "ATK_XY_SCREEN")
+    '("window" "ATK_XY_WINDOW")
+  )
+)
+
diff --git a/tests/defs/AtkImage.defs b/tests/defs/AtkImage.defs
new file mode 100644
index 0000000..a99a926
--- /dev/null
+++ b/tests/defs/AtkImage.defs
@@ -0,0 +1,74 @@
+(define-interface Image
+  (in-module "Atk")
+  (c-name "AtkImage")
+  (gtype-id "ATK_TYPE_IMAGE")
+)
+
+(define-method get_image_description
+  (of-object "AtkImage")
+  (c-name "atk_image_get_image_description")
+  (return-type "const-gchar*")
+)
+
+(define-method get_image_size
+  (of-object "AtkImage")
+  (c-name "atk_image_get_image_size")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-method set_image_description
+  (of-object "AtkImage")
+  (c-name "atk_image_set_image_description")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "description")
+  )
+)
+
+(define-method get_image_position
+  (of-object "AtkImage")
+  (c-name "atk_image_get_image_position")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_image_position
+  (of-object "AtkImage")
+  (return-type "none")
+  (parameters
+    '("gint*" "x")
+    '("gint*" "y")
+    '("AtkCoordType" "coord_type")
+  )
+)
+
+(define-virtual get_image_description
+  (of-object "AtkImage")
+  (return-type "const-gchar*")
+)
+
+(define-virtual get_image_size
+  (of-object "AtkImage")
+  (return-type "none")
+  (parameters
+    '("gint*" "width")
+    '("gint*" "height")
+  )
+)
+
+(define-virtual set_image_description
+  (of-object "AtkImage")
+  (return-type "gboolean")
+  (parameters
+    '("const-gchar*" "description")
+  )
+)
+
diff --git a/tests/defs/GdkWindowState.defs b/tests/defs/GdkWindowState.defs
new file mode 100644
index 0000000..5d8441a
--- /dev/null
+++ b/tests/defs/GdkWindowState.defs
@@ -0,0 +1,15 @@
+(define-flags WindowState
+  (in-module "Gdk")
+  (c-name "GdkWindowState")
+  (gtype-id "GDK_TYPE_WINDOW_STATE")
+  (values
+    '("withdrawn" "GDK_WINDOW_STATE_WITHDRAWN")
+    '("iconified" "GDK_WINDOW_STATE_ICONIFIED")
+    '("maximized" "GDK_WINDOW_STATE_MAXIMIZED")
+    '("sticky" "GDK_WINDOW_STATE_STICKY")
+    '("fullscreen" "GDK_WINDOW_STATE_FULLSCREEN")
+    '("above" "GDK_WINDOW_STATE_ABOVE")
+    '("below" "GDK_WINDOW_STATE_BELOW")
+  )
+)
+
diff --git a/tests/defs/GtkButton.defs b/tests/defs/GtkButton.defs
new file mode 100644
index 0000000..b3d9fe3
--- /dev/null
+++ b/tests/defs/GtkButton.defs
@@ -0,0 +1,205 @@
+;; vim: set filetype=scheme:
+;;
+;; This is an extract of .defs metadata as pertains to GtkButton.
+;; Material from pyGTK's gtk/gtk-base-types.defs and gtk/gtk-base.defs
+;; Note that several aspects have been commented out as the parser
+;; does not yet deal with them
+
+(define-object Button
+  (in-module "Gtk")
+  (parent "GtkBin")
+  (c-name "GtkButton")
+  (gtype-id "GTK_TYPE_BUTTON")
+)
+
+;;
+;; now the fragment relating to the functions, methods, and virtuals of
+;; GtkButton.
+;;
+
+(define-function gtk_button_new
+  (c-name "gtk_button_new")
+  (is-constructor-of "GtkButton")
+  (return-type "GtkWidget*")
+)
+
+(define-function gtk_button_new_with_label
+  (c-name "gtk_button_new_with_label")
+  (is-constructor-of "GtkButton")
+  (return-type "GtkWidget*")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method pressed
+  (of-object "GtkButton")
+  (c-name "gtk_button_pressed")
+  (return-type "none")
+)
+
+(define-method released
+  (of-object "GtkButton")
+  (c-name "gtk_button_released")
+  (return-type "none")
+)
+
+(define-method clicked
+  (of-object "GtkButton")
+  (c-name "gtk_button_clicked")
+  (return-type "none")
+)
+
+(define-method enter
+  (of-object "GtkButton")
+  (c-name "gtk_button_enter")
+  (return-type "none")
+)
+
+(define-method leave
+  (of-object "GtkButton")
+  (c-name "gtk_button_leave")
+  (return-type "none")
+)
+
+(define-method set_relief
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_relief")
+  (return-type "none")
+  (parameters
+    '("GtkReliefStyle" "newstyle")
+  )
+)
+
+(define-method get_relief
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_relief")
+  (return-type "GtkReliefStyle")
+)
+
+(define-method set_label
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_label")
+  (return-type "none")
+  (parameters
+    '("const-gchar*" "label")
+  )
+)
+
+(define-method get_label
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_label")
+  (return-type "const-gchar*")
+)
+
+(define-method set_use_underline
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_use_underline")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_underline")
+  )
+)
+
+(define-method get_use_underline
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_use_underline")
+  (return-type "gboolean")
+)
+
+(define-method set_use_stock
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_use_stock")
+  (return-type "none")
+  (parameters
+    '("gboolean" "use_stock")
+  )
+)
+
+(define-method get_use_stock
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_use_stock")
+  (return-type "gboolean")
+)
+
+(define-method set_focus_on_click
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_focus_on_click")
+  (return-type "none")
+  (parameters
+    '("gboolean" "focus_on_click")
+  )
+)
+
+(define-method get_focus_on_click
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_focus_on_click")
+  (return-type "gboolean")
+)
+
+(define-method set_alignment
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat" "xalign")
+    '("gfloat" "yalign")
+  )
+)
+
+(define-method get_alignment
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_alignment")
+  (return-type "none")
+  (parameters
+    '("gfloat*" "xalign")
+    '("gfloat*" "yalign")
+  )
+)
+
+(define-method set_image
+  (of-object "GtkButton")
+  (c-name "gtk_button_set_image")
+  (return-type "none")
+  (parameters
+    '("GtkWidget*" "image")
+  )
+)
+
+(define-method get_image
+  (of-object "GtkButton")
+  (c-name "gtk_button_get_image")
+  (return-type "GtkWidget*")
+)
+
+(define-virtual pressed
+  (of-object "GtkButton")
+  (return-type "none")
+)
+(define-virtual released
+  (of-object "GtkButton")
+  (return-type "none")
+)
+(define-virtual clicked
+  (of-object "GtkButton")
+  (return-type "none")
+)
+(define-virtual enter
+  (of-object "GtkButton")
+  (return-type "none")
+)
+(define-virtual leave
+  (of-object "GtkButton")
+  (return-type "none")
+)
+(define-virtual activate
+  (of-object "GtkButton")
+  (return-type "none")
+)
+(define-virtual depressed
+  (of-object "GtkButton")
+  (return-type "gboolean")
+  (parameters
+    '("GtkWidget*" "who_is_depressed")
+  )
+)
diff --git a/tests/defs/GtkReliefStyle.defs b/tests/defs/GtkReliefStyle.defs
new file mode 100644
index 0000000..e18edb8
--- /dev/null
+++ b/tests/defs/GtkReliefStyle.defs
@@ -0,0 +1,20 @@
+;; vim: set filetype=scheme:
+;;
+;; This is an extract of .defs metadata as pertains to GtkButton.
+;; Material from pyGTK's gtk/gtk-base-types.defs and gtk/gtk-base.defs
+
+;;
+;; Necessary type data to run through the other demo .defs file
+;;
+
+(define-enum ReliefStyle
+  (in-module "Gtk")
+  (c-name "GtkReliefStyle")
+  (gtype-id "GTK_TYPE_RELIEF_STYLE")
+  (values
+    '("normal" "GTK_RELIEF_NORMAL")
+    '("half" "GTK_RELIEF_HALF")
+    '("none" "GTK_RELIEF_NONE")
+  )
+)
+
diff --git a/tests/defs/GtkTreeIter.defs b/tests/defs/GtkTreeIter.defs
new file mode 100644
index 0000000..115433f
--- /dev/null
+++ b/tests/defs/GtkTreeIter.defs
@@ -0,0 +1,27 @@
+(define-boxed TreeIter
+  (in-module "Gtk")
+  (c-name "GtkTreeIter")
+  (gtype-id "GTK_TYPE_TREE_ITER")
+  (copy-func "gtk_tree_iter_copy")
+  (release-func "gtk_tree_iter_free")
+  (fields
+    '("GtkReliefStyle" "style")
+    '("gint" "rise")
+    '("GtkWidget*" "target")
+    '("gchar*" "wagga_momma")
+  )
+)
+
+(define-method copy
+  (of-object "GtkTreeIter")
+  (c-name "gtk_tree_iter_copy")
+  (caller-owns-return #t)
+  (return-type "GtkTreeIter*")
+)
+
+(define-method free
+  (of-object "GtkTreeIter")
+  (c-name "gtk_tree_iter_free")
+  (return-type "none")
+)
+
diff --git a/tests/defs/GtkWidget.defs b/tests/defs/GtkWidget.defs
new file mode 100644
index 0000000..1cdfa96
--- /dev/null
+++ b/tests/defs/GtkWidget.defs
@@ -0,0 +1,26 @@
+;; vim: set filetype=scheme:
+;;
+;; This is an extract of .defs metadata as pertains to GtkButton.
+;; Material from pyGTK's gtk/gtk-base-types.defs and gtk/gtk-base.defs
+
+;;
+;; Necessary type data to run through the other demo .defs file
+;;
+
+
+(define-object Widget
+  (in-module "Gtk")
+  (parent "GtkObject")
+  (c-name "GtkWidget")
+  (gtype-id "GTK_TYPE_WIDGET")
+  (fields
+    '("guint8" "state")
+    '("guint8" "saved_state")
+    '("gchar*" "name")
+    '("GtkStyle*" "style")
+    '("GdkRectangle" "allocation")
+    '("GdkWindow*" "window")
+    '("GtkWidget*" "parent")
+  )
+)
+
diff --git a/tests/exploration/accelerators.c b/tests/exploration/accelerators.c
new file mode 100644
index 0000000..8e5af2c
--- /dev/null
+++ b/tests/exploration/accelerators.c
@@ -0,0 +1,30 @@
+/*
+ * accelerators.c
+ *
+ * Copyright (c) 2008 Operational Dynamics Consulting Pty Ltd and Others
+ *
+ * The code in this file, and the library it is a part of, are made available
+ * to you by the authors under the terms of the "GNU General Public Licence,
+ * version 2" See the LICENCE file for the terms governing usage and
+ * redistribution.
+ */
+
+/*
+ * Experiment with GTK Accelerator Groups.
+ *
+ *    gcc `pkg-config --cflags --libs gtk+-2.0` -o accelerators accelerators.c
+ *
+ * ought to build this for you.
+ */
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+int main(int argc, char **argv) {
+	gtk_init(&argc, &argv);
+
+	printf("%s\n", gtk_accelerator_name(GDK_q, GDK_CONTROL_MASK));
+	printf("%s\n", gtk_accelerator_get_label(GDK_q, GDK_CONTROL_MASK));
+
+	return 0;
+}
diff --git a/tests/exploration/compose.c b/tests/exploration/compose.c
new file mode 100644
index 0000000..dd83404
--- /dev/null
+++ b/tests/exploration/compose.c
@@ -0,0 +1,111 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * Test Compose key usage
+ *
+ *    gcc `pkg-config --cflags --libs gtk+-2.0` -o compose compose.c
+ *
+ * ought to build this for you.
+ */
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+static gboolean
+keystroke_cb
+(
+	GtkWidget* widget,
+	GdkEventKey* event,
+	gpointer user_data
+)
+{
+	GtkIMContext* im;
+
+	im = (GtkIMContext*) user_data;
+
+	if (gtk_im_context_filter_keypress(im, event)) {
+		return TRUE;
+	}
+	return FALSE;
+}
+
+static void
+commit_cb
+(
+	GtkIMContext* im,
+	gchar* str,
+	gpointer user_data
+)
+{
+	g_print("%s\n", str);
+	gtk_main_quit();
+}
+
+int
+main
+(
+	int argc,
+	char **argv
+)
+{
+	GtkWindow* window;
+	GtkDrawingArea* area;
+	GtkIMContext* im;
+
+	gtk_init(&argc, &argv);
+
+	window = (GtkWindow*) gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	area = (GtkDrawingArea*) gtk_drawing_area_new();
+        GTK_WIDGET_SET_FLAGS(area, GTK_CAN_FOCUS);
+
+	gtk_container_add((GtkContainer*) window, (GtkWidget*) area);
+
+	im = gtk_im_context_simple_new();
+
+	g_signal_connect(area, "key-press-event", G_CALLBACK(keystroke_cb), im);
+	g_signal_connect(area, "key-release-event", G_CALLBACK(keystroke_cb), im);
+	g_signal_connect(im, "commit", G_CALLBACK(commit_cb), NULL);
+
+	gtk_widget_show_all((GtkWidget*) window);
+
+	/*
+	 * Get the Window on screen and let GTK settle.
+	 */
+
+	while (gtk_events_pending()) {
+		gtk_main_iteration();
+	}
+
+	/*
+	 * Generate the compose sequence.
+	 */
+
+	gtk_test_widget_send_key((GtkWidget*) area, GDK_Multi_key, 0);
+	gtk_test_widget_send_key((GtkWidget*) area, GDK_e, 0);
+	gtk_test_widget_send_key((GtkWidget*) area, GDK_equal, 0);
+
+	/*
+	 * Will return if and only if commit is hit.
+	 */
+
+	gtk_main();
+
+	return 0;
+}
diff --git a/tests/exploration/enums.c b/tests/exploration/enums.c
new file mode 100644
index 0000000..f1cd80a
--- /dev/null
+++ b/tests/exploration/enums.c
@@ -0,0 +1,67 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * One of the main hypothesis in the design of the new java-gnome 4.0 bindings
+ * is that enums in C are sequential from 0, and that the #defined constants
+ * in the various GLib and GTK header files are enums and hence sequential.
+ *
+ * This little file tests that assumption. If you compile and run this, you
+ * will hopefully see a nice sequence, starting at 0!
+ *
+ *    gcc `pkg-config --cflags --libs gtk+-2.0` -o enums enums.c
+ *
+ * ought to build this for you.
+ */
+
+#include <gtk/gtk.h>
+
+int main(int argc, char **argv) {
+	gtk_init(&argc, &argv);
+
+	printf("%d\n", GTK_SCROLL_NONE);
+	printf("%d\n", GTK_SCROLL_JUMP);
+	printf("%d\n", GTK_SCROLL_STEP_BACKWARD);
+	printf("%d\n", GTK_SCROLL_STEP_FORWARD);
+	printf("%d\n", GTK_SCROLL_PAGE_BACKWARD);
+	printf("%d\n", GTK_SCROLL_PAGE_FORWARD);
+	printf("%d\n", GTK_SCROLL_STEP_UP);
+	printf("%d\n", GTK_SCROLL_STEP_DOWN);
+	printf("%d\n", GTK_SCROLL_PAGE_UP);
+	printf("%d\n", GTK_SCROLL_PAGE_DOWN);
+	printf("%d\n", GTK_SCROLL_STEP_LEFT);
+	printf("%d\n", GTK_SCROLL_STEP_RIGHT);
+	printf("%d\n", GTK_SCROLL_PAGE_LEFT);
+	printf("%d\n", GTK_SCROLL_PAGE_RIGHT);
+	printf("%d\n", GTK_SCROLL_START);
+	printf("%d\n", GTK_SCROLL_END);
+
+
+	printf("\n");
+	printf("%d\n", 1 << 0);
+	printf("%d\n", 1 << 1);
+	printf("%d\n", 1 << 2);
+	printf("%d\n", 1 << 3);
+	printf("%d\n", 1 << 4);
+	printf("%d\n", 1 << 8);
+	printf("%d\n", 1 << 14);
+	printf("%d\n", 1 << 30);
+
+	return 0;
+}
diff --git a/tests/exploration/fonts.c b/tests/exploration/fonts.c
new file mode 100644
index 0000000..174a9d7
--- /dev/null
+++ b/tests/exploration/fonts.c
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * List the available font descriptions, by string name
+ *
+ *    gcc `pkg-config --cflags --libs gtk+-2.0` -o fonts fonts.c
+ *
+ * ought to build this for you.
+ */
+
+#include <gtk/gtk.h>
+
+int main(int argc, char **argv) {
+	PangoFontMap* map;
+	PangoFontFamily **families;
+	int n_families;
+	int i;
+	PangoFontFace **faces;
+	int n_faces;
+	int j;
+
+	gtk_init(&argc, &argv);
+
+	map = pango_cairo_font_map_get_default();
+
+	pango_font_map_list_families(map, &families, &n_families);
+
+	for (i = 0; i < n_families; i++) {
+		g_print("%s\n", pango_font_family_get_name(families[i]));
+
+		pango_font_family_list_faces(families[i], &faces, &n_faces);
+		for (j = 0; j < n_faces; j++) {
+			g_print("  %s\n", pango_font_face_get_face_name(faces[j]));
+		}
+	}
+
+	return 0;
+}
diff --git a/tests/exploration/pixbuf_formats.c b/tests/exploration/pixbuf_formats.c
new file mode 100644
index 0000000..93df3fc
--- /dev/null
+++ b/tests/exploration/pixbuf_formats.c
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+/*
+ * Code cut from the GdkPixbuf documentation to determine the file types
+ * available
+ *
+ *    gcc `pkg-config --cflags --libs gtk+-2.0` -o enums enums.c
+ *
+ * ought to build this for you.
+ */
+
+#include <gtk/gtk.h>
+
+void add_if_writable(gpointer data, gpointer user_data) {
+	GdkPixbufFormat* format;
+
+	format = (GdkPixbufFormat*) data;
+	
+	g_print("%s\t", gdk_pixbuf_format_get_name(format));
+	if (gdk_pixbuf_format_is_writable(format)) {
+		g_print("rw\t");
+	} else {
+		g_print("r\t");
+	}
+	g_print("%s\n", gdk_pixbuf_format_get_description(format));
+}
+
+int main(int argc, char **argv) {
+	gtk_init(&argc, &argv);
+
+	GSList *formats = gdk_pixbuf_get_formats();
+	g_slist_foreach(formats, add_if_writable, NULL);
+	g_slist_free(formats);
+
+	return 0;
+}
diff --git a/tests/generator/com/operationaldynamics/codegen/ValidateThingUsage.java b/tests/generator/com/operationaldynamics/codegen/ValidateThingUsage.java
new file mode 100644
index 0000000..b4b2d4d
--- /dev/null
+++ b/tests/generator/com/operationaldynamics/codegen/ValidateThingUsage.java
@@ -0,0 +1,137 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.operationaldynamics.defsparser.Block;
+import com.operationaldynamics.defsparser.ObjectBlock;
+import com.operationaldynamics.defsparser.ValidateDefsParsing;
+
+/*
+ * In the codegen package so we can see the Thing fields.
+ */
+public final class ValidateThingUsage extends ValidateDefsParsing
+{
+    /**
+     * This is a somewhat contrived test; the same code is tested again
+     * {@link com.operationaldynamics.defsparser.ValidateDefsParsing#testObjectBlockCreatesObjectThing()}
+     * on "real" defs data, but this at least is an isolated an explicit
+     * check.
+     */
+    public final void testObjectBlockCreatesObjectThing() {
+        List<String[]> characteristics;
+        ObjectBlock b;
+        Thing t;
+        ObjectThing ot;
+
+        characteristics = new ArrayList<String[]>();
+        characteristics.add(new String[] {
+            "in-module",
+            "Gtk"
+        });
+        characteristics.add(new String[] {
+            "parent",
+            "GtkBin"
+        });
+        characteristics.add(new String[] {
+            "c-name",
+            "GtkButton"
+        });
+
+        b = new ObjectBlock("Button", characteristics, null);
+        assertNotNull(b);
+
+        t = b.createThing();
+        assertNotNull(t);
+        assertTrue(t instanceof ObjectThing);
+        ot = (ObjectThing) t;
+        assertEquals("org.gnome.gtk", ot.bindingsPackage);
+        assertEquals("GtkButton", ot.bindingsClass);
+
+        assertEquals("Button", ot.javaType);
+        assertEquals("long", ot.nativeType);
+        assertEquals("jlong", ot.jniType);
+    }
+
+    public final void testCreateObjectThing() {
+        final Block[] blocks;
+        final ObjectThing ot;
+
+        blocks = parser.parseData();
+
+        assertTrue(blocks[0] instanceof ObjectBlock);
+        ot = (ObjectThing) blocks[0].createThing();
+        assertEquals("GtkButton*", ot.gType);
+        assertEquals("GtkButton", ot.bindingsClass);
+        assertEquals("Button", ot.javaType);
+
+        Thing.register(ot);
+        assertSame(ot, Thing.lookup("GtkButton*"));
+    }
+
+    public final void testCreateConstVariant() {
+        final Thing normal, variant, again;
+
+        normal = Thing.lookup("GtkButton*");
+
+        assertEquals("GtkButton*", normal.gType);
+        assertEquals("GtkButton*", normal.cType);
+
+        /*
+         * Ok, let's see it make the constant variant Thing
+         */
+
+        variant = Thing.lookup("const-GtkButton*");
+        assertEquals("const-GtkButton*", variant.gType);
+        assertEquals("const GtkButton*", variant.cType);
+
+        /*
+         * Make sure it doesn't create another one!
+         */
+
+        again = Thing.lookup("const-GtkButton*");
+        assertSame(variant, again);
+    }
+
+    public final void testCreateOutVariant() {
+        final Thing normal, variant, again;
+
+        normal = Thing.lookup("GtkButton*");
+
+        assertEquals("GtkButton*", normal.gType);
+        assertEquals("GtkButton*", normal.cType);
+
+        /*
+         * Ok, let's see it make the out-parameter variant Thing
+         */
+
+        variant = Thing.lookup("GtkButton**");
+        assertEquals("GtkButton**", variant.gType);
+        assertEquals("GtkButton**", variant.cType);
+
+        /*
+         * Make sure it doesn't create another one!
+         */
+
+        again = Thing.lookup("GtkButton**");
+        assertSame(variant, again);
+    }
+}
diff --git a/tests/generator/com/operationaldynamics/codegen/ValidateUtilityMethods.java b/tests/generator/com/operationaldynamics/codegen/ValidateUtilityMethods.java
new file mode 100644
index 0000000..516e02d
--- /dev/null
+++ b/tests/generator/com/operationaldynamics/codegen/ValidateUtilityMethods.java
@@ -0,0 +1,87 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.codegen;
+
+import com.operationaldynamics.defsparser.ValidateDefsParsing;
+import com.operationaldynamics.driver.DefsFile;
+import com.operationaldynamics.driver.ImproperDefsFileException;
+
+/**
+ * While much of the output from the code generator is subjective (ie
+ * formatting and code style), there are numerous helper methods used to
+ * transform the .defs data to that needed by the java-gnome bindings. These
+ * we can test.
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.3
+ */
+public final class ValidateUtilityMethods extends ValidateDefsParsing
+{
+    public final void testEncodeJavaNamesToJni() {
+        assertEquals("org_gnome_gtk_GtkButton",
+                Generator.encodeJavaClassName("org.gnome.gtk", "GtkButton"));
+        assertEquals("gtk_1button_1set_1label", Generator.encodeJavaMethodName("gtk_button_set_label"));
+        assertEquals("setLabelTheRightWay", Generator.toCamel("set_label_the_right_way"));
+    }
+
+    public final void testFullyQualifiedJavaName() {
+        Thing button = new ObjectThing("GtkButton*", "org.gnome.gtk", "GtkButton", "Button");
+        assertEquals("org.gnome.gtk.Button", button.fullyQualifiedJavaClassName());
+    }
+
+    public final void testConstructorNameMunging() {
+        Thing button = new ObjectThing("GtkButton*", "org.gnome.gtk", "GtkButton", "Button");
+        Thing.register(button);
+
+        String munged1 = ConstructorGenerator.mungeConstructorName("GtkButton*",
+                "gtk_button_new_with_label");
+        assertEquals("createButtonWithLabel", munged1);
+
+        String munged2 = ConstructorGenerator.mungeConstructorName("GtkButton*", "gtk_button_new");
+        assertEquals("createButton", munged2);
+    }
+
+    public final void testThingTranslationCode() throws ImproperDefsFileException {
+        FundamentalThing ft;
+        ObjectThing ot;
+        DefsFile context;
+
+        context = new DefsFile(parser.parseData());
+
+        ft = new FundamentalThing("gboolean", "boolean", "boolean", "jboolean");
+        assertEquals("a", ft.translationToNative("a"));
+        assertEquals("a", ft.translationToJava("a", context));
+
+        ot = new ObjectThing("GtkWidget*", "org.gnome.gtk", "GtkWidget", "Widget");
+        assertEquals("pointerOf(b)", ot.translationToNative("b"));
+        assertEquals("(Widget) objectFor(b)", ot.translationToJava("b", context));
+    }
+
+    public final void testConsantNameMunging() {
+        assertEquals("REALLY_IMPORTANT", Generator.toAllCaps("really-important"));
+    }
+
+    public final void testSignalNameMunging() {
+        assertEquals("DeleteEvent", Generator.toPascalCase("delete_event"));
+    }
+
+    public final void testPascalCaseBackToUnderscores() {
+        assertEquals("gtk_tree_iter", AccessorGenerator.toUnderscores("GtkTreeIter"));
+    }
+}
diff --git a/tests/generator/com/operationaldynamics/defsparser/ValidateBlockUsage.java b/tests/generator/com/operationaldynamics/defsparser/ValidateBlockUsage.java
new file mode 100644
index 0000000..497a2da
--- /dev/null
+++ b/tests/generator/com/operationaldynamics/defsparser/ValidateBlockUsage.java
@@ -0,0 +1,80 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public final class ValidateBlockUsage extends TestCase
+{
+
+    public final void testBlockAddPointerSymbol() {
+        assertEquals("GnomeBlah*", Block.addPointerSymbol("GnomeBlah"));
+    }
+
+    public final void testCharacteristicNameToSetterMethod() {
+        assertEquals("setBeeBop", Block.nameToMethod("bee-bop"));
+    }
+
+    /**
+     * Not only tests the reflector in processCharacteristics(), but makes
+     * sure it works for subclasses even through the reflector code is in
+     * Block.
+     */
+    public final void testBlockReflectorKnownCharacteristic() {
+        List<String[]> characteristics;
+        ObjectBlock b;
+
+        characteristics = new ArrayList<String[]>();
+        characteristics.add(new String[] {
+            "in-module",
+            "Atk"
+        });
+
+        b = new ObjectBlock("AtkFoo", characteristics, null);
+        assertNotNull(b);
+        assertEquals("Atk", b.inModule);
+    }
+
+    public final void testBlockReflectorBogusCharacteristic() {
+        List<String[]> characteristics;
+        ObjectBlock b;
+
+        characteristics = new ArrayList<String[]>();
+        characteristics.add(new String[] {
+            "bee-bop",
+            "is_a_cowboy"
+        });
+
+        b = null;
+        try {
+            b = new ObjectBlock("AnimeFoo", characteristics, null);
+            fail("Should have thrown IllegalStateException because of a characteristic name that is no known");
+        } catch (IllegalStateException ise) {
+            // good
+        }
+        assertNull(b);
+    }
+
+    public final void testModuleNameToJavaPackageName() {
+        assertEquals("org.gnome.gnome", TypeBlock.moduleToJavaPackage("Gnome"));
+    }
+}
diff --git a/tests/generator/com/operationaldynamics/defsparser/ValidateDefsParsing.java b/tests/generator/com/operationaldynamics/defsparser/ValidateDefsParsing.java
new file mode 100644
index 0000000..b7a495c
--- /dev/null
+++ b/tests/generator/com/operationaldynamics/defsparser/ValidateDefsParsing.java
@@ -0,0 +1,167 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package com.operationaldynamics.defsparser;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.ParseException;
+
+import junit.framework.TestCase;
+
+import com.operationaldynamics.codegen.Thing;
+
+/**
+ * Evaluate the internal methods in the DefsParser class.
+ * 
+ * @author Andrew Cowie
+ */
+public class ValidateDefsParsing extends TestCase
+{
+    private static final String inputDefsData;
+
+    static {
+        final StringBuffer buf;
+        final String[] raw;
+
+        raw = new String[] {
+            "(define-object Button",
+            "  (in-module \"Gtk\")",
+            "  (parent \"GtkBin\")",
+            "  (c-name \"GtkButton\")",
+            "  (gtype-id \"GTK_TYPE_BUTTON\")",
+            ")",
+            "",
+            "(define-function gtk_button_new",
+            "  (is-constructor-of \"GtkButton\")",
+            "  (c-name \"gtk_button_new\")",
+            "  (caller-owns-return #t)",
+            "  (return-type \"GtkWidget*\")",
+            ")",
+            "",
+            "(define-method set_label",
+            "  (of-object \"GtkButton\")",
+            "  (c-name \"gtk_button_set_label\")",
+            "  (return-type \"none\")",
+            "  (parameters",
+            "    '(\"const-gchar*\" \"label\")",
+            "  )",
+            ")",
+            "",
+            "(define-method leave",
+            "  (of-object \"GtkButton\")",
+            "  (c-name \"gtk_button_leave\")",
+            "  (return-type \"none\")",
+            "  (deprecated)",
+            ")",
+            "",
+            "(define-virtual clicked",
+            "  (of-object \"GtkButton\")",
+            "  (return-type \"none\")",
+            ")"
+        };
+
+        buf = new StringBuffer();
+        for (int i = 0; i < raw.length; i++) {
+            buf.append(raw[i]);
+            buf.append("\n");
+        }
+
+        inputDefsData = buf.toString();
+    }
+
+    protected DefsParser parser;
+
+    DefsLineNumberReader in;
+
+    public void setUp() throws IOException {
+        in = new DefsLineNumberReader(new StringReader(inputDefsData), "Mock data");
+
+        parser = new DefsParser(in);
+    }
+
+    public void tearDown() throws IOException {
+        in.close();
+    }
+
+    public final void testInputStreamToStanzas() throws ParseException {
+        int i;
+
+        for (i = 0; parser.readNextStanza(); i++) {
+            ;
+        }
+
+        assertEquals(5, i);
+    }
+
+    public final void testObjectBlockCreated() throws ParseException {
+        Block[] results;
+        ObjectBlock o;
+
+        results = parser.parseData();
+
+        assertTrue(results[0] instanceof ObjectBlock);
+
+        o = (ObjectBlock) results[0];
+
+        assertEquals("Gtk", o.inModule);
+        assertEquals("GtkBin", o.parent);
+        assertEquals("GtkButton", o.cName);
+        assertEquals("Button", o.blockName);
+    }
+
+    public final void testCantCreateThingFromNonTypeBlock() {
+        Block[] blocks;
+        Thing t = null;
+        blocks = parser.parseData();
+
+        assertFalse(blocks[1] instanceof TypeBlock);
+        try {
+            t = blocks[1].createThing();
+            fail("Should have thrown UnsupportedOperationException");
+        } catch (UnsupportedOperationException uoe) {
+            // good
+        }
+        assertNull(t);
+    }
+
+    public final void testMethodReferenceToSelfInsertion() {
+        Block[] results;
+        MethodBlock block;
+
+        results = parser.parseData();
+
+        assertTrue(results[2] instanceof MethodBlock);
+
+        block = (MethodBlock) results[2];
+
+        assertTrue(block.parameters.length == 2);
+        assertEquals("GtkButton*", block.parameters[0][0]);
+        assertEquals("self", block.parameters[0][1]);
+        assertEquals("const-gchar*", block.parameters[1][0]);
+        assertEquals("label", block.parameters[1][1]);
+    }
+
+    public final void testIgnoreUnnecessaryBlocks() {
+        Block[] results;
+
+        results = parser.parseData();
+
+        assertEquals(4, results.length);
+    }
+}
diff --git a/tests/po/en_US.po b/tests/po/en_US.po
new file mode 100644
index 0000000..df5b9b7
--- /dev/null
+++ b/tests/po/en_US.po
@@ -0,0 +1,25 @@
+# java-gnome Unit Tests
+# Copyright (C) 2008-2012 Operational Dynamics Consulting, Pty Ltd and Others
+# This file is distributed under the same license as the java-gnome package.
+# Andrew Cowie <andrew at operationaldynamics.com>, 2012.
+#
+#: tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java:107
+#: tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java:108
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: java-gnome 4.1.2\n"
+"POT-Creation-Date: 2012-08-13 09:13+1000\n"
+"PO-Revision-Date: 2012-08-13 09:14+1000\n"
+"Last-Translator: Andrew Cowie <andrew at operationaldynamics.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java:87
+msgid "login"
+msgstr "Hello"
+
+#: tests/bindings/org/freedesktop/bindings/ValidateInternationalization.java:90
+msgid "logoff"
+msgstr "Goodbye"
diff --git a/tests/prototype/Designer.java b/tests/prototype/Designer.java
new file mode 100644
index 0000000..a0c239a
--- /dev/null
+++ b/tests/prototype/Designer.java
@@ -0,0 +1,87 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import java.io.FileNotFoundException;
+import java.text.ParseException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventKey;
+import org.gnome.gtk.Builder;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A skeleton program to test using the <code>.ui</code> XML output from a
+ * GNOME user interface designer translated into live Widgets with
+ * <code>GtkBuilder</code>.
+ * 
+ * @author Andrew Cowie
+ */
+public final class Designer
+{
+    private static void setupUserInterface() throws FileNotFoundException, ParseException {
+        final Builder builder;
+        final Window w;
+        final Label l;
+
+        builder = new Builder();
+        builder.addFromFile("tests/prototype/simple.ui");
+
+        l = (Label) builder.getObject("label1");
+        System.out.println("Extracted label text: \n\"" + l.getText() + "\"");
+
+        w = (Window) builder.getObject("simple");
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        l.connect(new Widget.KeyPressEvent() {
+            public boolean onKeyPressEvent(Widget source, EventKey event) {
+                System.out.println("Pressed:  " + event.getKeyval());
+                return false;
+            }
+        });
+
+        l.connect(new Widget.KeyReleaseEvent() {
+            public boolean onKeyReleaseEvent(Widget source, EventKey event) {
+                System.out.println("Released: " + event.getKeyval());
+                return false;
+            }
+        });
+
+        l.selectRegion(0, 0);
+    }
+
+    public static void main(String[] args) throws FileNotFoundException, ParseException {
+        Gtk.init(args);
+
+        setupUserInterface();
+
+        Gtk.main();
+
+        System.gc();
+        System.out.println("Bye now.");
+    }
+}
diff --git a/tests/prototype/Experiment.java b/tests/prototype/Experiment.java
new file mode 100644
index 0000000..4de1407
--- /dev/null
+++ b/tests/prototype/Experiment.java
@@ -0,0 +1,141 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import java.io.FileNotFoundException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gdk.Screen;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.FileChooserAction;
+import org.gnome.gtk.FileChooserButton;
+import org.gnome.gtk.FontButton;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.ReliefStyle;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * A simple demonstration program to experiment with, and validate, the
+ * end-developer design of the new java-gnome 4.0 bindings architecture.
+ * 
+ * @author Andrew Cowie
+ */
+public final class Experiment
+{
+    /*
+     * It is not, strictly speaking, necessary to put the UI building code
+     * into a constructor; there's nothing wrong in a tiny program with doing
+     * it all in static code in main().
+     * 
+     * What we gain, however, is that the references to all the objects
+     * created become unreachable as soon as it runs, and that allowed us to
+     * evaluate that the memory management is working correctly.
+     */
+    private Experiment() {
+        final Window w;
+        final VBox x;
+        final Label l;
+        final Button b;
+        final FileChooserButton fcb;
+        final FontButton fb;
+        final Screen s;
+        final Pixbuf logo;
+
+        w = new Window();
+
+        x = new VBox(false, 3);
+
+        l = new Label("These Buttons\nare <b>made</b> for\nclicking.");
+        l.setUseMarkup(true);
+        x.packStart(l, true, true, 0);
+
+        b = new Button("Change Me?");
+        b.setLabel("Press Me!");
+        b.setRelief(ReliefStyle.NORMAL);
+        x.packStart(b, false, false, 0);
+
+        fcb = new FileChooserButton("Good to get, a file is", FileChooserAction.OPEN);
+        x.packStart(fcb, false, false, 0);
+
+        fb = new FontButton();
+        x.packStart(fb, false, false, 0);
+
+        w.add(x);
+
+        w.setTitle("Experiments");
+        w.showAll();
+
+        s = w.getScreen();
+        w.move(s.getWidth() - 200, s.getHeight() - 200);
+
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                System.out.println("I was clicked... " + b.getLabel());
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                System.out.println("I was deleted!");
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        fcb.connect(new FileChooserButton.FileSet() {
+            public void onFileSet(FileChooserButton source) {
+                System.out.println("File selected:   " + source.getURI());
+                System.gc();
+            }
+        });
+
+        fb.connect(new FontButton.FontSet() {
+            public void onFontSet(FontButton source) {
+                System.out.println(fb.getFontName());
+            }
+        });
+
+        b.setTooltipText("Pressing this Button will result in some output");
+
+        try {
+            logo = new Pixbuf("src/bindings/java-gnome_Icon.png");
+            w.setIcon(logo);
+        } catch (FileNotFoundException fnfe) {
+            System.err.println("Where's the logo?");
+        }
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new Experiment();
+
+        Gtk.main();
+
+        // Observe release() being done on the various Proxies created. As
+        // ever, though, calling gc() is not imperative.
+        System.gc();
+
+        // And, hopefully, we make it out of the main loop without crashing
+        System.out.println("Bye now.");
+    }
+}
diff --git a/tests/prototype/ManualInput.java b/tests/prototype/ManualInput.java
new file mode 100644
index 0000000..969ed0a
--- /dev/null
+++ b/tests/prototype/ManualInput.java
@@ -0,0 +1,116 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import org.freedesktop.cairo.Context;
+import org.gnome.gdk.Event;
+import org.gnome.gdk.EventKey;
+import org.gnome.gtk.DrawingArea;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.InputMethod;
+import org.gnome.gtk.SimpleInputMethod;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+import org.gnome.pango.FontDescription;
+import org.gnome.pango.Layout;
+
+/**
+ * Experiment with GTK's input method system.
+ * 
+ * @author AndrewCowie
+ */
+public class ManualInput
+{
+    public static void main(String[] args) {
+        final Window w;
+        final DrawingArea d;
+        final InputMethod im;
+        final StringBuilder buf;
+
+        Gtk.init(args);
+
+        w = new Window();
+        w.setTitle("Text editor");
+        w.setDefaultSize(200, 100);
+
+        d = new DrawingArea();
+        d.setCanFocus(true);
+
+        w.add(d);
+
+        im = new SimpleInputMethod();
+        im.setUsePreedit(true);
+
+        buf = new StringBuilder("Hello");
+
+        d.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                final Layout layout;
+                final FontDescription desc;
+
+                layout = new Layout(cr);
+
+                desc = new FontDescription("DejaVu Serif, Book 12");
+                layout.setFontDescription(desc);
+
+                layout.setText(buf.toString());
+
+                source.setSizeRequest(layout.getPixelWidth(), layout.getPixelHeight());
+
+                cr.showLayout(layout);
+                return false;
+            }
+        });
+
+        d.connect(new Widget.KeyPressEvent() {
+            public boolean onKeyPressEvent(Widget source, EventKey event) {
+                if (im.filterKeypress(event)) {
+                    return true;
+                }
+                return false;
+            }
+        });
+
+        d.connect(new Widget.KeyReleaseEvent() {
+            public boolean onKeyReleaseEvent(Widget source, EventKey event) {
+                if (im.filterKeypress(event)) {
+                    return true;
+                }
+                return false;
+            }
+        });
+
+        im.connect(new InputMethod.Commit() {
+            public void onCommit(InputMethod source, String str) {
+                buf.append(str);
+                d.queueDraw();
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+
+        w.showAll();
+
+        Gtk.main();
+    }
+}
diff --git a/tests/prototype/MapleSyrup.jpg b/tests/prototype/MapleSyrup.jpg
new file mode 100644
index 0000000..4da9b22
Binary files /dev/null and b/tests/prototype/MapleSyrup.jpg differ
diff --git a/tests/prototype/Toggling.java b/tests/prototype/Toggling.java
new file mode 100644
index 0000000..cdd6412
--- /dev/null
+++ b/tests/prototype/Toggling.java
@@ -0,0 +1,156 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import java.util.HashSet;
+
+import org.freedesktop.bindings.Debug;
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Fork of Experiment to specifically test memory management under limited and
+ * almost controllable conditions. This is not example code!
+ * 
+ * @author Andrew Cowie
+ */
+public final class Toggling
+{
+
+    private HashSet<Window> set;
+
+    /*
+     * It is not, strictly speaking, necessary to put the UI building code
+     * into a constructor; there's nothing wrong in a tiny program with doing
+     * it all in static code in main().
+     * 
+     * What we gain, however, is that the references to all the objects
+     * created become unreachable as soon as it runs, and that allowed us to
+     * evaluate that the memory management is working correctly.
+     */
+    private Toggling() {
+        final Window w;
+        final VBox x;
+        final Button b;
+        final Button gc;
+        final Button res;
+
+        if (!Debug.MEMORY_MANAGEMENT) {
+            System.err.println("Debug.MEMORY_MANAGEMENT must be enabled to run this class");
+            System.exit(1);
+        }
+
+        w = new Window();
+        set = new HashSet<Window>();
+
+        x = new VBox(false, 3);
+
+        b = new Button("New window");
+        x.packStart(b, false, false, 0);
+
+        res = new Button("Ressurect");
+        x.packStart(res, false, false, 0);
+        res.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                for (Window w : set) {
+                    w.present();
+                }
+            }
+        });
+
+        gc = new Button("Run gc()");
+        x.packStart(gc, false, false, 0);
+        gc.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                System.err.println("Run Java garbage collector");
+                System.gc();
+            }
+        });
+
+        w.add(x);
+
+        w.setTitle("Toggling");
+
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                final Window z;
+                final Label d;
+                z = new Window();
+                d = new Label("This is some very very\nimportant data that concerns your future!");
+                z.add(d);
+                z.showAll();
+                set.add(z);
+            }
+        });
+
+        Button zero = new Button("Drop extra refs");
+        x.packStart(zero, false, false, 0);
+        zero.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                System.err.println("Drop refs");
+                set = null;
+            }
+        });
+
+        w.showAll();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                System.out.println("I was deleted!");
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new Toggling();
+
+        System.out.println("Main loop starting...");
+        Gtk.main();
+        System.out.println("Main loop exited");
+        // Observe release() being done on the various Proxies created. As
+        // ever, though, calling gc() is not imperative.
+
+        System.err.println("Run Java garbage collector (last-1 time)");
+        System.gc();
+        try {
+            Thread.sleep(500);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        System.err.println("Run Java garbage collector (last time)");
+        System.gc();
+        try {
+            Thread.sleep(500);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        // And, hopefully, we make it out of the main loop without crashing
+        System.out.println("Bye now.");
+    }
+}
diff --git a/tests/prototype/WorkerThreads.java b/tests/prototype/WorkerThreads.java
new file mode 100644
index 0000000..536e73c
--- /dev/null
+++ b/tests/prototype/WorkerThreads.java
@@ -0,0 +1,133 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2006-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+
+import org.gnome.gdk.Event;
+import org.gnome.gtk.Button;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Label;
+import org.gnome.gtk.VBox;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * Examine multi-threading issues. Yet another derivation of the original
+ * Experiment class. If you run this in a terminal, say with
+ * 
+ * <pre>
+ *  java -client -ea -classpath tmp/tests:tmp/gtk-4.0.jar WorkerThreads
+ * </pre>
+ * 
+ * you can press Ctrl+\ to get the thread dump to study the lock contention
+ * when one or more worker threads are running. Or you can just run it in an
+ * IDE debugger.
+ * 
+ * @author Andrew Cowie
+ */
+public final class WorkerThreads implements Runnable
+{
+    /**
+     * Simple reference to the created class that can be used when this is
+     * blocked.
+     */
+    private static WorkerThreads self;
+
+    private final Label l;
+
+    private final Button b;
+
+    private int j;
+
+    private WorkerThreads() {
+        final Window w;
+        final VBox x;
+
+        self = this;
+        j = 65;
+
+        w = new Window();
+        x = new VBox(false, 3);
+        l = new Label("Ready");
+        x.packStart(l, false, false, 0);
+
+        b = new Button("Start");
+        x.packStart(b, false, false, 0);
+
+        w.add(x);
+
+        w.setTitle("Worker Threads");
+        w.showAll();
+
+        b.connect(new Button.Clicked() {
+            public void onClicked(Button source) {
+                String name = "" + (char) j;
+                System.out.println(name + " launching.");
+                b.setLabel(name + " running");
+                new Thread(self, name).start();
+                j++;
+            }
+        });
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                System.out.println("I was deleted!");
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+
+        new WorkerThreads();
+
+        Gtk.main();
+
+        System.out.println("Bye now.");
+        /*
+         * There's probably all kinds of threads still running if the button
+         * was clicked numerous times, but if the person has closed the
+         * window, kill off the app already.
+         */
+        System.exit(0);
+    }
+
+    /*
+     * This could have been nested in the callback above. Whatever.
+     */
+    public void run() {
+        final String name;
+
+        name = Thread.currentThread().getName();
+
+        for (int i = 1; i <= 50000; i++) {
+            l.setLabel(name + "->" + i);
+            /*
+             * Interestingly, this loop is tight enough, and the contention
+             * sufficient if you fire up multiple threads that you actually
+             * get the otherwise rare condition of "lock starvation". If you
+             * stick a yield here the balance is more like you would expect.
+             */
+            // Thread.yield();
+        }
+
+        b.setLabel("Restart?");
+        System.out.println(name + " done.");
+    }
+}
diff --git a/tests/prototype/simple.ui b/tests/prototype/simple.ui
new file mode 100644
index 0000000..5fa658b
--- /dev/null
+++ b/tests/prototype/simple.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkWindow" id="simple">
+    <property name="visible">True</property>
+    <property name="title" translatable="yes">A Simple Window, brought to you by GtkBuilder!</property>
+    <property name="default_width">200</property>
+    <property name="default_height">150</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="width_request">150</property>
+        <property name="visible">True</property>
+        <property name="label" translatable="yes">This is a test of the Emergency Broadcast System</property>
+        <property name="wrap">True</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/tests/screenshots/Harness.java b/tests/screenshots/Harness.java
new file mode 100644
index 0000000..9a7dde5
--- /dev/null
+++ b/tests/screenshots/Harness.java
@@ -0,0 +1,334 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.freedesktop.bindings.Environment;
+import org.freedesktop.cairo.Illustration;
+import org.freedesktop.cairo.IllustrationOperatorAdd;
+import org.freedesktop.cairo.IllustrationOperatorAtop;
+import org.freedesktop.cairo.IllustrationOperatorClear;
+import org.freedesktop.cairo.IllustrationOperatorDest;
+import org.freedesktop.cairo.IllustrationOperatorDestAtop;
+import org.freedesktop.cairo.IllustrationOperatorDestIn;
+import org.freedesktop.cairo.IllustrationOperatorDestOut;
+import org.freedesktop.cairo.IllustrationOperatorDestOver;
+import org.freedesktop.cairo.IllustrationOperatorIn;
+import org.freedesktop.cairo.IllustrationOperatorOut;
+import org.freedesktop.cairo.IllustrationOperatorOver;
+import org.freedesktop.cairo.IllustrationOperatorSaturate;
+import org.freedesktop.cairo.IllustrationOperatorSource;
+import org.freedesktop.cairo.IllustrationOperatorXOR;
+import org.freedesktop.cairo.SnapshotContextArc;
+import org.freedesktop.cairo.SnapshotContextArcNegative;
+import org.freedesktop.cairo.SnapshotContextLine;
+import org.freedesktop.cairo.SnapshotContextRectangle;
+import org.freedesktop.cairo.SnapshotMatrixRotate;
+import org.freedesktop.cairo.SnapshotMatrixScale;
+import org.freedesktop.cairo.SnapshotMatrixTranslate;
+import org.freedesktop.cairo.Surface;
+import org.gnome.gdk.Pixbuf;
+import org.gnome.gdk.PixbufFormat;
+import org.gnome.gtk.Gtk;
+import org.gnome.gtk.Snapshot;
+import org.gnome.gtk.SnapshotAboutDialog;
+import org.gnome.gtk.SnapshotArrow;
+import org.gnome.gtk.SnapshotButton;
+import org.gnome.gtk.SnapshotCalendar;
+import org.gnome.gtk.SnapshotComboBox;
+import org.gnome.gtk.SnapshotComboBoxText;
+import org.gnome.gtk.SnapshotComboBoxTextEntry;
+import org.gnome.gtk.SnapshotEntryCompletion;
+import org.gnome.gtk.SnapshotEntryIcon;
+import org.gnome.gtk.SnapshotFileChooserDialog;
+import org.gnome.gtk.SnapshotHScale;
+import org.gnome.gtk.SnapshotInfoBar;
+import org.gnome.gtk.SnapshotInfoMessageDialog;
+import org.gnome.gtk.SnapshotLinkButton;
+import org.gnome.gtk.SnapshotNotebook;
+import org.gnome.gtk.SnapshotQuestionMessageDialog;
+import org.gnome.gtk.SnapshotRadioButton;
+import org.gnome.gtk.SnapshotStatusbar;
+import org.gnome.gtk.SnapshotSwitch;
+import org.gnome.gtk.SnapshotTextView;
+import org.gnome.gtk.SnapshotTextViewBorderWindows;
+import org.gnome.gtk.SnapshotTextViewSpelling;
+import org.gnome.gtk.SnapshotTreeStore;
+import org.gnome.gtk.SnapshotTreeView;
+import org.gnome.gtk.SnapshotVScale;
+import org.gnome.gtk.SnapshotWindow;
+import org.gnome.gtk.Window;
+import org.gnome.screenshot.Screenshot;
+
+/**
+ * Start a virtual X server and a window manager Run the screenshot suite and
+ * capture images of each one for use in the API documentation.
+ * 
+ * @author Andrew Cowie
+ */
+/*
+ * FIXME This whole system is a bit of a hack with much ugliness.
+ * Instantiating the subordinate processes is messy, the list of the Snapshots
+ * to be run is in a terrible place, being able to cycling the main loop from
+ * here has to be fixed, and Pixbuf's save() has a terrible signature, and
+ * there's no progress reporting. Yuck. None of this is to be considered fixed
+ * API!
+ */
+public final class Harness
+{
+    private static final boolean USE_VIRTUAL_DISPLAY = false;
+
+    public static void main(String[] args) throws IOException, InterruptedException {
+        final String DISPLAY;
+        final Runtime r;
+        Process xServerVirtual = null;
+        Process windowManager = null;
+        Process settingsDaemon = null;
+        final Pixbuf logo;
+        final Class<?>[] demos;
+        final Class<?>[] illustrationdemos;
+
+        try {
+            r = Runtime.getRuntime();
+
+            /*
+             * Get the X server address. If it's not present, abort, giving a
+             * short-cut way to skip generating snapshots.
+             */
+
+            DISPLAY = Environment.getEnv("DISPLAY");
+
+            if (DISPLAY == null) {
+                return;
+            } else if (USE_VIRTUAL_DISPLAY) {
+                /*
+                 * Xvfb arguments:
+                 * 
+                 * -ac disable access control (necessary so that other program
+                 * can draw there)
+                 * 
+                 * -wr white background
+                 * 
+                 * Don't try to force it to 32 bits per pixed in -screen; for
+                 * some reason this makes Xvfb unable to start.
+                 */
+                System.out.println("EXEC\tXvfb");
+                xServerVirtual = r.exec("/usr/bin/Xvfb " + DISPLAY
+                        + " -ac -dpi 96 -screen 0 800x600x24 -wr");
+                Thread.sleep(1000);
+                checkAlive(xServerVirtual, "Xvfb");
+
+                System.out.println("EXEC\tmetacity");
+                windowManager = r.exec("/usr/bin/metacity --display=" + DISPLAY);
+                Thread.sleep(100);
+                checkAlive(windowManager, "metacity");
+
+                System.out.println("EXEC\tgnome-settings-daemon");
+                settingsDaemon = r.exec("/usr/libexec/gnome-settings-daemon --display=" + DISPLAY
+                        + " --disable-crash-dialog");
+                Thread.sleep(100);
+                checkAlive(settingsDaemon, "gnome-settings-daemon");
+            }
+
+            Gtk.init(new String[] {
+                "--display=" + DISPLAY
+            });
+
+            /*
+             * Set an icon so our screenshots look cool
+             */
+
+            try {
+                logo = new Pixbuf("src/bindings/java-gnome_Icon.png");
+                Gtk.setDefaultIcon(logo);
+            } catch (FileNotFoundException fnfe) {
+                System.err.println("Where's the logo?");
+            }
+
+            /*
+             * Iterate over the class list. This is a TERRIBLE place to
+             * specify content like this. A Runner API like JUnit has would be
+             * far preferable.
+             */
+
+            demos = new Class[] {
+                SnapshotWindow.class,
+                SnapshotStatusbar.class,
+                SnapshotButton.class,
+                SnapshotInfoMessageDialog.class,
+                SnapshotQuestionMessageDialog.class,
+                SnapshotTreeView.class,
+                SnapshotTreeStore.class,
+                SnapshotFileChooserDialog.class,
+                SnapshotAboutDialog.class,
+                SnapshotHScale.class,
+                SnapshotVScale.class,
+                SnapshotRadioButton.class,
+                SnapshotComboBox.class,
+                SnapshotArrow.class,
+                SnapshotNotebook.class,
+                SnapshotCalendar.class,
+                SnapshotComboBoxText.class,
+                SnapshotComboBoxTextEntry.class,
+                SnapshotContextLine.class,
+                SnapshotTextView.class,
+                SnapshotTextViewBorderWindows.class,
+                SnapshotTextViewSpelling.class,
+                SnapshotContextArc.class,
+                SnapshotContextArcNegative.class,
+                SnapshotMatrixRotate.class,
+                SnapshotMatrixScale.class,
+                SnapshotMatrixTranslate.class,
+                SnapshotContextRectangle.class,
+                SnapshotEntryCompletion.class,
+                SnapshotEntryIcon.class,
+                SnapshotLinkButton.class,
+                SnapshotInfoBar.class,
+                SnapshotSwitch.class
+            };
+
+            illustrationdemos = new Class[] {
+                IllustrationOperatorIn.class,
+                IllustrationOperatorClear.class,
+                IllustrationOperatorSource.class,
+                IllustrationOperatorOver.class,
+                IllustrationOperatorOut.class,
+                IllustrationOperatorAtop.class,
+                IllustrationOperatorDest.class,
+                IllustrationOperatorDestOver.class,
+                IllustrationOperatorDestIn.class,
+                IllustrationOperatorDestOut.class,
+                IllustrationOperatorDestAtop.class,
+                IllustrationOperatorXOR.class,
+                IllustrationOperatorAdd.class,
+                IllustrationOperatorSaturate.class
+            };
+
+            /*
+             * And now the hard part. Take screenshots! This thread runs
+             * asynchronously to the main loop; even though Gtk.main() below
+             * blocs, we have a main loop running so that things like Dialogs
+             * will work.
+             */
+
+            for (int i = 0; i < demos.length; i++) {
+                final Snapshot demo;
+                final Window w;
+                final String f;
+                final Pixbuf image;
+
+                /*
+                 * Instantiate here (as opposed to above when specifying the
+                 * array) so that each one takes its resources in turn. We ran
+                 * into problems with all sorts of cruft being on the display
+                 * when doing it otherwise.
+                 */
+                try {
+                    demo = (Snapshot) demos[i].newInstance();
+                } catch (InstantiationException e) {
+                    e.printStackTrace();
+                    continue;
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                    continue;
+                } catch (UnsupportedOperationException e) {
+                    e.printStackTrace();
+                    continue;
+                }
+
+                w = demo.getWindow();
+                f = demo.getFilename();
+
+                System.out.println("SNAP\t" + f);
+
+                w.setHasResizeGrip(false);
+                w.showAll();
+                w.present();
+                Snapshot.cycleMainLoop();
+
+                image = Screenshot.capture();
+                image.save(f, PixbufFormat.PNG);
+
+                w.hide();
+            }
+            /* Now for the Illustrations */
+            for (int i = 0; i < illustrationdemos.length; i++) {
+                final Illustration demo;
+                final String f;
+                final Surface s;
+
+                /*
+                 * Instantiate here (as opposed to above when specifying the
+                 * array) so that each one takes its resources in turn. We ran
+                 * into problems with all sorts of cruft being on the display
+                 * when doing it otherwise.
+                 */
+                try {
+                    demo = (Illustration) illustrationdemos[i].newInstance();
+                } catch (InstantiationException e) {
+                    e.printStackTrace();
+                    continue;
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                    continue;
+                }
+
+                demo.illustrate();
+
+                s = demo.getSurface();
+                f = demo.getFilename();
+
+                System.out.println("WRITE\t" + f);
+
+                s.writeToPNG(f);
+            }
+        } finally {
+            /*
+             * And now tear down the virtual X server and friends. This is far
+             * from bullet proof. As it is incredibly annoying when processes
+             * get orphaned, improvements to this would be welcome.
+             */
+
+            if (xServerVirtual != null) {
+                System.out.println("KILL\tXvfb");
+                xServerVirtual.destroy();
+                xServerVirtual.waitFor();
+            }
+            if (windowManager != null) {
+                System.out.println("KILL\tmetacity");
+                windowManager.destroy();
+                windowManager.waitFor();
+            }
+            if (settingsDaemon != null) {
+                System.out.println("KILL\tgnome-settings-daemon");
+                settingsDaemon.destroy();
+                settingsDaemon.waitFor();
+            }
+        }
+    }
+
+    private static void checkAlive(Process p, String name) {
+        try {
+            p.exitValue();
+            throw new RuntimeException("\n" + name + " didn't start");
+        } catch (IllegalThreadStateException itse) {
+            // good
+        }
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/Illustration.java b/tests/screenshots/org/freedesktop/cairo/Illustration.java
new file mode 100644
index 0000000..514338c
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/Illustration.java
@@ -0,0 +1,83 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * Extend this class to create a illustration to be used in the documentation
+ * 
+ * @author Kenneth Prugh
+ * @since 4.0.16
+ */
+/*
+ * Based heavily off Snapshot. Could probably be handled a bit better
+ * especially the use of illustrate().
+ */
+public abstract class Illustration
+{
+    /**
+     * The Surface containing the illustration you wish to illustrate
+     */
+    protected Surface surface;
+
+    private String target;
+
+    /**
+     * Instantiate a new illustration demo. For (Operator.class, "blah")
+     * you'll get doc/api/org/freedesktop/cairo/Operator-blah.png
+     */
+    protected Illustration(Class<?> underTest, String suffix) {
+        this.target = targetFilenameFromClass(underTest, suffix);
+    }
+
+    /**
+     * Draw the illustration
+     */
+    abstract public void illustrate();
+
+    static String targetFilenameFromClass(Class<?> underTest, String suffix) {
+        final StringBuffer path;
+        int i = 0;
+
+        path = new StringBuffer(underTest.getPackage().getName());
+        while ((i = path.indexOf(".", i)) != -1) {
+            path.setCharAt(i, '/');
+        }
+        path.insert(0, "doc/api/");
+
+        path.append("/");
+        path.append(underTest.getSimpleName());
+
+        if (suffix != null) {
+            path.append("-");
+            path.append(suffix);
+        }
+
+        path.append(".png");
+
+        return path.toString();
+    }
+
+    public String getFilename() {
+        return target;
+    }
+
+    public Surface getSurface() {
+        return surface;
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperator.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperator.java
new file mode 100644
index 0000000..342bc2e
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperator.java
@@ -0,0 +1,49 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+abstract class IllustrationOperator extends Illustration
+{
+    Context cr;
+
+    IllustrationOperator(Class<?> cls, String suffix) {
+        super(Operator.class, suffix);
+
+        surface = new ImageSurface(Format.ARGB32, 100, 100);
+        cr = new Context(surface);
+    }
+
+    protected void drawOperator(Operator op) {
+        /* Draw the Destination rectangle */
+        cr.rectangle(0, 0, 75, 75);
+        cr.setSource(0.7, 0, 0, 0.8);
+        cr.fill();
+
+        /* Set the Operator */
+        cr.setOperator(op);
+
+        /* Draw the Source Rectangle */
+        cr.rectangle(40, 40, 75, 75);
+        cr.setSource(0, 0, 0.9, 0.4);
+        cr.fill();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorAdd.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorAdd.java
new file mode 100644
index 0000000..b3d9f38
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorAdd.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorAdd extends IllustrationOperator
+{
+    public IllustrationOperatorAdd() {
+        super(Operator.class, "add");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.ADD);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorAtop.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorAtop.java
new file mode 100644
index 0000000..66ea3e8
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorAtop.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorAtop extends IllustrationOperator
+{
+    public IllustrationOperatorAtop() {
+        super(Operator.class, "atop");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.ATOP);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorClear.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorClear.java
new file mode 100644
index 0000000..511d5b0
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorClear.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorClear extends IllustrationOperator
+{
+    public IllustrationOperatorClear() {
+        super(Operator.class, "clear");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.CLEAR);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDest.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDest.java
new file mode 100644
index 0000000..8799bab
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDest.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorDest extends IllustrationOperator
+{
+    public IllustrationOperatorDest() {
+        super(Operator.class, "dest");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.DEST);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestAtop.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestAtop.java
new file mode 100644
index 0000000..e3385b9
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestAtop.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorDestAtop extends IllustrationOperator
+{
+    public IllustrationOperatorDestAtop() {
+        super(Operator.class, "dest_atop");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.DEST_ATOP);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestIn.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestIn.java
new file mode 100644
index 0000000..9f18d30
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestIn.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorDestIn extends IllustrationOperator
+{
+    public IllustrationOperatorDestIn() {
+        super(Operator.class, "dest_in");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.DEST_IN);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestOut.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestOut.java
new file mode 100644
index 0000000..6ca9a97
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestOut.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorDestOut extends IllustrationOperator
+{
+    public IllustrationOperatorDestOut() {
+        super(Operator.class, "dest_out");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.DEST_OUT);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestOver.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestOver.java
new file mode 100644
index 0000000..4bcc7ae
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorDestOver.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorDestOver extends IllustrationOperator
+{
+    public IllustrationOperatorDestOver() {
+        super(Operator.class, "dest_over");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.DEST_OVER);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorIn.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorIn.java
new file mode 100644
index 0000000..b0125ef
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorIn.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorIn extends IllustrationOperator
+{
+    public IllustrationOperatorIn() {
+        super(Operator.class, "in");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.IN);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorOut.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorOut.java
new file mode 100644
index 0000000..12f913a
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorOut.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorOut extends IllustrationOperator
+{
+    public IllustrationOperatorOut() {
+        super(Operator.class, "out");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.OUT);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorOver.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorOver.java
new file mode 100644
index 0000000..6218384
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorOver.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorOver extends IllustrationOperator
+{
+    public IllustrationOperatorOver() {
+        super(Operator.class, "over");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.OVER);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorSaturate.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorSaturate.java
new file mode 100644
index 0000000..d4acb0b
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorSaturate.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorSaturate extends IllustrationOperator
+{
+    public IllustrationOperatorSaturate() {
+        super(Operator.class, "saturate");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.SATURATE);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorSource.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorSource.java
new file mode 100644
index 0000000..3e5a85c
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorSource.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorSource extends IllustrationOperator
+{
+    public IllustrationOperatorSource() {
+        super(Operator.class, "source");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.SOURCE);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorXOR.java b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorXOR.java
new file mode 100644
index 0000000..ac5301e
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/IllustrationOperatorXOR.java
@@ -0,0 +1,33 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Kenneth Prugh
+ */
+public class IllustrationOperatorXOR extends IllustrationOperator
+{
+    public IllustrationOperatorXOR() {
+        super(Operator.class, "xor");
+    }
+
+    public void illustrate() {
+        super.drawOperator(Operator.XOR);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotCairo.java b/tests/screenshots/org/freedesktop/cairo/SnapshotCairo.java
new file mode 100644
index 0000000..b1236e1
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotCairo.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Image;
+import org.gnome.gtk.Snapshot;
+import org.gnome.gtk.Widget;
+import org.gnome.gtk.Window;
+
+/**
+ * @author Andrew Cowie
+ */
+public abstract class SnapshotCairo extends Snapshot
+{
+    public SnapshotCairo(Class<?> cls, String suffix) {
+        super(cls, suffix);
+        final Image image;
+
+        window = new Window();
+        window.setDefaultSize(100, 100);
+        window.setDecorated(false);
+
+        image = new Image();
+        window.add(image);
+        window.showAll();
+
+        image.connect(new Widget.Draw() {
+            public boolean onDraw(Widget source, Context cr) {
+                draw(cr);
+                return false;
+            }
+        });
+    }
+
+    protected abstract void draw(Context cr);
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotCairoAxis.java b/tests/screenshots/org/freedesktop/cairo/SnapshotCairoAxis.java
new file mode 100644
index 0000000..f512134
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotCairoAxis.java
@@ -0,0 +1,79 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.pango.FontDescription;
+import org.gnome.pango.Layout;
+import org.gnome.pango.Rectangle;
+
+/**
+ * Draw an x and y axis, emphasizing that +y is downwards.
+ * 
+ * @author Andrew Cowie
+ */
+
+abstract class SnapshotCairoAxis extends SnapshotCairo
+{
+    SnapshotCairoAxis(Class<?> cls, String suffix) {
+        super(cls, suffix);
+    }
+
+    protected void drawAxis(Context cr) {
+        final Layout text;
+        final FontDescription desc;
+        Rectangle rect;
+
+        text = new Layout(cr);
+
+        cr.setSource(0, 0, 0);
+        cr.setLineWidth(2.0);
+
+        // horizontal
+        cr.moveTo(5, 50);
+        cr.lineTo(95, 50);
+        cr.stroke();
+
+        cr.moveTo(95, 50);
+        cr.lineRelative(-5, -3);
+        cr.lineRelative(0, 6);
+        cr.fill();
+
+        desc = new FontDescription("Liberation Serif, 12");
+        text.setFontDescription(desc);
+        text.setMarkup("+<i>x</i>");
+        rect = text.getExtentsLogical();
+        cr.moveTo(95 - rect.getWidth(), 50 - rect.getHeight() - 2);
+        cr.showLayout(text);
+
+        // vertical
+        cr.moveTo(50, 5);
+        cr.lineTo(50, 95);
+        cr.stroke();
+
+        cr.moveTo(50, 95);
+        cr.lineRelative(-3, -5);
+        cr.lineRelative(+6, 0);
+        cr.fill();
+
+        text.setMarkup("+<i>y</i>");
+        rect = text.getExtentsLogical();
+        cr.moveTo(50 - rect.getWidth() - 5, 95 - rect.getHeight());
+        cr.showLayout(text);
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotContextArc.java b/tests/screenshots/org/freedesktop/cairo/SnapshotContextArc.java
new file mode 100644
index 0000000..3cdd637
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotContextArc.java
@@ -0,0 +1,59 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotContextArc extends SnapshotCairoAxis
+{
+    public SnapshotContextArc() {
+        super(Context.class, "arc");
+    }
+
+    protected void draw(Context cr) {
+        final double x, y;
+
+        super.drawAxis(cr);
+
+        // arc positive
+        cr.setSource(0, 0, 1);
+        cr.setLineWidth(2.0);
+
+        cr.moveTo(50 + 30, 50);
+        cr.arc(50, 50, 30, 0, Math.PI / 3);
+
+        x = cr.getCurrentPointX();
+        y = cr.getCurrentPointY();
+        cr.stroke();
+
+        cr.moveTo(x, y + 0.2);
+        cr.lineRelative(2, -6);
+        cr.lineRelative(4.5, 5.5);
+        cr.fill();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotContextArc());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotContextArcNegative.java b/tests/screenshots/org/freedesktop/cairo/SnapshotContextArcNegative.java
new file mode 100644
index 0000000..17935de
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotContextArcNegative.java
@@ -0,0 +1,63 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+/*
+ * This code is a close copy of SnapshotContextArc (and both inherit from
+ * SnapshotContextAxis). If you change one, change the other.
+ */
+public class SnapshotContextArcNegative extends SnapshotCairoAxis
+{
+    public SnapshotContextArcNegative() {
+        super(Context.class, "arcNegative");
+    }
+
+    protected void draw(Context cr) {
+        final double x, y;
+
+        super.drawAxis(cr);
+
+        // arc negative
+        cr.setSource(0, 0, 1);
+        cr.setLineWidth(2.0);
+
+        cr.moveTo(50 + 30, 50);
+        cr.arcNegative(50, 50, 30, 0, -(Math.PI * 3.0 / 4.0));
+
+        x = cr.getCurrentPointX();
+        y = cr.getCurrentPointY();
+        cr.stroke();
+
+        cr.moveTo(x, y + 0.2);
+        cr.lineRelative(2, -6);
+        cr.lineRelative(4.5, 5.5);
+        cr.fill();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotContextArcNegative());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotContextLine.java b/tests/screenshots/org/freedesktop/cairo/SnapshotContextLine.java
new file mode 100644
index 0000000..69a7e46
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotContextLine.java
@@ -0,0 +1,44 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotContextLine extends SnapshotCairo
+{
+    public SnapshotContextLine() {
+        super(Context.class, "line");
+    }
+
+    protected void draw(Context cr) {
+        cr.setSource(1.0, 0.0, 0.0);
+        cr.moveTo(10, 10);
+        cr.lineTo(90, 50);
+        cr.stroke();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotContextLine());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotContextRectangle.java b/tests/screenshots/org/freedesktop/cairo/SnapshotContextRectangle.java
new file mode 100644
index 0000000..1b474c6
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotContextRectangle.java
@@ -0,0 +1,43 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotContextRectangle extends SnapshotCairo
+{
+    public SnapshotContextRectangle() {
+        super(Context.class, "rectangle");
+    }
+
+    protected void draw(Context cr) {
+        cr.setSource(0.5, 1.0, 0.0, 0.8);
+        cr.rectangle(30, 20, 60, 60);
+        cr.fill();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotContextRectangle());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotMatrix.java b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrix.java
new file mode 100644
index 0000000..b20e2a6
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrix.java
@@ -0,0 +1,51 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+/**
+ * @author Andrew Cowie
+ */
+abstract class SnapshotMatrix extends SnapshotCairoAxis
+{
+    public SnapshotMatrix(String suffix) {
+        super(Matrix.class, suffix);
+    }
+
+    protected void drawAxis(Context cr) {
+        final Matrix reset;
+
+        super.drawAxis(cr);
+
+        reset = new Matrix();
+        reset.translate(50.0, 50.0);
+        cr.transform(reset);
+    }
+
+    protected void drawBox(Context cr, boolean first) {
+        cr.setLineWidth(2.0);
+
+        if (first) {
+            cr.setSource(0.7, 0.8, 0.8);
+        } else {
+            cr.setSource(0.0, 0.0, 1.0);
+        }
+        cr.rectangle(5, 5, 25, 15);
+        cr.stroke();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixRotate.java b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixRotate.java
new file mode 100644
index 0000000..5378ede
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixRotate.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotMatrixRotate extends SnapshotMatrix
+{
+    public SnapshotMatrixRotate() {
+        super("rotate");
+    }
+
+    protected void draw(Context cr) {
+        final Matrix matrix;
+
+        super.drawAxis(cr);
+        super.drawBox(cr, true);
+
+        matrix = new Matrix();
+        matrix.rotate(-Math.PI / 4.0);
+        cr.transform(matrix);
+
+        super.drawBox(cr, false);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotMatrixRotate());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixScale.java b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixScale.java
new file mode 100644
index 0000000..df9dc84
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixScale.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotMatrixScale extends SnapshotMatrix
+{
+    public SnapshotMatrixScale() {
+        super("scale");
+    }
+
+    protected void draw(Context cr) {
+        final Matrix matrix;
+
+        super.drawAxis(cr);
+        super.drawBox(cr, true);
+
+        matrix = new Matrix();
+        matrix.scale(-0.8, 1.6);
+        cr.transform(matrix);
+
+        super.drawBox(cr, false);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotMatrixScale());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixTranslate.java b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixTranslate.java
new file mode 100644
index 0000000..ca2db53
--- /dev/null
+++ b/tests/screenshots/org/freedesktop/cairo/SnapshotMatrixTranslate.java
@@ -0,0 +1,50 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.freedesktop.cairo;
+
+import org.gnome.gtk.Gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotMatrixTranslate extends SnapshotMatrix
+{
+    public SnapshotMatrixTranslate() {
+        super("translate");
+    }
+
+    protected void draw(Context cr) {
+        final Matrix matrix;
+
+        super.drawAxis(cr);
+        super.drawBox(cr, true);
+
+        matrix = new Matrix();
+        matrix.translate(5, 10);
+        cr.transform(matrix);
+
+        super.drawBox(cr, false);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotMatrixTranslate());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/Snapshot.java b/tests/screenshots/org/gnome/gtk/Snapshot.java
new file mode 100644
index 0000000..0b171c3
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/Snapshot.java
@@ -0,0 +1,153 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.io.FileNotFoundException;
+
+import org.gnome.gdk.Event;
+import org.gnome.gdk.Pixbuf;
+
+/**
+ * Extend this class to create a snapshot to be used in the documentation
+ * 
+ * @author Andrew Cowie
+ * @since 4.0.5
+ */
+/*
+ * This is not the greatest API. The fact that you have to populate the window
+ * field in a subclass is ok, but the presence of the helper methods here just
+ * seems clutter. What really complicates matters is trying to find a scheme
+ * where running the Snapshot with a minimal main() method causes the Window
+ * to appear, whereas running the Harness also works sensibly. Ideally this
+ * would be like JUnit test cases, but that would require a plugin to Eclipse
+ * to work. There is, therefore, something to be said for doing this as a
+ * JUnit TestSuite.
+ */
+public abstract class Snapshot
+{
+    protected static Pixbuf logo = null;
+
+    /**
+     * The Window containing the user interface you wish to screenshot. This
+     * Window will be presented and hidden by the calling test harness.
+     */
+    protected Window window;
+
+    private String target;
+
+    /**
+     * Instantiate a new screenshot demo. The class you are doing a demo for
+     * will be used to derive the target filename, ie Button.class ->
+     * doc/api/org/gnome/gtk/Button.png
+     */
+    protected Snapshot(Class<?> underTest) {
+        this.target = targetFilenameFromClass(underTest, null);
+    }
+
+    /**
+     * Instantiate a new screenshot demo. For (Button.class, "blah") you'll
+     * get doc/api/org/gnome/gtk/Button-blah.png
+     */
+    protected Snapshot(Class<?> underTest, String suffix) {
+        this.target = targetFilenameFromClass(underTest, suffix);
+    }
+
+    public static void cycleMainLoop() {
+        /*
+         * Lead off with one iteration no matter what. Pending events aren't
+         * the only thing that the main loop does! Then continue by working
+         * off whatever has accumulated.
+         */
+        do {
+            try {
+                GtkMain.mainIterationDo(false);
+                Thread.sleep(10);
+            } catch (InterruptedException e) {
+                // ignore
+            }
+        } while (GtkMain.eventsPending());
+    }
+
+    /**
+     * Run a single Screenshot wrapper in interactive mode so you can preview
+     * it and check your work.
+     */
+    /*
+     * As noted elsewhere, I'm not super thrilled about this API. If anyone
+     * has an idea for making is sexier, let me know.
+     */
+    protected static void runExample(final Snapshot example) {
+        final Pixbuf logo;
+        final Window w;
+
+        w = example.window;
+
+        try {
+            logo = new Pixbuf("src/bindings/java-gnome_Icon.png");
+            Gtk.setDefaultIcon(logo);
+        } catch (FileNotFoundException fnfe) {
+            System.err.println("Where's the logo?");
+        }
+
+        w.showAll();
+        w.present();
+
+        w.connect(new Window.DeleteEvent() {
+            public boolean onDeleteEvent(Widget source, Event event) {
+                Gtk.mainQuit();
+                return false;
+            }
+        });
+    }
+
+    static String targetFilenameFromClass(Class<?> underTest, String suffix) {
+        final StringBuffer path;
+        int i = 0;
+
+        path = new StringBuffer(underTest.getPackage().getName());
+        while ((i = path.indexOf(".", i)) != -1) {
+            path.setCharAt(i, '/');
+        }
+        path.insert(0, "doc/api/");
+
+        path.append("/");
+        path.append(underTest.getSimpleName());
+
+        if (suffix != null) {
+            path.append("-");
+            path.append(suffix);
+        }
+
+        path.append(".png");
+
+        return path.toString();
+    }
+
+    public Window getWindow() {
+        if (window == null) {
+            throw new IllegalStateException(
+                    "\nThe window of this Snapshot subclass has not been set yet!");
+        }
+        return window;
+    }
+
+    public String getFilename() {
+        return target;
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotAboutDialog.java b/tests/screenshots/org/gnome/gtk/SnapshotAboutDialog.java
new file mode 100644
index 0000000..1c8ab18
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotAboutDialog.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-20l1 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.freedesktop.bindings.Version;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotAboutDialog extends SnapshotDialog
+{
+    public SnapshotAboutDialog() {
+        super(AboutDialog.class);
+        final AboutDialog dialog;
+
+        dialog = new AboutDialog();
+
+        dialog.setProgramName("java-gnome");
+        dialog.setVersion(Version.getVersion());
+        dialog.setComments("The library allowing you to write outstanding GNOME applications with the GTK widget toolkit, from Java!");
+        dialog.setCopyright("Copyright \u00A9 2006-2011 Operational Dynamics Consulting, Pty Ltd and Others");
+        dialog.setAuthors(new String[] {
+            "Andrew Cowie <andrew at operationaldynamics.com>",
+            "Srichand Pendyala <srichand.pendyala at gmail.com>",
+            "Vreixo Formoso Lopes <metalpain2002 at yahoo.es>",
+            "Sebastian Mancke <s.mancke at tarent.de>"
+        });
+        dialog.setWebsite("http://java-gnome.sourceforge.net/");
+
+        window = dialog;
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotAboutDialog());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotArrow.java b/tests/screenshots/org/gnome/gtk/SnapshotArrow.java
new file mode 100644
index 0000000..e607cc0
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotArrow.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotArrow extends Snapshot
+{
+    public SnapshotArrow() {
+        super(Arrow.class);
+
+        final HBox x;
+        final Arrow a1, a2, a3, a4;
+
+        window = new Window();
+        window.setDecorated(false);
+        window.setBorderWidth(6);
+
+        x = new HBox(true, 6);
+
+        a1 = new Arrow(ArrowType.UP, ShadowType.OUT);
+        x.packStart(a1, false, false, 0);
+        a2 = new Arrow(ArrowType.DOWN, ShadowType.OUT);
+        x.packStart(a2, false, false, 0);
+        a3 = new Arrow(ArrowType.LEFT, ShadowType.OUT);
+        x.packStart(a3, false, false, 0);
+        a4 = new Arrow(ArrowType.RIGHT, ShadowType.OUT);
+        x.packStart(a4, false, false, 0);
+
+        window.add(x);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotArrow());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotAssistant.java b/tests/screenshots/org/gnome/gtk/SnapshotAssistant.java
new file mode 100644
index 0000000..02ec2e6
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotAssistant.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Stefan Prelle
+ */
+public class SnapshotAssistant extends Snapshot
+{
+    public SnapshotAssistant() {
+        super(Assistant.class);
+
+        final Assistant assi = new Assistant();
+        final Entry id_tf;
+        super.window = assi;
+
+        final VBox page2 = new VBox(false, 3);
+        id_tf = new Entry();
+        page2.packStart(new Label("Enter any data"), false, false, 0);
+        page2.packStart(new Label("The 'next' button will be enabled after\nyou hit return."), false,
+                false, 0);
+        page2.packEnd(id_tf, false, false, 0);
+        assi.appendPage(page2);
+        assi.setPageComplete(page2, true);
+        assi.setPageType(page2, AssistantPageType.CONTENT);
+        assi.setPageTitle(page2, "Enter data");
+
+        // Page 3
+        Label page3 = new Label("");
+        assi.appendPage(page3);
+        assi.setPageType(page3, AssistantPageType.CONFIRM);
+        assi.setPageTitle(page3, "Done");
+        assi.setPageComplete(page3, true);
+
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotAssistant());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotButton.java b/tests/screenshots/org/gnome/gtk/SnapshotButton.java
new file mode 100644
index 0000000..2aa423e
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotButton.java
@@ -0,0 +1,44 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotButton extends Snapshot
+{
+    public SnapshotButton() {
+        super(Button.class);
+
+        final Button b;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        b = new Button(" Press Me ");
+
+        window.add(b);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotButton());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotCalendar.java b/tests/screenshots/org/gnome/gtk/SnapshotCalendar.java
new file mode 100644
index 0000000..aa56d67
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotCalendar.java
@@ -0,0 +1,46 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotCalendar extends Snapshot
+{
+    public SnapshotCalendar() {
+        super(Calendar.class);
+
+        final Calendar b;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        b = new Calendar();
+        b.selectMonth(12, 2007);
+        b.selectDay(21);
+
+        window.add(b);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotCalendar());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotComboBox.java b/tests/screenshots/org/gnome/gtk/SnapshotComboBox.java
new file mode 100644
index 0000000..594cd0b
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotComboBox.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Wrote this before we had the text methods spliced off into TextComboBox,
+ * but in any case this provides a good test of the ComboBox functionality.
+ * FIXME Screenshot doesn't seem to capture the popup properly, even though it
+ * does raise to screen when run manually. Help?
+ * 
+ * @author Andrew Cowie
+ */
+public class SnapshotComboBox extends Snapshot
+{
+    private final ListStore model;
+
+    private final DataColumnString cityColumn;
+
+    private final DataColumnString codeColumn;
+
+    public SnapshotComboBox() {
+        super(ComboBox.class);
+        final ComboBox combo;
+        CellRendererText text;
+
+        window = new Window();
+        window.setTitle("Airports");
+        window.setDecorated(false);
+
+        model = new ListStore(new DataColumn[] {
+            cityColumn = new DataColumnString(),
+            codeColumn = new DataColumnString(),
+        });
+
+        populate("Sydney", "Australia", "SYD");
+        populate("Toronto", "Canada", "YYZ");
+        populate("New York", "United States of America", "JFK");
+        populate("London", "United Kingdom of Great Britain and Northern Ireland", "LHR");
+
+        combo = new ComboBox(model);
+
+        text = new CellRendererText(combo);
+        text.setMarkup(cityColumn);
+
+        text = new CellRendererText(combo);
+        text.setMarkup(codeColumn);
+        text.setAlignment(Alignment.RIGHT, Alignment.TOP);
+
+        window.add(combo);
+
+        window.showAll();
+        window.move(100, 100);
+        combo.setActive(2);
+        // combo.popup();
+    }
+
+    private void populate(String city, String country, String code) {
+        TreeIter row;
+
+        row = model.appendRow();
+        model.setValue(row, cityColumn, city + "\n<span size='small'><i>" + country + "</i></span>");
+        model.setValue(row, codeColumn, "<span font_desc='Mono'>" + code + "</span>");
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotComboBox());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotComboBoxText.java b/tests/screenshots/org/gnome/gtk/SnapshotComboBoxText.java
new file mode 100644
index 0000000..ded3a9b
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotComboBoxText.java
@@ -0,0 +1,55 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * FIXME Same problem as SnapshotComboBox, which is where this code originally
+ * lived.
+ * 
+ * @author Andrew Cowie
+ */
+public class SnapshotComboBoxText extends Snapshot
+{
+    public SnapshotComboBoxText() {
+        super(ComboBoxText.class);
+
+        final ComboBoxText combo;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        combo = new ComboBoxText();
+        combo.appendText("SYD");
+        combo.appendText("YYZ");
+        combo.appendText("JFK");
+        combo.appendText("LHR");
+        window.add(combo);
+
+        window.showAll();
+        window.move(100, 100);
+        combo.setActive(2);
+        // combo.popup();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotComboBoxText());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotComboBoxTextEntry.java b/tests/screenshots/org/gnome/gtk/SnapshotComboBoxTextEntry.java
new file mode 100644
index 0000000..9c5af75
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotComboBoxTextEntry.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotComboBoxTextEntry extends Snapshot
+{
+    public SnapshotComboBoxTextEntry() {
+        super(ComboBoxText.class, "-Entry");
+
+        final ComboBoxText combo;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        combo = new ComboBoxText();
+        combo.appendText("Sydney");
+        combo.appendText("Toronto");
+        combo.appendText("New York");
+        combo.appendText("London");
+        window.add(combo);
+
+        window.showAll();
+        window.move(100, 100);
+        combo.setActive(2);
+        // combo.popup();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotComboBoxText());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotDialog.java b/tests/screenshots/org/gnome/gtk/SnapshotDialog.java
new file mode 100644
index 0000000..29935c2
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotDialog.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+/*
+ * Doesn't have to be abstract (we'll have a snapshot for Dialog sooner or
+ * later, I imagine); this was originally put here as a way to hook up the
+ * appropriate handlers to deal with closing Dialogs when running manually.
+ */
+abstract class SnapshotDialog extends Snapshot
+{
+    protected SnapshotDialog(Class<?> underTest) {
+        super(underTest);
+    }
+
+    /*
+     * Chain up to the runExample() in Snapshot, then hook up a generic
+     * RESPONSE handler.
+     */
+    protected static void runExample(final Snapshot example) {
+        final Dialog dialog;
+
+        Snapshot.runExample(example);
+
+        dialog = (Dialog) example.window;
+
+        dialog.connect(new Dialog.Response() {
+            public void onResponse(Dialog source, ResponseType response) {
+                Gtk.mainQuit();
+            }
+        });
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotEntryCompletion.java b/tests/screenshots/org/gnome/gtk/SnapshotEntryCompletion.java
new file mode 100644
index 0000000..444b57e
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotEntryCompletion.java
@@ -0,0 +1,71 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Illustrate the EntryCompletion use on an Entry widget.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class SnapshotEntryCompletion extends Snapshot
+{
+    public SnapshotEntryCompletion() {
+        super(EntryCompletion.class);
+
+        final ListStore model;
+        final DataColumnString column;
+        final Entry entry;
+        final EntryCompletion completion;
+        final VBox vbox;
+        final Label label;
+
+        TreeIter row;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        vbox = new VBox(false, 3);
+        window.add(vbox);
+
+        label = new Label("Send a mail to:");
+        vbox.add(label);
+
+        model = new ListStore(new DataColumn[] {
+            column = new DataColumnString()
+        });
+
+        row = model.appendRow();
+        model.setValue(row, column, "respawneral at gmail.com");
+
+        entry = new Entry();
+        completion = new EntryCompletion();
+
+        completion.setModel(model);
+        completion.setTextColumn(column);
+
+        entry.setCompletion(completion);
+        vbox.add(entry);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotEntryCompletion());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotEntryIcon.java b/tests/screenshots/org/gnome/gtk/SnapshotEntryIcon.java
new file mode 100644
index 0000000..6395585
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotEntryIcon.java
@@ -0,0 +1,48 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Illustrate using setIconFromStock() on an Entry.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class SnapshotEntryIcon extends Snapshot
+{
+    public SnapshotEntryIcon() {
+        super(Entry.class);
+
+        final Entry entry;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        entry = new Entry();
+        entry.setIconFromStock(EntryIconPosition.SECONDARY, Stock.CLEAR);
+        entry.setText("Search...");
+
+        window.add(entry);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotEntryIcon());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotEntryRed.java b/tests/screenshots/org/gnome/gtk/SnapshotEntryRed.java
new file mode 100644
index 0000000..c18a863
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotEntryRed.java
@@ -0,0 +1,52 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.RGBA;
+
+/**
+ * Illustrate using modifyText() on an Entry. FIXME, probably should save this
+ * with a specific name for use on Widget.
+ * 
+ * @author Andrew Cowie
+ */
+public class SnapshotEntryRed extends Snapshot
+{
+    public SnapshotEntryRed() {
+        super(Entry.class);
+
+        final Entry e;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        e = new Entry();
+        e.setText("Lots of money");
+        e.overrideColor(StateFlags.NORMAL, RGBA.RED);
+        e.selectRegion(0, 0);
+
+        window.add(e);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotEntryRed());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotFileChooserDialog.java b/tests/screenshots/org/gnome/gtk/SnapshotFileChooserDialog.java
new file mode 100644
index 0000000..1a03bd1
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotFileChooserDialog.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotFileChooserDialog extends SnapshotDialog
+{
+    public SnapshotFileChooserDialog() {
+        super(FileChooserDialog.class);
+
+        final FileChooserDialog dialog;
+
+        dialog = new FileChooserDialog("Pick a file", null, FileChooserAction.OPEN);
+        try {
+            dialog.setFilename(new File("AUTHORS").getCanonicalPath());
+        } catch (IOException ie) {
+            System.err.println("Couldn't extract the canonical path. Go figure");
+            ie.printStackTrace();
+            /*
+             * And carry on. Not great, but if you're not the person
+             * publishing the website, whatever.
+             */
+        }
+
+        window = dialog;
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotFileChooserDialog());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotHScale.java b/tests/screenshots/org/gnome/gtk/SnapshotHScale.java
new file mode 100644
index 0000000..2185772
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotHScale.java
@@ -0,0 +1,46 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotHScale extends Snapshot
+{
+    public SnapshotHScale() {
+        super(HScale.class);
+
+        final HScale hs;
+
+        window = new Window();
+        window.setDecorated(false);
+        window.setDefaultSize(200, -1);
+
+        hs = new HScale(0, 100, 10);
+        hs.setValue(35);
+
+        window.add(hs);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotHScale());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotInfoBar.java b/tests/screenshots/org/gnome/gtk/SnapshotInfoBar.java
new file mode 100644
index 0000000..9ff1932
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotInfoBar.java
@@ -0,0 +1,54 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Guillaume Mazoyer
+ */
+public class SnapshotInfoBar extends Snapshot
+{
+    public SnapshotInfoBar() {
+        super(InfoBar.class);
+
+        final InfoBar bar;
+        final Label label;
+
+        window = new Window();
+        window.setDecorated(false);
+        window.setBorderWidth(6);
+
+        bar = new InfoBar();
+
+        label = new Label("You have been disconnected.\nClick on the reconnect button to go online.");
+        bar.add(label);
+
+        bar.addButton("Reconnect", ResponseType.OK);
+        bar.addButton(Stock.QUIT, ResponseType.DELETE_EVENT);
+
+        bar.setMessageType(MessageType.WARNING);
+
+        window.add(bar);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotInfoBar());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotInfoMessageDialog.java b/tests/screenshots/org/gnome/gtk/SnapshotInfoMessageDialog.java
new file mode 100644
index 0000000..b02695c
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotInfoMessageDialog.java
@@ -0,0 +1,37 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotInfoMessageDialog extends SnapshotDialog
+{
+    public SnapshotInfoMessageDialog() {
+        super(InfoMessageDialog.class);
+
+        window = new InfoMessageDialog(null, "You should feel privileged", "He hardly lands for anyone.");
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotInfoMessageDialog());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotLinkButton.java b/tests/screenshots/org/gnome/gtk/SnapshotLinkButton.java
new file mode 100644
index 0000000..5b60a3b
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotLinkButton.java
@@ -0,0 +1,63 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * @author Serkan Kaba
+ */
+public class SnapshotLinkButton extends Snapshot
+{
+    public SnapshotLinkButton() throws URISyntaxException {
+        super(LinkButton.class);
+
+        final VBox x;
+        final LinkButton link1, link2;
+        final Label label1, label2;
+
+        window = new Window();
+        window.setDecorated(false);
+        window.setBorderWidth(6);
+
+        x = new VBox(true, 6);
+
+        label1 = new Label("LinkButton with only a URI as its label");
+        x.packStart(label1, false, false, 0);
+
+        link1 = new LinkButton(new URI("http://java-gnome.sourceforge.net/"));
+        x.packStart(link1, false, false, 0);
+
+        label2 = new Label("A visited LinkButton with a text label");
+        x.packStart(label2, false, false, 0);
+
+        link2 = new LinkButton(new URI("http://java-gnome.sourceforge.net/"), "The java-gnome website");
+        link2.setVisited(true);
+        x.packStart(link2, false, false, 0);
+
+        window.add(x);
+    }
+
+    public static void main(String[] args) throws URISyntaxException {
+        Gtk.init(args);
+        runExample(new SnapshotLinkButton());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotNotebook.java b/tests/screenshots/org/gnome/gtk/SnapshotNotebook.java
new file mode 100644
index 0000000..2ea5aa3
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotNotebook.java
@@ -0,0 +1,58 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotNotebook extends Snapshot
+{
+    public SnapshotNotebook() {
+        super(Notebook.class);
+        final Notebook book;
+        final Label firstPage, firstTab;
+        final Label secondPage, secondTab;
+        final Label thirdPage, thirdTab;
+
+        book = new Notebook();
+
+        firstPage = new Label("This is the first page");
+        firstTab = new Label("One");
+        book.appendPage(firstPage, firstTab);
+
+        secondPage = new Label("");
+        secondTab = new Label("Two");
+        book.appendPage(secondPage, secondTab);
+
+        thirdPage = new Label("");
+        thirdTab = new Label("Three");
+        book.appendPage(thirdPage, thirdTab);
+
+        window = new Window();
+        window.setDecorated(true);
+        window.setDefaultSize(200, 200);
+        window.add(book);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotNotebook());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotQuestionMessageDialog.java b/tests/screenshots/org/gnome/gtk/SnapshotQuestionMessageDialog.java
new file mode 100644
index 0000000..a144505
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotQuestionMessageDialog.java
@@ -0,0 +1,36 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotQuestionMessageDialog extends SnapshotDialog
+{
+    public SnapshotQuestionMessageDialog() {
+        super(QuestionMessageDialog.class);
+        window = new QuestionMessageDialog(null, "File Exists!", "Do you really want to overwrite it?");
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotQuestionMessageDialog());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotRadioButton.java b/tests/screenshots/org/gnome/gtk/SnapshotRadioButton.java
new file mode 100644
index 0000000..55e2574
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotRadioButton.java
@@ -0,0 +1,62 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotRadioButton extends Snapshot
+{
+    public SnapshotRadioButton() {
+        super(RadioButton.class);
+
+        final RadioGroup muppets;
+        final RadioButton kermit, animal, gonzo, fozzie;
+        final VBox x;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        x = new VBox(false, 3);
+
+        muppets = new RadioGroup();
+
+        kermit = new RadioButton(muppets, "Kermit");
+        x.add(kermit);
+
+        animal = new RadioButton(muppets, "Animal");
+        x.add(animal);
+
+        gonzo = new RadioButton(muppets, "Gonzo");
+        x.add(gonzo);
+
+        fozzie = new RadioButton(muppets, "Fozzie");
+        x.add(fozzie);
+
+        gonzo.setActive(true);
+
+        window.add(x);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotRadioButton());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotStatusbar.java b/tests/screenshots/org/gnome/gtk/SnapshotStatusbar.java
new file mode 100644
index 0000000..44b0b59
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotStatusbar.java
@@ -0,0 +1,64 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2011 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.gnome.gdk.RGBA;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotStatusbar extends Snapshot
+{
+    public SnapshotStatusbar() {
+        super(Statusbar.class);
+        final VBox box;
+        final Statusbar status;
+        final Label spacer;
+
+        window = new Window();
+        window.setTitle("Statusbar");
+        window.setDecorated(true);
+        window.setDefaultSize(200, 100);
+
+        box = new VBox(false, 0);
+        // I wish Java had here-docs
+        spacer = new Label("This <tt>Window</tt> has a <tt>Statusbar</tt> " + "at the bottom. "
+                + "Notice the message \"Ready\" " + "and also the grab handle on the right-hand side.");
+        spacer.setLineWrap(true);
+        spacer.setUseMarkup(true);
+        spacer.setAlignment(0.0f, 0.0f);
+        spacer.setSizeRequest(200, 100);
+        spacer.setPadding(2, 1);
+        window.overrideBackground(StateFlags.NORMAL, RGBA.WHITE);
+        box.packStart(spacer, false, false, 0);
+
+        status = new Statusbar();
+        status.setMessage("Ready");
+        box.packEnd(status, false, false, 0);
+
+        window.add(box);
+        window.showAll();
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotStatusbar());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotSwitch.java b/tests/screenshots/org/gnome/gtk/SnapshotSwitch.java
new file mode 100644
index 0000000..2ae1637
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotSwitch.java
@@ -0,0 +1,53 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2011 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * Illustrate the Switch widget.
+ * 
+ * @author Guillaume Mazoyer
+ */
+public class SnapshotSwitch extends Snapshot
+{
+    public SnapshotSwitch() {
+        super(Switch.class);
+
+        final HBox hbox;
+        final Label label;
+        final Switch switchy;
+
+        window = new Window();
+        window.setDecorated(false);
+
+        hbox = new HBox(true, 3);
+        label = new Label("Switch me!");
+        switchy = new Switch();
+
+        hbox.packStart(label, false, false, 0);
+        hbox.packStart(switchy, false, false, 0);
+
+        window.add(hbox);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotSwitch());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotTextView.java b/tests/screenshots/org/gnome/gtk/SnapshotTextView.java
new file mode 100644
index 0000000..cf73b21
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotTextView.java
@@ -0,0 +1,69 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import org.gnome.pango.Style;
+
+import static org.gnome.gtk.PolicyType.ALWAYS;
+import static org.gnome.gtk.PolicyType.NEVER;
+import static org.gnome.gtk.WrapMode.WORD;
+import static textview.LoremIpsum.text;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotTextView extends Snapshot
+{
+    public SnapshotTextView() {
+        super(TextView.class);
+        final TextView view;
+        final TextBuffer buffer;
+        final ScrolledWindow scroll;
+        final TextTag italic;
+        TextIter start;
+
+        buffer = new TextBuffer();
+        view = new TextView(buffer);
+
+        view.setWrapMode(WORD);
+        scroll = new ScrolledWindow();
+        scroll.setPolicy(NEVER, ALWAYS);
+        scroll.add(view);
+
+        italic = new TextTag();
+        italic.setStyle(Style.ITALIC);
+
+        start = buffer.getIterStart();
+        buffer.insert(start, text, italic);
+
+        view.setPaddingBelowParagraph(15);
+
+        window = new Window();
+        window.add(scroll);
+        window.setDecorated(false);
+        window.setBorderWidth(2);
+        window.setDefaultSize(300, 600);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotTextView());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotTextViewBorderWindows.java b/tests/screenshots/org/gnome/gtk/SnapshotTextViewBorderWindows.java
new file mode 100644
index 0000000..3d4e4ad
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotTextViewBorderWindows.java
@@ -0,0 +1,86 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+import static org.gnome.gtk.PolicyType.ALWAYS;
+import static org.gnome.gtk.TextWindowType.BOTTOM;
+import static org.gnome.gtk.TextWindowType.LEFT;
+import static org.gnome.gtk.TextWindowType.RIGHT;
+import static org.gnome.gtk.TextWindowType.TOP;
+import static org.gnome.gtk.WrapMode.WORD;
+import static textview.LoremIpsum.text;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotTextViewBorderWindows extends Snapshot
+{
+    public SnapshotTextViewBorderWindows() {
+        super(TextView.class, "BorderWindows");
+        final TextTagTable table;
+        final TextView view;
+        final TextBuffer buffer;
+        final Label left2, right, top, bottom;
+        final Box left;
+        final ScrolledWindow scroll;
+
+        table = new TextTagTable();
+        buffer = new TextBuffer(table);
+        view = new TextView(buffer);
+
+        left2 = new Label("LEFT");
+        left = new HBox(true, 0);
+        left.packStart(left2, false, false, 0);
+
+        right = new Label("RIGHT");
+        top = new Label("TOP");
+        bottom = new Label("BOTTOM");
+
+        view.setBorderWindowSize(LEFT, 50);
+        view.add(left, LEFT, 0, 0);
+
+        view.setBorderWindowSize(RIGHT, 50);
+        view.add(right, RIGHT, 0, 0);
+
+        view.setBorderWindowSize(TOP, 50);
+        view.add(top, TOP, 0, 0);
+
+        view.setBorderWindowSize(BOTTOM, 50);
+        view.add(bottom, BOTTOM, 0, 0);
+
+        view.setWrapMode(WORD);
+        scroll = new ScrolledWindow();
+        scroll.setPolicy(ALWAYS, ALWAYS);
+        scroll.add(view);
+
+        buffer.insertAtCursor(text);
+
+        window = new Window();
+        window.add(scroll);
+        window.setDecorated(false);
+        window.setBorderWidth(2);
+        window.setDefaultSize(400, 300);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotTextViewBorderWindows());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotTextViewSpelling.java b/tests/screenshots/org/gnome/gtk/SnapshotTextViewSpelling.java
new file mode 100644
index 0000000..06ca454
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotTextViewSpelling.java
@@ -0,0 +1,68 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd and Others
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/*
+ * Inspired by SnapshotTextView.
+ */
+
+import static org.gnome.gtk.PolicyType.ALWAYS;
+import static org.gnome.gtk.PolicyType.NEVER;
+import static org.gnome.gtk.WrapMode.WORD;
+
+/**
+ * Illustrate spelling mistakes being underlined in red
+ * 
+ * @author Andrew Cowie
+ * @author Serkan Kaba
+ */
+public class SnapshotTextViewSpelling extends Snapshot
+{
+    public SnapshotTextViewSpelling() throws UnsupportedOperationException {
+        super(TextView.class, "Spelling");
+        final TextView view;
+        final TextBuffer buffer;
+        final ScrolledWindow scroll;
+
+        buffer = new TextBuffer();
+        buffer.setText("Thiz text is fulll of misspelings.");
+
+        view = new TextView(buffer);
+
+        view.setWrapMode(WORD);
+        view.attachSpell("en");
+        scroll = new ScrolledWindow();
+        scroll.setPolicy(NEVER, ALWAYS);
+        scroll.add(view);
+
+        view.setPaddingBelowParagraph(15);
+
+        window = new Window();
+        window.add(scroll);
+        window.setDecorated(false);
+        window.setBorderWidth(2);
+        window.setDefaultSize(300, 10);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotTextViewSpelling());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotTreeStore.java b/tests/screenshots/org/gnome/gtk/SnapshotTreeStore.java
new file mode 100644
index 0000000..92787af
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotTreeStore.java
@@ -0,0 +1,89 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotTreeStore extends Snapshot
+{
+    public SnapshotTreeStore() {
+        super(TreeStore.class);
+
+        final TreeStore model;
+        final DataColumnString placeName;
+        TreeIter parent, child;
+        final TreeView view;
+        TreeViewColumn vertical;
+        CellRendererText text;
+
+        window = new Window();
+        window.setTitle("Cities");
+
+        model = new TreeStore(new DataColumn[] {
+            placeName = new DataColumnString(),
+        });
+
+        parent = model.appendRow();
+        model.setValue(parent, placeName, "Europe");
+
+        child = model.appendChild(parent);
+        model.setValue(child, placeName, "London");
+
+        child = model.appendChild(parent);
+        model.setValue(child, placeName, "Paris");
+
+        child = model.appendChild(parent);
+        model.setValue(child, placeName, "Berlin");
+
+        parent = model.appendRow();
+        model.setValue(parent, placeName, "Asia");
+
+        child = model.appendChild(parent);
+        model.setValue(child, placeName, "Singapore");
+
+        child = model.appendChild(parent);
+        model.setValue(child, placeName, "Calcutta");
+
+        child = model.appendChild(parent);
+        model.setValue(child, placeName, "...");
+
+        view = new TreeView(model);
+
+        vertical = view.appendColumn();
+        text = new CellRendererText(vertical);
+        text.setText(placeName);
+
+        view.setHeadersVisible(false);
+        view.expandAll();
+        view.getSelection().setMode(SelectionMode.NONE);
+        view.setCanFocus(false);
+        view.setRulesHint(false);
+
+        window.add(view);
+        window.setDecorated(false);
+        window.setBorderWidth(2);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotTreeStore());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotTreeView.java b/tests/screenshots/org/gnome/gtk/SnapshotTreeView.java
new file mode 100644
index 0000000..1492428
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotTreeView.java
@@ -0,0 +1,121 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotTreeView extends Snapshot
+{
+    public SnapshotTreeView() {
+        super(TreeView.class);
+
+        final ListStore model;
+        final DataColumnString countryName;
+        final DataColumnString monarchName;
+        final DataColumnString ascendedYear;
+        TreeIter row;
+        final TreeView view;
+        TreeViewColumn vertical;
+        CellRendererText text;
+
+        window = new Window();
+        window.setTitle("Sovereigns of Canada");
+
+        model = new ListStore(new DataColumn[] {
+            countryName = new DataColumnString(),
+            monarchName = new DataColumnString(),
+            ascendedYear = new DataColumnString(),
+        });
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "Great Britain");
+        model.setValue(row, monarchName, "King George III");
+        model.setValue(row, ascendedYear, "1760");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "United Kingdom");
+        model.setValue(row, monarchName, "King George IV");
+        model.setValue(row, ascendedYear, "1820");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "United Kingdom");
+        model.setValue(row, monarchName, "King William IV");
+        model.setValue(row, ascendedYear, "1830");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "United Kingdom");
+        model.setValue(row, monarchName, "Queen Victoria");
+        model.setValue(row, ascendedYear, "1837");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "United Kingdom");
+        model.setValue(row, monarchName, "King Edward VII");
+        model.setValue(row, ascendedYear, "1901");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "United Kingdom");
+        model.setValue(row, monarchName, "King George V");
+        model.setValue(row, ascendedYear, "1910");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "United Kingdom");
+        model.setValue(row, monarchName, "King Edward VIII");
+        model.setValue(row, ascendedYear, "1936");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "Canada");
+        model.setValue(row, monarchName, "King George VI");
+        model.setValue(row, ascendedYear, "1936");
+
+        row = model.appendRow();
+        model.setValue(row, countryName, "Canada");
+        model.setValue(row, monarchName, "Queen Elizabeth II");
+        model.setValue(row, ascendedYear, "1952");
+
+        view = new TreeView(model);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Name");
+        text = new CellRendererText(vertical);
+        text.setText(monarchName);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Country");
+        text = new CellRendererText(vertical);
+        text.setText(countryName);
+
+        vertical = view.appendColumn();
+        vertical.setTitle("Ascended");
+        text = new CellRendererText(vertical);
+        text.setText(ascendedYear);
+        text.setAlignment(Alignment.RIGHT, Alignment.TOP);
+
+        view.setRulesHint(true);
+        view.getSelection().selectRow(new TreePath("7"));
+
+        window.add(view);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotTreeView());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotVScale.java b/tests/screenshots/org/gnome/gtk/SnapshotVScale.java
new file mode 100644
index 0000000..52aa553
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotVScale.java
@@ -0,0 +1,47 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2008-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotVScale extends Snapshot
+{
+    public SnapshotVScale() {
+        super(VScale.class);
+
+        final VScale vs;
+
+        window = new Window();
+        window.setDecorated(false);
+        window.setDefaultSize(-1, 160);
+
+        vs = new VScale(0, 100, 10);
+        vs.setValue(35);
+        // vs.setValuePosition(PositionType.BOTTOM);
+
+        window.add(vs);
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotVScale());
+        Gtk.main();
+    }
+}
diff --git a/tests/screenshots/org/gnome/gtk/SnapshotWindow.java b/tests/screenshots/org/gnome/gtk/SnapshotWindow.java
new file mode 100644
index 0000000..0e985f3
--- /dev/null
+++ b/tests/screenshots/org/gnome/gtk/SnapshotWindow.java
@@ -0,0 +1,39 @@
+/*
+ * java-gnome, a UI library for writing GTK and GNOME programs from Java!
+ *
+ * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
+ *
+ * The code in this file, and the program it is a part of, is made available
+ * to you by its authors as open source software: you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License version
+ * 2 ("GPL") as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
+ *
+ * You should have received a copy of the GPL along with this program. If not,
+ * see http://www.gnu.org/licenses/. The authors of this program may be
+ * contacted through http://java-gnome.sourceforge.net/.
+ */
+package org.gnome.gtk;
+
+/**
+ * @author Andrew Cowie
+ */
+public class SnapshotWindow extends Snapshot
+{
+    public SnapshotWindow() {
+        super(Window.class);
+
+        window = new Window();
+        window.setKeepAbove(true);
+        window.setTitle("Window");
+    }
+
+    public static void main(String[] args) {
+        Gtk.init(args);
+        runExample(new SnapshotWindow());
+        Gtk.main();
+    }
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/java-gnome.git



More information about the pkg-java-commits mailing list