diff -u -p -r libwnck-2.1.3/libwnck/tasklist.c libwnck-2.1.3-multihead/libwnck/tasklist.c
--- libwnck-2.1.3/libwnck/tasklist.c	2002-10-31 06:23:41.000000000 +0100
+++ libwnck-2.1.3-multihead/libwnck/tasklist.c	2002-11-16 13:18:12.000000000 +0100
@@ -29,6 +29,7 @@
 #include "application.h"
 #include "xutils.h"
 #include "private.h"
+#include <X11/extensions/Xinerama.h>
 
 /* TODO:
  * 
@@ -155,6 +156,9 @@ struct _WnckTasklistPrivate
   gint minimum_width;
   gint minimum_height;
 
+  gint head;
+  gint head_x, head_y, head_w, head_h;
+
 #ifdef HAVE_STARTUP_NOTIFICATION
   SnMonitorContext *sn_context;
 #endif
@@ -428,6 +432,8 @@ wnck_tasklist_init (WnckTasklist *taskli
 
   tasklist->priv->minimum_width = DEFAULT_WIDTH;
   tasklist->priv->minimum_height = DEFAULT_HEIGHT;
+
+  tasklist->priv->head = -1;
 }
 
 static void
@@ -593,6 +599,46 @@ wnck_tasklist_get_minimum_height (WnckTa
   return tasklist->priv->minimum_height;
 }
 
+void
+wnck_tasklist_set_head (WnckTasklist *tasklist, gint head)
+{
+  Display            *dpy;
+  XineramaScreenInfo *head_info;
+  gint                num_heads;
+
+  g_return_if_fail (WNCK_IS_TASKLIST (tasklist));
+
+  if (tasklist->priv->head == head)
+    return;
+
+  tasklist->priv->head = -1;
+  dpy = (Display *) GDK_DISPLAY ();
+  if (XineramaIsActive (dpy))
+  {
+    head_info = (XineramaScreenInfo *) XineramaQueryScreens (dpy, &num_heads);
+    if (head < num_heads)
+    {
+      tasklist->priv->head = head;
+      tasklist->priv->head_x = head_info[head].x_org;
+      tasklist->priv->head_y = head_info[head].y_org;
+      tasklist->priv->head_w = head_info[head].width;
+      tasklist->priv->head_h = head_info[head].height;
+    }
+  }
+
+  wnck_tasklist_update_lists (tasklist);
+
+  gtk_widget_queue_resize (GTK_WIDGET (tasklist));
+}
+ 
+gint
+wnck_tasklist_get_head (WnckTasklist *tasklist)
+{
+  g_return_val_if_fail (WNCK_IS_TASKLIST (tasklist), 0);
+	
+  return tasklist->priv->head;
+}
+
 /* returns the maximal possible button width (i.e. if you
  * don't want to stretch the buttons to fill the alloctions
  * the width can be smaller) */
@@ -1323,6 +1369,8 @@ wnck_tasklist_update_lists (WnckTasklist
   WnckWorkspace *active_workspace;
   WnckTask *app_task;
   WnckTask *win_task;
+  gboolean on_active_head;
+  int x,y,w,h;
 
   wnck_tasklist_free_tasks (tasklist);
   
@@ -1335,11 +1383,27 @@ wnck_tasklist_update_lists (WnckTasklist
       WnckWindowState state;
       win = WNCK_WINDOW (l->data);
 
+      wnck_window_get_geometry(win, &x, &y, &w, &h);
+      if (tasklist->priv->head < 0)
+      {
+        on_active_head = 1;
+      }
+      else
+      {
+        x += w / 2;
+        y += h / 2;
+        on_active_head = (x >= tasklist->priv->head_x
+                          && x < tasklist->priv->head_x + tasklist->priv->head_w
+                          && y >= tasklist->priv->head_y
+                          && y < tasklist->priv->head_y + tasklist->priv->head_h);
+     }
+
       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_head)
 	{
 	  win_task = wnck_task_new_from_window (tasklist, win);
 	  tasklist->priv->windows = g_list_prepend (tasklist->priv->windows, win_task);
@@ -1495,6 +1559,14 @@ wnck_tasklist_active_workspace_changed (
 }
 
 static void
+wnck_tasklist_window_changed_geometry (WnckWindow   *window,
+                                       WnckTasklist *tasklist)
+{
+  wnck_tasklist_update_lists (tasklist);
+  gtk_widget_queue_resize (GTK_WIDGET (tasklist));
+}
+
+static void
 wnck_tasklist_window_changed_workspace (WnckWindow   *window,
 					WnckTasklist *tasklist)
 {
@@ -1540,6 +1612,9 @@ wnck_tasklist_connect_window (WnckTaskli
   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
Only in libwnck-2.1.3-multihead/libwnck: tasklist.c~
diff -u -p -r libwnck-2.1.3/libwnck/tasklist.h libwnck-2.1.3-multihead/libwnck/tasklist.h
--- libwnck-2.1.3/libwnck/tasklist.h	2002-09-16 07:54:44.000000000 +0200
+++ libwnck-2.1.3-multihead/libwnck/tasklist.h	2002-11-16 12:30:33.000000000 +0100
@@ -76,6 +76,9 @@ void wnck_tasklist_set_minimum_width (Wn
 gint wnck_tasklist_get_minimum_width (WnckTasklist *tasklist);
 void wnck_tasklist_set_minimum_height (WnckTasklist *tasklist, gint size);
 gint wnck_tasklist_get_minimum_height (WnckTasklist *tasklist);
+
+void wnck_tasklist_set_head (WnckTasklist *tasklist, gint head);
+gint wnck_tasklist_get_head (WnckTasklist *tasklist);
     
 G_END_DECLS
 
Only in libwnck-2.1.3-multihead/libwnck: tasklist.h~
diff -u -p -r libwnck-2.1.3/libwnck/xutils.c libwnck-2.1.3-multihead/libwnck/xutils.c
--- libwnck-2.1.3/libwnck/xutils.c	2002-11-03 18:37:52.000000000 +0100
+++ libwnck-2.1.3-multihead/libwnck/xutils.c	2002-11-16 12:30:33.000000000 +0100
@@ -695,6 +695,7 @@ filter_func (GdkXEvent  *gdkxevent,
              GdkEvent   *event,
              gpointer    data)
 {
+  WnckScreen *screen;
   XEvent *xevent = gdkxevent;
   int i;
   
@@ -702,8 +703,6 @@ filter_func (GdkXEvent  *gdkxevent,
     {
     case PropertyNotify:
       {
-        WnckScreen *screen;
-        
         screen = wnck_screen_get_for_root (xevent->xany.window);
         if (screen != NULL)
           _wnck_screen_process_property_notify (screen, xevent);
@@ -732,6 +731,12 @@ filter_func (GdkXEvent  *gdkxevent,
         
         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;
 
Only in libwnck-2.1.3-multihead/libwnck: xutils.c~
