summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Janik <timj@gimp.org>1998-02-23 15:13:03 +0000
committerTim Janik <timj@src.gnome.org>1998-02-23 15:13:03 +0000
commitf6f927d227858f25f1e5df5a181a856ac2151314 (patch)
tree3f4e442f6e9cba641ad84588ac134dde3210c5fe
parent1b656e0ddef81edfaf95aa766716d9e6179abb46 (diff)
downloadgtk+-f6f927d227858f25f1e5df5a181a856ac2151314.tar.gz
implemented the statusbar widget. my first intend was to fix the code, but
Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org> * gtk/gtkstatusbar.h: * gtk/gtkstatusbar.c: (re-)implemented the statusbar widget. my first intend was to fix the code, but then there was nothing to fix - the whole thing was just a big JOKE! people who don't even know the semantics of the g_list_* functions shouldn't put their hands on widget code and inheritance! this is the first step to get bug "BUG: statusbar/hbox (redraw?) problem" worked out, i have to leave now, but will continue work on the resizing code this evening.
-rw-r--r--ChangeLog10
-rw-r--r--ChangeLog.pre-2-010
-rw-r--r--ChangeLog.pre-2-1010
-rw-r--r--ChangeLog.pre-2-210
-rw-r--r--ChangeLog.pre-2-410
-rw-r--r--ChangeLog.pre-2-610
-rw-r--r--ChangeLog.pre-2-810
-rw-r--r--gtk/gtkstatusbar.c215
-rw-r--r--gtk/gtkstatusbar.h26
-rw-r--r--gtk/testgtk.c149
-rw-r--r--tests/testgtk.c149
11 files changed, 553 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog
index 817380b868..bba26eda01 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 817380b868..bba26eda01 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 817380b868..bba26eda01 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 817380b868..bba26eda01 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 817380b868..bba26eda01 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 817380b868..bba26eda01 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 817380b868..bba26eda01 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,13 @@
+Mon Feb 23 13:44:10 1998 Tim Janik <timj@gimp.org>
+
+ * gtk/gtkstatusbar.h:
+ * gtk/gtkstatusbar.c:
+ (re-)implemented the statusbar widget. my first intend was to fix the
+ code, but then there was nothing to fix - the whole thing was just a
+ big JOKE!
+ people who don't even know the semantics of the g_list_* functions
+ shouldn't put their hands on widget code and inheritance!
+
Sun Feb 22 20:42:04 1998 Marc Ewing <marc@redhat.com>
* gtk/gtkclist.c (gtk_clist_insert): Allow inserts
diff --git a/gtk/gtkstatusbar.c b/gtk/gtkstatusbar.c
index a110cc8f4a..b0581176fb 100644
--- a/gtk/gtkstatusbar.c
+++ b/gtk/gtkstatusbar.c
@@ -19,14 +19,29 @@
#include "gtkframe.h"
#include "gtklabel.h"
+#include "gtksignal.h"
#include "gtkstatusbar.h"
+
+enum
+{
+ SIGNAL_TEXT_PUSHED,
+ SIGNAL_TEXT_POPPED,
+ SIGNAL_LAST
+};
+
+typedef void (*SignalTextP) (GtkObject *object,
+ const gchar *text,
+ gpointer func_data);
+
static void gtk_statusbar_class_init (GtkStatusbarClass *class);
static void gtk_statusbar_init (GtkStatusbar *statusbar);
static void gtk_statusbar_destroy (GtkObject *object);
-static void gtk_statusbar_show_top_msg (GtkStatusbar *statusbar);
-
+static void gtk_statusbar_update (GtkStatusbar *statusbar,
+ const gchar *text);
+
static GtkContainerClass *parent_class;
+static gint statusbar_signals[SIGNAL_LAST] = { 0 };
guint
gtk_statusbar_get_type ()
@@ -53,6 +68,19 @@ gtk_statusbar_get_type ()
};
static void
+gtk_statusbar_marshal_text_p (GtkObject *object,
+ GtkSignalFunc func,
+ gpointer func_data,
+ GtkArg *args)
+{
+ SignalTextP sfunc = (SignalTextP) func;
+
+ (* sfunc) (object,
+ GTK_VALUE_STRING (args[0]),
+ func_data);
+}
+
+static void
gtk_statusbar_class_init (GtkStatusbarClass *class)
{
GtkObjectClass *object_class;
@@ -63,105 +91,196 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
widget_class = (GtkWidgetClass *) class;
container_class = (GtkContainerClass *) class;
- parent_class = gtk_type_class (gtk_box_get_type ());
-
+ parent_class = gtk_type_class (gtk_hbox_get_type ());
+
+ statusbar_signals[SIGNAL_TEXT_PUSHED] =
+ gtk_signal_new ("text_pushed",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (GtkStatusbarClass, text_pushed),
+ gtk_statusbar_marshal_text_p,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_STRING);
+ statusbar_signals[SIGNAL_TEXT_POPPED] =
+ gtk_signal_new ("text_popped",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (GtkStatusbarClass, text_popped),
+ gtk_statusbar_marshal_text_p,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_STRING);
+ gtk_object_class_add_signals (object_class, statusbar_signals, SIGNAL_LAST);
+
object_class->destroy = gtk_statusbar_destroy;
+ class->messages_mem_chunk = g_mem_chunk_new ("GtkStatusBar messages mem chunk",
+ sizeof (GtkStatusbarMsg),
+ sizeof (GtkStatusbarMsg) * 64,
+ G_ALLOC_AND_FREE);
+
+ class->text_pushed = gtk_statusbar_update;
+ class->text_popped = gtk_statusbar_update;
}
static void
gtk_statusbar_init (GtkStatusbar *statusbar)
{
- GTK_BOX (statusbar)->spacing = 2;
- GTK_BOX (statusbar)->homogeneous = FALSE;
+ GtkBox *box;
+
+ box = GTK_BOX (statusbar);
+
+ box->spacing = 2;
+ box->homogeneous = FALSE;
statusbar->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (statusbar->frame), GTK_SHADOW_IN);
- gtk_box_pack_start (GTK_BOX (statusbar), statusbar->frame, 1, 1, 0);
+ gtk_box_pack_start (box, statusbar->frame, TRUE, TRUE, 0);
gtk_widget_show (statusbar->frame);
- statusbar->label = gtk_label_new("");
- gtk_misc_set_alignment(GTK_MISC(statusbar->label), 0.0, 0.0);
- gtk_container_add(GTK_CONTAINER(statusbar->frame), statusbar->label);
+ statusbar->label = gtk_label_new ("");
+ gtk_misc_set_alignment (GTK_MISC (statusbar->label), 0.0, 0.0);
+ gtk_container_add (GTK_CONTAINER (statusbar->frame), statusbar->label);
gtk_widget_show (statusbar->label);
- statusbar->next_statusid = 1;
- statusbar->msgs = g_list_alloc();
+ statusbar->seq_status_id = 1;
+ statusbar->messages = NULL;
}
GtkWidget*
gtk_statusbar_new ()
{
- GtkStatusbar *statusbar;
+ return gtk_type_new (gtk_statusbar_get_type ());
+}
+
+static void
+gtk_statusbar_update (GtkStatusbar *statusbar,
+ const gchar *text)
+{
+ g_return_if_fail (statusbar != NULL);
+ g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
- statusbar = gtk_type_new (gtk_statusbar_get_type ());
+ if (!text)
+ text = "";
- return GTK_WIDGET (statusbar);
+ gtk_label_set (GTK_LABEL (statusbar->label), text);
}
-gint
-gtk_statusbar_push (GtkStatusbar *statusbar, gchar *str)
+guint
+gtk_statusbar_push (GtkStatusbar *statusbar,
+ const gchar *text)
{
GtkStatusbarMsg *msg;
- GList *list;
+ GtkStatusbarClass *class;
+
+ g_return_val_if_fail (statusbar != NULL, 0);
+ g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), 0);
+ g_return_val_if_fail (text != NULL, 0);
- list = statusbar->msgs;
- msg = g_new(GtkStatusbarMsg, 1);
- msg->str = g_strdup(str);
- msg->statusid = statusbar->next_statusid;
- statusbar->next_statusid++;
+ class = GTK_STATUSBAR_CLASS (GTK_OBJECT (statusbar)->klass);
+ msg = g_chunk_new (GtkStatusbarMsg, class->messages_mem_chunk);
+ msg->text = g_strdup (text);
+ msg->status_id = statusbar->seq_status_id++;
- g_list_append(list, msg);
+ statusbar->messages = g_list_prepend (statusbar->messages, msg);
- gtk_statusbar_show_top_msg(statusbar);
+ gtk_signal_emit (GTK_OBJECT (statusbar), statusbar_signals[SIGNAL_TEXT_PUSHED], msg->text);
- return msg->statusid;
+ return msg->status_id;
}
-static void
-gtk_statusbar_show_top_msg (GtkStatusbar *statusbar)
+void
+gtk_statusbar_pop (GtkStatusbar *statusbar)
{
- GList *listitem;
- listitem = g_list_last(statusbar->msgs);
+ GtkStatusbarMsg *msg;
+ g_return_if_fail (statusbar != NULL);
+ g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
- if ((listitem != NULL) && (listitem->data != NULL))
- gtk_label_set(GTK_LABEL(statusbar->label), ((GtkStatusbarMsg*) (listitem->data))->str);
+ if (statusbar->messages)
+ {
+ GList *list;
+ GtkStatusbarClass *class;
+
+ list = statusbar->messages;
+ msg = list->data;
+ class = GTK_STATUSBAR_CLASS (GTK_OBJECT (statusbar)->klass);
+
+ statusbar->messages = g_list_remove_link (statusbar->messages, list);
+ g_free (msg->text);
+ g_mem_chunk_free (class->messages_mem_chunk, msg);
+ g_list_free_1 (list);
+ }
+
+ msg = statusbar->messages ? statusbar->messages->data : NULL;
+ gtk_signal_emit (GTK_OBJECT (statusbar), statusbar_signals[SIGNAL_TEXT_POPPED],
+ msg ? msg->text : NULL);
}
void
-gtk_statusbar_pop (GtkStatusbar *statusbar, gint statusid)
+gtk_statusbar_steal (GtkStatusbar *statusbar,
+ guint status_id)
{
- GList *listitem;
-
- listitem = g_list_last(statusbar->msgs);
+ GtkStatusbarMsg *msg;
+ g_return_if_fail (statusbar != NULL);
+ g_return_if_fail (GTK_IS_STATUSBAR (statusbar));
- while ((listitem != NULL) && (listitem->data != NULL)) {
-
- if (((GtkStatusbarMsg*)(listitem->data))->statusid == statusid) {
- g_list_remove(listitem, listitem->data);
- break;
+ msg = statusbar->messages ? statusbar->messages->data : NULL;
+ if (msg)
+ {
+ GList *list;
+
+ if (msg->status_id == status_id)
+ {
+ gtk_statusbar_pop (statusbar);
+ return;
+ }
+
+ for (list = statusbar->messages; list; list = list->next)
+ {
+ msg = list->data;
+
+ if (msg->status_id == status_id)
+ {
+ GtkStatusbarClass *class;
+
+ class = GTK_STATUSBAR_CLASS (GTK_OBJECT (statusbar)->klass);
+ statusbar->messages = g_list_remove_link (statusbar->messages, list);
+ g_free (msg->text);
+ g_mem_chunk_free (class->messages_mem_chunk, msg);
+ g_list_free_1 (list);
+
+ break;
+ }
+ }
}
-
- listitem = listitem->prev;
- }
-
- gtk_statusbar_show_top_msg(statusbar);
}
static void
gtk_statusbar_destroy (GtkObject *object)
{
GtkStatusbar *statusbar;
+ GtkStatusbarClass *class;
+ GList *list;
+
g_return_if_fail (object != NULL);
g_return_if_fail (GTK_IS_STATUSBAR (object));
statusbar = GTK_STATUSBAR (object);
- g_list_free(statusbar->msgs);
+ class = GTK_STATUSBAR_CLASS (GTK_OBJECT (statusbar)->klass);
+
+ for (list = statusbar->messages; list; list = list->next)
+ {
+ GtkStatusbarMsg *msg;
+
+ msg = list->data;
+ g_free (msg->text);
+ g_mem_chunk_free (class->messages_mem_chunk, msg);
+ }
+ g_list_free (statusbar->messages);
+ statusbar->messages = NULL;
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
-
diff --git a/gtk/gtkstatusbar.h b/gtk/gtkstatusbar.h
index dc9a2f2488..498c04abbe 100644
--- a/gtk/gtkstatusbar.h
+++ b/gtk/gtkstatusbar.h
@@ -40,31 +40,41 @@ struct _GtkStatusbar
GtkWidget *frame;
GtkWidget *label;
- GList *msgs;
- gint next_statusid;
+ GList *messages;
+
+ guint seq_status_id;
};
struct _GtkStatusbarClass
{
GtkHBoxClass parent_class;
+
+ GMemChunk *messages_mem_chunk;
+
+ void (*text_pushed) (GtkStatusbar *statusbar,
+ const gchar *text);
+ void (*text_popped) (GtkStatusbar *statusbar,
+ const gchar *text);
};
struct _GtkStatusbarMsg
{
- gchar *str;
- gint statusid;
+ gchar *text;
+ guint status_id;
};
guint gtk_statusbar_get_type (void);
GtkWidget* gtk_statusbar_new (void);
/* Returns StatusID used for gtk_statusbar_push */
-gint gtk_statusbar_push (GtkStatusbar *statusbar,
- gchar *text);
+guint gtk_statusbar_push (GtkStatusbar *statusbar,
+ const gchar *text);
+void gtk_statusbar_pop (GtkStatusbar *statusbar);
+void gtk_statusbar_steal (GtkStatusbar *statusbar,
+ guint status_id);
+
-void gtk_statusbar_pop (GtkStatusbar *statusbar,
- gint statusid);
#ifdef __cplusplus
}
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 50d7f27a75..4ad4ab3c76 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -782,6 +782,154 @@ make_toolbar (GtkWidget *window)
return toolbar;
}
+static guint statusbar_counter = 1;
+
+static void
+statusbar_push (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ gchar text[1024];
+
+ sprintf (text, "something %d", statusbar_counter++);
+
+ gtk_statusbar_push (statusbar, text);
+}
+
+static void
+statusbar_pop (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ gtk_statusbar_pop (statusbar);
+}
+
+static void
+statusbar_steal (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ gtk_statusbar_steal (statusbar, 4);
+}
+
+static void
+statusbar_popped (GtkStatusbar *statusbar,
+ const gchar *text)
+{
+ if (!statusbar->messages)
+ statusbar_counter = 1;
+}
+
+static void
+statusbar_dump_stack (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ GList *list;
+
+ for (list = statusbar->messages; list; list = list->next)
+ {
+ GtkStatusbarMsg *msg;
+
+ msg = list->data;
+ g_print ("status_id: %d, status_text: \"%s\"\n", msg->status_id, msg->text);
+ }
+}
+
+static void
+create_statusbar ()
+{
+ static GtkWidget *window = NULL;
+ GtkWidget *box1;
+ GtkWidget *box2;
+ GtkWidget *button;
+ GtkWidget *separator;
+ GtkWidget *statusbar;
+
+ if (!window)
+ {
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ gtk_signal_connect (GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroyed),
+ &window);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC (gtk_true),
+ NULL);
+
+ gtk_window_set_title (GTK_WINDOW (window), "statusbar");
+ gtk_container_border_width (GTK_CONTAINER (window), 0);
+
+
+ box1 = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (window), box1);
+ gtk_widget_show (box1);
+
+
+ box2 = gtk_vbox_new (FALSE, 10);
+ gtk_container_border_width (GTK_CONTAINER (box2), 10);
+ gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
+ gtk_widget_show (box2);
+
+ statusbar = gtk_statusbar_new ();
+ gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
+ gtk_widget_show (statusbar);
+ gtk_signal_connect (GTK_OBJECT (statusbar),
+ "text_popped",
+ GTK_SIGNAL_FUNC (statusbar_popped),
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "push something",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_push, statusbar,
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "pop",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_pop, statusbar,
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "steal #4",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_steal, statusbar,
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "dump stack",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_dump_stack, statusbar,
+ NULL);
+
+ separator = gtk_hseparator_new ();
+ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
+ gtk_widget_show (separator);
+
+
+ box2 = gtk_vbox_new (FALSE, 10);
+ gtk_container_border_width (GTK_CONTAINER (box2), 10);
+ gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
+ gtk_widget_show (box2);
+
+
+ button = gtk_button_new_with_label ("close");
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC(gtk_widget_destroy),
+ GTK_OBJECT (window));
+ gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+ }
+
+ if (!GTK_WIDGET_VISIBLE (window))
+ gtk_widget_show (window);
+ else
+ gtk_widget_destroy (window);
+}
+
static void
create_handle_box ()
{
@@ -4221,6 +4369,7 @@ create_main_window ()
{ "button box", create_button_box },
{ "toolbar", create_toolbar },
{ "handle box", create_handle_box },
+ { "statusbar", create_statusbar },
{ "reparent", create_reparent },
{ "pixmap", create_pixmap },
{ "tooltips", create_tooltips },
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 50d7f27a75..4ad4ab3c76 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -782,6 +782,154 @@ make_toolbar (GtkWidget *window)
return toolbar;
}
+static guint statusbar_counter = 1;
+
+static void
+statusbar_push (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ gchar text[1024];
+
+ sprintf (text, "something %d", statusbar_counter++);
+
+ gtk_statusbar_push (statusbar, text);
+}
+
+static void
+statusbar_pop (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ gtk_statusbar_pop (statusbar);
+}
+
+static void
+statusbar_steal (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ gtk_statusbar_steal (statusbar, 4);
+}
+
+static void
+statusbar_popped (GtkStatusbar *statusbar,
+ const gchar *text)
+{
+ if (!statusbar->messages)
+ statusbar_counter = 1;
+}
+
+static void
+statusbar_dump_stack (GtkWidget *button,
+ GtkStatusbar *statusbar)
+{
+ GList *list;
+
+ for (list = statusbar->messages; list; list = list->next)
+ {
+ GtkStatusbarMsg *msg;
+
+ msg = list->data;
+ g_print ("status_id: %d, status_text: \"%s\"\n", msg->status_id, msg->text);
+ }
+}
+
+static void
+create_statusbar ()
+{
+ static GtkWidget *window = NULL;
+ GtkWidget *box1;
+ GtkWidget *box2;
+ GtkWidget *button;
+ GtkWidget *separator;
+ GtkWidget *statusbar;
+
+ if (!window)
+ {
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ gtk_signal_connect (GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroyed),
+ &window);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC (gtk_true),
+ NULL);
+
+ gtk_window_set_title (GTK_WINDOW (window), "statusbar");
+ gtk_container_border_width (GTK_CONTAINER (window), 0);
+
+
+ box1 = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (window), box1);
+ gtk_widget_show (box1);
+
+
+ box2 = gtk_vbox_new (FALSE, 10);
+ gtk_container_border_width (GTK_CONTAINER (box2), 10);
+ gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
+ gtk_widget_show (box2);
+
+ statusbar = gtk_statusbar_new ();
+ gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
+ gtk_widget_show (statusbar);
+ gtk_signal_connect (GTK_OBJECT (statusbar),
+ "text_popped",
+ GTK_SIGNAL_FUNC (statusbar_popped),
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "push something",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_push, statusbar,
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "pop",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_pop, statusbar,
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "steal #4",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_steal, statusbar,
+ NULL);
+
+ button = gtk_widget_new (gtk_button_get_type (),
+ "GtkButton::label", "dump stack",
+ "GtkWidget::visible", TRUE,
+ "GtkWidget::parent", box2,
+ "GtkObject::signal::clicked", statusbar_dump_stack, statusbar,
+ NULL);
+
+ separator = gtk_hseparator_new ();
+ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
+ gtk_widget_show (separator);
+
+
+ box2 = gtk_vbox_new (FALSE, 10);
+ gtk_container_border_width (GTK_CONTAINER (box2), 10);
+ gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
+ gtk_widget_show (box2);
+
+
+ button = gtk_button_new_with_label ("close");
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC(gtk_widget_destroy),
+ GTK_OBJECT (window));
+ gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+ }
+
+ if (!GTK_WIDGET_VISIBLE (window))
+ gtk_widget_show (window);
+ else
+ gtk_widget_destroy (window);
+}
+
static void
create_handle_box ()
{
@@ -4221,6 +4369,7 @@ create_main_window ()
{ "button box", create_button_box },
{ "toolbar", create_toolbar },
{ "handle box", create_handle_box },
+ { "statusbar", create_statusbar },
{ "reparent", create_reparent },
{ "pixmap", create_pixmap },
{ "tooltips", create_tooltips },