Don't redraw buttons in size_allocate callback
[pspp] / lib / gtksheet / gtksheet.c
index 6b0e640bd5a57e48692fff8f3998c3ac7d463e41..e38b389553d33d694189cb7cd4af56d7dd44157e 100644 (file)
@@ -1,6 +1,3 @@
-#define GLIB_DISABLE_DEPRECATED 1
-#define GDK_DISABLE_DEPRECATED 1
-#define GTK_DISABLE_DEPRECATED 1
 /*
  * Copyright (C) 2006, 2008 Free Software Foundation
  *
@@ -58,6 +55,8 @@
 #include "gtksheet.h"
 #include "gtkextra-marshal.h"
 #include "gsheetmodel.h"
+#include <libpspp/misc.h>
+#include <math.h>
 
 /* sheet flags */
 enum
@@ -85,11 +84,12 @@ enum
 #define COLUMN_MIN_WIDTH 10
 #define COLUMN_TITLES_HEIGHT 4
 #define DEFAULT_COLUMN_WIDTH 80
+#define DEFAULT_ROW_HEIGHT 25
 
 static void gtk_sheet_update_primary_selection (GtkSheet *sheet);
-static void gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column);
+static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint n);
+static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint n);
 
-static void gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row);
 
 static void gtk_sheet_set_row_height (GtkSheet *sheet,
                                      gint row,
@@ -113,67 +113,37 @@ dispose_string (const GtkSheet *sheet, gchar *text)
     g_free (text);
 }
 
-static guint
-default_row_height (const GtkSheet *sheet)
-{
-  GtkWidget *widget = GTK_WIDGET (sheet);
-
-  if (!widget->style->font_desc) return 25;
-  else
-    {
-      PangoContext *context = gtk_widget_get_pango_context (widget);
-      PangoFontMetrics *metrics =
-       pango_context_get_metrics (context,
-                                  widget->style->font_desc,
-                                  pango_context_get_language (context));
-
-      guint val = pango_font_metrics_get_descent (metrics) +
-       pango_font_metrics_get_ascent (metrics);
-
-      pango_font_metrics_unref (metrics);
-
-      return PANGO_PIXELS (val) + 2 * COLUMN_TITLES_HEIGHT;
-    }
-}
-
-static
-guint STRING_WIDTH (GtkWidget *widget,
-                   const PangoFontDescription *font, const gchar *text)
-{
-  PangoRectangle rect;
-  PangoLayout *layout;
-
-  layout = gtk_widget_create_pango_layout (widget, text);
-  pango_layout_set_font_description (layout, font);
-
-  pango_layout_get_extents (layout, NULL, &rect);
-
-  g_object_unref (layout);
-  return PANGO_PIXELS (rect.width);
-}
-
 /* Return the row containing pixel Y */
 static gint
 yyy_row_ypixel_to_row (const GtkSheet *sheet, gint y)
 {
   GSheetRow *geo = sheet->row_geometry;
 
-  if (y < 0)
-    {
-      g_error ("This shouldnt happen");
-      return -1;
-    }
+  g_return_val_if_fail (y >= 0, -1);
 
   return g_sheet_row_pixel_to_row (geo, y);
 }
 
-
+/* Return the lowest row number which is wholly or partially on
+   the visible range of the sheet */
 static inline glong
 min_visible_row (const GtkSheet *sheet)
 {
   return yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value);
 }
 
+static inline glong
+min_fully_visible_row (const GtkSheet *sheet)
+{
+  glong row = yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value);
+
+  if ( g_sheet_row_start_pixel (sheet->row_geometry, row) < sheet->vadjustment->value)
+    row++;
+
+  return  row;
+}
+
+
 
 static inline glong
 max_visible_row (const GtkSheet *sheet)
@@ -184,6 +154,21 @@ max_visible_row (const GtkSheet *sheet)
 }
 
 
+static inline glong
+max_fully_visible_row (const GtkSheet *sheet)
+{
+  glong row = max_visible_row (sheet);
+
+  if ( g_sheet_row_start_pixel (sheet->row_geometry, row)
+       + 
+       g_sheet_row_get_height (sheet->row_geometry, row)
+       > sheet->vadjustment->value)
+    row--;
+
+  return row;
+}
+
+
 /* returns the column index from a x pixel location */
 static inline gint
 column_from_xpixel (const GtkSheet *sheet, gint x)
@@ -207,13 +192,28 @@ column_from_xpixel (const GtkSheet *sheet, gint x)
 }
 
 
+/* Returns the lowest column number which is wholly or partially
+   on the sheet */
 static inline glong
 min_visible_column (const GtkSheet *sheet)
 {
   return column_from_xpixel (sheet, sheet->hadjustment->value);
 }
 
+static inline glong
+min_fully_visible_column (const GtkSheet *sheet)
+{
+  glong col = min_visible_column (sheet);
+
+  if ( g_sheet_column_start_pixel (sheet->column_geometry, col) < sheet->hadjustment->value)
+    col++;
+
+  return col;
+}
 
+
+/* Returns the highest column number which is wholly or partially
+   on the sheet */
 static inline glong
 max_visible_column (const GtkSheet *sheet)
 {
@@ -222,6 +222,21 @@ max_visible_column (const GtkSheet *sheet)
                             sheet->hadjustment->page_size);
 }
 
+static inline glong
+max_fully_visible_column (const GtkSheet *sheet)
+{
+  glong col = max_visible_column (sheet);
+
+  if ( g_sheet_column_start_pixel (sheet->column_geometry, col)
+       + 
+       g_sheet_column_get_width (sheet->column_geometry, col)
+       > sheet->hadjustment->value)
+    col--;
+
+  return col;
+}
+
+
 
 /* The size of the region (in pixels) around the row/column boundaries
    where the height/width may be grabbed to change size */
@@ -370,14 +385,14 @@ rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range,
   g_return_val_if_fail (range, FALSE);
 
   r->x = g_sheet_column_start_pixel (sheet->column_geometry, range->col0);
-  r->x -= sheet->hadjustment->value;
+  r->x -= round (sheet->hadjustment->value);
 
   if ( sheet->row_titles_visible)
     r->x += sheet->row_title_area.width;
 
 
   r->y = g_sheet_row_start_pixel (sheet->row_geometry, range->row0);
-  r->y -= sheet->vadjustment->value;
+  r->y -= round (sheet->vadjustment->value);
 
   if ( sheet->column_titles_visible)
     r->y += sheet->column_title_area.height;
@@ -468,8 +483,6 @@ static void gtk_sheet_range_draw_selection   (GtkSheet *sheet,
 
 /* Selection */
 
-static gboolean gtk_sheet_move_query                    (GtkSheet *sheet,
-                                                 gint row, gint column);
 static void gtk_sheet_real_select_range         (GtkSheet *sheet,
                                                  const GtkSheetRange *range);
 static void gtk_sheet_real_unselect_range       (GtkSheet *sheet,
@@ -486,7 +499,7 @@ static void gtk_sheet_draw_border            (GtkSheet *sheet,
 static void gtk_sheet_entry_changed             (GtkWidget *widget,
                                                  gpointer data);
 static void gtk_sheet_hide_active_cell          (GtkSheet *sheet);
-static void activate_cell               (GtkSheet *sheet,
+static void change_active_cell          (GtkSheet *sheet,
                                          gint row, gint col);
 static void gtk_sheet_draw_active_cell          (GtkSheet *sheet);
 static void gtk_sheet_show_active_cell          (GtkSheet *sheet);
@@ -563,7 +576,6 @@ enum
     MOVE_RANGE,
     TRAVERSE,
     ACTIVATE,
-    CHANGED,
     LAST_SIGNAL
   };
 
@@ -599,6 +611,8 @@ gtk_sheet_get_type ()
   return sheet_type;
 }
 
+\f
+
 static GtkSheetRange*
 gtk_sheet_range_copy (const GtkSheetRange *range)
 {
@@ -637,9 +651,44 @@ gtk_sheet_range_get_type (void)
   return sheet_range_type;
 }
 
+static GtkSheetCell*
+gtk_sheet_cell_copy (const GtkSheetCell *cell)
+{
+  GtkSheetCell *new_cell;
+
+  g_return_val_if_fail (cell != NULL, NULL);
+
+  new_cell = g_new (GtkSheetCell, 1);
+
+  *new_cell = *cell;
+
+  return new_cell;
+}
+
+static void
+gtk_sheet_cell_free (GtkSheetCell *cell)
+{
+  g_return_if_fail (cell != NULL);
+
+  g_free (cell);
+}
 
-static void column_titles_changed (GtkWidget *w, gint first, gint n_columns,
-                                  gpointer data);
+GType
+gtk_sheet_cell_get_type (void)
+{
+  static GType sheet_cell_type = 0;
+
+  if (!sheet_cell_type)
+    {
+      sheet_cell_type =
+       g_boxed_type_register_static ("GtkSheetCell",
+                                     (GBoxedCopyFunc) gtk_sheet_cell_copy,
+                                     (GBoxedFreeFunc) gtk_sheet_cell_free);
+    }
+
+  return sheet_cell_type;
+}
+\f
 
 /* Properties */
 enum
@@ -687,9 +736,6 @@ gtk_sheet_set_property (GObject         *object,
       break;
     case PROP_COL_GEO:
       gtk_sheet_set_column_geometry (sheet, g_value_get_pointer (value));
-      if ( sheet->column_geometry)
-       g_signal_connect (sheet->column_geometry, "columns_changed",
-                         G_CALLBACK (column_titles_changed), sheet);
       break;
     case PROP_MODEL:
       gtk_sheet_set_model (sheet, g_value_get_pointer (value));
@@ -900,9 +946,10 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, traverse),
                  NULL, NULL,
-                 gtkextra_BOOLEAN__INT_INT_POINTER_POINTER,
-                 G_TYPE_BOOLEAN, 4, G_TYPE_INT, G_TYPE_INT,
-                 G_TYPE_POINTER, G_TYPE_POINTER);
+                 gtkextra_BOOLEAN__BOXED_POINTER,
+                 G_TYPE_BOOLEAN, 2,
+                 GTK_TYPE_SHEET_CELL,
+                 G_TYPE_POINTER);
 
 
   sheet_signals[ACTIVATE] =
@@ -916,15 +963,6 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_TYPE_INT, G_TYPE_INT,
                  G_TYPE_INT, G_TYPE_INT);
 
-  sheet_signals[CHANGED] =
-    g_signal_new ("changed",
-                 G_TYPE_FROM_CLASS (object_class),
-                 G_SIGNAL_RUN_LAST,
-                 offsetof (GtkSheetClass, changed),
-                 NULL, NULL,
-                 gtkextra_VOID__INT_INT,
-                 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-
   widget_class->set_scroll_adjustments_signal =
     g_signal_new ("set-scroll-adjustments",
                  G_TYPE_FROM_CLASS (object_class),
@@ -1024,7 +1062,7 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->column_title_area.x = 0;
   sheet->column_title_area.y = 0;
   sheet->column_title_area.width = 0;
-  sheet->column_title_area.height = default_row_height (sheet);
+  sheet->column_title_area.height = DEFAULT_ROW_HEIGHT;
 
   sheet->row_title_window = NULL;
   sheet->row_title_area.x = 0;
@@ -1048,6 +1086,7 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->sheet_window = NULL;
   sheet->entry_widget = NULL;
   sheet->entry_container = NULL;
+  sheet->entry_handler_id = 0;
   sheet->button = NULL;
 
   sheet->hadjustment = NULL;
@@ -1088,7 +1127,6 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column,
                                   gint n_columns,
                                   gpointer data)
 {
-  gint i;
   GtkSheet *sheet = GTK_SHEET (data);
 
   GtkSheetRange range;
@@ -1106,10 +1144,10 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column,
   adjust_scrollbars (sheet);
 
   if (sheet->active_cell.col >= model_columns)
-    activate_cell (sheet, sheet->active_cell.row, model_columns - 1);
+    change_active_cell (sheet, sheet->active_cell.row, model_columns - 1);
 
-  for (i = first_column; i <= max_visible_column (sheet); i++)
-    gtk_sheet_column_title_button_draw (sheet, i);
+  draw_column_title_buttons_range (sheet,
+                                  first_column, max_visible_column (sheet));
 
   gtk_sheet_range_draw (sheet, &range);
 }
@@ -1120,7 +1158,6 @@ static void
 rows_inserted_deleted_callback (GSheetModel *model, gint first_row,
                                gint n_rows, gpointer data)
 {
-  gint i;
   GtkSheet *sheet = GTK_SHEET (data);
 
   GtkSheetRange range;
@@ -1138,10 +1175,9 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row,
   adjust_scrollbars (sheet);
 
   if (sheet->active_cell.row >= model_rows)
-    activate_cell (sheet, model_rows - 1, sheet->active_cell.col);
+    change_active_cell (sheet, model_rows - 1, sheet->active_cell.col);
 
-  for (i = first_row; i <= max_visible_row (sheet); i++)
-    gtk_sheet_row_title_button_draw (sheet, i);
+  draw_row_title_buttons_range (sheet, first_row, max_visible_row (sheet));
 
   gtk_sheet_range_draw (sheet, &range);
 }
@@ -1163,27 +1199,26 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
   range.rowi = rowi;
   range.coli = coli;
 
-  if ( max_visible_row (sheet) >
-       g_sheet_model_get_row_count (sheet->model)
+  if ( !GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
+    return;
+
+  if ( max_visible_row (sheet) > g_sheet_model_get_row_count (sheet->model)
        ||
-       max_visible_column (sheet) >
-       g_sheet_model_get_column_count (sheet->model))
+       max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model))
     {
-      gtk_sheet_move_query (sheet, 0, 0);
+      gtk_sheet_moveto (sheet, 0, 0, 0, 0);
     }
 
   if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) )
     {
-      gint i;
       gtk_sheet_range_draw (sheet, NULL);
       adjust_scrollbars (sheet);
 
-      for (i = min_visible_row (sheet); i <= max_visible_row (sheet); i++)
-       gtk_sheet_row_title_button_draw (sheet, i);
+      draw_row_title_buttons_range (sheet, min_visible_row (sheet),
+                                      max_visible_row (sheet));
 
-      for (i = min_visible_column (sheet);
-          i <= max_visible_column (sheet); i++)
-       gtk_sheet_column_title_button_draw (sheet, i);
+      draw_column_title_buttons_range (sheet, min_visible_column (sheet),
+                                      max_visible_column (sheet));
 
       return;
     }
@@ -1264,37 +1299,6 @@ gtk_sheet_set_model (GtkSheet *sheet, GSheetModel *model)
 }
 
 
-/* Call back for when the column titles have changed.
-   FIRST is the first column changed.
-   N_COLUMNS is the number of columns which have changed, or -1, which
-   indicates that the column has changed to its right-most extremity
-*/
-static void
-column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data)
-{
-  GtkSheet *sheet = GTK_SHEET (data);
-  gboolean extremity = FALSE;
-
-  if ( n_columns == -1 )
-    {
-      extremity = TRUE;
-      n_columns = g_sheet_column_get_column_count (sheet->column_geometry) - 1 ;
-    }
-
-  {
-    gint i;
-    for ( i = first ; i <= first + n_columns ; ++i )
-      {
-       gtk_sheet_column_title_button_draw (sheet, i);
-       g_signal_emit (sheet, sheet_signals[CHANGED], 0, -1, i);
-      }
-  }
-
-  if ( extremity)
-    gtk_sheet_column_title_button_draw (sheet, -1);
-
-}
-
 void
 gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type)
 {
@@ -1315,11 +1319,8 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type)
   if (state == GTK_SHEET_NORMAL)
     {
       gtk_sheet_show_active_cell (sheet);
-      g_signal_connect (gtk_sheet_get_entry (sheet),
-                       "changed",
-                       G_CALLBACK (gtk_sheet_entry_changed),
-                       sheet);
     }
+
 }
 
 void
@@ -1359,42 +1360,6 @@ gtk_sheet_set_column_width (GtkSheet *sheet,
                            guint width);
 
 
-static void
-gtk_sheet_autoresize_column (GtkSheet *sheet, gint column)
-{
-  gint text_width = 0;
-  gint row;
-
-  g_return_if_fail (sheet != NULL);
-  g_return_if_fail (GTK_IS_SHEET (sheet));
-  if (column >= g_sheet_column_get_column_count (sheet->column_geometry) || column < 0) return;
-
-  for (row = 0; row < g_sheet_row_get_row_count (sheet->row_geometry); row++)
-    {
-      gchar *text = gtk_sheet_cell_get_text (sheet, row, column);
-      if (text && strlen (text) > 0)
-       {
-         GtkSheetCellAttr attributes;
-
-         gtk_sheet_get_attributes (sheet, row, column, &attributes);
-         if (attributes.is_visible)
-           {
-             gint width = STRING_WIDTH (GTK_WIDGET (sheet),
-                                        attributes.font_desc,
-                                        text)
-               + 2 * COLUMN_TITLES_HEIGHT + attributes.border.width;
-             text_width = MAX (text_width, width);
-           }
-       }
-      dispose_string (sheet, text);
-    }
-
-  if (text_width > g_sheet_column_get_width (sheet->column_geometry, column) )
-    {
-      gtk_sheet_set_column_width (sheet, column, text_width);
-    }
-}
-
 void
 gtk_sheet_show_column_titles (GtkSheet *sheet)
 {
@@ -2053,7 +2018,7 @@ gtk_sheet_map (GtkWidget *widget)
          gtk_widget_map (GTK_BIN (sheet->button)->child);
 
       gtk_sheet_range_draw (sheet, NULL);
-      activate_cell (sheet,
+      change_active_cell (sheet,
                     sheet->active_cell.row,
                     sheet->active_cell.col);
     }
@@ -2326,7 +2291,6 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col,
                    const gchar *text)
 {
   GSheetModel *model ;
-  gboolean changed = FALSE;
   gchar *old_text ;
 
   g_return_if_fail (sheet != NULL);
@@ -2342,14 +2306,8 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col,
 
   old_text = g_sheet_model_get_string (model, row, col);
 
-  if (0 != safe_strcmp (old_text, text))
-    changed = g_sheet_model_set_string (model, text, row, col);
-
   if ( g_sheet_model_free_strings (model))
     g_free (old_text);
-
-  if ( changed )
-    g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, col);
 }
 
 
@@ -2560,7 +2518,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col)
       return;
     }
 
-  activate_cell (sheet, row, col);
+  change_active_cell (sheet, row, col);
 }
 
 void
@@ -2643,10 +2601,11 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet)
 }
 
 static void
-activate_cell (GtkSheet *sheet, gint row, gint col)
+change_active_cell (GtkSheet *sheet, gint row, gint col)
 {
   gint old_row, old_col;
-  g_return_if_fail (sheet != NULL);
+  glong old_handler_id = sheet->entry_handler_id;
+
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if (row < 0 || col < 0)
@@ -2662,6 +2621,8 @@ activate_cell (GtkSheet *sheet, gint row, gint col)
       gtk_sheet_real_unselect_range (sheet, NULL);
     }
 
+  g_signal_handler_block   (sheet->entry_widget, sheet->entry_handler_id);
+
   old_row = sheet->active_cell.row;
   old_col = sheet->active_cell.col;
 
@@ -2678,13 +2639,12 @@ activate_cell (GtkSheet *sheet, gint row, gint col)
 
   gtk_sheet_show_active_cell (sheet);
 
-  g_signal_connect (gtk_sheet_get_entry (sheet),
-                   "changed",
-                   G_CALLBACK (gtk_sheet_entry_changed),
-                   sheet);
 
   g_signal_emit (sheet, sheet_signals [ACTIVATE], 0,
                 row, col, old_row, old_col);
+
+  if ( old_handler_id == sheet->entry_handler_id)
+    g_signal_handler_unblock   (sheet->entry_widget, sheet->entry_handler_id);
 }
 
 static void
@@ -3116,7 +3076,7 @@ gtk_sheet_unselect_range (GtkSheet *sheet)
   gtk_sheet_real_unselect_range (sheet, NULL);
   sheet->state = GTK_STATE_NORMAL;
 
-  activate_cell (sheet,
+  change_active_cell (sheet,
                 sheet->active_cell.row, sheet->active_cell.col);
 }
 
@@ -3169,19 +3129,17 @@ gtk_sheet_expose (GtkWidget *widget,
   if (event->window == sheet->row_title_window &&
       sheet->row_titles_visible)
     {
-      gint i;
-      for (i = min_visible_row (sheet); i <= max_visible_row (sheet); i++)
-       gtk_sheet_row_title_button_draw (sheet, i);
+      draw_row_title_buttons_range (sheet,
+                                   min_visible_row (sheet),
+                                   max_visible_row (sheet));
     }
 
   if (event->window == sheet->column_title_window &&
       sheet->column_titles_visible)
     {
-      gint i;
-      for (i = min_visible_column (sheet);
-          i <= max_visible_column (sheet);
-          ++i)
-       gtk_sheet_column_title_button_draw (sheet, i);
+      draw_column_title_buttons_range (sheet,
+                                      min_visible_column (sheet),
+                                      max_visible_column (sheet));
     }
 
 
@@ -3274,10 +3232,12 @@ gtk_sheet_button_press (GtkWidget *widget,
                     sheet_signals[BUTTON_EVENT_COLUMN], 0,
                     column, event);
 
-      if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
-       g_signal_emit (sheet,
-                      sheet_signals[DOUBLE_CLICK_COLUMN], 0, column);
-
+      if (g_sheet_column_get_sensitivity (sheet->column_geometry, column))
+       {
+         if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
+           g_signal_emit (sheet,
+                          sheet_signals[DOUBLE_CLICK_COLUMN], 0, column);
+       }
     }
   else if (event->window == sheet->row_title_window)
     {
@@ -3285,11 +3245,14 @@ gtk_sheet_button_press (GtkWidget *widget,
                     sheet_signals[BUTTON_EVENT_ROW], 0,
                     row, event);
 
-      if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
-       g_signal_emit (sheet,
-                      sheet_signals[DOUBLE_CLICK_ROW], 0, row);
-    }
 
+      if (g_sheet_row_get_sensitivity (sheet->row_geometry, row))
+       {
+         if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
+           g_signal_emit (sheet,
+                          sheet_signals[DOUBLE_CLICK_ROW], 0, row);
+       }
+    }
 
   gdk_window_get_pointer (widget->window, NULL, NULL, &mods);
 
@@ -3311,12 +3274,6 @@ gtk_sheet_button_press (GtkWidget *widget,
       if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col))
        {
          guint req;
-         if (event->type == GDK_2BUTTON_PRESS)
-           {
-             gtk_sheet_autoresize_column (sheet, sheet->drag_cell.col);
-             GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
-             return TRUE;
-           }
          gtk_sheet_column_size_request (sheet, sheet->drag_cell.col, &req);
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
          gdk_pointer_grab (sheet->column_title_window, FALSE,
@@ -3475,8 +3432,12 @@ gtk_sheet_button_press (GtkWidget *widget,
 static gboolean
 gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
 {
+  GtkSheetCell cell;
   gboolean forbid_move;
 
+  cell.row = row;
+  cell.col = column;
+
   if (row >= g_sheet_row_get_row_count (sheet->row_geometry)
       || column >= g_sheet_column_get_column_count (sheet->column_geometry))
     {
@@ -3484,8 +3445,9 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
     }
 
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
-                sheet->active_cell.row, sheet->active_cell.col,
-                &row, &column, &forbid_move);
+                &sheet->active_cell,
+                &cell,
+                &forbid_move);
 
   if (forbid_move)
     {
@@ -3495,7 +3457,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
       row = sheet->active_cell.row;
       column = sheet->active_cell.col;
 
-      activate_cell (sheet, row, column);
+      change_active_cell (sheet, row, column);
       return FALSE;
     }
 
@@ -3531,7 +3493,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
     }
   else
     {
-      activate_cell (sheet, row, column);
+      change_active_cell (sheet, row, column);
     }
 
   sheet->active_cell.row = row;
@@ -3649,7 +3611,7 @@ gtk_sheet_button_release (GtkWidget *widget,
     {
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
       gdk_display_pointer_ungrab (display, event->time);
-      activate_cell (sheet, sheet->active_cell.row,
+      change_active_cell (sheet, sheet->active_cell.row,
                               sheet->active_cell.col);
     }
 
@@ -4115,71 +4077,6 @@ gtk_sheet_crossing_notify (GtkWidget *widget,
   return TRUE;
 }
 
-
-static gboolean
-gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column)
-{
-  gint height, width;
-  gint new_row = row;
-  gint new_col = column;
-
-  gint row_move = FALSE;
-  gint column_move = FALSE;
-  gfloat row_align = -1.0;
-  gfloat col_align = -1.0;
-
-  if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
-    return FALSE;
-
-  gdk_drawable_get_size (sheet->sheet_window, &width, &height);
-
-  if (row >= max_visible_row (sheet) &&
-      sheet->state != GTK_SHEET_COLUMN_SELECTED)
-    {
-      row_align = 1.;
-      new_row = MIN (g_sheet_row_get_row_count (sheet->row_geometry) - 1, row + 1);
-      row_move = TRUE;
-      if (max_visible_row (sheet) == g_sheet_row_get_row_count (sheet->row_geometry) - 1 &&
-         g_sheet_row_start_pixel (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) +
-         g_sheet_row_get_height (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) < height)
-       {
-         row_move = FALSE;
-         row_align = -1.;
-       }
-    }
-
-  if (row < min_visible_row (sheet) && sheet->state != GTK_SHEET_COLUMN_SELECTED)
-    {
-      row_align= 0.;
-      row_move = TRUE;
-    }
-  if (column >= max_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED)
-    {
-      col_align = 1.;
-      new_col = MIN (g_sheet_column_get_column_count (sheet->column_geometry) - 1, column + 1);
-      column_move = TRUE;
-      if (max_visible_column (sheet) == (g_sheet_column_get_column_count (sheet->column_geometry) - 1) &&
-         g_sheet_column_start_pixel (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) +
-         g_sheet_column_get_width (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) < width)
-       {
-         column_move = FALSE;
-         col_align = -1.;
-       }
-    }
-  if (column < min_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED)
-    {
-      col_align = 0.0;
-      column_move = TRUE;
-    }
-
-  if (row_move || column_move)
-    {
-      gtk_sheet_moveto (sheet, new_row, new_col, row_align, col_align);
-    }
-
-  return (row_move || column_move);
-}
-
 static void
 gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column)
 {
@@ -4192,7 +4089,6 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column)
 
   if (sheet->selection_mode == GTK_SELECTION_SINGLE) return;
 
-  gtk_sheet_move_query (sheet, row, column);
   gtk_widget_grab_focus (GTK_WIDGET (sheet));
 
   if (GTK_SHEET_IN_DRAG (sheet)) return;
@@ -4284,7 +4180,7 @@ page_vertical (GtkSheet *sheet, GtkScrollType dir)
 
   new_row =  yyy_row_ypixel_to_row (sheet, vpixel);
 
-  activate_cell (sheet, new_row,
+  change_active_cell (sheet, new_row,
                           sheet->active_cell.col);
 }
 
@@ -4294,57 +4190,91 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
 {
   gint current_row = sheet->active_cell.row;
   gint current_col = sheet->active_cell.col;
-  gint new_row = current_row;
-  gint new_col = current_col;
+  GtkSheetCell new_cell ;
   gboolean forbidden = FALSE;
 
+  new_cell.row = current_row;
+  new_cell.col = current_col;
+
   switch ( dir)
     {
     case GTK_SCROLL_STEP_DOWN:
-      new_row++;
+      new_cell.row++;
       break;
     case GTK_SCROLL_STEP_UP:
-      new_row--;
+      new_cell.row--;
       break;
     case GTK_SCROLL_STEP_RIGHT:
-      new_col++;
+      new_cell.col++;
       break;
     case GTK_SCROLL_STEP_LEFT:
-      new_col--;
+      new_cell.col--;
       break;
     default:
       g_assert_not_reached ();
       break;
     }
 
+
+  maximize_int (&new_cell.row, 0);
+  maximize_int (&new_cell.col, 0);
+
+  minimize_int (&new_cell.row,
+               g_sheet_row_get_row_count (sheet->row_geometry) - 1);
+
+  minimize_int (&new_cell.col,
+               g_sheet_column_get_column_count (sheet->column_geometry) - 1);
+
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
-                current_row, current_col,
-                &new_row, &new_col, &forbidden);
+                &sheet->active_cell,
+                &new_cell,
+               &forbidden);
 
   if (forbidden)
     return;
 
-  activate_cell (sheet, new_row, new_col);
+  change_active_cell (sheet, new_cell.row, new_cell.col);
 
-  if ( sheet->active_cell.col >= max_visible_column (sheet))
+  if ( new_cell.col > max_fully_visible_column (sheet))
     {
       glong hpos  =
        g_sheet_column_start_pixel (sheet->column_geometry,
-                                   sheet->active_cell.col + 1);
+                                   new_cell.col + 1);
       hpos -= sheet->hadjustment->page_size;
 
       gtk_adjustment_set_value (sheet->hadjustment,
                                hpos);
     }
-  else if ( sheet->active_cell.col <= min_visible_column (sheet))
+  else if ( new_cell.col < min_fully_visible_column (sheet))
     {
       glong hpos  =
        g_sheet_column_start_pixel (sheet->column_geometry,
-                                   sheet->active_cell.col);
+                                   new_cell.col);
 
       gtk_adjustment_set_value (sheet->hadjustment,
                                hpos);
     }
+
+
+  if ( new_cell.row > max_fully_visible_row (sheet))
+    {
+      glong vpos  =
+       g_sheet_row_start_pixel (sheet->row_geometry,
+                                   new_cell.row + 1);
+      vpos -= sheet->vadjustment->page_size;
+
+      gtk_adjustment_set_value (sheet->vadjustment,
+                               vpos);
+    }
+  else if ( new_cell.row < min_fully_visible_row (sheet))
+    {
+      glong vpos  =
+       g_sheet_row_start_pixel (sheet->row_geometry,
+                                   new_cell.row);
+
+      gtk_adjustment_set_value (sheet->vadjustment,
+                               vpos);
+    }
 }
 
 
@@ -4385,7 +4315,7 @@ gtk_sheet_key_press (GtkWidget *widget,
       gtk_adjustment_set_value (sheet->vadjustment,
                                sheet->vadjustment->lower);
 
-      activate_cell (sheet,  0,
+      change_active_cell (sheet,  0,
                               sheet->active_cell.col);
 
       break;
@@ -4397,7 +4327,7 @@ gtk_sheet_key_press (GtkWidget *widget,
                                sheet->vadjustment->page_increment);
 
       /*
-       activate_cell (sheet,
+       change_active_cellx (sheet,
        g_sheet_row_get_row_count (sheet->row_geometry) - 1,
        sheet->active_cell.col);
       */
@@ -4426,7 +4356,7 @@ gtk_sheet_size_request (GtkWidget *widget,
   sheet = GTK_SHEET (widget);
 
   requisition->width = 3 * DEFAULT_COLUMN_WIDTH;
-  requisition->height = 3 * default_row_height (sheet);
+  requisition->height = 3 * DEFAULT_ROW_HEIGHT;
 
   /* compute the size of the column title area */
   if (sheet->column_titles_visible)
@@ -4501,9 +4431,6 @@ gtk_sheet_size_allocate (GtkWidget *widget,
                            sheet->column_title_area.height);
 
 
-  /* column button allocation */
-  draw_column_title_buttons (sheet);
-
   /* position the window which holds the row title buttons */
   sheet->row_title_area.x = 0;
   sheet->row_title_area.y = 0;
@@ -4523,10 +4450,6 @@ gtk_sheet_size_allocate (GtkWidget *widget,
                            sheet->row_title_area.height);
 
 
-  /* row button allocation */
-  draw_row_title_buttons (sheet);
-  draw_column_title_buttons (sheet);
-
   /* set the scrollbars adjustments */
   adjust_scrollbars (sheet);
 }
@@ -4534,7 +4457,6 @@ gtk_sheet_size_allocate (GtkWidget *widget,
 static void
 draw_column_title_buttons (GtkSheet *sheet)
 {
-  gint i;
   gint x, width;
 
   if (!sheet->column_titles_visible) return;
@@ -4571,14 +4493,13 @@ draw_column_title_buttons (GtkSheet *sheet)
 
   size_allocate_global_button (sheet);
 
-  for (i = min_visible_column (sheet); i <= max_visible_column (sheet); i++)
-    gtk_sheet_column_title_button_draw (sheet, i);
+  draw_column_title_buttons_range (sheet, min_visible_column (sheet), 
+                                  max_visible_column (sheet));
 }
 
 static void
 draw_row_title_buttons (GtkSheet *sheet)
 {
-  gint i;
   gint y = 0;
   gint height;
 
@@ -4614,12 +4535,9 @@ draw_row_title_buttons (GtkSheet *sheet)
 
   size_allocate_global_button (sheet);
 
-  for (i = min_visible_row (sheet); i <= max_visible_row (sheet); i++)
-    {
-      if ( i >= g_sheet_row_get_row_count (sheet->row_geometry))
-       break;
-      gtk_sheet_row_title_button_draw (sheet, i);
-    }
+
+  draw_row_title_buttons_range (sheet, min_visible_row (sheet),
+                               max_visible_row (sheet));
 }
 
 
@@ -4713,6 +4631,12 @@ create_sheet_entry (GtkSheet *sheet)
                            G_CALLBACK (gtk_sheet_entry_key_press),
                            sheet);
 
+  sheet->entry_handler_id =
+    g_signal_connect (sheet->entry_widget,
+                     "changed",
+                     G_CALLBACK (gtk_sheet_entry_changed),
+                     sheet);
+
   gtk_widget_show (sheet->entry_widget);
 }
 
@@ -4769,7 +4693,7 @@ gtk_sheet_get_entry_widget (GtkSheet *sheet)
 
 
 static void
-gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window,
+draw_button (GtkSheet *sheet, GdkWindow *window,
                       GtkSheetButton *button, gboolean is_sensitive,
                       GdkRectangle allocation)
 {
@@ -4780,8 +4704,6 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window,
   gboolean rtl ;
 
   gint state = 0;
-  gint len = 0;
-  gchar *line = 0;
 
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (button != NULL);
@@ -4818,8 +4740,7 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window,
 
   if (button->label_visible)
     {
-
-      text_height = default_row_height (sheet) -
+      text_height = DEFAULT_ROW_HEIGHT -
        2 * COLUMN_TITLES_HEIGHT;
 
       gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state],
@@ -4829,68 +4750,46 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window,
 
       allocation.y += 2 * sheet->button->style->ythickness;
 
-
       if (button->label && strlen (button->label)>0)
        {
-         gchar *words = 0;
+         PangoRectangle rect;
+         gchar *line = button->label;
+
          PangoLayout *layout = NULL;
-         gint real_x = allocation.x, real_y = allocation.y;
+         gint real_x = allocation.x;
+         gint real_y = allocation.y;
 
-         words = button->label;
-         line = g_new (gchar, 1);
-         line[0]='\0';
+         layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), line);
+         pango_layout_get_extents (layout, NULL, &rect);
 
-         while (words && *words != '\0')
+         text_width = PANGO_PIXELS (rect.width);
+         switch (button->justification)
            {
-             if (*words != '\n')
-               {
-                 len = strlen (line);
-                 line = g_realloc (line, len + 2);
-                 line[len]=*words;
-                 line[len + 1]='\0';
-               }
-             if (*words == '\n' || * (words + 1) == '\0')
-               {
-                 text_width = STRING_WIDTH (GTK_WIDGET (sheet), GTK_WIDGET (sheet)->style->font_desc, line);
-
-                 layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), line);
-                 switch (button->justification)
-                   {
-                   case GTK_JUSTIFY_LEFT:
-                     real_x = allocation.x + COLUMN_TITLES_HEIGHT;
-                     align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
-                     break;
-                   case GTK_JUSTIFY_RIGHT:
-                     real_x = allocation.x + allocation.width - text_width - COLUMN_TITLES_HEIGHT;
-                     align = rtl ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT;
-                     break;
-                   case GTK_JUSTIFY_CENTER:
-                   default:
-                     real_x = allocation.x + (allocation.width - text_width)/2;
-                     align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
-                     pango_layout_set_justify (layout, TRUE);
-                   }
-                 pango_layout_set_alignment (layout, align);
-                 gtk_paint_layout (GTK_WIDGET (sheet)->style,
-                                   window,
-                                   state,
-                                   FALSE,
-                                   &allocation,
-                                   GTK_WIDGET (sheet),
-                                   "label",
-                                   real_x, real_y,
-                                   layout);
-                 g_object_unref (layout);
-
-                 real_y += text_height + 2;
-
-                 g_free (line);
-                 line = g_new (gchar, 1);
-                 line[0]='\0';
-               }
-             words++;
+           case GTK_JUSTIFY_LEFT:
+             real_x = allocation.x + COLUMN_TITLES_HEIGHT;
+             align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
+             break;
+           case GTK_JUSTIFY_RIGHT:
+             real_x = allocation.x + allocation.width - text_width - COLUMN_TITLES_HEIGHT;
+             align = rtl ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT;
+             break;
+           case GTK_JUSTIFY_CENTER:
+           default:
+             real_x = allocation.x + (allocation.width - text_width)/2;
+             align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
+             pango_layout_set_justify (layout, TRUE);
            }
-         g_free (line);
+         pango_layout_set_alignment (layout, align);
+         gtk_paint_layout (GTK_WIDGET (sheet)->style,
+                           window,
+                           state,
+                           FALSE,
+                           &allocation,
+                           GTK_WIDGET (sheet),
+                           "label",
+                           real_x, real_y,
+                           layout);
+         g_object_unref (layout);
        }
 
       gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state],
@@ -4902,60 +4801,93 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window,
   gtk_sheet_button_free (button);
 }
 
+
+/* Draw the column title buttons FIRST through to LAST */
 static void
-gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column)
+draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 {
-  GdkRectangle allocation;
-  GtkSheetButton *button = NULL;
-  gboolean is_sensitive = FALSE;
-
+  GdkRegion *region;
+  gint col;
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
 
   if (!sheet->column_titles_visible) return;
 
-  if (column < min_visible_column (sheet)) return;
-  if (column > max_visible_column (sheet)) return;
+  g_return_if_fail (first >= min_visible_column (sheet));
+  g_return_if_fail (last <= max_visible_column (sheet));
 
-  button = g_sheet_column_get_button (sheet->column_geometry, column);
-  allocation.y = 0;
-  allocation.x = g_sheet_column_start_pixel (sheet->column_geometry, column) + CELL_SPACING;
-  allocation.x -= sheet->hadjustment->value;
+  region =
+    gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->column_title_window));
 
-  allocation.height = sheet->column_title_area.height;
-  allocation.width = g_sheet_column_get_width (sheet->column_geometry, column);
-  is_sensitive = g_sheet_column_get_sensitivity (sheet->column_geometry, column);
+  gdk_window_begin_paint_region (sheet->column_title_window, region);
+
+  for (col = first ; col <= last ; ++col)
+    {
+      GdkRectangle allocation;
+      gboolean is_sensitive = FALSE;
 
-  gtk_sheet_button_draw (sheet, sheet->column_title_window,
-                        button, is_sensitive, allocation);
+      GtkSheetButton *
+       button = g_sheet_column_get_button (sheet->column_geometry, col);
+      allocation.y = 0;
+      allocation.x =
+       g_sheet_column_start_pixel (sheet->column_geometry, col)
+       + CELL_SPACING;
+      allocation.x -= sheet->hadjustment->value;
+
+      allocation.height = sheet->column_title_area.height;
+      allocation.width =
+       g_sheet_column_get_width (sheet->column_geometry, col);
+      is_sensitive =
+       g_sheet_column_get_sensitivity (sheet->column_geometry, col);
+
+      draw_button (sheet, sheet->column_title_window,
+                  button, is_sensitive, allocation);
+    }
+
+  gdk_window_end_paint (sheet->column_title_window);
 }
 
 
 static void
-gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row)
+draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last)
 {
-  GdkRectangle allocation;
-  GtkSheetButton *button = NULL;
-  gboolean is_sensitive = FALSE;
-
-
+  GdkRegion *region;
+  gint row;
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
 
   if (!sheet->row_titles_visible) return;
 
-  if (row < min_visible_row (sheet)) return;
-  if (row > max_visible_row (sheet)) return;
+  g_return_if_fail (first >= min_visible_row (sheet));
+  g_return_if_fail (last <= max_visible_row (sheet));
 
-  button = g_sheet_row_get_button (sheet->row_geometry, row);
-  allocation.x = 0;
-  allocation.y = g_sheet_row_start_pixel (sheet->row_geometry, row) + CELL_SPACING;
-  allocation.y -= sheet->vadjustment->value;
 
-  allocation.width = sheet->row_title_area.width;
-  allocation.height = g_sheet_row_get_height (sheet->row_geometry, row);
-  is_sensitive = g_sheet_row_get_sensitivity (sheet->row_geometry, row);
+  region =
+    gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->row_title_window));
+
+  gdk_window_begin_paint_region (sheet->row_title_window, region);
+
+
+  for (row = first; row <= last; ++row)
+    {
+      GdkRectangle allocation;
 
-  gtk_sheet_button_draw (sheet, sheet->row_title_window,
-                        button, is_sensitive, allocation);
+      gboolean is_sensitive = FALSE;
+
+      GtkSheetButton *button =
+       g_sheet_row_get_button (sheet->row_geometry, row);
+      allocation.x = 0;
+      allocation.y = g_sheet_row_start_pixel (sheet->row_geometry, row)
+       + CELL_SPACING;
+      allocation.y -= sheet->vadjustment->value;
+
+      allocation.width = sheet->row_title_area.width;
+      allocation.height = g_sheet_row_get_height (sheet->row_geometry, row);
+      is_sensitive = g_sheet_row_get_sensitivity (sheet->row_geometry, row);
+
+      draw_button (sheet, sheet->row_title_window,
+                  button, is_sensitive, allocation);
+    }
+
+  gdk_window_end_paint (sheet->row_title_window);
 }
 
 /* SCROLLBARS
@@ -4975,6 +4907,12 @@ adjust_scrollbars (GtkSheet *sheet)
 
   gdk_drawable_get_size (sheet->sheet_window, &width, &height);
 
+  if ( sheet->row_titles_visible)
+    width -= sheet->row_title_area.width;
+
+  if (sheet->column_titles_visible)
+    height -= sheet->column_title_area.height;
+
   if (sheet->vadjustment)
     {
       glong last_row = g_sheet_row_get_row_count (sheet->row_geometry) - 1;
@@ -4996,9 +4934,6 @@ adjust_scrollbars (GtkSheet *sheet)
        g_sheet_row_get_height (sheet->row_geometry, last_row)
        ;
 
-      if (sheet->column_titles_visible)
-       sheet->vadjustment->upper += sheet->column_title_area.height;
-
       sheet->vadjustment->lower = 0;
       sheet->vadjustment->page_size = height;
 
@@ -5020,9 +4955,6 @@ adjust_scrollbars (GtkSheet *sheet)
        g_sheet_column_get_width (sheet->column_geometry, last_col)
        ;
 
-      if (sheet->row_titles_visible)
-       sheet->hadjustment->upper += sheet->row_title_area.width;
-
       sheet->hadjustment->lower = 0;
       sheet->hadjustment->page_size = width;
 
@@ -5267,8 +5199,6 @@ gtk_sheet_set_column_width (GtkSheet *sheet,
       gtk_sheet_size_allocate_entry (sheet);
       gtk_sheet_range_draw (sheet, NULL);
     }
-
-  g_signal_emit (sheet, sheet_signals[CHANGED], 0, -1, column);
 }
 
 
@@ -5298,8 +5228,6 @@ gtk_sheet_set_row_height (GtkSheet *sheet,
       gtk_sheet_size_allocate_entry (sheet);
       gtk_sheet_range_draw (sheet, NULL);
     }
-
-  g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, - 1);
 }
 
 gboolean
@@ -5373,10 +5301,10 @@ gtk_sheet_button_size_request    (GtkSheet *sheet,
   GtkRequisition requisition;
   GtkRequisition label_requisition;
 
-  label_requisition.height = default_row_height (sheet);
+  label_requisition.height = DEFAULT_ROW_HEIGHT;
   label_requisition.width = COLUMN_MIN_WIDTH;
 
-  requisition.height = default_row_height (sheet);
+  requisition.height = DEFAULT_ROW_HEIGHT;
   requisition.width = COLUMN_MIN_WIDTH;