diff -u libwnck/libwnck/tasklist.c libwnck.NEW/tasklist.c
--- libwnck/libwnck/tasklist.c	2003-07-11 15:37:33.000000000 -0400
+++ libwnck.NEW/tasklist.c	2003-08-21 20:17:49.000000000 -0400
@@ -182,7 +182,7 @@
 static WnckTask *wnck_task_new_from_startup_sequence (WnckTasklist      *tasklist,
                                                       SnStartupSequence *sequence);
 #endif
-
+static gboolean  urgent_timeout_callback(void*);
 static char      *wnck_task_get_text (WnckTask *task);
 static GdkPixbuf *wnck_task_get_icon (WnckTask *task);
 static gint       wnck_task_compare  (gconstpointer  a,
@@ -2153,7 +2153,26 @@
 	    wnck_task_update_visible_state (app_task);
 	}
     }
-    
+   if (changed_mask & WNCK_WINDOW_STATE_URGENT)
+     {
+       WnckTask *win_task;
+       win_task = g_hash_table_lookup (tasklist->priv->win_hash,
+       						   window);
+	if (win_task)
+	{
+	    if(new_state & WNCK_WINDOW_STATE_URGENT)
+	      g_timeout_add (1000, urgent_timeout_callback,
+	    	win_task);
+	    else 
+	    {
+	    gtk_widget_modify_bg (win_task->button, GTK_STATE_NORMAL, NULL);
+            gtk_widget_modify_bg (win_task->button, GTK_STATE_PRELIGHT, NULL);
+            gtk_widget_modify_fg (win_task->label, GTK_STATE_NORMAL, NULL);
+            gtk_widget_modify_fg (win_task->label, GTK_STATE_PRELIGHT, NULL);
+	    }
+	}
+      }
+	
 }
 
 static void
@@ -2626,7 +2645,45 @@
   else
     return TRUE;
 }
+static gboolean
+urgent_timeout_callback	(void *user_data)
+{
+ WnckTask *task = user_data;
+ GtkStyle *style;
+ GdkColor c;
+ WnckWindowState state;
+ state = wnck_window_get_state (task->window);
+
+ if(state & WNCK_WINDOW_STATE_URGENT)
+ {
+ style = gtk_widget_get_style (task->button);
+ c.pixel = 0;
+ c.red = 65535 - style->bg[GTK_STATE_NORMAL].red;
+ c.green = 65535 - style->bg[GTK_STATE_NORMAL].green;
+ c.blue = 65535 - style->bg[GTK_STATE_NORMAL].blue;
 
+ gtk_widget_modify_bg (task->button, GTK_STATE_NORMAL, &c);
+ gtk_widget_modify_bg (task->button, GTK_STATE_PRELIGHT, &c);
+ 
+ style = gtk_widget_get_style (task->label);
+ c.pixel = 0;
+ c.red = 65535 - style->fg[GTK_STATE_NORMAL].red;
+ c.green = 65535 - style->fg[GTK_STATE_NORMAL].green;
+ c.blue = 65535 - style->fg[GTK_STATE_NORMAL].blue;
+
+ gtk_widget_modify_fg (task->label, GTK_STATE_NORMAL, &c);
+ gtk_widget_modify_fg (task->label, GTK_STATE_PRELIGHT, &c);
+ }
+/* else
+ {
+ gtk_widget_modify_bg (task->button, GTK_STATE_NORMAL, NULL);
+ gtk_widget_modify_bg (task->button, GTK_STATE_PRELIGHT, NULL);
+ gtk_widget_modify_fg (task->label, GTK_STATE_NORMAL, NULL);
+ gtk_widget_modify_fg (task->label, GTK_STATE_PRELIGHT, NULL);
+ }*/
+ return (state & WNCK_WINDOW_STATE_URGENT);
+}
+ 
 static void
 wnck_tasklist_sn_event (SnMonitorEvent *event,
                         void           *user_data)
diff -u libwnck/libwnck/window.c libwnck.NEW/window.c
--- libwnck/libwnck/window.c	2003-07-20 19:43:15.000000000 -0400
+++ libwnck.NEW/window.c	2003-08-21 19:52:20.000000000 -0400
@@ -21,6 +21,7 @@
  * Boston, MA 02111-1307, USA.
  */
 
+ /* #include <stdio.h> */
 #include <string.h>
 #include "window.h"
 #include "xutils.h"
@@ -45,7 +46,8 @@
     ((window)->priv->skip_taskbar        << 5) |        \
     ((window)->priv->is_sticky           << 6) |        \
     ((window)->priv->is_hidden           << 7) |        \
-    ((window)->priv->is_fullscreen       << 8) )
+    ((window)->priv->is_fullscreen       << 8) |        \
+    ((window)->priv->is_urgent           << 9) )
 
 struct _WnckWindowPrivate
 {
@@ -95,6 +97,7 @@
   guint is_sticky : 1;
   guint is_hidden : 1;
   guint is_fullscreen : 1;
+  guint is_urgent : 1;
 
   /* _NET_WM_STATE_HIDDEN doesn't map directly into an
    * externally-visible state (it determines the WM_STATE
@@ -120,6 +123,7 @@
   guint need_update_transient_for : 1;
   guint need_update_startup_id : 1;
   guint need_update_wmclass : 1;
+  guint need_update_wmhints : 1;
 };
 
 enum {
@@ -393,6 +397,7 @@
   window->priv->need_update_transient_for = TRUE;
   window->priv->need_update_startup_id = TRUE;
   window->priv->need_update_wmclass = TRUE;
+  window->priv->need_update_wmhints = TRUE;
   force_update_now (window);
 
   return window;
@@ -1436,14 +1441,19 @@
   else if (xevent->xproperty.atom ==
            _wnck_atom_get ("_NET_WM_ICON") ||
            xevent->xproperty.atom ==
-           _wnck_atom_get ("KWM_WIN_ICON") ||
-           xevent->xproperty.atom ==
-           _wnck_atom_get ("WM_HINTS"))
+           _wnck_atom_get ("KWM_WIN_ICON"))
     {
       _wnck_icon_cache_property_changed (window->priv->icon_cache,
                                          xevent->xproperty.atom);
       queue_update (window);
     }
+  else if (xevent->xproperty.atom ==
+  	   _wnck_atom_get ("WM_HINTS"))
+   {
+       window->priv->need_update_wmhints = TRUE;
+       queue_update (window);
+   }
+
 }
 
 void
@@ -1899,6 +1909,17 @@
 }
 
 static void
+update_wmhints (WnckWindow *window)
+{
+  gboolean retval;
+  if (!window->priv->need_update_wmhints)
+    return;
+  window->priv->need_update_wmhints = FALSE;
+  retval = _wnck_read_hints(window->priv->xwindow);
+  window->priv->is_urgent = (retval ? 1 : 0);
+}
+
+static void
 force_update_now (WnckWindow *window)
 {
   WnckWindowState old_state;
@@ -1949,6 +1970,7 @@
 
   update_startup_id (window);    /* no side effects */
   update_wmclass (window);
+  update_wmhints (window);
   update_transient_for (window); /* wintype needs this to be first */
   update_wintype (window);
   update_wm_state (window);
@@ -1963,8 +1985,9 @@
   new_state = COMPRESS_STATE (window);
 
   if (old_state != new_state)
+  {
     emit_state_changed (window, old_state ^ new_state, new_state);
-
+}
   if (old_actions != window->priv->actions)
     emit_actions_changed (window, old_actions ^ window->priv->actions,
                           window->priv->actions);
diff -u libwnck/libwnck/window.h libwnck.NEW/window.h
--- libwnck/libwnck/window.h	2003-05-06 12:05:51.000000000 -0400
+++ libwnck.NEW/window.h	2003-08-21 14:34:13.000000000 -0400
@@ -42,7 +42,8 @@
   WNCK_WINDOW_STATE_SKIP_TASKLIST          = 1 << 5,
   WNCK_WINDOW_STATE_STICKY                 = 1 << 6,
   WNCK_WINDOW_STATE_HIDDEN                 = 1 << 7,
-  WNCK_WINDOW_STATE_FULLSCREEN             = 1 << 8
+  WNCK_WINDOW_STATE_FULLSCREEN             = 1 << 8,
+  WNCK_WINDOW_STATE_URGENT                 = 1 << 9
 } WnckWindowState;
 
 typedef enum
diff -u libwnck/libwnck/xutils.c libwnck.NEW/xutils.c
--- libwnck/libwnck/xutils.c	2003-07-31 05:35:29.000000000 -0400
+++ libwnck.NEW/xutils.c	2003-08-21 19:52:31.000000000 -0400
@@ -22,7 +22,7 @@
 #include <config.h>
 #include "xutils.h"
 #include <string.h>
-#include <stdio.h>
+#include <stdio.h> 
 #include "screen.h"
 #include "window.h"
 #include "private.h"
@@ -1970,6 +1970,24 @@
 }
 
 gboolean
+_wnck_read_hints (Window xwindow)
+{
+ XWMHints *hints;
+ gboolean retval;
+ retval = FALSE;
+ _wnck_error_trap_push ();
+ hints = XGetWMHints (gdk_display, xwindow);
+ _wnck_error_trap_pop ();
+ if (hints)
+        {
+		 retval  = (hints->flags & XUrgencyHint);
+      	 	 XFree (hints);
+       		 hints = NULL;
+	}
+return retval;
+}
+  
+gboolean
 _wnck_read_icons (Window         xwindow,
                   WnckIconCache *icon_cache,
                   GdkPixbuf    **iconp,
diff -u libwnck/libwnck/xutils.h libwnck.NEW/xutils.h
--- libwnck/libwnck/xutils.h	2003-04-04 01:50:10.000000000 -0500
+++ libwnck.NEW/xutils.h	2003-08-21 17:30:36.000000000 -0400
@@ -137,6 +137,7 @@
 void           _wnck_icon_cache_set_want_fallback    (WnckIconCache *icon_cache,
                                                       gboolean       setting);
 gboolean       _wnck_icon_cache_get_is_fallback      (WnckIconCache *icon_cache);
+gboolean _wnck_read_hints (Window xwindow);
 
 gboolean _wnck_read_icons         (Window          xwindow,
                                    WnckIconCache  *icon_cache,
