]> Pileus Git - ~andy/gtk/blobdiff - tests/testtext.c
Fix many sparse warnings.
[~andy/gtk] / tests / testtext.c
index 4eaf62b75c535cf5c16236c6da012c1e300fc35b..80fc9bbb6be185fc59a955c06b41fadb54a607e9 100644 (file)
@@ -1,12 +1,17 @@
+#include <config.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 
+#undef GTK_DISABLE_DEPRECATED
+
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
+#include "prop-editor.h"
+
 typedef struct _Buffer Buffer;
 typedef struct _View View;
 
@@ -73,14 +78,14 @@ GSList *views = NULL;
 static void
 push_active_window (GtkWindow *window)
 {
-  gtk_object_ref (GTK_OBJECT (window));
+  g_object_ref (window);
   active_window_stack = g_slist_prepend (active_window_stack, window);
 }
 
 static void
 pop_active_window (void)
 {
-  gtk_object_unref (active_window_stack->data);
+  g_object_unref (active_window_stack->data);
   active_window_stack = g_slist_delete_link (active_window_stack, active_window_stack);
 }
 
@@ -102,9 +107,9 @@ typedef gboolean (*FileselOKFunc) (const char *filename, gpointer data);
 static void
 filesel_ok_cb (GtkWidget *button, GtkWidget *filesel)
 {
-  FileselOKFunc ok_func = gtk_object_get_data (GTK_OBJECT (filesel), "ok-func");
-  gpointer data = gtk_object_get_data (GTK_OBJECT (filesel), "ok-data");
-  gint *result = gtk_object_get_data (GTK_OBJECT (filesel), "ok-result");
+  FileselOKFunc ok_func = (FileselOKFunc)g_object_get_data (G_OBJECT (filesel), "ok-func");
+  gpointer data = g_object_get_data (G_OBJECT (filesel), "ok-data");
+  gint *result = g_object_get_data (G_OBJECT (filesel), "ok-result");
   
   gtk_widget_hide (filesel);
   
@@ -137,19 +142,19 @@ filesel_run (GtkWindow    *parent,
     gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), start_file);
 
   
-  gtk_object_set_data (GTK_OBJECT (filesel), "ok-func", func);
-  gtk_object_set_data (GTK_OBJECT (filesel), "ok-data", data);
-  gtk_object_set_data (GTK_OBJECT (filesel), "ok-result", &result);
+  g_object_set_data (G_OBJECT (filesel), "ok-func", func);
+  g_object_set_data (G_OBJECT (filesel), "ok-data", data);
+  g_object_set_data (G_OBJECT (filesel), "ok-result", &result);
 
-  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button),
-                     "clicked",
-                     GTK_SIGNAL_FUNC (filesel_ok_cb), filesel);
-  gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filesel)->cancel_button),
-                            "clicked",
-                            GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (filesel));
+  g_signal_connect (GTK_FILE_SELECTION (filesel)->ok_button,
+                   "clicked",
+                   G_CALLBACK (filesel_ok_cb), filesel);
+  g_signal_connect_swapped (GTK_FILE_SELECTION (filesel)->cancel_button,
+                           "clicked",
+                           G_CALLBACK (gtk_widget_destroy), filesel);
 
-  gtk_signal_connect (GTK_OBJECT (filesel), "destroy",
-                     GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
+  g_signal_connect (filesel, "destroy",
+                   G_CALLBACK (gtk_main_quit), NULL);
   gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
 
   gtk_widget_show (filesel);
@@ -181,7 +186,7 @@ msgbox_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
   if (event->keyval == GDK_Escape)
     {
-      gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event");
+      g_signal_stop_emission_by_name (widget, "key_press_event");
       gtk_object_destroy (GTK_OBJECT (widget));
       return TRUE;
     }
@@ -189,6 +194,9 @@ msgbox_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer data)
   return FALSE;
 }
 
+/* Don't copy this example, it's all crack-smoking - you can just use
+ * GtkMessageDialog now
+ */
 gint
 msgbox_run (GtkWindow  *parent,
            const char *message,
@@ -221,13 +229,13 @@ msgbox_run (GtkWindow  *parent,
 
   /* Quit our recursive main loop when the dialog is destroyed.
    */
-  gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
-                     GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
+  g_signal_connect (dialog, "destroy",
+                   G_CALLBACK (gtk_main_quit), NULL);
 
   /* Catch Escape key presses and have them destroy the dialog
    */
-  gtk_signal_connect (GTK_OBJECT (dialog), "key_press_event",
-                     GTK_SIGNAL_FUNC (msgbox_key_press_cb), NULL);
+  g_signal_connect (dialog, "key_press_event",
+                   G_CALLBACK (msgbox_key_press_cb), NULL);
 
   /* Fill in the contents of the widget
    */
@@ -259,8 +267,8 @@ msgbox_run (GtkWindow  *parent,
       if (default_index == 0)
        gtk_widget_grab_default (button);
       
-      gtk_signal_connect (GTK_OBJECT (button), "clicked",
-                         GTK_SIGNAL_FUNC (msgbox_yes_cb), &result);
+      g_signal_connect (button, "clicked",
+                       G_CALLBACK (msgbox_yes_cb), &result);
     }
 
   /* When No is clicked, call the msgbox_no_cb
@@ -275,8 +283,8 @@ msgbox_run (GtkWindow  *parent,
       if (default_index == 0)
        gtk_widget_grab_default (button);
       
-      gtk_signal_connect (GTK_OBJECT (button), "clicked",
-                         GTK_SIGNAL_FUNC (msgbox_no_cb), &result);
+      g_signal_connect (button, "clicked",
+                       G_CALLBACK (msgbox_no_cb), &result);
     }
 
   /* When Cancel is clicked, destroy the dialog
@@ -290,8 +298,8 @@ msgbox_run (GtkWindow  *parent,
       if (default_index == 1)
        gtk_widget_grab_default (button);
       
-      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
-                                GTK_SIGNAL_FUNC (gtk_object_destroy), GTK_OBJECT (dialog));
+      g_signal_connect_swapped (button, "clicked",
+                               G_CALLBACK (gtk_object_destroy), dialog);
     }
 
   gtk_widget_show_all (dialog);
@@ -303,6 +311,7 @@ msgbox_run (GtkWindow  *parent,
   return result;
 }
 
+#ifdef DO_BLINK
 /*
  * Example buffer filling code
  */
@@ -314,7 +323,7 @@ blink_timeout (gpointer data)
   
   tag = GTK_TEXT_TAG (data);
 
-  gtk_object_set (GTK_OBJECT (tag),
+  g_object_set (tag,
                  "foreground", flip ? "blue" : "purple",
                  NULL);
 
@@ -322,6 +331,7 @@ blink_timeout (gpointer data)
 
   return TRUE;
 }
+#endif
 
 static gint
 tag_event_handler (GtkTextTag *tag, GtkWidget *widget, GdkEvent *event,
@@ -388,14 +398,13 @@ tag_event_handler (GtkTextTag *tag, GtkWidget *widget, GdkEvent *event,
 static void
 setup_tag (GtkTextTag *tag)
 {
-
-  gtk_signal_connect (GTK_OBJECT (tag),
-                     "event",
-                     GTK_SIGNAL_FUNC (tag_event_handler),
-                     NULL);
+  g_signal_connect (tag,
+                   "event",
+                   G_CALLBACK (tag_event_handler),
+                   NULL);
 }
 
-static char  *book_closed_xpm[] = {
+static const char  *book_closed_xpm[] = {
 "16 16 6 1",
 "       c None s None",
 ".      c black",
@@ -425,21 +434,23 @@ fill_example_buffer (GtkTextBuffer *buffer)
 {
   GtkTextIter iter, iter2;
   GtkTextTag *tag;
+  GtkTextChildAnchor *anchor;
   GdkColor color;
   GdkColor color2;
   GdkPixbuf *pixbuf;
   int i;
   char *str;
-  GtkTextChildAnchor *anchor;
   
   /* FIXME this is broken if called twice on a buffer, since
    * we try to create tags a second time.
    */
   
-  tag = gtk_text_buffer_create_tag (buffer, "fg_blue");
+  tag = gtk_text_buffer_create_tag (buffer, "fg_blue", NULL);
 
-  /*       gtk_timeout_add (1000, blink_timeout, tag); */
-      
+#ifdef DO_BLINK
+  gtk_timeout_add (1000, blink_timeout, tag);
+#endif     
   setup_tag (tag);
   
   color.red = color.green = 0;
@@ -447,84 +458,90 @@ fill_example_buffer (GtkTextBuffer *buffer)
   color2.red = 0xfff;
   color2.blue = 0x0;
   color2.green = 0;
-  gtk_object_set (GTK_OBJECT (tag),
-                "foreground_gdk", &color,
-                "background_gdk", &color2,
-                  "size_points", 24.0,
-                NULL);
+  g_object_set (tag,
+                "foreground_gdk", &color,
+                "background_gdk", &color2,
+                "size_points", 24.0,
+                NULL);
 
-  tag = gtk_text_buffer_create_tag (buffer, "fg_red");
+  tag = gtk_text_buffer_create_tag (buffer, "fg_red", NULL);
 
   setup_tag (tag);
       
   color.blue = color.green = 0;
   color.red = 0xffff;
-  gtk_object_set (GTK_OBJECT (tag),
-                "rise", -4 * PANGO_SCALE,
-                "foreground_gdk", &color,
-                NULL);
+  g_object_set (tag,
+                "rise", -4 * PANGO_SCALE,
+                "foreground_gdk", &color,
+                NULL);
 
-  tag = gtk_text_buffer_create_tag (buffer, "bg_green");
+  tag = gtk_text_buffer_create_tag (buffer, "bg_green", NULL);
 
   setup_tag (tag);
       
   color.blue = color.red = 0;
   color.green = 0xffff;
-  gtk_object_set (GTK_OBJECT (tag),
-                  "background_gdk", &color,
-                  "size_points", 10.0,
-                  NULL);
+  g_object_set (tag,
+                "background_gdk", &color,
+                "size_points", 10.0,
+                NULL);
 
-  tag = gtk_text_buffer_create_tag (buffer, "strikethrough");
+  tag = gtk_text_buffer_create_tag (buffer, "strikethrough", NULL);
 
   setup_tag (tag);
       
-  gtk_object_set (GTK_OBJECT (tag),
-                  "strikethrough", TRUE,
-                  NULL);
+  g_object_set (tag,
+                "strikethrough", TRUE,
+                NULL);
 
 
-  tag = gtk_text_buffer_create_tag (buffer, "underline");
+  tag = gtk_text_buffer_create_tag (buffer, "underline", NULL);
 
   setup_tag (tag);
       
-  gtk_object_set (GTK_OBJECT (tag),
-                  "underline", PANGO_UNDERLINE_SINGLE,
-                  NULL);
+  g_object_set (tag,
+                "underline", PANGO_UNDERLINE_SINGLE,
+                NULL);
+
+  tag = gtk_text_buffer_create_tag (buffer, "underline_error", NULL);
 
   setup_tag (tag);
       
-  gtk_object_set (GTK_OBJECT (tag),
-                  "underline", PANGO_UNDERLINE_SINGLE,
-                  NULL);
+  g_object_set (tag,
+                "underline", PANGO_UNDERLINE_ERROR,
+                NULL);
 
-  tag = gtk_text_buffer_create_tag (buffer, "centered");
+  tag = gtk_text_buffer_create_tag (buffer, "centered", NULL);
       
-  gtk_object_set (GTK_OBJECT (tag),
-                  "justify", GTK_JUSTIFY_CENTER,
-                  NULL);
+  g_object_set (tag,
+                "justification", GTK_JUSTIFY_CENTER,
+                NULL);
 
-  tag = gtk_text_buffer_create_tag (buffer, "rtl_quote");
+  tag = gtk_text_buffer_create_tag (buffer, "rtl_quote", NULL);
       
-  gtk_object_set (GTK_OBJECT (tag),
-                  "wrap_mode", GTK_WRAPMODE_WORD,
-                  "direction", GTK_TEXT_DIR_RTL,
-                  "indent", 30,
-                  "left_margin", 20,
-                  "right_margin", 20,
-                  NULL);
+  g_object_set (tag,
+                "wrap_mode", GTK_WRAP_WORD,
+                "direction", GTK_TEXT_DIR_RTL,
+                "indent", 30,
+                "left_margin", 20,
+                "right_margin", 20,
+                NULL);
 
 
-#if 0
+  tag = gtk_text_buffer_create_tag (buffer, "negative_indent", NULL);
+      
+  g_object_set (tag,
+                "indent", -25,
+                NULL);
+  
   gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
 
   anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
 
-  g_object_ref (G_OBJECT (anchor));
+  g_object_ref (anchor);
   
   g_object_set_data_full (G_OBJECT (buffer), "anchor", anchor,
                           (GDestroyNotify) g_object_unref);
-#endif
   
   pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
   
@@ -550,7 +567,7 @@ fill_example_buffer (GtkTextBuffer *buffer)
                             "(Hello World!)\nfoo foo Hello this is some text we are using to text word wrap. It has punctuation! gee; blah - hmm, great.\nnew line with a significant quantity of text on it. This line really does contain some text. More text! More text! More text!\n"
                             /* This is UTF8 stuff, Emacs doesn't
                                really know how to display it */
-                            "German (Deutsch Süd) Grüß Gott Greek (Ελληνικά) Γειά σας Hebrew   שלום Japanese (日本語)\n", -1);
+                            "German (Deutsch S\303\274d) Gr\303\274\303\237 Gott Greek (\316\225\316\273\316\273\316\267\316\275\316\271\316\272\316\254) \316\223\316\265\316\271\316\254 \317\203\316\261\317\202 Hebrew(\327\251\327\234\327\225\327\235) Hebrew punctuation(\xd6\xbf\327\251\xd6\xbb\xd6\xbc\xd6\xbb\xd6\xbf\327\234\xd6\xbc\327\225\xd6\xbc\xd6\xbb\xd6\xbb\xd6\xbf\327\235\xd6\xbc\xd6\xbb\xd6\xbf) Japanese (\346\227\245\346\234\254\350\252\236) Thai (\340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\270\243\340\270\261\340\270\232) Thai wrong spelling (\340\270\204\340\270\263\340\270\225\340\271\210\340\270\255\340\271\204\340\270\233\340\270\231\340\270\267\340\271\210\340\270\252\340\270\260\340\270\201\340\270\224\340\270\234\340\270\264\340\270\224 \340\270\236\340\270\261\340\270\261\340\271\211\340\270\261\340\270\261\340\271\210\340\270\207\340\271\202\340\270\201\340\270\260)\n", -1);
 
       temp_mark =
         gtk_text_buffer_create_mark (buffer, "tmp_mark", &iter, TRUE);
@@ -566,6 +583,11 @@ fill_example_buffer (GtkTextBuffer *buffer)
 
       gtk_text_buffer_apply_tag_by_name (buffer, "underline", &iter, &iter2);
 
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 4);
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 7);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "underline_error", &iter, &iter2);
+
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 14);
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 24);
 
@@ -595,14 +617,21 @@ fill_example_buffer (GtkTextBuffer *buffer)
 
       gtk_text_buffer_move_mark (buffer, temp_mark, &iter);
       gtk_text_buffer_insert (buffer, &iter, "Word wrapped, Right-to-left Quote\n", -1);
-      gtk_text_buffer_insert (buffer, &iter, "وقد بدأ ثلاث من أكثر المؤسسات تقدما في شبكة اكسيون برامجها كمنظمات لا تسعى للربح، ثم تحولت في السنوات الخمس الماضية إلى مؤسسات مالية منظمة، وباتت جزءا من النظام المالي في بلدانها، ولكنها تتخصص في خدمة قطاع المشروعات الصغيرة. وأحد أكثر هذه المؤسسات نجاحا هو »بانكوسول« في بوليفيا.\n", -1);
+      gtk_text_buffer_insert (buffer, &iter, "\331\210\331\202\330\257 \330\250\330\257\330\243 \330\253\331\204\330\247\330\253 \331\205\331\206 \330\243\331\203\330\253\330\261 \330\247\331\204\331\205\330\244\330\263\330\263\330\247\330\252 \330\252\331\202\330\257\331\205\330\247 \331\201\331\212 \330\264\330\250\331\203\330\251 \330\247\331\203\330\263\331\212\331\210\331\206 \330\250\330\261\330\247\331\205\330\254\331\207\330\247 \331\203\331\205\331\206\330\270\331\205\330\247\330\252 \331\204\330\247 \330\252\330\263\330\271\331\211 \331\204\331\204\330\261\330\250\330\255\330\214 \330\253\331\205 \330\252\330\255\331\210\331\204\330\252 \331\201\331\212 \330\247\331\204\330\263\331\206\331\210\330\247\330\252 \330\247\331\204\330\256\331\205\330\263 \330\247\331\204\331\205\330\247\330\266\331\212\330\251 \330\245\331\204\331\211 \331\205\330\244\330\263\330\263\330\247\330\252 \331\205\330\247\331\204\331\212\330\251 \331\205\331\206\330\270\331\205\330\251\330\214 \331\210\330\250\330\247\330\252\330\252 \330\254\330\262\330\241\330\247 \331\205\331\206 \330\247\331\204\331\206\330\270\330\247\331\205 \330\247\331\204\331\205\330\247\331\204\331\212 \331\201\331\212 \330\250\331\204\330\257\330\247\331\206\331\207\330\247\330\214 \331\210\331\204\331\203\331\206\331\207\330\247 \330\252\330\252\330\256\330\265\330\265 \331\201\331\212 \330\256\330\257\331\205\330\251 \331\202\330\267\330\247\330\271 \330\247\331\204\331\205\330\264\330\261\331\210\330\271\330\247\330\252 \330\247\331\204\330\265\330\272\331\212\330\261\330\251. \331\210\330\243\330\255\330\257 \330\243\331\203\330\253\330\261 \331\207\330\260\331\207 \330\247\331\204\331\205\330\244\330\263\330\263\330\247\330\252 \331\206\330\254\330\247\330\255\330\247 \331\207\331\210 \302\273\330\250\330\247\331\206\331\203\331\210\330\263\331\210\331\204\302\253 \331\201\331\212 \330\250\331\210\331\204\331\212\331\201\331\212\330\247.\n", -1);
       gtk_text_buffer_get_iter_at_mark (buffer, &iter2, temp_mark);
       gtk_text_buffer_apply_tag_by_name (buffer, "rtl_quote", &iter2, &iter);
-         
+
+      gtk_text_buffer_insert_with_tags (buffer, &iter,
+                                        "Paragraph with negative indentation. blah blah blah blah blah. The quick brown fox jumped over the lazy dog.\n",
+                                        -1,
+                                        gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer),
+                                                                   "negative_indent"),
+                                        NULL);
+      
       ++i;
     }
 
-  g_object_unref (G_OBJECT (pixbuf));
+  g_object_unref (pixbuf);
   
   printf ("%d lines %d chars\n",
           gtk_text_buffer_get_line_count (buffer),
@@ -638,22 +667,14 @@ fill_file_buffer (GtkTextBuffer *buffer, const char *filename)
   while (!feof (f))
     {
       gint count;
-      char *leftover, *next;
+      const char *leftover;
       int to_read = 2047  - remaining;
 
       count = fread (buf + remaining, 1, to_read, f);
       buf[count + remaining] = '\0';
 
-      leftover = next = buf;
-      while (next)
-       {
-         leftover = next;
-         if (!*leftover)
-           break;
-         
-         next = g_utf8_find_next_char (next, buf + count + remaining);
-       }
-
+      g_utf8_validate (buf, count + remaining, &leftover);
+      
       g_assert (g_utf8_validate (buf, leftover - buf, NULL));
       gtk_text_buffer_insert (buffer, &iter, buf, leftover - buf);
 
@@ -674,7 +695,7 @@ fill_file_buffer (GtkTextBuffer *buffer, const char *filename)
   /* We had a newline in the buffer to begin with. (The buffer always contains
    * a newline, so we delete to the end of the buffer to clean up.
    */
-  gtk_text_buffer_get_last_iter (buffer, &end);
+  gtk_text_buffer_get_end_iter (buffer, &end);
   gtk_text_buffer_delete (buffer, &iter, &end);
   
   gtk_text_buffer_set_modified (buffer, FALSE);
@@ -702,7 +723,7 @@ static View *
 get_empty_view (View *view)
 {
   if (!view->buffer->filename &&
-      !gtk_text_buffer_modified (view->buffer->buffer))
+      !gtk_text_buffer_get_modified (view->buffer->buffer))
     return view;
   else
     return create_view (create_buffer ());
@@ -711,17 +732,15 @@ get_empty_view (View *view)
 static View *
 view_from_widget (GtkWidget *widget)
 {
-  GtkWidget *app;
-
   if (GTK_IS_MENU_ITEM (widget))
     {
       GtkItemFactory *item_factory = gtk_item_factory_from_widget (widget);
-      return gtk_object_get_data (GTK_OBJECT (item_factory), "view");      
+      return g_object_get_data (G_OBJECT (item_factory), "view");      
     }
   else
     {
       GtkWidget *app = gtk_widget_get_toplevel (widget);
-      return gtk_object_get_data (GTK_OBJECT (app), "view");
+      return g_object_get_data (G_OBJECT (app), "view");
     }
 }
 
@@ -853,6 +872,34 @@ do_example (gpointer             callback_data,
   view_add_example_widgets (new_view);
 }
 
+
+static void
+do_insert_and_scroll (gpointer             callback_data,
+                      guint                callback_action,
+                      GtkWidget           *widget)
+{
+  View *view = view_from_widget (widget);
+  GtkTextBuffer *buffer;
+  GtkTextIter start, end;
+  GtkTextMark *mark;
+  
+  buffer = view->buffer->buffer;
+
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+  mark = gtk_text_buffer_create_mark (buffer, NULL, &end, /* right grav */ FALSE);
+
+  gtk_text_buffer_insert (buffer, &end,
+                          "Hello this is multiple lines of text\n"
+                          "Line 1\n"  "Line 2\n"
+                          "Line 3\n"  "Line 4\n"
+                          "Line 5\n",
+                          -1);
+
+  gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view->text_view), mark,
+                                0, TRUE, 0.0, 1.0);
+  gtk_text_buffer_delete_mark (buffer, mark);
+}
+
 static void
 do_wrap_changed (gpointer             callback_data,
                 guint                callback_action,
@@ -1053,7 +1100,7 @@ do_apply_colors (gpointer callback_data,
               gtk_text_iter_forward_char (&next);
               gtk_text_iter_forward_char (&next);
 
-              if (gtk_text_iter_compare (&next, &end) > 0)
+              if (gtk_text_iter_compare (&next, &end) >= 0)
                 {
                   next = end;
                   done = TRUE;
@@ -1076,6 +1123,33 @@ do_apply_colors (gpointer callback_data,
     }
 }
 
+static void
+do_remove_tags (gpointer callback_data,
+                guint callback_action,
+                GtkWidget *widget)
+{
+  View *view = view_from_widget (widget);
+  GtkTextIter start;
+  GtkTextIter end;
+  
+  if (gtk_text_buffer_get_selection_bounds (view->buffer->buffer,
+                                            &start, &end))
+    {
+      gtk_text_buffer_remove_all_tags (view->buffer->buffer,
+                                       &start, &end);
+    }
+}
+
+static void
+do_properties (gpointer callback_data,
+                guint callback_action,
+                GtkWidget *widget)
+{
+  View *view = view_from_widget (widget);
+
+  create_prop_editor (G_OBJECT (view->text_view), 0);
+}
+
 enum
 {
   RESPONSE_FORWARD,
@@ -1097,16 +1171,13 @@ dialog_response_callback (GtkWidget *dialog, gint response_id, gpointer data)
       return;
     }
   
-  buffer = gtk_object_get_data (GTK_OBJECT (dialog), "buffer");
+  buffer = g_object_get_data (G_OBJECT (dialog), "buffer");
 
   gtk_text_buffer_get_bounds (buffer, &start, &end);
-
-  /* Remove trailing newline */
-  gtk_text_iter_backward_char (&end);
   
   search_string = gtk_text_iter_get_text (&start, &end);
 
-  printf ("Searching for `%s'\n", search_string);
+  g_print ("Searching for `%s'\n", search_string);
 
   if (response_id == RESPONSE_FORWARD)
     buffer_search_forward (view->buffer, search_string, view);
@@ -1133,7 +1204,7 @@ do_search (gpointer callback_data,
                                         GTK_DIALOG_DESTROY_WITH_PARENT,
                                         "Forward", RESPONSE_FORWARD,
                                         "Backward", RESPONSE_BACKWARD,
-                                        GTK_STOCK_BUTTON_CANCEL,
+                                        GTK_STOCK_CANCEL,
                                         GTK_RESPONSE_NONE, NULL);
 
 
@@ -1141,18 +1212,18 @@ do_search (gpointer callback_data,
 
   search_text = gtk_text_view_new_with_buffer (buffer);
 
-  g_object_unref (G_OBJECT (buffer));
+  g_object_unref (buffer);
   
   gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->vbox),
                     search_text,
                     TRUE, TRUE, 0);
 
-  gtk_object_set_data (GTK_OBJECT (dialog), "buffer", buffer);
+  g_object_set_data (G_OBJECT (dialog), "buffer", buffer);
   
-  gtk_signal_connect (GTK_OBJECT (dialog),
-                      "response",
-                      GTK_SIGNAL_FUNC (dialog_response_callback),
-                      view);
+  g_signal_connect (dialog,
+                    "response",
+                    G_CALLBACK (dialog_response_callback),
+                    view);
 
   gtk_widget_show (search_text);
 
@@ -1161,6 +1232,230 @@ do_search (gpointer callback_data,
   gtk_widget_show_all (dialog);
 }
 
+typedef struct
+{
+  /* position is in coordinate system of text_view_move_child */
+  int click_x;
+  int click_y;
+  int start_x;
+  int start_y;
+  int button;
+} ChildMoveInfo;
+
+static gboolean
+movable_child_callback (GtkWidget *child,
+                        GdkEvent  *event,
+                        gpointer   data)
+{
+  ChildMoveInfo *info;
+  GtkTextView *text_view;
+
+  text_view = GTK_TEXT_VIEW (data);
+  
+  g_return_val_if_fail (GTK_IS_EVENT_BOX (child), FALSE);
+  g_return_val_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (text_view), FALSE);  
+  
+  info = g_object_get_data (G_OBJECT (child),
+                            "testtext-move-info");
+
+  if (info == NULL)
+    {
+      info = g_new (ChildMoveInfo, 1);      
+      info->start_x = -1;
+      info->start_y = -1;
+      info->button = -1;
+      g_object_set_data_full (G_OBJECT (child),
+                              "testtext-move-info",
+                              info,
+                              g_free);
+    }
+  
+  switch (event->type)
+    {
+    case GDK_BUTTON_PRESS:
+      if (info->button < 0)
+        {
+          if (gdk_pointer_grab (event->button.window,
+                                FALSE,
+                                GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK |
+                                GDK_BUTTON_RELEASE_MASK,
+                                NULL,
+                                NULL,
+                                event->button.time) != GDK_GRAB_SUCCESS)
+            return FALSE;
+          
+          info->button = event->button.button;
+          
+          info->start_x = child->allocation.x;
+          info->start_y = child->allocation.y;
+          info->click_x = child->allocation.x + event->button.x;
+          info->click_y = child->allocation.y + event->button.y;
+        }
+      break;
+
+    case GDK_BUTTON_RELEASE:
+      if (info->button < 0)
+        return FALSE;
+
+      if (info->button == event->button.button)
+        {
+          int x, y;
+          
+          gdk_pointer_ungrab (event->button.time);
+          info->button = -1;
+
+          /* convert to window coords from event box coords */
+          x = info->start_x + (event->button.x + child->allocation.x - info->click_x);
+          y = info->start_y + (event->button.y + child->allocation.y - info->click_y);
+
+          gtk_text_view_move_child (text_view,
+                                    child,
+                                    x, y);
+        }
+      break;
+
+    case GDK_MOTION_NOTIFY:
+      {
+        int x, y;
+        
+        if (info->button < 0)
+          return FALSE;
+        
+        gdk_window_get_pointer (child->window, &x, &y, NULL); /* ensure more events */
+
+        /* to window coords from event box coords */
+        x += child->allocation.x;
+        y += child->allocation.y;
+        
+        x = info->start_x + (x - info->click_x);
+        y = info->start_y + (y - info->click_y);
+        
+        gtk_text_view_move_child (text_view,
+                                  child,
+                                  x, y);
+      }
+      break;
+
+    default:
+      break;
+    }
+
+  return FALSE;
+}
+
+static void
+add_movable_child (GtkTextView      *text_view,
+                   GtkTextWindowType window)
+{
+  GtkWidget *event_box;
+  GtkWidget *label;
+  GdkColor color;
+  
+  label = gtk_label_new ("Drag me around");  
+  
+  event_box = gtk_event_box_new ();
+  gtk_widget_add_events (event_box,
+                         GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+                         GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);
+
+  color.red = 0xffff;
+  color.green = color.blue = 0;
+  gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, &color);
+  
+  gtk_container_add (GTK_CONTAINER (event_box), label);
+
+  gtk_widget_show_all (event_box);
+
+  g_signal_connect (event_box, "event",
+                    G_CALLBACK (movable_child_callback),
+                    text_view);
+
+  gtk_text_view_add_child_in_window (text_view,
+                                     event_box,
+                                     window,
+                                     0, 0);
+}
+
+static void
+do_add_children (gpointer callback_data,
+                 guint callback_action,
+                 GtkWidget *widget)
+{
+  View *view = view_from_widget (widget);
+
+  add_movable_child (GTK_TEXT_VIEW (view->text_view),
+                     GTK_TEXT_WINDOW_WIDGET);
+  add_movable_child (GTK_TEXT_VIEW (view->text_view),
+                     GTK_TEXT_WINDOW_LEFT);
+  add_movable_child (GTK_TEXT_VIEW (view->text_view),
+                     GTK_TEXT_WINDOW_RIGHT);
+}
+
+static void
+do_add_focus_children (gpointer callback_data,
+                       guint callback_action,
+                       GtkWidget *widget)
+{
+  View *view = view_from_widget (widget);
+  GtkWidget *child;
+  GtkTextChildAnchor *anchor;
+  GtkTextIter iter;
+  GtkTextView *text_view;
+
+  text_view = GTK_TEXT_VIEW (view->text_view);
+  
+  child = gtk_button_new_with_mnemonic ("Button _A in widget->window");
+
+  gtk_text_view_add_child_in_window (text_view,
+                                     child,
+                                     GTK_TEXT_WINDOW_WIDGET,
+                                     200, 200);
+
+  child = gtk_button_new_with_mnemonic ("Button _B in widget->window");
+
+  gtk_text_view_add_child_in_window (text_view,
+                                     child,
+                                     GTK_TEXT_WINDOW_WIDGET,
+                                     350, 300);
+
+  child = gtk_button_new_with_mnemonic ("Button _C in left window");
+
+  gtk_text_view_add_child_in_window (text_view,
+                                     child,
+                                     GTK_TEXT_WINDOW_LEFT,
+                                     0, 0);
+
+  child = gtk_button_new_with_mnemonic ("Button _D in right window");
+  
+  gtk_text_view_add_child_in_window (text_view,
+                                     child,
+                                     GTK_TEXT_WINDOW_RIGHT,
+                                     0, 0);
+
+  gtk_text_buffer_get_start_iter (view->buffer->buffer, &iter);
+  
+  anchor = gtk_text_buffer_create_child_anchor (view->buffer->buffer, &iter);
+
+  child = gtk_button_new_with_mnemonic ("Button _E in buffer");
+  
+  gtk_text_view_add_child_at_anchor (text_view, child, anchor);
+
+  anchor = gtk_text_buffer_create_child_anchor (view->buffer->buffer, &iter);
+
+  child = gtk_button_new_with_mnemonic ("Button _F in buffer");
+  
+  gtk_text_view_add_child_at_anchor (text_view, child, anchor);
+
+  anchor = gtk_text_buffer_create_child_anchor (view->buffer->buffer, &iter);
+
+  child = gtk_button_new_with_mnemonic ("Button _G in buffer");
+  
+  gtk_text_view_add_child_at_anchor (text_view, child, anchor);
+
+  /* show all the buttons */
+  gtk_widget_show_all (view->text_view);
+}
+
 static void
 view_init_menus (View *view)
 {
@@ -1185,12 +1480,15 @@ view_init_menus (View *view)
 
   switch (wrap_mode)
     {
-    case GTK_WRAPMODE_NONE:
+    case GTK_WRAP_NONE:
       menu_item = gtk_item_factory_get_widget (view->item_factory, "/Settings/Wrap Off");
       break;
-    case GTK_WRAPMODE_WORD:
+    case GTK_WRAP_WORD:
       menu_item = gtk_item_factory_get_widget (view->item_factory, "/Settings/Wrap Words");
       break;
+    case GTK_WRAP_CHAR:
+      menu_item = gtk_item_factory_get_widget (view->item_factory, "/Settings/Wrap Chars");
+      break;
     default:
       break;
     }
@@ -1201,41 +1499,42 @@ view_init_menus (View *view)
 
 static GtkItemFactoryEntry menu_items[] =
 {
-  { "/_File",            NULL,         0,           0, "<Branch>" },
+  { "/_File",            NULL,         NULL,        0, "<Branch>" },
   { "/File/_New",        "<control>N", do_new,      0, NULL },
   { "/File/New _View",   NULL,         do_new_view, 0, NULL },
   { "/File/_Open",       "<control>O", do_open,     0, NULL },
   { "/File/_Save",       "<control>S", do_save,     0, NULL },
   { "/File/Save _As...", NULL,         do_save_as,  0, NULL },
-  { "/File/sep1",        NULL,         0,           0, "<Separator>" },
+  { "/File/sep1",        NULL,         NULL,        0, "<Separator>" },
   { "/File/_Close",     "<control>W" , do_close,    0, NULL },
   { "/File/E_xit",      "<control>Q" , do_exit,     0, NULL },
 
   { "/_Edit", NULL, 0, 0, "<Branch>" },
   { "/Edit/Find...", NULL, do_search, 0, NULL },
 
-  { "/_Settings",        NULL,         0,                0, "<Branch>" },
-  { "/Settings/Wrap _Off",   NULL,      do_wrap_changed,  GTK_WRAPMODE_NONE, "<RadioItem>" },
-  { "/Settings/Wrap _Words", NULL,      do_wrap_changed,  GTK_WRAPMODE_WORD, "/Settings/Wrap Off" },
-  { "/Settings/sep1",        NULL,      0,                0, "<Separator>" },
+  { "/_Settings",        NULL,         NULL,             0, "<Branch>" },
+  { "/Settings/Wrap _Off",   NULL,      do_wrap_changed,  GTK_WRAP_NONE, "<RadioItem>" },
+  { "/Settings/Wrap _Words", NULL,      do_wrap_changed,  GTK_WRAP_WORD, "/Settings/Wrap Off" },
+  { "/Settings/Wrap _Chars", NULL,      do_wrap_changed,  GTK_WRAP_CHAR, "/Settings/Wrap Off" },
+  { "/Settings/sep1",        NULL,      NULL,             0, "<Separator>" },
   { "/Settings/Editable", NULL,      do_editable_changed,  TRUE, "<RadioItem>" },
   { "/Settings/Not editable",    NULL,      do_editable_changed,  FALSE, "/Settings/Editable" },
-  { "/Settings/sep1",        NULL,      0,                0, "<Separator>" },
+  { "/Settings/sep1",        NULL,      NULL,             0, "<Separator>" },
 
   { "/Settings/Cursor visible",    NULL,      do_cursor_visible_changed,  TRUE, "<RadioItem>" },
   { "/Settings/Cursor not visible", NULL,      do_cursor_visible_changed,  FALSE, "/Settings/Cursor visible" },
-  { "/Settings/sep1",        NULL,      0,                0, "<Separator>" },
+  { "/Settings/sep1",        NULL,      NULL,          0, "<Separator>" },
   
   { "/Settings/Left-to-Right", NULL,    do_direction_changed,  GTK_TEXT_DIR_LTR, "<RadioItem>" },
   { "/Settings/Right-to-Left", NULL,    do_direction_changed,  GTK_TEXT_DIR_RTL, "/Settings/Left-to-Right" },
 
-  { "/Settings/sep1",        NULL,      0,                0, "<Separator>" },
+  { "/Settings/sep1",        NULL,      NULL,                0, "<Separator>" },
   { "/Settings/Sane spacing", NULL,    do_spacing_changed,  FALSE, "<RadioItem>" },
   { "/Settings/Funky spacing", NULL,    do_spacing_changed,  TRUE, "/Settings/Sane spacing" },
-  { "/Settings/sep1",        NULL,      0,                0, "<Separator>" },
+  { "/Settings/sep1",        NULL,      NULL,                0, "<Separator>" },
   { "/Settings/Don't cycle color tags", NULL,    do_color_cycle_changed,  FALSE, "<RadioItem>" },
   { "/Settings/Cycle colors", NULL,    do_color_cycle_changed,  TRUE, "/Settings/Don't cycle color tags" },
-  { "/_Attributes",      NULL,         0,                0, "<Branch>" },
+  { "/_Attributes",      NULL,         NULL,                0, "<Branch>" },
   { "/Attributes/Editable",      NULL,         do_apply_editable, TRUE, NULL },
   { "/Attributes/Not editable",          NULL,         do_apply_editable, FALSE, NULL },
   { "/Attributes/Invisible",             NULL,         do_apply_invisible, FALSE, NULL },
@@ -1244,8 +1543,13 @@ static GtkItemFactoryEntry menu_items[] =
   { "/Attributes/Default tabs",          NULL,         do_apply_tabs, TRUE, NULL },
   { "/Attributes/Color cycles",          NULL,         do_apply_colors, TRUE, NULL },
   { "/Attributes/No colors",                     NULL,         do_apply_colors, FALSE, NULL },
-  { "/_Test",           NULL,         0,           0, "<Branch>" },
+  { "/Attributes/Remove all tags",       NULL, do_remove_tags, 0, NULL },
+  { "/Attributes/Properties",       NULL, do_properties, 0, NULL },
+  { "/_Test",           NULL,         NULL,           0, "<Branch>" },
   { "/Test/_Example",           NULL,         do_example,  0, NULL },
+  { "/Test/_Insert and scroll", NULL,         do_insert_and_scroll,  0, NULL },
+  { "/Test/_Add fixed children", NULL,         do_add_children,  0, NULL },
+  { "/Test/A_dd focusable children", NULL,    do_add_focus_children,  0, NULL },
 };
 
 static gboolean
@@ -1286,7 +1590,7 @@ save_buffer (Buffer *buffer)
   else
     {
       gtk_text_buffer_get_iter_at_offset (buffer->buffer, &start, 0);
-      gtk_text_buffer_get_last_iter (buffer->buffer, &end);
+      gtk_text_buffer_get_end_iter (buffer->buffer, &end);
   
       chars = gtk_text_buffer_get_slice (buffer->buffer, &start, &end, FALSE);
 
@@ -1371,7 +1675,7 @@ save_as_buffer (Buffer *buffer)
 static gboolean
 check_buffer_saved (Buffer *buffer)
 {
-  if (gtk_text_buffer_modified (buffer->buffer))
+  if (gtk_text_buffer_get_modified (buffer->buffer))
     {
       char *pretty_name = buffer_pretty_name (buffer);
       char *msg = g_strdup_printf ("Save changes to '%s'?", pretty_name);
@@ -1419,26 +1723,25 @@ create_buffer (void)
     {
       GtkTextTag *tag;
 
-      tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
+      tag = gtk_text_buffer_create_tag (buffer->buffer, NULL, NULL);
       
       buffer->color_tags = g_slist_prepend (buffer->color_tags, tag);
       
       ++i;
     }
+
+#if 0  
+  buffer->invisible_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL,
+                                                      "invisible", TRUE, NULL);
+#endif  
   
-  buffer->invisible_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
-  gtk_object_set (GTK_OBJECT (buffer->invisible_tag),
-                  "invisible", TRUE,
-                  NULL);
-  
-  buffer->not_editable_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
-  gtk_object_set (GTK_OBJECT (buffer->not_editable_tag),
-                  "editable", FALSE,
-                  "foreground", "purple", NULL);
+  buffer->not_editable_tag =
+    gtk_text_buffer_create_tag (buffer->buffer, NULL,
+                                "editable", FALSE,
+                                "foreground", "purple", NULL);
 
-  buffer->found_text_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
-  gtk_object_set (GTK_OBJECT (buffer->found_text_tag),
-                  "foreground", "red", NULL);
+  buffer->found_text_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL,
+                                                       "foreground", "red", NULL);
 
   tabs = pango_tab_array_new_with_positions (4,
                                              TRUE,
@@ -1447,10 +1750,9 @@ create_buffer (void)
                                              PANGO_TAB_LEFT, 60,
                                              PANGO_TAB_LEFT, 120);
   
-  buffer->custom_tabs_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
-  gtk_object_set (GTK_OBJECT (buffer->custom_tabs_tag),
-                  "tabs", tabs,
-                  "foreground", "green", NULL);
+  buffer->custom_tabs_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL,
+                                                        "tabs", tabs,
+                                                        "foreground", "green", NULL);
 
   pango_tab_array_free (tabs);
   
@@ -1527,7 +1829,9 @@ buffer_search (Buffer     *buffer,
 
       if (forward)
         {
-          while (gtk_text_iter_forward_search (&iter, str, TRUE, FALSE,
+          while (gtk_text_iter_forward_search (&iter, str,
+                                               GTK_TEXT_SEARCH_VISIBLE_ONLY |
+                                               GTK_TEXT_SEARCH_TEXT_ONLY,
                                                &match_start, &match_end,
                                                NULL))
             {
@@ -1540,7 +1844,9 @@ buffer_search (Buffer     *buffer,
         }
       else
         {
-          while (gtk_text_iter_backward_search (&iter, str, TRUE, FALSE,
+          while (gtk_text_iter_backward_search (&iter, str,
+                                                GTK_TEXT_SEARCH_VISIBLE_ONLY |
+                                                GTK_TEXT_SEARCH_TEXT_ONLY,
                                                 &match_start, &match_end,
                                                 NULL))
             {
@@ -1554,16 +1860,15 @@ buffer_search (Buffer     *buffer,
     }
 
   dialog = gtk_message_dialog_new (GTK_WINDOW (view->window),
+                                  GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_INFO,
                                    GTK_BUTTONS_OK,
-                                   GTK_DIALOG_DESTROY_WITH_PARENT,
                                    "%d strings found and marked in red",
                                    i);
 
-  gtk_signal_connect_object (GTK_OBJECT (dialog),
-                             "response",
-                             GTK_SIGNAL_FUNC (gtk_widget_destroy),
-                             GTK_OBJECT (dialog));
+  g_signal_connect_swapped (dialog,
+                            "response",
+                            G_CALLBACK (gtk_widget_destroy), dialog);
   
   gtk_widget_show (dialog);
 }
@@ -1596,7 +1901,7 @@ buffer_unref (Buffer *buffer)
     {
       buffer_set_colors (buffer, FALSE);
       buffers = g_slist_remove (buffers, buffer);
-      gtk_object_unref (GTK_OBJECT (buffer->buffer));
+      g_object_unref (buffer->buffer);
       g_free (buffer->filename);
       g_free (buffer);
     }
@@ -1712,10 +2017,10 @@ buffer_set_colors (Buffer  *buffer,
   gdouble hue = 0.0;
 
   if (enabled && buffer->color_cycle_timeout == 0)
-    buffer->color_cycle_timeout = gtk_timeout_add (200, color_cycle_timeout, buffer);
+    buffer->color_cycle_timeout = g_timeout_add (200, color_cycle_timeout, buffer);
   else if (!enabled && buffer->color_cycle_timeout != 0)
     {
-      gtk_timeout_remove (buffer->color_cycle_timeout);
+      g_source_remove (buffer->color_cycle_timeout);
       buffer->color_cycle_timeout = 0;
     }
     
@@ -1728,14 +2033,14 @@ buffer_set_colors (Buffer  *buffer,
           
           hue_to_color (hue, &color);
 
-          gtk_object_set (GTK_OBJECT (tmp->data),
-                          "foreground_gdk", &color,
-                          NULL);
+          g_object_set (tmp->data,
+                        "foreground_gdk", &color,
+                        NULL);
         }
       else
-        gtk_object_set (GTK_OBJECT (tmp->data),
-                        "foreground_set", FALSE,
-                        NULL);
+        g_object_set (tmp->data,
+                      "foreground_set", FALSE,
+                      NULL);
 
       hue += 1.0 / N_COLORS;
       
@@ -1756,9 +2061,9 @@ buffer_cycle_colors (Buffer *buffer)
       
       hue_to_color (hue, &color);
       
-      gtk_object_set (GTK_OBJECT (tmp->data),
-                      "foreground_gdk", &color,
-                      NULL);
+      g_object_set (tmp->data,
+                    "foreground_gdk", &color,
+                    NULL);
 
       hue += 1.0 / N_COLORS;
       if (hue > 1.0)
@@ -1778,7 +2083,7 @@ close_view (View *view)
   views = g_slist_remove (views, view);
   buffer_unref (view->buffer);
   gtk_widget_destroy (view->window);
-  g_object_unref (G_OBJECT (view->item_factory));
+  g_object_unref (view->item_factory);
   
   g_free (view);
   
@@ -1977,7 +2282,7 @@ get_lines (GtkTextView  *text_view,
   count = 0;
   size = 0;
 
-  while (!gtk_text_iter_is_last (&iter))
+  while (!gtk_text_iter_is_end (&iter))
     {
       gint y, height;
       gint line_num;
@@ -2087,12 +2392,15 @@ line_numbers_expose (GtkWidget      *widget,
 
       pango_layout_set_text (layout, str, -1);
 
-
-      gdk_draw_layout (target,
-                       widget->style->fg_gc [widget->state],
-                       /* 2 is just a random padding */
-                       2, pos + 2,
-                       layout);
+      gtk_paint_layout (widget->style,
+                        target,
+                        GTK_WIDGET_STATE (widget),
+                        FALSE,
+                        NULL,
+                        widget,
+                        NULL,
+                        2, pos + 2,
+                        layout);
 
       g_free (str);
       
@@ -2102,9 +2410,10 @@ line_numbers_expose (GtkWidget      *widget,
   g_array_free (pixels, TRUE);
   g_array_free (numbers, TRUE);
   
-  g_object_unref (G_OBJECT (layout));
+  g_object_unref (layout);
 
-  return TRUE;
+  /* don't stop emission, need to draw children */
+  return FALSE;
 }
 
 static View *
@@ -2122,14 +2431,14 @@ create_view (Buffer *buffer)
   buffer_ref (buffer);
   
   view->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_object_set_data (GTK_OBJECT (view->window), "view", view);
+  g_object_set_data (G_OBJECT (view->window), "view", view);
   
-  gtk_signal_connect (GTK_OBJECT (view->window), "delete_event",
-                     GTK_SIGNAL_FUNC (delete_event_cb), NULL);
+  g_signal_connect (view->window, "delete_event",
+                   G_CALLBACK (delete_event_cb), NULL);
 
   view->accel_group = gtk_accel_group_new ();
   view->item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", view->accel_group);
-  gtk_object_set_data (GTK_OBJECT (view->item_factory), "view", view);
+  g_object_set_data (G_OBJECT (view->item_factory), "view", view);
   
   gtk_item_factory_create_items (view->item_factory, G_N_ELEMENTS (menu_items), menu_items, view);
 
@@ -2149,7 +2458,11 @@ create_view (Buffer *buffer)
 
   view->text_view = gtk_text_view_new_with_buffer (buffer->buffer);
   gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view->text_view),
-                               GTK_WRAPMODE_WORD);
+                               GTK_WRAP_WORD);
+
+  /* Make sure border width works, no real reason to do this other than testing */
+  gtk_container_set_border_width (GTK_CONTAINER (view->text_view),
+                                  10);
   
   /* Draw tab stops in the top and bottom windows. */
   
@@ -2161,15 +2474,15 @@ create_view (Buffer *buffer)
                                         GTK_TEXT_WINDOW_BOTTOM,
                                         15);
 
-  gtk_signal_connect (GTK_OBJECT (view->text_view),
-                      "expose_event",
-                      GTK_SIGNAL_FUNC (tab_stops_expose),
-                      NULL);  
+  g_signal_connect (view->text_view,
+                    "expose_event",
+                    G_CALLBACK (tab_stops_expose),
+                    NULL);  
 
-  gtk_signal_connect (GTK_OBJECT (view->buffer->buffer),
-                      "mark_set",
-                      GTK_SIGNAL_FUNC (cursor_set_callback),
-                      view->text_view);
+  g_signal_connect (view->buffer->buffer,
+                   "mark_set",
+                   G_CALLBACK (cursor_set_callback),
+                   view->text_view);
   
   /* Draw line numbers in the side windows; we should really be
    * more scientific about what width we set them to.
@@ -2182,10 +2495,10 @@ create_view (Buffer *buffer)
                                         GTK_TEXT_WINDOW_LEFT,
                                         30);
   
-  gtk_signal_connect (GTK_OBJECT (view->text_view),
-                      "expose_event",
-                      GTK_SIGNAL_FUNC (line_numbers_expose),
-                      NULL);
+  g_signal_connect (view->text_view,
+                    "expose_event",
+                    G_CALLBACK (line_numbers_expose),
+                    NULL);
   
   gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
   gtk_container_add (GTK_CONTAINER (sw), view->text_view);
@@ -2209,19 +2522,14 @@ view_add_example_widgets (View *view)
   GtkTextChildAnchor *anchor;
   Buffer *buffer;
 
-  return;
-  
   buffer = view->buffer;
   
-  anchor = gtk_object_get_data (GTK_OBJECT (buffer->buffer),
-                                "anchor");
+  anchor = g_object_get_data (G_OBJECT (buffer->buffer),
+                              "anchor");
 
   if (anchor && !gtk_text_child_anchor_get_deleted (anchor))
     {
       GtkWidget *widget;
-      
-      widget = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
-                                         GTK_ICON_SIZE_DIALOG);
 
       widget = gtk_button_new_with_label ("Foo");
       
@@ -2233,20 +2541,14 @@ view_add_example_widgets (View *view)
     }
 }
 
-static gboolean
-file_exists (const char *filename)
-{
-  struct stat statbuf;
-
-  return stat (filename, &statbuf) == 0;
-}
 void
-test_init ()
+test_init (void)
 {
-  if (file_exists ("../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=./gtk.immodules");
+      g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
+      g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
     }
 }
 
@@ -2258,7 +2560,6 @@ main (int argc, char** argv)
   int i;
 
   test_init ();
-  gtk_set_locale ();
   gtk_init (&argc, &argv);
   
   buffer = create_buffer ();