\documentclass[12pt,landscape]{article}

\usepackage{times,helvetic}
\usepackage[latin1]{inputenc}

\newcommand{\Gnome}{{\sc gnome}}
\newcommand{\Gtk}{{\sc gtk+}}

\begin{document}

\title{The \Gnome\ Architecture}
\author{
	Federico Mena-Quintero\\
	Red Hat Advanced Development Labs\\
	federico@redhat.com
}

\maketitle

\section*{Overview}

\begin{itemize}

\item What is in \Gnome?
\item Architecture in detail
\item \Gnome\ programming guidelines

\end{itemize}

\newpage

\section*{What is in \Gnome? (1)}

\hrulefill

\begin{itemize}

\item Graphical desktop environment

	\begin{itemize}

	\item \Gtk\ as the GUI library and object system

	\item Standard GUI

	\item Consistent look and feel

	\item Drag and drop

	\end{itemize}

\item Application framework

	\begin{itemize}

	\item High-level widgets for applications

	\item Internationalization (all 20 letters of it)

	\item Session management

	\item Configuration back-end

	\end{itemize}

\item Imaging architecture

	\begin{itemize}

	\item The \Gnome\ canvas

	\item Libart imaging model

	\item Printing system

	\item Font system

	\end{itemize}

\end{itemize}

\newpage

\section*{What is in \Gnome? (2)}

\hrulefill

\begin{itemize}

\item Component model

	\begin{itemize}

	\item CORBA as the backend

	\item Bonobo component model

	\item Interfaces for (lack of) Unix services

	\end{itemize}

\item Miscellaneous backend libraries

	\begin{itemize}

	\item libxml --- XML loading/saving/parsing

	\item gnome-db --- Generic database API

	\item libglade --- GUI builder library

	\item gnome-mailer --- Mail API

	\item libgtop --- System information

	\item zvt --- Fast terminal emulation widget

	\end{itemize}

\end{itemize}

\newpage

\section*{\Gtk\ and Glib}

\hrulefill

\begin{itemize}

\item Glib

	\begin{itemize}

	\item Data structures

	\item Utility functions

	\item Main loop abstraction

	\item Portability functions

	\item Threads and mutexes

	\end{itemize}

\item \Gtk\

	\begin{itemize}

	\item Gdk wraps Xlib

	\item Gtk provides objects and widgets

	\end{itemize}

\end{itemize}

\newpage

\section*{Glib (1)}

\hrulefill

\begin{itemize}

\item Data structures

	\begin{itemize}

	\item Lists

	\item Trees

	\item Hash tables

	\item Resizable arrays

	\item Strings

	\item Relations (N-way mappings)

	\item Generic cache

	\end{itemize}

\item Utility functions

	\begin{itemize}

	\item Memory allocation and memory chunks

	\item Assertions for correctness

	\item Logging and debugging

	\item Datasets and hooks

	\item Date functions

	\item A lexical scanner

	\end{itemize}

\end{itemize}

\newpage

\section*{Glib (2)}

\hrulefill

\begin{itemize}

\item Main loop abstraction

	\begin{itemize}

	\item Data sources for select(2)-like functionality

	\item I/O channel abstraction

	\item Timers

	\item Idle functions

	\end{itemize}

\item Portability functions

	\begin{itemize}

	\item All sorts of weird string functions

	\item Byte-swapping functions

	\item Useful macros

	\end{itemize}

\item Thread and mutex abstraction

\end{itemize}

\newpage

\section*{Gdk}

\hrulefill

\begin{itemize}

\item Thin wrapper over Xlib

\item Makes operations less hard (or easier)

\item Ported to Win32 as well

\end{itemize}

\newpage

\section*{\Gtk}

\hrulefill

\begin{itemize}

\item Object and type system

	\begin{itemize}

	\item Single inheritance

	\item Signal/slot mechanism

	\item Dataset mechanism

	\item Dynamic type registration

	\end{itemize}

\item Widget system

	\begin{itemize}

	\item Widgets and containers

	\item Geometry negotiation

	\item Signals for notification

	\end{itemize}

\end{itemize}

\newpage

\section*{\Gtk\ Widget Organization}

\hrulefill

\begin{itemize}

\item Base GtkWidget class

	\begin{itemize}

	\item Signals for events

	\item Signals for map/unmap/realize/unrealize/etc.

	\end{itemize}

\item Base GtkContainer class

	\begin{itemize}

	\item Containers are widgets

	\item They manage their children's geometry

	\item Request/allocate size negotiation policy

	\end{itemize}

\end{itemize}

\newpage

\section*{\Gtk\ Drag and Drop}

\hrulefill

\begin{itemize}

\item Xdnd and Motif protocols

\item Protocol is transparent to the programmer

\item Based on MIME-types

\end{itemize}

\newpage

\section*{Imlib, GdkPixbuf, and GdkRGB}

\hrulefill

\begin{itemize}

\item Imlib/gdk\_imlib

	\begin{itemize}

	\item Image loading with fallbacks

	\item Color reduction and dithering

	\item Image/pixmap Cache

	\end{itemize}

\item GdkRGB

	\begin{itemize}

	\item High-quality dithering

	\item Part of Gdk

	\end{itemize}

\item GdkPixbuf

	\begin{itemize}

	\item Replacement for gdk\_imlib

	\item Separates loading, caching, and rendering

	\item Uses GdkRGB

	\end{itemize}

\end{itemize}

\newpage

\section*{Core \Gnome\ Libraries}

\hrulefill

\begin{itemize}

\item Libgnome for UI-independent stuff

	\begin{itemize}

	\item Configuration file handling

	\item Metadata for files

	\item MIME-type handling

	\item URL and Mozilla-remote handling

	\item High score handling

	\item Desktop entry files

	\end{itemize}

\item Libgnomeui for GUI framework

	\begin{itemize}

	\item High-level widgets

	\item Session management client

	\item The \Gnome\ canvas

	\end{itemize}

\end{itemize}

\newpage

\section*{Libgnome Features}

\hrulefill

\begin{itemize}

\item Configuration file handling

\item Metadata information for files

	\begin{itemize}

	\item Icons images, positions

	\item Stored in a db2 database

	\item Per-user and systemwide metadata

	\end{itemize}

\item MIME-types

	\begin{itemize}

	\item Basic data typing system

	\item Files are typified via a regex or file(1)-like match

	\item Actions bound to MIME-types

	\end{itemize}

\item URLs, scores, desktop entries

\end{itemize}

\newpage

\section*{Libgnomeui features}

\hrulefill

\begin{itemize}

\item High-level widgets

	\begin{itemize}

	\item Toplevel application window

	\item Menus and toolbars

	\item Stock icons

	\item Property dialogs

	\item GnomeGuru (wizards)

	\item Multiple document interface (MDI) framework

	\item The \Gnome\ canvas

	\end{itemize}

\item Session management client

	\begin{itemize}

	\item Implemented as a GtkObject

	\item Signals for SM requests

	\end{itemize}

\end{itemize}

\newpage

\section*{Internationalization}

\hrulefill

\begin{itemize}

\item GNU gettext for storing and translating message catalogs

\item Unicode in \Gtk\ is the next step

\end{itemize}

\newpage



\end{document}
