]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkprogress.c
Bug 131920 – gtkNotebook sends incorrect switch_page value
[~andy/gtk] / gtk / gtkprogress.c
index 44ed4f4e89d6656eb5d135f56385dd644e81f82f..587d6e8bcd0c93f7591b71cd14e2b8c45997f25a 100644 (file)
@@ -2,90 +2,71 @@
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 
 /*
- * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GTK+ Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
-#include <stdio.h>
+#include <config.h>
 #include <math.h>
 #include <string.h>
+#undef GTK_DISABLE_DEPRECATED
 #include "gtkprogress.h" 
-#include "gtksignal.h"
+#include "gtkprivate.h" 
+#include "gtkintl.h"
+#include "gtkalias.h"
 
 #define EPSILON  1e-5
+#define DEFAULT_FORMAT "%P %%"
 
 enum {
-  ARG_0,
-  ARG_ACTIVITY_MODE,
-  ARG_SHOW_TEXT,
-  ARG_TEXT_XALIGN,
-  ARG_TEXT_YALIGN
+  PROP_0,
+  PROP_ACTIVITY_MODE,
+  PROP_SHOW_TEXT,
+  PROP_TEXT_XALIGN,
+  PROP_TEXT_YALIGN
 };
 
 
-static void gtk_progress_class_init      (GtkProgressClass *klass);
-static void gtk_progress_init            (GtkProgress      *progress);
-static void gtk_progress_set_arg        (GtkObject        *object,
-                                         GtkArg           *arg,
-                                         guint             arg_id);
-static void gtk_progress_get_arg        (GtkObject        *object,
-                                         GtkArg           *arg,
-                                         guint             arg_id);
+static void gtk_progress_set_property    (GObject          *object,
+                                         guint             prop_id,
+                                         const GValue     *value,
+                                         GParamSpec       *pspec);
+static void gtk_progress_get_property    (GObject          *object,
+                                         guint             prop_id,
+                                         GValue           *value,
+                                         GParamSpec       *pspec);
 static void gtk_progress_destroy         (GtkObject        *object);
 static void gtk_progress_finalize        (GObject          *object);
 static void gtk_progress_realize         (GtkWidget        *widget);
-static gint gtk_progress_expose          (GtkWidget        *widget,
+static gboolean gtk_progress_expose      (GtkWidget        *widget,
                                          GdkEventExpose   *event);
 static void gtk_progress_size_allocate   (GtkWidget        *widget,
                                          GtkAllocation    *allocation);
 static void gtk_progress_create_pixmap   (GtkProgress      *progress);
+static void gtk_progress_value_changed   (GtkAdjustment    *adjustment,
+                                         GtkProgress      *progress);
+static void gtk_progress_changed         (GtkAdjustment    *adjustment,
+                                         GtkProgress      *progress);
 
-
-static GtkWidgetClass *parent_class = NULL;
-
-
-GtkType
-gtk_progress_get_type (void)
-{
-  static GtkType progress_type = 0;
-
-  if (!progress_type)
-    {
-      static const GtkTypeInfo progress_info =
-      {
-       "GtkProgress",
-       sizeof (GtkProgress),
-       sizeof (GtkProgressClass),
-       (GtkClassInitFunc) gtk_progress_class_init,
-       (GtkObjectInitFunc) gtk_progress_init,
-        /* reserved_1 */ NULL,
-        /* reserved_2 */ NULL,
-        (GtkClassInitFunc) NULL
-      };
-
-      progress_type = gtk_type_unique (GTK_TYPE_WIDGET, &progress_info);
-    }
-
-  return progress_type;
-}
+G_DEFINE_TYPE (GtkProgress, gtk_progress, GTK_TYPE_WIDGET)
 
 static void
 gtk_progress_class_init (GtkProgressClass *class)
@@ -96,12 +77,11 @@ gtk_progress_class_init (GtkProgressClass *class)
 
   object_class = (GtkObjectClass *) class;
   widget_class = (GtkWidgetClass *) class;
-  parent_class = gtk_type_class (GTK_TYPE_WIDGET);
 
   gobject_class->finalize = gtk_progress_finalize;
 
-  object_class->set_arg = gtk_progress_set_arg;
-  object_class->get_arg = gtk_progress_get_arg;
+  gobject_class->set_property = gtk_progress_set_property;
+  gobject_class->get_property = gtk_progress_get_property;
   object_class->destroy = gtk_progress_destroy;
 
   widget_class->realize = gtk_progress_realize;
@@ -112,78 +92,99 @@ gtk_progress_class_init (GtkProgressClass *class)
   class->paint = NULL;
   class->update = NULL;
   class->act_mode_enter = NULL;
-
-  gtk_object_add_arg_type ("GtkProgress::activity_mode",
-                          GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
-                          ARG_ACTIVITY_MODE);
-  gtk_object_add_arg_type ("GtkProgress::show_text",
-                          GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
-                          ARG_SHOW_TEXT);
-  gtk_object_add_arg_type ("GtkProgress::text_xalign",
-                          GTK_TYPE_FLOAT,
-                          GTK_ARG_READWRITE,
-                          ARG_TEXT_XALIGN);
-  gtk_object_add_arg_type ("GtkProgress::text_yalign",
-                          GTK_TYPE_FLOAT,
-                          GTK_ARG_READWRITE,
-                          ARG_TEXT_YALIGN);
+  
+  g_object_class_install_property (gobject_class,
+                                   PROP_ACTIVITY_MODE,
+                                   g_param_spec_boolean ("activity-mode",
+                                                        P_("Activity mode"),
+                                                        P_("If TRUE, the GtkProgress is in activity mode, meaning that it signals "
+                                                            "something is happening, but not how much of the activity is finished. "
+                                                            "This is used when you're doing something but don't know how long it will take."),
+                                                        FALSE,
+                                                        GTK_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_TEXT,
+                                   g_param_spec_boolean ("show-text",
+                                                        P_("Show text"),
+                                                        P_("Whether the progress is shown as text."),
+                                                        FALSE,
+                                                        GTK_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                  PROP_TEXT_XALIGN,
+                                  g_param_spec_float ("text-xalign",
+                                                      P_("Text x alignment"),
+                                                       P_("The horizontal text alignment, from 0 (left) to 1 (right). Reversed for RTL layouts."),
+                                                      0.0, 1.0, 0.5,
+                                                      GTK_PARAM_READWRITE));  
+  g_object_class_install_property (gobject_class,
+                                  PROP_TEXT_YALIGN,
+                                  g_param_spec_float ("text-yalign",
+                                                      P_("Text y alignment"),
+                                                       P_("The vertical text alignment, from 0 (top) to 1 (bottom)."),
+                                                      0.0, 1.0, 0.5,
+                                                      GTK_PARAM_READWRITE));
 }
 
 static void
-gtk_progress_set_arg (GtkObject      *object,
-                     GtkArg         *arg,
-                     guint           arg_id)
+gtk_progress_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
 {
   GtkProgress *progress;
   
   progress = GTK_PROGRESS (object);
 
-  switch (arg_id)
+  switch (prop_id)
     {
-    case ARG_ACTIVITY_MODE:
-      gtk_progress_set_activity_mode (progress, GTK_VALUE_BOOL (*arg));
+    case PROP_ACTIVITY_MODE:
+      gtk_progress_set_activity_mode (progress, g_value_get_boolean (value));
       break;
-    case ARG_SHOW_TEXT:
-      gtk_progress_set_show_text (progress, GTK_VALUE_BOOL (*arg));
+    case PROP_SHOW_TEXT:
+      gtk_progress_set_show_text (progress, g_value_get_boolean (value));
       break;
-    case ARG_TEXT_XALIGN:
-      gtk_progress_set_text_alignment (progress, GTK_VALUE_FLOAT (*arg), progress->y_align);
+    case PROP_TEXT_XALIGN:
+      gtk_progress_set_text_alignment (progress,
+                                      g_value_get_float (value),
+                                      progress->y_align);
       break;
-    case ARG_TEXT_YALIGN:
-      gtk_progress_set_text_alignment (progress, progress->x_align, GTK_VALUE_FLOAT (*arg));
+    case PROP_TEXT_YALIGN:
+      gtk_progress_set_text_alignment (progress,
+                                      progress->x_align,
+                                      g_value_get_float (value));
       break;
     default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
 
 static void
-gtk_progress_get_arg (GtkObject      *object,
-                     GtkArg         *arg,
-                     guint           arg_id)
+gtk_progress_get_property (GObject      *object,
+                          guint         prop_id,
+                          GValue       *value,
+                          GParamSpec   *pspec)
 {
   GtkProgress *progress;
   
   progress = GTK_PROGRESS (object);
 
-  switch (arg_id)
+  switch (prop_id)
     {
-    case ARG_ACTIVITY_MODE:
-      GTK_VALUE_BOOL (*arg) = (progress->activity_mode != 0);
+    case PROP_ACTIVITY_MODE:
+      g_value_set_boolean (value, (progress->activity_mode != FALSE));
       break;
-    case ARG_SHOW_TEXT:
-      GTK_VALUE_BOOL (*arg) = (progress->show_text != 0);
+    case PROP_SHOW_TEXT:
+      g_value_set_boolean (value, (progress->show_text != FALSE));
       break;
-    case ARG_TEXT_XALIGN:
-      GTK_VALUE_FLOAT (*arg) = progress->x_align;
+    case PROP_TEXT_XALIGN:
+      g_value_set_float (value, progress->x_align);
       break;
-    case ARG_TEXT_YALIGN:
-      GTK_VALUE_FLOAT (*arg) = progress->y_align;
+    case PROP_TEXT_YALIGN:
+      g_value_set_float (value, progress->y_align);
       break;
     default:
-      arg->type = GTK_TYPE_INVALID;
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
@@ -193,24 +194,21 @@ gtk_progress_init (GtkProgress *progress)
 {
   progress->adjustment = NULL;
   progress->offscreen_pixmap = NULL;
-  progress->format = g_strdup ("%P %%");
+  progress->format = g_strdup (DEFAULT_FORMAT);
   progress->x_align = 0.5;
   progress->y_align = 0.5;
   progress->show_text = FALSE;
   progress->activity_mode = FALSE;
+  progress->use_text_format = TRUE;
 }
 
 static void
 gtk_progress_realize (GtkWidget *widget)
 {
-  GtkProgress *progress;
+  GtkProgress *progress = GTK_PROGRESS (widget);
   GdkWindowAttr attributes;
   gint attributes_mask;
 
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_PROGRESS (widget));
-
-  progress = GTK_PROGRESS (widget);
   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
 
   attributes.window_type = GDK_WINDOW_CHILD;
@@ -239,58 +237,48 @@ gtk_progress_realize (GtkWidget *widget)
 static void
 gtk_progress_destroy (GtkObject *object)
 {
-  GtkProgress *progress;
-
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_PROGRESS (object));
-
-  progress = GTK_PROGRESS (object);
+  GtkProgress *progress = GTK_PROGRESS (object);
 
   if (progress->adjustment)
     {
-      gtk_signal_disconnect_by_data (GTK_OBJECT (progress->adjustment),
-                                    progress);
-      gtk_object_unref (GTK_OBJECT (progress->adjustment));
+      g_signal_handlers_disconnect_by_func (progress->adjustment,
+                                           gtk_progress_value_changed,
+                                           progress);
+      g_signal_handlers_disconnect_by_func (progress->adjustment,
+                                           gtk_progress_changed,
+                                           progress);
+      g_object_unref (progress->adjustment);
       progress->adjustment = NULL;
     }
 
-  GTK_OBJECT_CLASS (parent_class)->destroy (object);
+  GTK_OBJECT_CLASS (gtk_progress_parent_class)->destroy (object);
 }
 
 static void
 gtk_progress_finalize (GObject *object)
 {
-  GtkProgress *progress;
-
-  g_return_if_fail (GTK_IS_PROGRESS (object));
-
-  progress = GTK_PROGRESS (object);
+  GtkProgress *progress = GTK_PROGRESS (object);
 
   if (progress->offscreen_pixmap)
-    gdk_pixmap_unref (progress->offscreen_pixmap);
+    g_object_unref (progress->offscreen_pixmap);
 
-  if (progress->format)
-    g_free (progress->format);
+  g_free (progress->format);
 
-  G_OBJECT_CLASS (parent_class)->finalize (object);
+  G_OBJECT_CLASS (gtk_progress_parent_class)->finalize (object);
 }
 
-static gint
+static gboolean
 gtk_progress_expose (GtkWidget      *widget,
                     GdkEventExpose *event)
 {
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_PROGRESS (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
   if (GTK_WIDGET_DRAWABLE (widget))
-    gdk_draw_pixmap (widget->window,
-                    widget->style->black_gc,
-                    GTK_PROGRESS (widget)->offscreen_pixmap,
-                    event->area.x, event->area.y,
-                    event->area.x, event->area.y,
-                    event->area.width,
-                    event->area.height);
+    gdk_draw_drawable (widget->window,
+                      widget->style->black_gc,
+                      GTK_PROGRESS (widget)->offscreen_pixmap,
+                      event->area.x, event->area.y,
+                      event->area.x, event->area.y,
+                      event->area.width,
+                      event->area.height);
 
   return FALSE;
 }
@@ -299,10 +287,6 @@ static void
 gtk_progress_size_allocate (GtkWidget     *widget,
                            GtkAllocation *allocation)
 {
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_PROGRESS (widget));
-  g_return_if_fail (allocation != NULL);
-
   widget->allocation = *allocation;
 
   if (GTK_WIDGET_REALIZED (widget))
@@ -320,7 +304,6 @@ gtk_progress_create_pixmap (GtkProgress *progress)
 {
   GtkWidget *widget;
 
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
 
   if (GTK_WIDGET_REALIZED (progress))
@@ -328,16 +311,36 @@ gtk_progress_create_pixmap (GtkProgress *progress)
       widget = GTK_WIDGET (progress);
 
       if (progress->offscreen_pixmap)
-       gdk_pixmap_unref (progress->offscreen_pixmap);
+       g_object_unref (progress->offscreen_pixmap);
 
       progress->offscreen_pixmap = gdk_pixmap_new (widget->window,
                                                   widget->allocation.width,
                                                   widget->allocation.height,
                                                   -1);
+
+      /* clear the pixmap for transparent themes */
+      gtk_paint_flat_box (widget->style,
+                          progress->offscreen_pixmap,
+                          GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+                          NULL, widget, "trough", 0, 0, -1, -1);
+      
       GTK_PROGRESS_GET_CLASS (progress)->paint (progress);
     }
 }
 
+static void
+gtk_progress_changed (GtkAdjustment *adjustment,
+                     GtkProgress   *progress)
+{
+  /* A change in the value of adjustment->upper can change
+   * the size request
+   */
+  if (progress->use_text_format && progress->show_text)
+    gtk_widget_queue_resize (GTK_WIDGET (progress));
+  else
+    GTK_PROGRESS_GET_CLASS (progress)->update (progress);
+}
+
 static void
 gtk_progress_value_changed (GtkAdjustment *adjustment,
                            GtkProgress   *progress)
@@ -347,8 +350,8 @@ gtk_progress_value_changed (GtkAdjustment *adjustment,
 
 static gchar *
 gtk_progress_build_string (GtkProgress *progress,
-                          gfloat       value,
-                          gfloat       percentage)
+                          gdouble      value,
+                          gdouble      percentage)
 {
   gchar buf[256] = { 0 };
   gchar tmp[256] = { 0 };
@@ -357,6 +360,13 @@ gtk_progress_build_string (GtkProgress *progress,
   gchar fmt[10];
 
   src = progress->format;
+
+  /* This is the new supported version of this function */
+  if (!progress->use_text_format)
+    return g_strdup (src);
+
+  /* And here's all the deprecated goo. */
+  
   dest = buf;
  
   while (src && *src)
@@ -392,11 +402,11 @@ gtk_progress_build_string (GtkProgress *progress,
            case 'P':
              if (digits)
                {
-                 sprintf (fmt, "%%.%df", digits);
-                 sprintf (tmp, fmt, 100 * percentage);
+                 g_snprintf (fmt, sizeof (fmt), "%%.%df", digits);
+                 g_snprintf (tmp, sizeof (tmp), fmt, 100 * percentage);
                }
              else
-               sprintf (tmp, "%.0f", 100 * percentage);
+               g_snprintf (tmp, sizeof (tmp), "%.0f", 100 * percentage);
              strcat (buf, tmp);
              dest = &(buf[strlen (buf)]);
              src++;
@@ -405,11 +415,11 @@ gtk_progress_build_string (GtkProgress *progress,
            case 'V':
              if (digits)
                {
-                 sprintf (fmt, "%%.%df", digits);
-                 sprintf (tmp, fmt, value);
+                 g_snprintf (fmt, sizeof (fmt), "%%.%df", digits);
+                 g_snprintf (tmp, sizeof (tmp), fmt, value);
                }
              else
-               sprintf (tmp, "%.0f", value);
+               g_snprintf (tmp, sizeof (tmp), "%.0f", value);
              strcat (buf, tmp);
              dest = &(buf[strlen (buf)]);
              src++;
@@ -418,11 +428,11 @@ gtk_progress_build_string (GtkProgress *progress,
            case 'L':
              if (digits)
                {
-                 sprintf (fmt, "%%.%df", digits);
-                 sprintf (tmp, fmt, progress->adjustment->lower);
+                 g_snprintf (fmt, sizeof (fmt), "%%.%df", digits);
+                 g_snprintf (tmp, sizeof (tmp), fmt, progress->adjustment->lower);
                }
              else
-               sprintf (tmp, "%.0f", progress->adjustment->lower);
+               g_snprintf (tmp, sizeof (tmp), "%.0f", progress->adjustment->lower);
              strcat (buf, tmp);
              dest = &(buf[strlen (buf)]);
              src++;
@@ -431,11 +441,11 @@ gtk_progress_build_string (GtkProgress *progress,
            case 'U':
              if (digits)
                {
-                 sprintf (fmt, "%%.%df", digits);
-                 sprintf (tmp, fmt, progress->adjustment->upper);
+                 g_snprintf (fmt, sizeof (fmt), "%%.%df", digits);
+                 g_snprintf (tmp, sizeof (tmp), fmt, progress->adjustment->upper);
                }
              else
-               sprintf (tmp, "%.0f", progress->adjustment->upper);
+               g_snprintf (tmp, sizeof (tmp), "%.0f", progress->adjustment->upper);
              strcat (buf, tmp);
              dest = &(buf[strlen (buf)]);
              src++;
@@ -456,7 +466,6 @@ void
 gtk_progress_set_adjustment (GtkProgress   *progress,
                             GtkAdjustment *adjustment)
 {
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
   if (adjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
@@ -467,32 +476,39 @@ gtk_progress_set_adjustment (GtkProgress   *progress,
     {
       if (progress->adjustment)
         {
-          gtk_signal_disconnect_by_data (GTK_OBJECT (progress->adjustment),
-                                         (gpointer) progress);
-          gtk_object_unref (GTK_OBJECT (progress->adjustment));
+         g_signal_handlers_disconnect_by_func (progress->adjustment,
+                                               gtk_progress_changed,
+                                               progress);
+         g_signal_handlers_disconnect_by_func (progress->adjustment,
+                                               gtk_progress_value_changed,
+                                               progress);
+          g_object_unref (progress->adjustment);
         }
       progress->adjustment = adjustment;
       if (adjustment)
         {
-          gtk_object_ref (GTK_OBJECT (adjustment));
-         gtk_object_sink (GTK_OBJECT (adjustment));
-          gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
-                             (GtkSignalFunc) gtk_progress_value_changed,
-                             (gpointer) progress);
+          g_object_ref_sink (adjustment);
+          g_signal_connect (adjustment, "changed",
+                           G_CALLBACK (gtk_progress_changed),
+                           progress);
+          g_signal_connect (adjustment, "value_changed",
+                           G_CALLBACK (gtk_progress_value_changed),
+                           progress);
         }
+
+      gtk_progress_changed (adjustment, progress);
     }
 }
 
 void
 gtk_progress_configure (GtkProgress *progress,
-                       gfloat value,
-                       gfloat min,
-                       gfloat max)
+                       gdouble      value,
+                       gdouble      min,
+                       gdouble      max)
 {
   GtkAdjustment *adj;
   gboolean changed = FALSE;
 
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
   g_return_if_fail (min <= max);
   g_return_if_fail (value >= min && value <= max);
@@ -508,16 +524,15 @@ gtk_progress_configure (GtkProgress *progress,
   adj->lower = min;
   adj->upper = max;
 
-  gtk_signal_emit_by_name (GTK_OBJECT (adj), "value_changed");
+  gtk_adjustment_value_changed (adj);
   if (changed)
-    gtk_signal_emit_by_name (GTK_OBJECT (progress->adjustment), "changed");
+    gtk_adjustment_changed (adj);
 }
 
 void
 gtk_progress_set_percentage (GtkProgress *progress,
-                            gfloat       percentage)
+                            gdouble      percentage)
 {
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
   g_return_if_fail (percentage >= 0 && percentage <= 1.0);
 
@@ -527,30 +542,28 @@ gtk_progress_set_percentage (GtkProgress *progress,
                 (progress->adjustment->upper - progress->adjustment->lower));
 }
 
-gfloat
+gdouble
 gtk_progress_get_current_percentage (GtkProgress *progress)
 {
-  g_return_val_if_fail (progress != NULL, 0);
   g_return_val_if_fail (GTK_IS_PROGRESS (progress), 0);
 
   if (!progress->adjustment)
     gtk_progress_set_adjustment (progress, NULL);
 
-  return ((progress->adjustment->value - progress->adjustment->lower) /
-         (progress->adjustment->upper - progress->adjustment->lower));
+  return gtk_progress_get_percentage_from_value (progress, progress->adjustment->value);
 }
 
-gfloat
+gdouble
 gtk_progress_get_percentage_from_value (GtkProgress *progress,
-                                       gfloat       value)
+                                       gdouble      value)
 {
-  g_return_val_if_fail (progress != NULL, 0);
   g_return_val_if_fail (GTK_IS_PROGRESS (progress), 0);
 
   if (!progress->adjustment)
     gtk_progress_set_adjustment (progress, NULL);
 
-  if (value >= progress->adjustment->lower &&
+  if (progress->adjustment->lower < progress->adjustment->upper &&
+      value >= progress->adjustment->lower &&
       value <= progress->adjustment->upper)
     return (value - progress->adjustment->lower) /
       (progress->adjustment->upper - progress->adjustment->lower);
@@ -560,9 +573,8 @@ gtk_progress_get_percentage_from_value (GtkProgress *progress,
 
 void
 gtk_progress_set_value (GtkProgress *progress,
-                       gfloat       value)
+                       gdouble      value)
 {
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
 
   if (!progress->adjustment)
@@ -572,10 +584,9 @@ gtk_progress_set_value (GtkProgress *progress,
     gtk_adjustment_set_value (progress->adjustment, value);
 }
 
-gfloat
+gdouble
 gtk_progress_get_value (GtkProgress *progress)
 {
-  g_return_val_if_fail (progress != NULL, 0);
   g_return_val_if_fail (GTK_IS_PROGRESS (progress), 0);
 
   return progress->adjustment ? progress->adjustment->value : 0;
@@ -583,17 +594,17 @@ gtk_progress_get_value (GtkProgress *progress)
 
 void
 gtk_progress_set_show_text (GtkProgress *progress,
-                           gint        show_text)
+                           gboolean     show_text)
 {
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
 
   if (progress->show_text != show_text)
     {
       progress->show_text = show_text;
 
-      if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (progress)))
-       gtk_widget_queue_resize (GTK_WIDGET (progress));
+      gtk_widget_queue_resize (GTK_WIDGET (progress));
+
+      g_object_notify (G_OBJECT (progress), "show-text");
     }
 }
 
@@ -602,15 +613,25 @@ gtk_progress_set_text_alignment (GtkProgress *progress,
                                 gfloat       x_align,
                                 gfloat       y_align)
 {
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
   g_return_if_fail (x_align >= 0.0 && x_align <= 1.0);
   g_return_if_fail (y_align >= 0.0 && y_align <= 1.0);
 
   if (progress->x_align != x_align || progress->y_align != y_align)
     {
-      progress->x_align = x_align;
-      progress->y_align = y_align;
+      g_object_freeze_notify (G_OBJECT (progress));
+      if (progress->x_align != x_align)
+       {
+         progress->x_align = x_align;
+         g_object_notify (G_OBJECT (progress), "text-xalign");
+       }
+
+      if (progress->y_align != y_align)
+       {
+         progress->y_align = y_align;
+         g_object_notify (G_OBJECT (progress), "text-yalign");
+       }
+      g_object_thaw_notify (G_OBJECT (progress));
 
       if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (progress)))
        gtk_widget_queue_resize (GTK_WIDGET (progress));
@@ -621,25 +642,30 @@ void
 gtk_progress_set_format_string (GtkProgress *progress,
                                const gchar *format)
 {
-  g_return_if_fail (progress != NULL);
+  gchar *old_format;
+  
   g_return_if_fail (GTK_IS_PROGRESS (progress));
 
-  if (format)
-    {
-      if (progress->format)
-       g_free (progress->format);
-      progress->format = g_strdup (format);
+  /* Turn on format, in case someone called
+   * gtk_progress_bar_set_text() and turned it off.
+   */
+  progress->use_text_format = TRUE;
 
-      if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (progress)))
-       gtk_widget_queue_resize (GTK_WIDGET (progress));
-    }
+  old_format = progress->format;
+
+  if (!format)
+    format = DEFAULT_FORMAT;
+
+  progress->format = g_strdup (format);
+  g_free (old_format);
+  
+  gtk_widget_queue_resize (GTK_WIDGET (progress));
 }
 
 gchar *
 gtk_progress_get_current_text (GtkProgress *progress)
 {
-  g_return_val_if_fail (progress != NULL, 0);
-  g_return_val_if_fail (GTK_IS_PROGRESS (progress), 0);
+  g_return_val_if_fail (GTK_IS_PROGRESS (progress), NULL);
 
   if (!progress->adjustment)
     gtk_progress_set_adjustment (progress, NULL);
@@ -650,10 +676,9 @@ gtk_progress_get_current_text (GtkProgress *progress)
 
 gchar *
 gtk_progress_get_text_from_value (GtkProgress *progress,
-                                 gfloat       value)
+                                 gdouble      value)
 {
-  g_return_val_if_fail (progress != NULL, 0);
-  g_return_val_if_fail (GTK_IS_PROGRESS (progress), 0);
+  g_return_val_if_fail (GTK_IS_PROGRESS (progress), NULL);
 
   if (!progress->adjustment)
     gtk_progress_set_adjustment (progress, NULL);
@@ -664,19 +689,23 @@ gtk_progress_get_text_from_value (GtkProgress *progress,
 
 void
 gtk_progress_set_activity_mode (GtkProgress *progress,
-                               guint        activity_mode)
+                               gboolean     activity_mode)
 {
-  g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
 
-  if (progress->activity_mode != (activity_mode != 0))
+  if (progress->activity_mode != (activity_mode != FALSE))
     {
-      progress->activity_mode = (activity_mode != 0);
+      progress->activity_mode = (activity_mode != FALSE);
 
       if (progress->activity_mode)
        GTK_PROGRESS_GET_CLASS (progress)->act_mode_enter (progress);
 
       if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (progress)))
        gtk_widget_queue_resize (GTK_WIDGET (progress));
+
+      g_object_notify (G_OBJECT (progress), "activity-mode");
     }
 }
+
+#define __GTK_PROGRESS_C__
+#include "gtkaliasdef.c"