diff -ur libwnck-2.2.0/libwnck/tasklist.c libwnck-2.2.0-multimonitor/libwnck/tasklist.c
--- libwnck-2.2.0/libwnck/tasklist.c	2002-12-01 04:55:43.000000000 +0100
+++ libwnck-2.2.0-multimonitor/libwnck/tasklist.c	2003-02-06 11:23:00.000000000 +0100
@@ -162,6 +162,9 @@
 #ifdef HAVE_STARTUP_NOTIFICATION
   SnMonitorContext *sn_context;
 #endif
+
+  gint monitor_num;
+  GdkRectangle monitor_geometry;
 };
 
 
@@ -1291,7 +1294,7 @@
 }
 
 GtkWidget*
-wnck_tasklist_new (WnckScreen *screen)
+wnck_tasklist_new_multimonitor (WnckScreen *screen, gint monitor_num)
 {
   WnckTasklist *tasklist;
 
@@ -1303,9 +1306,21 @@
 
   wnck_tasklist_set_screen (tasklist, screen);
 
+  tasklist->priv->monitor_num = monitor_num;
+  if (monitor_num != -1)
+  {
+    gdk_screen_get_monitor_geometry(_wnck_screen_get_gdk_screen (screen), monitor_num, &tasklist->priv->monitor_geometry);
+  }
+
   return GTK_WIDGET (tasklist);
 }
 
+GtkWidget*
+wnck_tasklist_new (WnckScreen *screen)
+{
+  return wnck_tasklist_new_multimonitor (screen, -1);
+}
+
 static void
 wnck_tasklist_free_tasks (WnckTasklist *tasklist)
 {
@@ -1357,6 +1372,8 @@
   WnckWorkspace *active_workspace;
   WnckTask *app_task;
   WnckTask *win_task;
+  gboolean on_active_monitor;
+  int x, y, w, h;
 
   wnck_tasklist_free_tasks (tasklist);
   
@@ -1368,12 +1385,24 @@
     {
       WnckWindowState state;
       win = WNCK_WINDOW (l->data);
+      
+      if (tasklist->priv->monitor_num == -1)
+      {
+        on_active_monitor = TRUE;
+      }
+      else
+      {
+        wnck_window_get_geometry (win, &x, &y, &w, &h);
+        on_active_monitor = gdk_region_point_in (gdk_region_rectangle (
+          &tasklist->priv->monitor_geometry), x + w / 2, y + h / 2);
+      }
 
       state = wnck_window_get_state (win);
       if ((state & WNCK_WINDOW_STATE_SKIP_TASKLIST) == 0 &&
 	  (tasklist->priv->include_all_workspaces ||
 	   active_workspace == NULL ||
-	   wnck_window_is_on_workspace (win, active_workspace)))
+	   wnck_window_is_on_workspace (win, active_workspace)) &&
+             on_active_monitor)
 	{
 	  win_task = wnck_task_new_from_window (tasklist, win);
 	  tasklist->priv->windows = g_list_prepend (tasklist->priv->windows, win_task);
@@ -1568,12 +1597,55 @@
 }
 
 static void
+wnck_tasklist_window_changed_geometry (WnckWindow   *window,
+					WnckTasklist *tasklist)
+{
+  int x, y, w, h;
+  gboolean       need_update;
+  GList         *l;
+
+  need_update = FALSE;
+
+  if (tasklist->priv->monitor_num == -1)
+  {
+    need_update = FALSE;
+  }
+  else
+  {
+    wnck_window_get_geometry (window, &x, &y, &w, &h);
+    need_update = gdk_region_point_in (gdk_region_rectangle (
+      &tasklist->priv->monitor_geometry), x + w / 2, y + h / 2);
+  }
+  
+  l = tasklist->priv->windows;
+  while (!need_update && l != NULL)
+    {
+      WnckTask *task = l->data;
+
+      if (task->type == WNCK_TASK_WINDOW &&
+          task->window == window)
+        need_update = TRUE;
+
+      l = l->next;
+    }
+
+  if (need_update)
+    {
+      wnck_tasklist_update_lists (tasklist);
+      gtk_widget_queue_resize (GTK_WIDGET (tasklist));
+    }
+}
+
+static void
 wnck_tasklist_connect_window (WnckTasklist *tasklist,
 			      WnckWindow   *window)
 {
   g_signal_connect_object (window, "workspace_changed",
 			   G_CALLBACK (wnck_tasklist_window_changed_workspace),
 			   tasklist, 0);
+  g_signal_connect_object (window, "geometry_changed",
+			   G_CALLBACK (wnck_tasklist_window_changed_geometry),
+			   tasklist, 0);
 }
 
 static void
diff -ur libwnck-2.2.0/libwnck/tasklist.h libwnck-2.2.0-multimonitor/libwnck/tasklist.h
--- libwnck-2.2.0/libwnck/tasklist.h	2002-12-01 04:55:43.000000000 +0100
+++ libwnck-2.2.0-multimonitor/libwnck/tasklist.h	2003-02-06 11:23:08.000000000 +0100
@@ -59,6 +59,7 @@
 GType wnck_tasklist_get_type (void) G_GNUC_CONST;
 
 GtkWidget *wnck_tasklist_new (WnckScreen *screen);
+GtkWidget *wnck_tasklist_new_multimonitor (WnckScreen *screen, gint monitor_num);
 void       wnck_tasklist_set_screen (WnckTasklist *tasklist,
 				     WnckScreen   *screen);
 const int *wnck_tasklist_get_size_hint_list (WnckTasklist  *tasklist,
Only in libwnck-2.2.0-multimonitor/libwnck: tasklist.h~
diff -ur libwnck-2.2.0/libwnck/test-tasklist.c libwnck-2.2.0-multimonitor/libwnck/test-tasklist.c
--- libwnck-2.2.0/libwnck/test-tasklist.c	2002-05-14 18:55:38.000000000 +0200
+++ libwnck-2.2.0-multimonitor/libwnck/test-tasklist.c	2003-02-06 11:03:57.000000000 +0100
@@ -30,7 +30,7 @@
                     G_CALLBACK (gtk_main_quit),
                     NULL);
 
-  tasklist = wnck_tasklist_new (screen);
+  tasklist = wnck_tasklist_new_multimonitor (screen, 0);
 
   wnck_tasklist_set_grouping (WNCK_TASKLIST (tasklist), WNCK_TASKLIST_AUTO_GROUP);
   frame = gtk_frame_new (NULL);
diff -ur libwnck-2.2.0/libwnck/xutils.c libwnck-2.2.0-multimonitor/libwnck/xutils.c
--- libwnck-2.2.0/libwnck/xutils.c	2002-12-01 04:55:43.000000000 +0100
+++ libwnck-2.2.0-multimonitor/libwnck/xutils.c	2003-02-06 11:06:08.000000000 +0100
@@ -726,12 +726,17 @@
 
     case ConfigureNotify:
       {
+        WnckScreen *screen;
         WnckWindow *window;
         
         window = wnck_window_get (xevent->xconfigure.window);
         
         if (window)
           _wnck_window_process_configure_notify (window, xevent);
+          
+        screen = wnck_screen_get_default ();
+        if (screen != NULL)
+          _wnck_screen_process_property_notify (screen, xevent);
       }
       break;
 
