* 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"
#include "gtkwindow.h"
#include "gtkprivate.h"
#include "gtkintl.h"
+#include "gtkbuildable.h"
#include "gtkalias.h"
typedef struct _GtkStatusbarMsg GtkStatusbarMsg;
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,
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)
* 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),
* 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),
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;
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;
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:
*
const gchar *context_description)
{
gchar *string;
- guint *id;
+ guint id;
g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), 0);
g_return_val_if_fail (context_description != NULL, 0);
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)
{
- GtkStatusbar *statusbar;
+ GtkStatusbar *statusbar = GTK_STATUSBAR (object);
GSList *list;
- g_return_if_fail (GTK_IS_STATUSBAR (object));
-
- statusbar = GTK_STATUSBAR (object);
-
for (list = statusbar->messages; list; list = list->next)
{
GtkStatusbarMsg *msg;
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;
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);
gdk_window_set_user_data (statusbar->grip_window, widget);
+ gdk_window_raise (statusbar->grip_window);
+
set_grip_cursor (statusbar);
}
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);
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
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);
}
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
GList *l;
GtkBoxChild *child, *frame;
+ /* If the internal frame has been modified assume we have extra children */
+ if (gtk_bin_get_child (GTK_BIN (statusbar->frame)) != statusbar->label)
+ return TRUE;
+
frame = NULL;
for (l = GTK_BOX (statusbar)->children; l; l = l->next)
{
{
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)
if (statusbar->has_resize_grip)
{
- widget->allocation = *allocation;
- 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.
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;
/* 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);
+ }
+
}
}