]> Pileus Git - ~andy/gtk/blobdiff - tests/testtext.c
Put into #ifdef DO_BLINK to avoid an unused static function. (#97965)
[~andy/gtk] / tests / testtext.c
index 530842f68a130292e5dc7f871acd08d2ac25200a..55a82699590e5baedc07867ecd736afd9d2578d7 100644 (file)
@@ -7,6 +7,8 @@
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
+#include "prop-editor.h"
+
 typedef struct _Buffer Buffer;
 typedef struct _View View;
 
@@ -73,14 +75,14 @@ GSList *views = NULL;
 static void
 push_active_window (GtkWindow *window)
 {
-  g_object_ref (G_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,7 +104,7 @@ typedef gboolean (*FileselOKFunc) (const char *filename, gpointer data);
 static void
 filesel_ok_cb (GtkWidget *button, GtkWidget *filesel)
 {
-  FileselOKFunc ok_func = g_object_get_data (G_OBJECT (filesel), "ok-func");
+  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");
   
@@ -141,15 +143,15 @@ filesel_run (GtkWindow    *parent,
   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 +183,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 +191,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 +226,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 +264,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 +280,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 +295,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 +308,7 @@ msgbox_run (GtkWindow  *parent,
   return result;
 }
 
+#ifdef DO_BLINK
 /*
  * Example buffer filling code
  */
@@ -322,6 +328,7 @@ blink_timeout (gpointer data)
 
   return TRUE;
 }
+#endif
 
 static gint
 tag_event_handler (GtkTextTag *tag, GtkWidget *widget, GdkEvent *event,
@@ -388,10 +395,10 @@ tag_event_handler (GtkTextTag *tag, GtkWidget *widget, GdkEvent *event,
 static void
 setup_tag (GtkTextTag *tag)
 {
-  g_signal_connect_data (G_OBJECT (tag),
-                         "event",
-                         G_CALLBACK (tag_event_handler),
-                         NULL, NULL, FALSE, FALSE);
+  g_signal_connect (tag,
+                   "event",
+                   G_CALLBACK (tag_event_handler),
+                   NULL);
 }
 
 static const char  *book_closed_xpm[] = {
@@ -437,8 +444,10 @@ fill_example_buffer (GtkTextBuffer *buffer)
   
   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;
@@ -514,11 +523,17 @@ fill_example_buffer (GtkTextBuffer *buffer)
                 NULL);
 
 
+  tag = gtk_text_buffer_create_tag (buffer, "negative_indent", NULL);
+      
+  g_object_set (G_OBJECT (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);
@@ -595,11 +610,18 @@ fill_example_buffer (GtkTextBuffer *buffer)
       gtk_text_buffer_insert (buffer, &iter, "وقد بدأ ثلاث من أكثر المؤسسات تقدما في شبكة اكسيون برامجها كمنظمات لا تسعى للربح، ثم تحولت في السنوات الخمس الماضية إلى مؤسسات مالية منظمة، وباتت جزءا من النظام المالي في بلدانها، ولكنها تتخصص في خدمة قطاع المشروعات الصغيرة. وأحد أكثر هذه المؤسسات نجاحا هو »بانكوسول« في بوليفيا.\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),
@@ -840,6 +862,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,
@@ -1040,7 +1090,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;
@@ -1063,6 +1113,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,
@@ -1087,13 +1164,10 @@ dialog_response_callback (GtkWidget *dialog, gint response_id, gpointer data)
   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);
@@ -1120,7 +1194,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);
 
 
@@ -1128,7 +1202,7 @@ 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,
@@ -1136,10 +1210,10 @@ do_search (gpointer callback_data,
 
   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);
 
@@ -1148,6 +1222,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)
 {
@@ -1235,8 +1533,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 },
+  { "/Attributes/Remove all tags",       NULL, do_remove_tags, 0, NULL },
+  { "/Attributes/Properties",       NULL, do_properties, 0, NULL },
   { "/_Test",           NULL,         0,           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
@@ -1416,9 +1719,11 @@ create_buffer (void)
       
       ++i;
     }
-  
+
+#if 0  
   buffer->invisible_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL,
                                                       "invisible", TRUE, NULL);
+#endif  
   
   buffer->not_editable_tag =
     gtk_text_buffer_create_tag (buffer->buffer, NULL,
@@ -1514,7 +1819,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))
             {
@@ -1527,7 +1834,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))
             {
@@ -1541,16 +1850,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);
 }
@@ -1583,7 +1891,7 @@ buffer_unref (Buffer *buffer)
     {
       buffer_set_colors (buffer, FALSE);
       buffers = g_slist_remove (buffers, buffer);
-      g_object_unref (G_OBJECT (buffer->buffer));
+      g_object_unref (buffer->buffer);
       g_free (buffer->filename);
       g_free (buffer);
     }
@@ -1765,7 +2073,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);
   
@@ -2092,9 +2400,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 *
@@ -2114,8 +2423,8 @@ create_view (Buffer *buffer)
   view->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   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);
@@ -2140,6 +2449,10 @@ 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_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. */
   
@@ -2151,15 +2464,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);  
 
-  g_signal_connect_data (G_OBJECT (view->buffer->buffer),
-                         "mark_set",
-                         GTK_SIGNAL_FUNC (cursor_set_callback),
-                         view->text_view, NULL, FALSE, FALSE);
+  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.
@@ -2172,10 +2485,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);
@@ -2200,9 +2513,6 @@ view_add_example_widgets (View *view)
   Buffer *buffer;
 
   buffer = view->buffer;
-
-  /* REMOVE to test widgets */
-  return;
   
   anchor = g_object_get_data (G_OBJECT (buffer->buffer),
                               "anchor");
@@ -2221,20 +2531,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 ()
 {
-  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/gtk.immodules");
+      putenv ("GDK_PIXBUF_MODULE_FILE=../gdk-pixbuf/gdk-pixbuf.loaders");
+      putenv ("GTK_IM_MODULE_FILE=../modules/input/gtk.immodules");
     }
 }
 
@@ -2246,7 +2550,6 @@ main (int argc, char** argv)
   int i;
 
   test_init ();
-  gtk_set_locale ();
   gtk_init (&argc, &argv);
   
   buffer = create_buffer ();