]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkstatusbar.c
Deprecate widget flag: GTK_WIDGET_VISIBLE
[~andy/gtk] / gtk / gtkstatusbar.c
index 3401a6f2836fc4632535c90acc83afe08cb5696f..04212be199a48b6456615ed13aacab866de179c3 100644 (file)
  * 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/. 
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
  */
 
-#include <config.h>
+#include "config.h"
 #include "gtkframe.h"
 #include "gtklabel.h"
 #include "gtkmarshalers.h"
@@ -33,6 +33,7 @@
 #include "gtkwindow.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
+#include "gtkbuildable.h"
 #include "gtkalias.h"
 
 typedef struct _GtkStatusbarMsg GtkStatusbarMsg;
@@ -51,12 +52,16 @@ enum
   SIGNAL_LAST
 };
 
-enum 
+enum
 {
-  PROP_ZERO,
+  PROP_0,
   PROP_HAS_RESIZE_GRIP
 };
 
+static void     gtk_statusbar_buildable_interface_init    (GtkBuildableIface *iface);
+static GObject *gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable,
+                                                            GtkBuilder   *builder,
+                                                            const gchar  *childname);
 static void     gtk_statusbar_destroy           (GtkObject         *object);
 static void     gtk_statusbar_update            (GtkStatusbar      *statusbar,
                                                 guint              context_id,
@@ -96,7 +101,9 @@ static void     label_selectable_changed        (GtkWidget         *label,
 
 static guint              statusbar_signals[SIGNAL_LAST] = { 0 };
 
-G_DEFINE_TYPE (GtkStatusbar, gtk_statusbar, GTK_TYPE_HBOX)
+G_DEFINE_TYPE_WITH_CODE (GtkStatusbar, gtk_statusbar, GTK_TYPE_HBOX,
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                                gtk_statusbar_buildable_interface_init));
 
 static void
 gtk_statusbar_class_init (GtkStatusbarClass *class)
@@ -152,7 +159,7 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
    * Is emitted whenever a new message gets pushed onto a statusbar's stack.
    */
   statusbar_signals[SIGNAL_TEXT_PUSHED] =
-    g_signal_new (I_("text_pushed"),
+    g_signal_new (I_("text-pushed"),
                  G_OBJECT_CLASS_TYPE (class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkStatusbarClass, text_pushed),
@@ -171,7 +178,7 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
    * Is emitted whenever a new message is popped off a statusbar's stack.
    */
   statusbar_signals[SIGNAL_TEXT_POPPED] =
-    g_signal_new (I_("text_popped"),
+    g_signal_new (I_("text-popped"),
                  G_OBJECT_CLASS_TYPE (class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkStatusbarClass, text_popped),
@@ -194,10 +201,13 @@ static void
 gtk_statusbar_init (GtkStatusbar *statusbar)
 {
   GtkBox *box;
+  GtkWidget *message_area;
   GtkShadowType shadow_type;
   
   box = GTK_BOX (statusbar);
 
+  gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE);
+
   box->spacing = 2;
   box->homogeneous = FALSE;
 
@@ -210,13 +220,17 @@ gtk_statusbar_init (GtkStatusbar *statusbar)
   gtk_box_pack_start (box, statusbar->frame, TRUE, TRUE, 0);
   gtk_widget_show (statusbar->frame);
 
+  message_area = gtk_hbox_new (FALSE, 4);
+  gtk_container_add (GTK_CONTAINER (statusbar->frame), message_area);
+  gtk_widget_show (message_area);
+
   statusbar->label = gtk_label_new ("");
   gtk_label_set_single_line_mode (GTK_LABEL (statusbar->label), TRUE);
   gtk_misc_set_alignment (GTK_MISC (statusbar->label), 0.0, 0.5);
   g_signal_connect (statusbar->label, "notify::selectable",
                    G_CALLBACK (label_selectable_changed), statusbar);
   gtk_label_set_ellipsize (GTK_LABEL (statusbar->label), PANGO_ELLIPSIZE_END);
-  gtk_container_add (GTK_CONTAINER (statusbar->frame), statusbar->label);
+  gtk_container_add (GTK_CONTAINER (message_area), statusbar->label);
   gtk_widget_show (statusbar->label);
 
   statusbar->seq_context_id = 1;
@@ -225,6 +239,28 @@ gtk_statusbar_init (GtkStatusbar *statusbar)
   statusbar->keys = NULL;
 }
 
+static GtkBuildableIface *parent_buildable_iface;
+
+static void
+gtk_statusbar_buildable_interface_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+  iface->get_internal_child = gtk_statusbar_buildable_get_internal_child;
+}
+
+static GObject *
+gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable,
+                                            GtkBuilder   *builder,
+                                            const gchar  *childname)
+{
+    if (strcmp (childname, "message_area") == 0)
+      return G_OBJECT (gtk_bin_get_child (GTK_BIN (GTK_STATUSBAR (buildable)->frame)));
+
+    return parent_buildable_iface->get_internal_child (buildable,
+                                                       builder,
+                                                       childname);
+}
+
 /**
  * gtk_statusbar_new:
  *
@@ -480,6 +516,24 @@ gtk_statusbar_get_has_resize_grip (GtkStatusbar *statusbar)
   return statusbar->has_resize_grip;
 }
 
+/**
+ * gtk_statusbar_get_message_area:
+ * @statusbar: a #GtkStatusBar
+ *
+ * Retrieves the box containing the label widget.
+ *
+ * Returns: a #GtkBox
+ *
+ * Since: 2.20
+ */
+GtkWidget*
+gtk_statusbar_get_message_area (GtkStatusbar *statusbar)
+{
+  g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), NULL);
+
+  return gtk_bin_get_child (GTK_BIN (statusbar->frame));
+}
+
 static void
 gtk_statusbar_destroy (GtkObject *object)
 {
@@ -586,14 +640,14 @@ get_grip_rect (GtkStatusbar *statusbar,
 static void
 set_grip_cursor (GtkStatusbar *statusbar)
 {
-  if (statusbar->has_resize_grip)
+  if (statusbar->has_resize_grip && statusbar->grip_window != NULL)
     {
       GtkWidget *widget = GTK_WIDGET (statusbar);
       GdkDisplay *display = gtk_widget_get_display (widget);
       GdkCursorType cursor_type;
       GdkCursor *cursor;
       
-      if (GTK_WIDGET_IS_SENSITIVE (widget))
+      if (gtk_widget_is_sensitive (widget))
         {
           if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
            cursor_type = GDK_BOTTOM_RIGHT_CORNER;
@@ -616,10 +670,10 @@ gtk_statusbar_create_window (GtkStatusbar *statusbar)
   GdkWindowAttr attributes;
   gint attributes_mask;
   GdkRectangle rect;
-  
+
   g_return_if_fail (GTK_WIDGET_REALIZED (statusbar));
   g_return_if_fail (statusbar->has_resize_grip);
-  
+
   widget = GTK_WIDGET (statusbar);
 
   get_grip_rect (statusbar, &rect);
@@ -640,6 +694,8 @@ gtk_statusbar_create_window (GtkStatusbar *statusbar)
 
   gdk_window_set_user_data (statusbar->grip_window, widget);
 
+  gdk_window_raise (statusbar->grip_window);
+
   set_grip_cursor (statusbar);
 }
 
@@ -675,8 +731,8 @@ gtk_statusbar_realize (GtkWidget *widget)
   GtkStatusbar *statusbar;
 
   statusbar = GTK_STATUSBAR (widget);
-  
-  (* GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->realize) (widget);
+
+  GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->realize (widget);
 
   if (statusbar->has_resize_grip)
     gtk_statusbar_create_window (statusbar);
@@ -691,8 +747,8 @@ gtk_statusbar_unrealize (GtkWidget *widget)
 
   if (statusbar->grip_window)
     gtk_statusbar_destroy_window (statusbar);
-  
-  (* GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unrealize) (widget);
+
+  GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unrealize (widget);
 }
 
 static void
@@ -701,9 +757,9 @@ gtk_statusbar_map (GtkWidget *widget)
   GtkStatusbar *statusbar;
 
   statusbar = GTK_STATUSBAR (widget);
-  
-  (* GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->map) (widget);
-  
+
+  GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->map (widget);
+
   if (statusbar->grip_window)
     gdk_window_show (statusbar->grip_window);
 }
@@ -717,8 +773,8 @@ gtk_statusbar_unmap (GtkWidget *widget)
 
   if (statusbar->grip_window)
     gdk_window_hide (statusbar->grip_window);
-  
-  (* GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unmap) (widget);
+
+  GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unmap (widget);
 }
 
 static gboolean
@@ -838,7 +894,7 @@ has_extra_children (GtkStatusbar *statusbar)
     {
       child = l->data;
 
-      if (!GTK_WIDGET_VISIBLE (child->widget))
+      if (!gtk_widget_get_visible (child->widget))
        continue;
 
       if (frame->pack == GTK_PACK_START || child->pack == GTK_PACK_END)
@@ -858,10 +914,10 @@ gtk_statusbar_size_allocate  (GtkWidget     *widget,
 
   if (statusbar->has_resize_grip)
     {
-      get_grip_rect (statusbar, &rect);    
-      
+      get_grip_rect (statusbar, &rect);
+
       extra_children = has_extra_children (statusbar);
-      
+
       /* If there are extra children, we don't want them to occupy
        * the space where we draw the resize grip, so we temporarily
        * shrink the allocation.
@@ -882,14 +938,6 @@ gtk_statusbar_size_allocate  (GtkWidget     *widget,
 
   if (statusbar->has_resize_grip)
     {
-      if (statusbar->grip_window)
-       {
-         gdk_window_raise (statusbar->grip_window);
-         gdk_window_move_resize (statusbar->grip_window,
-                                 rect.x, rect.y,
-                                 rect.width, rect.height);
-       }
-
       if (extra_children) 
        {
          allocation->width += rect.width;
@@ -913,12 +961,23 @@ gtk_statusbar_size_allocate  (GtkWidget     *widget,
              /* shrink the label to make room for the grip */
              *allocation = child->allocation;
              allocation->width = MAX (1, allocation->width - rect.width);
-             if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) 
+             if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
                allocation->x += child->allocation.width - allocation->width;
 
              gtk_widget_size_allocate (child, allocation);
            }
        }
+
+      if (statusbar->grip_window)
+       {
+          get_grip_rect (statusbar, &rect);
+
+         gdk_window_raise (statusbar->grip_window);
+         gdk_window_move_resize (statusbar->grip_window,
+                                 rect.x, rect.y,
+                                 rect.width, rect.height);
+       }
+
     }
 }