gtkstatusbar: Move public members to private structure

This commit is contained in:
Javier Jardón
2010-07-13 01:46:15 +02:00
parent bf976cc1e4
commit 9114c4c410
2 changed files with 170 additions and 129 deletions

View File

@ -75,6 +75,23 @@
*/ */
typedef struct _GtkStatusbarMsg GtkStatusbarMsg; typedef struct _GtkStatusbarMsg GtkStatusbarMsg;
struct _GtkStatusbarPriv
{
GtkWidget *frame;
GtkWidget *label;
GdkWindow *grip_window;
GSList *messages;
GSList *keys;
guint seq_context_id;
guint seq_message_id;
guint has_resize_grip : 1;
};
struct _GtkStatusbarMsg struct _GtkStatusbarMsg
{ {
gchar *text; gchar *text;
@ -232,48 +249,54 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
GTK_TYPE_SHADOW_TYPE, GTK_TYPE_SHADOW_TYPE,
GTK_SHADOW_IN, GTK_SHADOW_IN,
GTK_PARAM_READABLE)); GTK_PARAM_READABLE));
g_type_class_add_private (class, sizeof (GtkStatusbarPriv));
} }
static void static void
gtk_statusbar_init (GtkStatusbar *statusbar) gtk_statusbar_init (GtkStatusbar *statusbar)
{ {
GtkBox *box; GtkStatusbarPriv *priv;
GtkBox *box = GTK_BOX (statusbar);
GtkWidget *message_area; GtkWidget *message_area;
GtkShadowType shadow_type; GtkShadowType shadow_type;
box = GTK_BOX (statusbar); statusbar->priv = G_TYPE_INSTANCE_GET_PRIVATE (statusbar,
GTK_TYPE_STATUSBAR,
GtkStatusbarPriv);
priv = statusbar->priv;
gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE); gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE);
gtk_box_set_spacing (box, 2); gtk_box_set_spacing (box, 2);
gtk_box_set_homogeneous (box, FALSE); gtk_box_set_homogeneous (box, FALSE);
statusbar->has_resize_grip = TRUE; priv->has_resize_grip = TRUE;
gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL); gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL);
statusbar->frame = gtk_frame_new (NULL); priv->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (statusbar->frame), shadow_type); gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type);
gtk_box_pack_start (box, statusbar->frame, TRUE, TRUE, 0); gtk_box_pack_start (box, priv->frame, TRUE, TRUE, 0);
gtk_widget_show (statusbar->frame); gtk_widget_show (priv->frame);
message_area = gtk_hbox_new (FALSE, 4); message_area = gtk_hbox_new (FALSE, 4);
gtk_container_add (GTK_CONTAINER (statusbar->frame), message_area); gtk_container_add (GTK_CONTAINER (priv->frame), message_area);
gtk_widget_show (message_area); gtk_widget_show (message_area);
statusbar->label = gtk_label_new (""); priv->label = gtk_label_new ("");
gtk_label_set_single_line_mode (GTK_LABEL (statusbar->label), TRUE); gtk_label_set_single_line_mode (GTK_LABEL (priv->label), TRUE);
gtk_misc_set_alignment (GTK_MISC (statusbar->label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5);
g_signal_connect (statusbar->label, "notify::selectable", g_signal_connect (priv->label, "notify::selectable",
G_CALLBACK (label_selectable_changed), statusbar); G_CALLBACK (label_selectable_changed), statusbar);
gtk_label_set_ellipsize (GTK_LABEL (statusbar->label), PANGO_ELLIPSIZE_END); gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END);
gtk_container_add (GTK_CONTAINER (message_area), statusbar->label); gtk_container_add (GTK_CONTAINER (message_area), priv->label);
gtk_widget_show (statusbar->label); gtk_widget_show (priv->label);
statusbar->seq_context_id = 1; priv->seq_context_id = 1;
statusbar->seq_message_id = 1; priv->seq_message_id = 1;
statusbar->messages = NULL; priv->messages = NULL;
statusbar->keys = NULL; priv->keys = NULL;
} }
static GtkBuildableIface *parent_buildable_iface; static GtkBuildableIface *parent_buildable_iface;
@ -290,8 +313,11 @@ gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable,
GtkBuilder *builder, GtkBuilder *builder,
const gchar *childname) const gchar *childname)
{ {
GtkStatusbar *statusbar = GTK_STATUSBAR (buildable);
GtkStatusbarPriv *priv = statusbar->priv;
if (strcmp (childname, "message_area") == 0) if (strcmp (childname, "message_area") == 0)
return G_OBJECT (gtk_bin_get_child (GTK_BIN (GTK_STATUSBAR (buildable)->frame))); return G_OBJECT (gtk_bin_get_child (GTK_BIN (priv->frame)));
return parent_buildable_iface->get_internal_child (buildable, return parent_buildable_iface->get_internal_child (buildable,
builder, builder,
@ -316,12 +342,16 @@ gtk_statusbar_update (GtkStatusbar *statusbar,
guint context_id, guint context_id,
const gchar *text) const gchar *text)
{ {
GtkStatusbarPriv *priv;
g_return_if_fail (GTK_IS_STATUSBAR (statusbar)); g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
priv = statusbar->priv;
if (!text) if (!text)
text = ""; text = "";
gtk_label_set_text (GTK_LABEL (statusbar->label), text); gtk_label_set_text (GTK_LABEL (priv->label), text);
} }
/** /**
@ -340,21 +370,24 @@ guint
gtk_statusbar_get_context_id (GtkStatusbar *statusbar, gtk_statusbar_get_context_id (GtkStatusbar *statusbar,
const gchar *context_description) const gchar *context_description)
{ {
GtkStatusbarPriv *priv;
gchar *string; gchar *string;
guint id; guint id;
g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), 0); g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), 0);
g_return_val_if_fail (context_description != NULL, 0); g_return_val_if_fail (context_description != NULL, 0);
priv = statusbar->priv;
/* we need to preserve namespaces on object datas */ /* we need to preserve namespaces on object datas */
string = g_strconcat ("gtk-status-bar-context:", context_description, NULL); string = g_strconcat ("gtk-status-bar-context:", context_description, NULL);
id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (statusbar), string)); id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (statusbar), string));
if (id == 0) if (id == 0)
{ {
id = statusbar->seq_context_id++; id = priv->seq_context_id++;
g_object_set_data_full (G_OBJECT (statusbar), string, GUINT_TO_POINTER (id), NULL); g_object_set_data_full (G_OBJECT (statusbar), string, GUINT_TO_POINTER (id), NULL);
statusbar->keys = g_slist_prepend (statusbar->keys, string); priv->keys = g_slist_prepend (priv->keys, string);
} }
else else
g_free (string); g_free (string);
@ -379,17 +412,20 @@ gtk_statusbar_push (GtkStatusbar *statusbar,
guint context_id, guint context_id,
const gchar *text) const gchar *text)
{ {
GtkStatusbarPriv *priv;
GtkStatusbarMsg *msg; GtkStatusbarMsg *msg;
g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), 0); g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), 0);
g_return_val_if_fail (text != NULL, 0); g_return_val_if_fail (text != NULL, 0);
priv = statusbar->priv;
msg = g_slice_new (GtkStatusbarMsg); msg = g_slice_new (GtkStatusbarMsg);
msg->text = g_strdup (text); msg->text = g_strdup (text);
msg->context_id = context_id; msg->context_id = context_id;
msg->message_id = statusbar->seq_message_id++; msg->message_id = priv->seq_message_id++;
statusbar->messages = g_slist_prepend (statusbar->messages, msg); priv->messages = g_slist_prepend (priv->messages, msg);
g_signal_emit (statusbar, g_signal_emit (statusbar,
statusbar_signals[SIGNAL_TEXT_PUSHED], statusbar_signals[SIGNAL_TEXT_PUSHED],
@ -416,21 +452,24 @@ void
gtk_statusbar_pop (GtkStatusbar *statusbar, gtk_statusbar_pop (GtkStatusbar *statusbar,
guint context_id) guint context_id)
{ {
GtkStatusbarPriv *priv;
GtkStatusbarMsg *msg; GtkStatusbarMsg *msg;
g_return_if_fail (GTK_IS_STATUSBAR (statusbar)); g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
if (statusbar->messages) priv = statusbar->priv;
if (priv->messages)
{ {
GSList *list; GSList *list;
for (list = statusbar->messages; list; list = list->next) for (list = priv->messages; list; list = list->next)
{ {
msg = list->data; msg = list->data;
if (msg->context_id == context_id) if (msg->context_id == context_id)
{ {
statusbar->messages = g_slist_remove_link (statusbar->messages, priv->messages = g_slist_remove_link (priv->messages,
list); list);
g_free (msg->text); g_free (msg->text);
g_slice_free (GtkStatusbarMsg, msg); g_slice_free (GtkStatusbarMsg, msg);
@ -440,7 +479,7 @@ gtk_statusbar_pop (GtkStatusbar *statusbar,
} }
} }
msg = statusbar->messages ? statusbar->messages->data : NULL; msg = priv->messages ? priv->messages->data : NULL;
g_signal_emit (statusbar, g_signal_emit (statusbar,
statusbar_signals[SIGNAL_TEXT_POPPED], statusbar_signals[SIGNAL_TEXT_POPPED],
@ -463,12 +502,15 @@ gtk_statusbar_remove (GtkStatusbar *statusbar,
guint context_id, guint context_id,
guint message_id) guint message_id)
{ {
GtkStatusbarPriv *priv;
GtkStatusbarMsg *msg; GtkStatusbarMsg *msg;
g_return_if_fail (GTK_IS_STATUSBAR (statusbar)); g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
g_return_if_fail (message_id > 0); g_return_if_fail (message_id > 0);
msg = statusbar->messages ? statusbar->messages->data : NULL; priv = statusbar->priv;
msg = priv->messages ? priv->messages->data : NULL;
if (msg) if (msg)
{ {
GSList *list; GSList *list;
@ -481,14 +523,14 @@ gtk_statusbar_remove (GtkStatusbar *statusbar,
return; return;
} }
for (list = statusbar->messages; list; list = list->next) for (list = priv->messages; list; list = list->next)
{ {
msg = list->data; msg = list->data;
if (msg->context_id == context_id && if (msg->context_id == context_id &&
msg->message_id == message_id) msg->message_id == message_id)
{ {
statusbar->messages = g_slist_remove_link (statusbar->messages, list); priv->messages = g_slist_remove_link (priv->messages, list);
g_free (msg->text); g_free (msg->text);
g_slice_free (GtkStatusbarMsg, msg); g_slice_free (GtkStatusbarMsg, msg);
g_slist_free_1 (list); g_slist_free_1 (list);
@ -513,15 +555,18 @@ void
gtk_statusbar_remove_all (GtkStatusbar *statusbar, gtk_statusbar_remove_all (GtkStatusbar *statusbar,
guint context_id) guint context_id)
{ {
GtkStatusbarPriv *priv;
GtkStatusbarMsg *msg; GtkStatusbarMsg *msg;
GSList *prev, *list; GSList *prev, *list;
g_return_if_fail (GTK_IS_STATUSBAR (statusbar)); g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
if (statusbar->messages == NULL) priv = statusbar->priv;
if (priv->messages == NULL)
return; return;
msg = statusbar->messages->data; msg = priv->messages->data;
/* care about signal emission if the topmost item is removed */ /* care about signal emission if the topmost item is removed */
if (msg->context_id == context_id) if (msg->context_id == context_id)
@ -529,11 +574,11 @@ gtk_statusbar_remove_all (GtkStatusbar *statusbar,
gtk_statusbar_pop (statusbar, context_id); gtk_statusbar_pop (statusbar, context_id);
prev = NULL; prev = NULL;
list = statusbar->messages; list = priv->messages;
} }
else else
{ {
prev = statusbar->messages; prev = priv->messages;
list = prev->next; list = prev->next;
} }
@ -544,7 +589,7 @@ gtk_statusbar_remove_all (GtkStatusbar *statusbar,
if (msg->context_id == context_id) if (msg->context_id == context_id)
{ {
if (prev == NULL) if (prev == NULL)
statusbar->messages = list->next; priv->messages = list->next;
else else
prev->next = list->next; prev->next = list->next;
@ -553,7 +598,7 @@ gtk_statusbar_remove_all (GtkStatusbar *statusbar,
g_slist_free_1 (list); g_slist_free_1 (list);
if (prev == NULL) if (prev == NULL)
prev = statusbar->messages; prev = priv->messages;
list = prev->next; list = prev->next;
} }
@ -577,25 +622,29 @@ void
gtk_statusbar_set_has_resize_grip (GtkStatusbar *statusbar, gtk_statusbar_set_has_resize_grip (GtkStatusbar *statusbar,
gboolean setting) gboolean setting)
{ {
GtkStatusbarPriv *priv;
g_return_if_fail (GTK_IS_STATUSBAR (statusbar)); g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
priv = statusbar->priv;
setting = setting != FALSE; setting = setting != FALSE;
if (setting != statusbar->has_resize_grip) if (setting != priv->has_resize_grip)
{ {
statusbar->has_resize_grip = setting; priv->has_resize_grip = setting;
gtk_widget_queue_resize (statusbar->label); gtk_widget_queue_resize (priv->label);
gtk_widget_queue_draw (GTK_WIDGET (statusbar)); gtk_widget_queue_draw (GTK_WIDGET (statusbar));
if (gtk_widget_get_realized (GTK_WIDGET (statusbar))) if (gtk_widget_get_realized (GTK_WIDGET (statusbar)))
{ {
if (statusbar->has_resize_grip && statusbar->grip_window == NULL) if (priv->has_resize_grip && priv->grip_window == NULL)
{ {
gtk_statusbar_create_window (statusbar); gtk_statusbar_create_window (statusbar);
if (gtk_widget_get_mapped (GTK_WIDGET (statusbar))) if (gtk_widget_get_mapped (GTK_WIDGET (statusbar)))
gdk_window_show (statusbar->grip_window); gdk_window_show (priv->grip_window);
} }
else if (!statusbar->has_resize_grip && statusbar->grip_window != NULL) else if (!priv->has_resize_grip && priv->grip_window != NULL)
gtk_statusbar_destroy_window (statusbar); gtk_statusbar_destroy_window (statusbar);
} }
@ -616,7 +665,7 @@ gtk_statusbar_get_has_resize_grip (GtkStatusbar *statusbar)
{ {
g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), FALSE); g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), FALSE);
return statusbar->has_resize_grip; return statusbar->priv->has_resize_grip;
} }
/** /**
@ -632,18 +681,23 @@ gtk_statusbar_get_has_resize_grip (GtkStatusbar *statusbar)
GtkWidget* GtkWidget*
gtk_statusbar_get_message_area (GtkStatusbar *statusbar) gtk_statusbar_get_message_area (GtkStatusbar *statusbar)
{ {
GtkStatusbarPriv *priv;
g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), NULL); g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), NULL);
return gtk_bin_get_child (GTK_BIN (statusbar->frame)); priv = statusbar->priv;
return gtk_bin_get_child (GTK_BIN (priv->frame));
} }
static void static void
gtk_statusbar_destroy (GtkObject *object) gtk_statusbar_destroy (GtkObject *object)
{ {
GtkStatusbar *statusbar = GTK_STATUSBAR (object); GtkStatusbar *statusbar = GTK_STATUSBAR (object);
GtkStatusbarPriv *priv = statusbar->priv;
GSList *list; GSList *list;
for (list = statusbar->messages; list; list = list->next) for (list = priv->messages; list; list = list->next)
{ {
GtkStatusbarMsg *msg; GtkStatusbarMsg *msg;
@ -651,13 +705,13 @@ gtk_statusbar_destroy (GtkObject *object)
g_free (msg->text); g_free (msg->text);
g_slice_free (GtkStatusbarMsg, msg); g_slice_free (GtkStatusbarMsg, msg);
} }
g_slist_free (statusbar->messages); g_slist_free (priv->messages);
statusbar->messages = NULL; priv->messages = NULL;
for (list = statusbar->keys; list; list = list->next) for (list = priv->keys; list; list = list->next)
g_free (list->data); g_free (list->data);
g_slist_free (statusbar->keys); g_slist_free (priv->keys);
statusbar->keys = NULL; priv->keys = NULL;
GTK_OBJECT_CLASS (gtk_statusbar_parent_class)->destroy (object); GTK_OBJECT_CLASS (gtk_statusbar_parent_class)->destroy (object);
} }
@ -688,11 +742,12 @@ gtk_statusbar_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkStatusbar *statusbar = GTK_STATUSBAR (object); GtkStatusbar *statusbar = GTK_STATUSBAR (object);
GtkStatusbarPriv *priv = statusbar->priv;
switch (prop_id) switch (prop_id)
{ {
case PROP_HAS_RESIZE_GRIP: case PROP_HAS_RESIZE_GRIP:
g_value_set_boolean (value, statusbar->has_resize_grip); g_value_set_boolean (value, priv->has_resize_grip);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -743,7 +798,9 @@ get_grip_rect (GtkStatusbar *statusbar,
static void static void
set_grip_cursor (GtkStatusbar *statusbar) set_grip_cursor (GtkStatusbar *statusbar)
{ {
if (statusbar->has_resize_grip && statusbar->grip_window != NULL) GtkStatusbarPriv *priv = statusbar->priv;
if (priv->has_resize_grip && priv->grip_window != NULL)
{ {
GtkWidget *widget = GTK_WIDGET (statusbar); GtkWidget *widget = GTK_WIDGET (statusbar);
GdkDisplay *display = gtk_widget_get_display (widget); GdkDisplay *display = gtk_widget_get_display (widget);
@ -758,11 +815,11 @@ set_grip_cursor (GtkStatusbar *statusbar)
cursor_type = GDK_BOTTOM_LEFT_CORNER; cursor_type = GDK_BOTTOM_LEFT_CORNER;
cursor = gdk_cursor_new_for_display (display, cursor_type); cursor = gdk_cursor_new_for_display (display, cursor_type);
gdk_window_set_cursor (statusbar->grip_window, cursor); gdk_window_set_cursor (priv->grip_window, cursor);
gdk_cursor_unref (cursor); gdk_cursor_unref (cursor);
} }
else else
gdk_window_set_cursor (statusbar->grip_window, NULL); gdk_window_set_cursor (priv->grip_window, NULL);
} }
} }
@ -770,6 +827,7 @@ static void
gtk_statusbar_create_window (GtkStatusbar *statusbar) gtk_statusbar_create_window (GtkStatusbar *statusbar)
{ {
GtkWidget *widget; GtkWidget *widget;
GtkStatusbarPriv *priv = statusbar->priv;
GdkWindowAttr attributes; GdkWindowAttr attributes;
gint attributes_mask; gint attributes_mask;
GdkRectangle rect; GdkRectangle rect;
@ -777,7 +835,7 @@ gtk_statusbar_create_window (GtkStatusbar *statusbar)
widget = GTK_WIDGET (statusbar); widget = GTK_WIDGET (statusbar);
g_return_if_fail (gtk_widget_get_realized (widget)); g_return_if_fail (gtk_widget_get_realized (widget));
g_return_if_fail (statusbar->has_resize_grip); g_return_if_fail (priv->has_resize_grip);
get_grip_rect (statusbar, &rect); get_grip_rect (statusbar, &rect);
@ -792,12 +850,12 @@ gtk_statusbar_create_window (GtkStatusbar *statusbar)
attributes_mask = GDK_WA_X | GDK_WA_Y; attributes_mask = GDK_WA_X | GDK_WA_Y;
statusbar->grip_window = gdk_window_new (widget->window, priv->grip_window = gdk_window_new (widget->window,
&attributes, attributes_mask); &attributes, attributes_mask);
gdk_window_set_user_data (statusbar->grip_window, widget); gdk_window_set_user_data (priv->grip_window, widget);
gdk_window_raise (statusbar->grip_window); gdk_window_raise (priv->grip_window);
set_grip_cursor (statusbar); set_grip_cursor (statusbar);
} }
@ -823,32 +881,32 @@ gtk_statusbar_state_changed (GtkWidget *widget,
static void static void
gtk_statusbar_destroy_window (GtkStatusbar *statusbar) gtk_statusbar_destroy_window (GtkStatusbar *statusbar)
{ {
gdk_window_set_user_data (statusbar->grip_window, NULL); GtkStatusbarPriv *priv = statusbar->priv;
gdk_window_destroy (statusbar->grip_window);
statusbar->grip_window = NULL; gdk_window_set_user_data (priv->grip_window, NULL);
gdk_window_destroy (priv->grip_window);
priv->grip_window = NULL;
} }
static void static void
gtk_statusbar_realize (GtkWidget *widget) gtk_statusbar_realize (GtkWidget *widget)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
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) if (priv->has_resize_grip)
gtk_statusbar_create_window (statusbar); gtk_statusbar_create_window (statusbar);
} }
static void static void
gtk_statusbar_unrealize (GtkWidget *widget) gtk_statusbar_unrealize (GtkWidget *widget)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
statusbar = GTK_STATUSBAR (widget); if (priv->grip_window)
if (statusbar->grip_window)
gtk_statusbar_destroy_window (statusbar); gtk_statusbar_destroy_window (statusbar);
GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unrealize (widget); GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unrealize (widget);
@ -857,25 +915,23 @@ gtk_statusbar_unrealize (GtkWidget *widget)
static void static void
gtk_statusbar_map (GtkWidget *widget) gtk_statusbar_map (GtkWidget *widget)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
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) if (priv->grip_window)
gdk_window_show (statusbar->grip_window); gdk_window_show (priv->grip_window);
} }
static void static void
gtk_statusbar_unmap (GtkWidget *widget) gtk_statusbar_unmap (GtkWidget *widget)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
statusbar = GTK_STATUSBAR (widget); if (priv->grip_window)
gdk_window_hide (priv->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);
} }
@ -884,15 +940,14 @@ static gboolean
gtk_statusbar_button_press (GtkWidget *widget, gtk_statusbar_button_press (GtkWidget *widget,
GdkEventButton *event) GdkEventButton *event)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
GtkWidget *ancestor; GtkWidget *ancestor;
GdkWindowEdge edge; GdkWindowEdge edge;
statusbar = GTK_STATUSBAR (widget); if (!priv->has_resize_grip ||
if (!statusbar->has_resize_grip ||
event->type != GDK_BUTTON_PRESS || event->type != GDK_BUTTON_PRESS ||
event->window != statusbar->grip_window) event->window != priv->grip_window)
return FALSE; return FALSE;
ancestor = gtk_widget_get_toplevel (widget); ancestor = gtk_widget_get_toplevel (widget);
@ -923,14 +978,13 @@ static gboolean
gtk_statusbar_expose_event (GtkWidget *widget, gtk_statusbar_expose_event (GtkWidget *widget,
GdkEventExpose *event) GdkEventExpose *event)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
GdkRectangle rect; GdkRectangle rect;
statusbar = GTK_STATUSBAR (widget);
GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->expose_event (widget, event); GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->expose_event (widget, event);
if (statusbar->has_resize_grip) if (priv->has_resize_grip)
{ {
GdkWindowEdge edge; GdkWindowEdge edge;
@ -960,13 +1014,12 @@ static void
gtk_statusbar_size_request (GtkWidget *widget, gtk_statusbar_size_request (GtkWidget *widget,
GtkRequisition *requisition) GtkRequisition *requisition)
{ {
GtkStatusbar *statusbar; GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
GtkShadowType shadow_type; GtkShadowType shadow_type;
statusbar = GTK_STATUSBAR (widget);
gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL); gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL);
gtk_frame_set_shadow_type (GTK_FRAME (statusbar->frame), shadow_type); gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type);
GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->size_request (widget, requisition); GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->size_request (widget, requisition);
} }
@ -977,11 +1030,12 @@ gtk_statusbar_size_request (GtkWidget *widget,
static gboolean static gboolean
has_extra_children (GtkStatusbar *statusbar) has_extra_children (GtkStatusbar *statusbar)
{ {
GtkStatusbarPriv *priv = statusbar->priv;
GList *l, *children; GList *l, *children;
GtkBoxChild *child, *frame; GtkBoxChild *child, *frame;
/* If the internal frame has been modified assume we have extra children */ /* If the internal frame has been modified assume we have extra children */
if (gtk_bin_get_child (GTK_BIN (statusbar->frame)) != statusbar->label) if (gtk_bin_get_child (GTK_BIN (priv->frame)) != priv->label)
return TRUE; return TRUE;
frame = NULL; frame = NULL;
@ -990,7 +1044,7 @@ has_extra_children (GtkStatusbar *statusbar)
{ {
frame = l->data; frame = l->data;
if (frame->widget == statusbar->frame) if (frame->widget == priv->frame)
break; break;
} }
@ -1015,10 +1069,11 @@ gtk_statusbar_size_allocate (GtkWidget *widget,
GtkAllocation *allocation) GtkAllocation *allocation)
{ {
GtkStatusbar *statusbar = GTK_STATUSBAR (widget); GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
GtkStatusbarPriv *priv = statusbar->priv;
gboolean extra_children = FALSE; gboolean extra_children = FALSE;
GdkRectangle rect; GdkRectangle rect;
if (statusbar->has_resize_grip) if (priv->has_resize_grip)
{ {
get_grip_rect (statusbar, &rect); get_grip_rect (statusbar, &rect);
@ -1042,7 +1097,7 @@ gtk_statusbar_size_allocate (GtkWidget *widget,
/* chain up normally */ /* chain up normally */
GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->size_allocate (widget, allocation); GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->size_allocate (widget, allocation);
if (statusbar->has_resize_grip) if (priv->has_resize_grip)
{ {
if (extra_children) if (extra_children)
{ {
@ -1056,13 +1111,13 @@ gtk_statusbar_size_allocate (GtkWidget *widget,
{ {
GtkWidget *child; GtkWidget *child;
/* Use the frame's child instead of statusbar->label directly, in case /* Use the frame's child instead of priv->label directly, in case
* the label has been replaced by a container as the frame's child * the label has been replaced by a container as the frame's child
* (and the label reparented into that container). * (and the label reparented into that container).
*/ */
child = gtk_bin_get_child (GTK_BIN (statusbar->frame)); child = gtk_bin_get_child (GTK_BIN (priv->frame));
if (child->allocation.width + rect.width > statusbar->frame->allocation.width) if (child->allocation.width + rect.width > priv->frame->allocation.width)
{ {
/* shrink the label to make room for the grip */ /* shrink the label to make room for the grip */
*allocation = child->allocation; *allocation = child->allocation;
@ -1074,12 +1129,12 @@ gtk_statusbar_size_allocate (GtkWidget *widget,
} }
} }
if (statusbar->grip_window) if (priv->grip_window)
{ {
get_grip_rect (statusbar, &rect); get_grip_rect (statusbar, &rect);
gdk_window_raise (statusbar->grip_window); gdk_window_raise (priv->grip_window);
gdk_window_move_resize (statusbar->grip_window, gdk_window_move_resize (priv->grip_window,
rect.x, rect.y, rect.x, rect.y,
rect.width, rect.height); rect.width, rect.height);
} }
@ -1093,8 +1148,9 @@ label_selectable_changed (GtkWidget *label,
gpointer data) gpointer data)
{ {
GtkStatusbar *statusbar = GTK_STATUSBAR (data); GtkStatusbar *statusbar = GTK_STATUSBAR (data);
GtkStatusbarPriv *priv = statusbar->priv;
if (statusbar && if (statusbar &&
statusbar->has_resize_grip && statusbar->grip_window) priv->has_resize_grip && priv->grip_window)
gdk_window_raise (statusbar->grip_window); gdk_window_raise (priv->grip_window);
} }

View File

@ -44,31 +44,16 @@ G_BEGIN_DECLS
#define GTK_STATUSBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_STATUSBAR, GtkStatusbarClass)) #define GTK_STATUSBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_STATUSBAR, GtkStatusbarClass))
/**
* GtkStatusbar:
*
* Contains private data that should be modified with the functions
* described below.
*/
typedef struct _GtkStatusbar GtkStatusbar; typedef struct _GtkStatusbar GtkStatusbar;
typedef struct _GtkStatusbarPriv GtkStatusbarPriv;
typedef struct _GtkStatusbarClass GtkStatusbarClass; typedef struct _GtkStatusbarClass GtkStatusbarClass;
struct _GtkStatusbar struct _GtkStatusbar
{ {
GtkHBox parent_widget; GtkHBox parent_widget;
GtkWidget *GSEAL (frame); /* <private> */
GtkWidget *GSEAL (label); GtkStatusbarPriv *priv;
GSList *GSEAL (messages);
GSList *GSEAL (keys);
guint GSEAL (seq_context_id);
guint GSEAL (seq_message_id);
GdkWindow *GSEAL (grip_window);
guint GSEAL (has_resize_grip) : 1;
}; };
struct _GtkStatusbarClass struct _GtkStatusbarClass