Copyright 2008 Sun Microsystems 1. Introduction 1.1. Project/Component Working Name: sigcpp, glibmm, cairomm, and gtkmm 1.2. Name of Document Author/Supplier: Ghee Teo, Chris Wang, Elaine Xiong, Simon Zheng 1.3. Date of This Document: 01/30/08 1.5. Email Aliases: 1.5.1. Responsible Manager: leo.binchy@sun.com 1.5.2. Responsible Engineer:ghee.teo@sun.com, chris.wang@sun.com, elaine.xiong@sun.com, simon.zheng@sun.com 2. Project Summary 2.1. Project Description: libsigc++ implements a typesafe callback system for use in widget libraries, abstract interfaces, and general programming. It allows users to define signals and to connect those signals to any callback function, either global or a member function, regardless of whether it is static or virtual. It contains adaptor classes for connecting dissimilar callbacks and has an ease of use unmatched by other C++ callback libraries. cairomm is a C++ wrapper for the cairo graphics library. It offers all the power cairo with an interface familiar to C++ developers, including use of the Standard Template Library where it makes sense. Even though cairomm can be used on its own, it is often used together with the higher level toolkit C++ wrapper, gtkmm. glibmm is a set of C++ bindings for Glib2 Library, including cross- platform APIs such as a std::string-like UTF8 string class, string utility methods, such as a text encoding converter API, file access, and threads. gtkmm is the official C++ interface for the popular GUI library GTK+. Highlights include typesafe callbacks, and a comprehensive set of widgets that are easily extensible via inheritance. You can create user interfaces either in code or with the Glade User Interface designer, using libglademm. There's extensive documentation, including API reference and a tutorial. 2.2. Risks and Assumptions: gtkmm and glibmm follow the official GNOME Platform Bindings release schedule. This guarantees API/ABI-stability and new releases on a predictable schedule, delivering C++ API for the underlying GTK+ and GNOME APIs as soon as possible. The problem we need deal with is that of the different C++ ABIs of Sun Studio CC and GNU g++. Now that Sun Studio is available as a free download it's not such a big problem, but there are modules that won't build with Sun Studio. However Sun Studio C++ has maintained a stable C++ ABI for over a decade. Considering the g++ compiler in Solaris can't build any 64-bit binaries that are actually usable, we only deliver these packages build with Sun Studio. For those modules that won't build with Sun Studio, It is maintainer's responsibility to fix the build problems. We propose to minimize the risk by first delivering a set of gtkmm, glibmm, cairomm and sigc++ libraries which are built using Sun Studio compilers and in subsequent case to address the provision of g++ compiled libraries that may address specific needs accordingly. 4. Technical Description: 4.1. Details: libsigc++ provides the following Features: - Compile time typesafe callbacks (faster than run time checks) - Typesafe violations report line number correctly with template names (no tracing template failures into headers) - No compiler extensions or meta compilers required - Proper handling of dynamic objects and signals (deleted objects will not cause segmentation faults) - Extendable API at any level: signal, slot, connection and trackable - Extensions do not require alteration of basic components - User definable accumulators - A variety of adaptors to change the callback signature: bind, hide, retype, compose and lambda call groups - Various compilers and platforms are supported: gcc, cygwin, mingw32, MS .NET 2003, Sun Forte C++, Compaq C++, Intel C++, IBM AIX, Tru64, IRIX MipsPro. cairomm is part of the gtkmm (gtk--) framework to allow developers to make full use of the capabilities of Object Oriented Programming language features as in C++. Cairo is a graphics description and rendering library. Cairomm provides classes that allow the cairo API to be accessed in an Object Oriented constructs. Cairo allow graphics to be created programmatical in its own language and the be rendered onto surfaces of specific target file formats, such as PostScript,PDF and so on. Current supported rendering surfaces are: - Image Surface (memory buffers) - PDF Surface - PostScript Surface - SVG Surface - Xlib Surface (X11 based systems) - Win32 Surface (Windows) - Quartz Surface (MacOS) - Glitz (OpenGL-accelerated, experimental not fully supported) These surfaces can then be augmented with the upper layer of libraries like that of gtkmm to create GUI application. To simplify the creation of C++ binding for gtkmm, glibmm delivers tools called gmmproc and generate_wrap_init.pl that can create wrapper for other glib/GObject-based libraries. For example, gtkmm uses this to generate most of its source code. The details on how to do this is described in Reference [7]. gtkmm provides the following Features: - Use inheritance to derive custom widgets. - Type-safe signal handlers, in standard C++. - Polymorphism. - Use of Standard C++ Library, including strings, containers, and iterators. - Full internationalisation with UTF8. - Complete C++ memory management - Object composition - Automatic deallocation of dynamically allocated widgets. - Full use of C++ namespaces. - No macros. - Cross-platform: Linux (gcc), FreeBSD (gcc), NetBSD (gcc), Solaris (gcc, Forte), Win32 (gcc, MSVC++ .Net 2003), MacOS X (gcc), others Free software and free of cost for both Open Source and proprietary development. - Discussed, designed and implemented in public. 4.5. Interfaces: Exported Interfaces Interface Stability Comments --------------------- ---------------- --------------- SUNWsigcpp Uncommitted Package names SUNWsigcpp-devel Uncommitted SUNWcairomm Uncommitted SUNWcairomm-devel Uncommitted SUNWglibmm Uncommitted SUNWglibmm-devel Uncommitted SUNWgtkmm Uncommitted SUNWgtkmm-devel Uncommitted libsigc-2.0.so Volatile See Note 1. libcairomm-1.0.so Uncommitted libglibmm-2.4.so Uncommitted libatkmm-1.6.so Uncommitted libgtkmm-2.4.so Uncommitted libgdkmm-2.4.so Uncommitted libpangomm-1.4.so Uncommitted /usr/demo/jds/bin/gtkmm-demo Uncommitted glibmm-2.4/proc/gmmproc Consolidation See Note 2. Private glibmm-2.4/proc/generate_wrap_init.pl Consolidation See Note 2. Private /usr/lib/pkgconfig/atkmm-1.6.pc Uncommitted See Note 3. /usr/lib/pkgconfig/gtkmm-2.4.pc Uncommitted /usr/lib/pkgconfig/pangomm-1.4.pc Uncommitted /usr/lib/pkgconfig/cairomm-1.0.pc Uncommitted /usr/lib/pkgconfig/sigc++-2.0.pc Uncommitted /usr/lib/pkgconfig/glibmm-2.4.pc Uncommitted Note 1: We classified this as Volatile as we have little working history with this particular community, thus a lack of reasonable certainly how well will they keep the interface stable. NOTE 2: Programs which used required by the upper stack, namely, gtkmm module to generate the C++ files based on some declarative language. Since its potential usage outside the stack is minimum, hence the Private interface. Note 3: All the header file include path are included are accessible by the *.pc files, hence making these Uncomiitted. Imported Interfaces Interface Stability Comments --------------------- ---------------- ---------------------- GNOME Committed Platform Libraries Committed LSARC/2007/520 GNOME 2.20 GTK+ library 4.9. I18N/L10N Impact: The JDS team and the G11N are working together to evaluation and provide I18N/L10N support 4.10. Packaging & Delivery: The project will be delivering the following packages: SUNWgtkmm SUNWgtkmm-devel SUNWglibmm SUNWglibmm-devel SUNWcairomm SUNWcairomm-devel SUNWsigcpp SUNWsigcpp-devel 5. Reference Documents: [1] gtkmm glibmm homepage http://www.gtkmm.org/ [2] cairomm homepage - http://cairographics.org/cairomm [3] cairomm download: http://cairographics.org/releases/ [4] libsigc++ Homepage - http://libsigc.sourceforge.net [5] libsigc++ Tutorial: http://libsigc.sourceforge.net/libsigc2/docs/manual/html/ [6] libsigc++ API Reference - http://libsigc.sourceforge.net/libsigc2/docs/ [7] Wrapping C Libraries with gmmproc: http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/chapter-wrapping-c-libraries.html ChangeLog By Ghee (1) Not to deliver of g++ compiled libraries This is now considered out of scope for this ARC fast-track due to the many issues raised over the brief period. If there is a need in the future to provide g++ compiled libraries this will be addressed in a subsequent case. (2) Libraries and .pc files are classified as Uncommitted instead of Volatile see updated interface exported table. .pc is the recommended way to access include files and also libraries by applications in general for JDS. (3) Tools for generation of wrapper code are classified as Consolidation Private See updated interface table and rationale for so doing.