]> Pileus Git - ~andy/gtk/blobdiff - demos/gtk-demo/main.c
gtk: remove "gboolean homogeneous" from gtk_box_new()
[~andy/gtk] / demos / gtk-demo / main.c
index 69710e3ada7130fa3f6fe3a546e7bdd765fef138..e0c9fb896a0187abf800f883d34b1de712d1596c 100644 (file)
@@ -1,23 +1,25 @@
+#include "config.h"
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
 
 #include <gtk/gtk.h>
+#include <glib/gstdio.h>
 
-#include <demos.h>
+#include "demos.h"
 
 static GtkTextBuffer *info_buffer;
 static GtkTextBuffer *source_buffer;
 
 static gchar *current_file = NULL;
 
+
 enum {
   TITLE_COLUMN,
   FILENAME_COLUMN,
   FUNC_COLUMN,
-  ITALIC_COLUMN,
+  STYLE_COLUMN,
   NUM_COLUMNS
 };
 
@@ -28,20 +30,79 @@ struct _CallbackData
   GtkTreePath *path;
 };
 
+#ifdef G_OS_WIN32
+
+#undef DEMOCODEDIR
+
+static char *
+get_democodedir (void)
+{
+  static char *result = NULL;
+
+  if (result == NULL)
+    {
+      result = g_win32_get_package_installation_directory_of_module (NULL);
+      if (result == NULL)
+       result = "unknown-location";
+
+      result = g_strconcat (result, "\\share\\gtk-2.0\\demo", NULL);
+    }
+
+  return result;
+}
+
+#define DEMOCODEDIR get_democodedir ()
+
+#endif
+
+/**
+ * demo_find_file:
+ * @base: base filename
+ * @err:  location to store error, or %NULL.
+ * 
+ * Looks for @base first in the current directory, then in the
+ * location GTK+ where it will be installed on make install,
+ * returns the first file found.
+ * 
+ * Return value: the filename, if found or %NULL
+ **/
+gchar *
+demo_find_file (const char *base,
+               GError    **err)
+{
+  g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+  
+  if (g_file_test ("gtk-logo-rgb.gif", G_FILE_TEST_EXISTS) &&
+      g_file_test (base, G_FILE_TEST_EXISTS))
+    return g_strdup (base);
+  else
+    {
+      char *filename = g_build_filename (DEMOCODEDIR, base, NULL);
+      if (!g_file_test (filename, G_FILE_TEST_EXISTS))
+       {
+         g_set_error (err, G_FILE_ERROR, G_FILE_ERROR_NOENT,
+                      "Cannot find demo data file \"%s\"", base);
+         g_free (filename);
+         return NULL;
+       }
+      return filename;
+    }
+}
+
 static void
 window_closed_cb (GtkWidget *window, gpointer data)
 {
   CallbackData *cbdata = data;
   GtkTreeIter iter;
-  gboolean italic;
+  PangoStyle style;
 
   gtk_tree_model_get_iter (cbdata->model, &iter, cbdata->path);
   gtk_tree_model_get (GTK_TREE_MODEL (cbdata->model), &iter,
-                     ITALIC_COLUMN, &italic,
+                     STYLE_COLUMN, &style,
                      -1);
-  if (italic)
+  if (style == PANGO_STYLE_ITALIC)
     gtk_tree_store_set (GTK_TREE_STORE (cbdata->model), &iter,
-                       ITALIC_COLUMN, !italic,
+                       STYLE_COLUMN, PANGO_STYLE_NORMAL,
                        -1);
 
   gtk_tree_path_free (cbdata->path);
@@ -53,7 +114,9 @@ read_line (FILE *stream, GString *str)
 {
   int n_read = 0;
   
+#ifdef HAVE_FLOCKFILE
   flockfile (stream);
+#endif
 
   g_string_truncate (str, 0);
   
@@ -61,7 +124,11 @@ read_line (FILE *stream, GString *str)
     {
       int c;
       
+#ifdef HAVE_FLOCKFILE
       c = getc_unlocked (stream);
+#else
+      c = getc (stream);
+#endif
 
       if (c == EOF)
        goto done;
@@ -73,7 +140,11 @@ read_line (FILE *stream, GString *str)
        case '\r':
        case '\n':
          {
+#ifdef HAVE_FLOCKFILE
            int next_c = getc_unlocked (stream);
+#else
+           int next_c = getc (stream);
+#endif
            
            if (!(next_c == EOF ||
                  (c == '\r' && next_c == '\n') ||
@@ -89,7 +160,9 @@ read_line (FILE *stream, GString *str)
 
  done:
 
+#ifdef HAVE_FLOCKFILE
   funlockfile (stream);
+#endif
 
   return n_read > 0;
 }
@@ -106,7 +179,7 @@ read_line (FILE *stream, GString *str)
  */
 enum {
   STATE_NORMAL,
-  STATE_IN_COMMENT,
+  STATE_IN_COMMENT
 };
 
 static gchar *tokens[] =
@@ -122,11 +195,12 @@ static gchar *types[] =
   "const ",
   "void",
   "gint",
-  "int ",
-  "char ",
+  " int ",
+  " char ",
   "gchar ",
   "gfloat",
   "float",
+  "double",
   "gint8",
   "gint16",
   "gint32",
@@ -149,7 +223,6 @@ static gchar *types[] =
   "FALSE",
   "TRUE",
   "FILE ",
-  "GtkObject ",
   "GtkColorSelection ",
   "GtkWidget ",
   "GtkButton ",
@@ -161,6 +234,87 @@ static gchar *types[] =
   "GdkPixbuf ",
   "GError",
   "size_t",
+  "GtkAboutDialog ",
+  "GtkAction ",
+  "GtkActionEntry ",
+  "GtkRadioActionEntry ",
+  "GtkIconFactory ",
+  "GtkStockItem ",
+  "GtkIconSet ",
+  "GtkTextBuffer ",
+  "GtkStatusbar ",
+  "GtkTextIter ",
+  "GtkTextMark ",
+  "GdkEventWindowState ",
+  "GtkActionGroup ",
+  "GtkUIManager ",
+  "GtkRadioAction ",
+  "GtkActionClass ",
+  "GtkToggleActionEntry ",
+  "GtkAssistant ",
+  "GtkBuilder ",
+  "GtkSizeGroup ",
+  "GtkTreeModel ",
+  "GtkTreeSelection ",
+  "GdkDisplay ",
+  "GdkScreen ",
+  "GdkWindow ",
+  "GdkEventButton ",
+  "GdkCursor ",
+  "GtkTreeIter ",
+  "GtkTreeViewColumn ",
+  "GdkDisplayManager ",
+  "GtkClipboard ",
+  "GtkIconSize ",
+  "GtkImage ",
+  "GdkDragContext ",
+  "GtkSelectionData ",
+  "GtkDialog ",
+  "GtkMenuItem ",
+  "GtkListStore ",
+  "GtkCellLayout ",
+  "GtkCellRenderer ",
+  "GtkTreePath ",
+  "GtkTreeStore ",
+  "GtkEntry ",
+  "GtkEditable ",
+  "GtkEditableInterface ",
+  "GdkPixmap ",
+  "GdkEventConfigure ",
+  "GdkEventMotion ",
+  "GdkModifierType ",
+  "GtkEntryCompletion ",
+  "GtkToolItem ",
+  "GDir ",
+  "GtkIconView ",
+  "GtkCellRendererText ",
+  "GtkContainer ",
+  "GtkAccelGroup ",
+  "GtkPaned ",
+  "GtkPrintOperation ",
+  "GtkPrintContext ",
+  "cairo_t ",
+  "PangoLayout "
+  "PangoFontDescription ",
+  "PangoRenderer ",
+  "PangoMatrix ",
+  "PangoContext ",
+  "PangoLayout ",
+  "GtkTable ",
+  "GtkToggleButton ",
+  "GString ",
+  "GtkIconSize ",
+  "GtkTreeView ",
+  "GtkTextTag ",
+  "GdkEvent ",
+  "GdkEventKey ",
+  "GtkTextView ",
+  "GdkEventVisibility ",
+  "GdkBitmap ",
+  "GtkTextChildAnchor ",
+  "GArray ",
+  "GtkCellEditable ",
+  "GtkCellRendererToggle ",
   NULL
 };
 
@@ -235,7 +389,8 @@ parse_chars (gchar     *text,
     }
   /* check for types */
   for (i = 0; types[i] != NULL; i++)
-    if (!strncmp (text, types[i], strlen (types[i])))
+    if (!strncmp (text, types[i], strlen (types[i])) ||
+        (start && types[i][0] == ' ' && !strncmp (text, types[i] + 1, strlen (types[i]) - 1)))
       {
        *end_ptr = text + strlen (types[i]);
        *tag = "type";
@@ -314,7 +469,7 @@ parse_chars (gchar     *text,
 
 /* While not as cool as c-mode, this will do as a quick attempt at highlighting */
 static void
-fontify ()
+fontify (void)
 {
   GtkTextIter start_iter, next_iter, tmp_iter;
   gint state;
@@ -347,7 +502,7 @@ fontify ()
              tmp_iter = next_iter;
            }
          if (tag)
-           gtk_text_buffer_apply_tag_by_name (info_buffer, tag, &start_iter, &tmp_iter);
+           gtk_text_buffer_apply_tag_by_name (source_buffer, tag, &start_iter, &tmp_iter);
 
          start_iter = tmp_iter;
          start_ptr = end_ptr;
@@ -364,6 +519,8 @@ load_file (const gchar *filename)
 {
   FILE *file;
   GtkTextIter start, end;
+  char *full_filename;
+  GError *err = NULL;
   GString *buffer = g_string_new (NULL);
   int state = 0;
   gboolean in_para = 0;
@@ -383,40 +540,44 @@ load_file (const gchar *filename)
   gtk_text_buffer_get_bounds (source_buffer, &start, &end);
   gtk_text_buffer_delete (source_buffer, &start, &end);
 
-  file = fopen (filename, "r");
+  full_filename = demo_find_file (filename, &err);
+  if (!full_filename)
+    {
+      g_warning ("%s", err->message);
+      g_error_free (err);
+      return;
+    }
+
+  file = g_fopen (full_filename, "r");
 
   if (!file)
-    {
-      char *installed = g_strconcat (DEMOCODEDIR,
-                                     G_DIR_SEPARATOR_S,
-                                     filename,
-                                     NULL);
+    g_warning ("Cannot open %s: %s\n", full_filename, g_strerror (errno));
 
-      file = fopen (installed, "r");
+  g_free (full_filename);
 
-      g_free (installed);
-    }
-  
   if (!file)
-    {
-      g_warning ("Cannot open %s: %s\n", filename, g_strerror (errno));
-      return;
-    }
+    return;
 
   gtk_text_buffer_get_iter_at_offset (info_buffer, &start, 0);
   while (read_line (file, buffer))
     {
       gchar *p = buffer->str;
       gchar *q;
+      gchar *r;
       
       switch (state)
        {
        case 0:
          /* Reading title */
-         while (*p == '/' || *p == '*' || isspace (*p))
+         while (*p == '/' || *p == '*' || g_ascii_isspace (*p))
            p++;
+         r = p;
+         while (*r != '/' && strlen (r))
+           r++;
+         if (strlen (r) > 0)
+           p = r + 1;
          q = p + strlen (p);
-         while (q > p && isspace (*(q - 1)))
+         while (q > p && g_ascii_isspace (*(q - 1)))
            q--;
 
          if (q > p)
@@ -440,7 +601,7 @@ load_file (const gchar *filename)
            
        case 1:
          /* Reading body of info section */
-         while (isspace (*p))
+         while (g_ascii_isspace (*p))
            p++;
          if (*p == '*' && *(p + 1) == '/')
            {
@@ -451,11 +612,11 @@ load_file (const gchar *filename)
            {
              int len;
              
-             while (*p == '*' || isspace (*p))
+             while (*p == '*' || g_ascii_isspace (*p))
                p++;
 
              len = strlen (p);
-             while (isspace (*(p + len - 1)))
+             while (g_ascii_isspace (*(p + len - 1)))
                len--;
              
              if (len > 0)
@@ -477,7 +638,7 @@ load_file (const gchar *filename)
 
        case 2:
          /* Skipping blank lines */
-         while (isspace (*p))
+         while (g_ascii_isspace (*p))
            p++;
          if (*p)
            {
@@ -491,86 +652,25 @@ load_file (const gchar *filename)
        case 3:
          /* Reading program body */
          gtk_text_buffer_insert (source_buffer, &start, p, -1);
-         gtk_text_buffer_insert (info_buffer, &start, "\n", 1);
+         gtk_text_buffer_insert (source_buffer, &start, "\n", 1);
          break;
        }
     }
 
+  fclose (file);
+  
   fontify ();
 
   g_string_free (buffer, TRUE);
 }
 
-gboolean
-button_press_event_cb (GtkTreeView    *tree_view,
-                      GdkEventButton *event,
-                      GtkTreeModel   *model)
-{
-  if (event->type == GDK_2BUTTON_PRESS)
-    {
-      GtkTreePath *path = NULL;
-
-      gtk_tree_view_get_path_at_pos (tree_view,
-                                    event->window,
-                                    event->x,
-                                    event->y,
-                                    &path,
-                                     NULL,
-                                     NULL,
-                                    NULL);
-
-      if (path)
-       {
-         GtkTreeIter iter;
-         gboolean italic;
-         GDoDemoFunc func;
-         GtkWidget *window;
-
-         gtk_tree_model_get_iter (model, &iter, path);
-         gtk_tree_model_get (GTK_TREE_MODEL (model),
-                             &iter,
-                             FUNC_COLUMN, &func,
-                             ITALIC_COLUMN, &italic,
-                             -1);
-         gtk_tree_store_set (GTK_TREE_STORE (model),
-                             &iter,
-                             ITALIC_COLUMN, !italic,
-                             -1);
-         window = (func) ();
-         if (window != NULL)
-           {
-             CallbackData *cbdata;
-
-             cbdata = g_new (CallbackData, 1);
-             cbdata->model = model;
-             cbdata->path = path;
-
-             gtk_signal_connect (GTK_OBJECT (window),
-                                  "destroy",
-                                  GTK_SIGNAL_FUNC (window_closed_cb),
-                                  cbdata);
-           }
-         else
-           {
-             gtk_tree_path_free (path);
-           }
-       }
-
-      gtk_signal_emit_stop_by_name (GTK_OBJECT (tree_view),
-                                   "button_press_event");
-      return TRUE;
-    }
-  
-  return FALSE;
-}
-
 void
 row_activated_cb (GtkTreeView       *tree_view,
                   GtkTreePath       *path,
                  GtkTreeViewColumn *column)
 {
   GtkTreeIter iter;
-  gboolean italic;
+  PangoStyle style;
   GDoDemoFunc func;
   GtkWidget *window;
   GtkTreeModel *model;
@@ -581,26 +681,28 @@ row_activated_cb (GtkTreeView       *tree_view,
   gtk_tree_model_get (GTK_TREE_MODEL (model),
                      &iter,
                      FUNC_COLUMN, &func,
-                     ITALIC_COLUMN, &italic,
-                     -1);
-  gtk_tree_store_set (GTK_TREE_STORE (model),
-                     &iter,
-                     ITALIC_COLUMN, !italic,
+                     STYLE_COLUMN, &style,
                      -1);
-  window = (func) ();
 
-  if (window != NULL)
+  if (func)
     {
-      CallbackData *cbdata;
-      
-      cbdata = g_new (CallbackData, 1);
-      cbdata->model = model;
-      cbdata->path = gtk_tree_path_copy (path);
+      gtk_tree_store_set (GTK_TREE_STORE (model),
+                         &iter,
+                         STYLE_COLUMN, (style == PANGO_STYLE_ITALIC ? PANGO_STYLE_NORMAL : PANGO_STYLE_ITALIC),
+                         -1);
+      window = (func) (gtk_widget_get_toplevel (GTK_WIDGET (tree_view)));
       
-      gtk_signal_connect (GTK_OBJECT (window),
-                         "destroy",
-                         GTK_SIGNAL_FUNC (window_closed_cb),
-                         cbdata);
+      if (window != NULL)
+       {
+         CallbackData *cbdata;
+         
+         cbdata = g_new (CallbackData, 1);
+         cbdata->model = model;
+         cbdata->path = gtk_tree_path_copy (path);
+         
+         g_signal_connect (window, "destroy",
+                           G_CALLBACK (window_closed_cb), cbdata);
+       }
     }
 }
 
@@ -617,7 +719,8 @@ selection_cb (GtkTreeSelection *selection,
   gtk_tree_model_get_value (model, &iter,
                            FILENAME_COLUMN,
                            &value);
-  load_file (g_value_get_string (&value));
+  if (g_value_get_string (&value))
+    load_file (g_value_get_string (&value));
   g_value_unset (&value);
 }
 
@@ -637,16 +740,17 @@ create_text (GtkTextBuffer **buffer,
                                       GTK_SHADOW_IN);
   
   text_view = gtk_text_view_new ();
-  gtk_container_add (GTK_CONTAINER (scrolled_window), text_view);
   
   *buffer = gtk_text_buffer_new (NULL);
   gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), *buffer);
   gtk_text_view_set_editable (GTK_TEXT_VIEW (text_view), FALSE);
   gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE);
 
+  gtk_container_add (GTK_CONTAINER (scrolled_window), text_view);
+  
   if (is_source)
     {
-      font_desc = pango_font_description_from_string ("Courier 14");
+      font_desc = pango_font_description_from_string ("monospace");
       gtk_widget_modify_font (text_view, font_desc);
       pango_font_description_free (font_desc);
 
@@ -667,7 +771,6 @@ create_text (GtkTextBuffer **buffer,
   return scrolled_window;
 }
 
-/* Technically a list, but if we do go to 80 demos, we may want to move to a tree */
 static GtkWidget *
 create_tree (void)
 {
@@ -677,48 +780,148 @@ create_tree (void)
   GtkTreeViewColumn *column;
   GtkTreeStore *model;
   GtkTreeIter iter;
-  gint i;
+  GtkWidget *box, *label, *scrolled_window;
 
-  model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
-  tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+  Demo *d = testgtk_demos;
+
+  model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT);
+  tree_view = gtk_tree_view_new ();
+  gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model));
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
 
   gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection),
-                              GTK_TREE_SELECTION_SINGLE);
-  gtk_widget_set_usize (tree_view, 200, -1);
+                              GTK_SELECTION_BROWSE);
+  gtk_widget_set_size_request (tree_view, 200, -1);
 
-  for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
+  /* this code only supports 1 level of children. If we
+   * want more we probably have to use a recursing function.
+   */
+  while (d->title)
     {
+      Demo *children = d->children;
+
       gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
 
       gtk_tree_store_set (GTK_TREE_STORE (model),
                          &iter,
-                         TITLE_COLUMN, testgtk_demos[i].title,
-                         FILENAME_COLUMN, testgtk_demos[i].filename,
-                         FUNC_COLUMN, testgtk_demos[i].func,
-                         ITALIC_COLUMN, FALSE,
+                         TITLE_COLUMN, d->title,
+                         FILENAME_COLUMN, d->filename,
+                         FUNC_COLUMN, d->func,
+                         STYLE_COLUMN, PANGO_STYLE_NORMAL,
                          -1);
+
+      d++;
+
+      if (!children)
+       continue;
+      
+      while (children->title)
+       {
+         GtkTreeIter child_iter;
+
+         gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
+         
+         gtk_tree_store_set (GTK_TREE_STORE (model),
+                             &child_iter,
+                             TITLE_COLUMN, children->title,
+                             FILENAME_COLUMN, children->filename,
+                             FUNC_COLUMN, children->func,
+                             STYLE_COLUMN, PANGO_STYLE_NORMAL,
+                             -1);
+         
+         children++;
+       }
     }
 
   cell = gtk_cell_renderer_text_new ();
 
-  g_object_set (G_OBJECT (cell),
-                "style", PANGO_STYLE_ITALIC,
-                NULL);
-  
   column = gtk_tree_view_column_new_with_attributes ("Widget (double click for demo)",
                                                     cell,
                                                     "text", TITLE_COLUMN,
-                                                    "style_set", ITALIC_COLUMN,
+                                                    "style", STYLE_COLUMN,
                                                     NULL);
   
   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),
                               GTK_TREE_VIEW_COLUMN (column));
 
-  gtk_signal_connect (GTK_OBJECT (selection), "selection_changed", GTK_SIGNAL_FUNC (selection_cb), model);
-  gtk_signal_connect (GTK_OBJECT (tree_view), "row_activated", GTK_SIGNAL_FUNC (row_activated_cb), model);
+  gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
+  gtk_tree_selection_select_iter (GTK_TREE_SELECTION (selection), &iter);
+
+  g_signal_connect (selection, "changed", G_CALLBACK (selection_cb), model);
+  g_signal_connect (tree_view, "row_activated", G_CALLBACK (row_activated_cb), model);
+
+  gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
+                                   
+  scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+                                 GTK_POLICY_NEVER,
+                                 GTK_POLICY_AUTOMATIC);
+  gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
+
+  label = gtk_label_new ("Widget (double click for demo)");
+
+  box = gtk_notebook_new ();
+  gtk_notebook_append_page (GTK_NOTEBOOK (box), scrolled_window, label);
 
-  return tree_view;
+  gtk_widget_grab_focus (tree_view);
+
+   g_object_unref (model);
+
+  return box;
+}
+
+static void
+setup_default_icon (void)
+{
+  GdkPixbuf *pixbuf;
+  char *filename;
+  GError *err;
+
+  err = NULL;
+
+  pixbuf = NULL;
+  filename = demo_find_file ("gtk-logo-rgb.gif", &err);
+  if (filename)
+    {
+      pixbuf = gdk_pixbuf_new_from_file (filename, &err);
+      g_free (filename);
+    }
+
+  /* Ignoring this error (passing NULL instead of &err above)
+   * would probably be reasonable for most apps.  We're just
+   * showing off.
+   */
+  if (err)
+    {
+      GtkWidget *dialog;
+      
+      dialog = gtk_message_dialog_new (NULL, 0,
+                                      GTK_MESSAGE_ERROR,
+                                      GTK_BUTTONS_CLOSE,
+                                      "Failed to read icon file: %s",
+                                      err->message);
+      g_error_free (err);
+
+      g_signal_connect (dialog, "response",
+                       G_CALLBACK (gtk_widget_destroy), NULL);
+    }
+
+  if (pixbuf)
+    {
+      GList *list;      
+      GdkPixbuf *transparent;
+
+      /* The gtk-logo-rgb icon has a white background, make it transparent */
+      transparent = gdk_pixbuf_add_alpha (pixbuf, TRUE, 0xff, 0xff, 0xff);
+
+      list = NULL;
+      list = g_list_append (list, transparent);
+      gtk_window_set_default_icon_list (list);
+      g_list_free (list);
+      g_object_unref (pixbuf);
+      g_object_unref (transparent);
+    }
 }
 
 int
@@ -734,22 +937,24 @@ main (int argc, char **argv)
    * these few lines, which are just a hack so gtk-demo will work
    * in the GTK tree without installing it.
    */
-  if (g_file_test ("../../gdk-pixbuf/.libs/libpixbufloader-pnm.so",
+  if (g_file_test ("../../gdk-pixbuf/libpixbufloader-pnm.la",
                    G_FILE_TEST_EXISTS))
     {
-      putenv ("GDK_PIXBUF_MODULEDIR=../../gdk-pixbuf/.libs");
-      putenv ("GTK_IM_MODULE_FILE=../../modules/input/gtk.immodules");
+      g_setenv ("GDK_PIXBUF_MODULE_FILE", "../../gdk-pixbuf/loaders.cache", TRUE);
+      g_setenv ("GTK_IM_MODULE_FILE", "../../modules/input/immodules.cache", TRUE);
     }
   /* -- End of hack -- */
   
   gtk_init (&argc, &argv);
+
+  setup_default_icon ();
   
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (window), "GTK+ Code Demos");
-  gtk_signal_connect (GTK_OBJECT (window), "destroy",
-                     GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
+  g_signal_connect_after (window, "destroy",
+                   G_CALLBACK (gtk_main_quit), NULL);
 
-  hbox = gtk_hbox_new (FALSE, 0);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
   gtk_container_add (GTK_CONTAINER (window), hbox);
 
   tree = create_tree ();
@@ -762,36 +967,39 @@ main (int argc, char **argv)
                            create_text (&info_buffer, FALSE),
                            gtk_label_new_with_mnemonic ("_Info"));
 
+  tag = gtk_text_buffer_create_tag (info_buffer, "title",
+                                    "font", "Sans 18",
+                                    NULL);
+   g_object_unref (info_buffer);
+
   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
                            create_text (&source_buffer, TRUE),
                            gtk_label_new_with_mnemonic ("_Source"));
 
-  tag = gtk_text_buffer_create_tag (info_buffer, "title",
-                                    "font", "Sans 18",
-                                    NULL);
 
-  tag = gtk_text_buffer_create_tag (info_buffer, "comment",
-                                   "foreground", "blue",
+  tag = gtk_text_buffer_create_tag (source_buffer, "comment",
+                                   "foreground", "DodgerBlue",
                                     NULL);
-  tag = gtk_text_buffer_create_tag (info_buffer, "type",
-                                   "foreground", "red",
+  tag = gtk_text_buffer_create_tag (source_buffer, "type",
+                                   "foreground", "ForestGreen",
                                     NULL);
-  tag = gtk_text_buffer_create_tag (info_buffer, "string",
-                                   "foreground", "SpringGreen3",
+  tag = gtk_text_buffer_create_tag (source_buffer, "string",
+                                   "foreground", "RosyBrown",
                                    "weight", PANGO_WEIGHT_BOLD,
                                     NULL);
-  tag = gtk_text_buffer_create_tag (info_buffer, "control",
+  tag = gtk_text_buffer_create_tag (source_buffer, "control",
                                    "foreground", "purple",
                                     NULL);
-  tag = gtk_text_buffer_create_tag (info_buffer, "preprocessor",
+  tag = gtk_text_buffer_create_tag (source_buffer, "preprocessor",
                                    "style", PANGO_STYLE_OBLIQUE,
                                    "foreground", "burlywood4",
                                     NULL);
-  tag = gtk_text_buffer_create_tag (info_buffer, "function",
+  tag = gtk_text_buffer_create_tag (source_buffer, "function",
                                    "weight", PANGO_WEIGHT_BOLD,
                                    "foreground", "DarkGoldenrod4",
                                     NULL);
-
+   g_object_unref (source_buffer);
+  
   gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
   gtk_widget_show_all (window);