Index: gedit-statusbar.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/Attic/gedit-statusbar.c,v retrieving revision 1.1.2.11 diff -u -p -r1.1.2.11 gedit-statusbar.c --- gedit-statusbar.c 11 Oct 2005 20:46:30 -0000 1.1.2.11 +++ gedit-statusbar.c 14 Nov 2005 10:11:08 -0000 @@ -53,8 +53,13 @@ struct _GeditStatusbarPrivate GtkWidget *error_frame; GtkWidget *error_event_box; - + GeditTooltips *tooltips; + + /* tmp flash timeout data */ + guint flash_timeout; + guint flash_context_id; + guint flash_message_id; }; G_DEFINE_TYPE(GeditStatusbar, gedit_statusbar, GTK_TYPE_STATUSBAR) @@ -83,6 +88,9 @@ gedit_statusbar_finalize (GObject *objec g_object_unref (statusbar->priv->tooltips); + if (statusbar->priv->flash_timeout > 0) + g_source_remove (statusbar->priv->flash_timeout); + G_OBJECT_CLASS (gedit_statusbar_parent_class)->finalize (object); } @@ -294,23 +302,15 @@ gedit_statusbar_set_cursor_position (Ged g_free (msg); } - -/* utility struct */ -typedef struct { - GtkStatusbar *statusbar; - guint context_id; - guint message_id; -} FlashInfo; - -static const guint32 flash_length = 3000; - static gboolean -remove_message_timeout (FlashInfo * fi) +remove_message_timeout (GeditStatusbar *statusbar) { - gtk_statusbar_remove (fi->statusbar, fi->context_id, fi->message_id); - g_free (fi); + gtk_statusbar_remove (GTK_STATUSBAR (statusbar), + statusbar->priv->flash_context_id, + statusbar->priv->flash_message_id); /* remove the timeout */ + statusbar->priv->flash_timeout = 0; return FALSE; } @@ -327,8 +327,8 @@ gedit_statusbar_flash_message (GeditStat guint context_id, const gchar *format, ...) { + const guint32 flash_length = 3000; /* three seconds */ va_list args; - FlashInfo *fi; gchar *msg; g_return_if_fail (GEDIT_IS_STATUSBAR (statusbar)); @@ -338,12 +338,22 @@ gedit_statusbar_flash_message (GeditStat msg = g_strdup_vprintf (format, args); va_end (args); - fi = g_new (FlashInfo, 1); - fi->statusbar = GTK_STATUSBAR (statusbar); - fi->context_id = context_id; - fi->message_id = gtk_statusbar_push (fi->statusbar, fi->context_id, msg); - - g_timeout_add (flash_length, (GtkFunction) remove_message_timeout, fi); + /* remove a currently ongoing flash message */ + g_source_remove (statusbar->priv->flash_timeout); + statusbar->priv->flash_timeout = 0; + + gtk_statusbar_remove (GTK_STATUSBAR (statusbar), + statusbar->priv->flash_context_id, + statusbar->priv->flash_message_id); + + statusbar->priv->flash_context_id = context_id; + statusbar->priv->flash_message_id = gtk_statusbar_push (GTK_STATUSBAR (statusbar), + context_id, + msg); + + statusbar->priv->flash_timeout = g_timeout_add (flash_length, + (GtkFunction) remove_message_timeout, + statusbar); g_free (msg); }