diff -uNr libwnck-2.3.1/libwnck/tasklist.c libwnck-2.3.1-multimonitor/libwnck/tasklist.c
--- libwnck-2.3.1/libwnck/tasklist.c	2003-04-04 08:50:10.000000000 +0200
+++ libwnck-2.3.1-multimonitor/libwnck/tasklist.c	2003-06-05 14:14:32.000000000 +0200
@@ -165,6 +165,9 @@
   SnMonitorContext *sn_context;
   guint startup_sequence_timeout;
 #endif
+
+  gint monitor_num;
+  GdkRectangle monitor_geometry;
 };
 
 
@@ -439,6 +442,8 @@
 
   tasklist->priv->minimum_width = DEFAULT_WIDTH;
   tasklist->priv->minimum_height = DEFAULT_HEIGHT;
+
+  tasklist->priv->monitor_num = -1;
 }
 
 static void
@@ -1376,23 +1381,52 @@
   WnckWorkspace *active_workspace;
   WnckTask *app_task;
   WnckTask *win_task;
+  gint monitor_num;
+  gboolean on_active_monitor;
+  int x, y, w, h;
 
   wnck_tasklist_free_tasks (tasklist);
   
   active_workspace = wnck_screen_get_active_workspace (tasklist->priv->screen);  
   windows = wnck_screen_get_windows (tasklist->priv->screen);
   
+  if (GTK_WIDGET (tasklist)->window == NULL)
+    monitor_num = -1;
+  else
+    {
+      monitor_num = gdk_screen_get_monitor_at_window (_wnck_screen_get_gdk_screen (tasklist->priv->screen),
+                                                      GTK_WIDGET (tasklist)->window);
+      if (monitor_num != tasklist->priv->monitor_num)
+        {
+          tasklist->priv->monitor_num = monitor_num;
+          gdk_screen_get_monitor_geometry (_wnck_screen_get_gdk_screen (tasklist->priv->screen),
+                                           tasklist->priv->monitor_num,
+                                           &tasklist->priv->monitor_geometry);
+        }
+    }
+
   l = windows;
   while (l != NULL)
     {
       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_in_viewport (win, active_workspace)))
+	   wnck_window_is_in_viewport (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);
@@ -1587,12 +1621,57 @@
 }
 
 static void
+wnck_tasklist_window_changed_geometry (WnckWindow   *window,
+                                       WnckTasklist *tasklist)
+{
+  int      x, y, w, h;
+  gboolean need_update;
+  GList    *l;
+  WnckTask *task;
+
+  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)
+    {
+      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 -uNr libwnck-2.3.1/libwnck/xutils.c libwnck-2.3.1-multimonitor/libwnck/xutils.c
--- libwnck-2.3.1/libwnck/xutils.c	2003-05-20 18:12:17.000000000 +0200
+++ libwnck-2.3.1-multimonitor/libwnck/xutils.c	2003-06-05 14:14:32.000000000 +0200
@@ -727,11 +727,16 @@
     case ConfigureNotify:
       {
         WnckWindow *window;
+        WnckScreen *screen;
         
         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;
 
