diff -Nuar libwnck-2.4.0.1/libwnck/pager.c libwnck-2.4.0.1-patch-dnd/libwnck/pager.c
--- libwnck-2.4.0.1/libwnck/pager.c	2003-04-09 14:50:07.000000000 -0300
+++ libwnck-2.4.0.1-patch-dnd/libwnck/pager.c	2003-11-04 08:37:15.000000000 -0300
@@ -31,6 +31,7 @@
 
 
 #define N_SCREEN_CONNECTIONS 11
+#define TIMEOUT_ACTIVATE 1000
 
 struct _WnckPagerPrivate
 {
@@ -59,6 +60,9 @@
   GdkPixbuf *bg_cache;
 
   int layout_manager_token;
+  guint dnd_activate;
+  WnckWindow *dnd_window;
+  WnckWorkspace *dnd_workspace;
 };
 
 enum
@@ -88,6 +92,12 @@
                                           GdkEventExpose   *event);
 static gboolean wnck_pager_button_press  (GtkWidget        *widget,
                                           GdkEventButton   *event);
+static gboolean wnck_pager_drag_motion   (GtkWidget        *widget,
+                                          GdkDragContext   *context,
+                                          gint              x,
+                                          gint              y,
+                                          guint             time);
+static gboolean wnck_pager_drag_motion_timeout (gpointer data);
 static gboolean wnck_pager_motion        (GtkWidget        *widget,
                                           GdkEventMotion   *event);
 static gboolean wnck_pager_button_release (GtkWidget        *widget,
@@ -101,6 +111,9 @@
                                           WnckScreen *screen);
 static void wnck_pager_connect_window    (WnckPager  *pager,
                                           WnckWindow *window);
+static void wnck_pager_drag_motion_leave (GtkWidget        *widget,
+                                          GdkDragContext   *context,
+                                          guint             time);
 static void wnck_pager_disconnect_screen (WnckPager  *pager);
 
 static void wnck_pager_set_layout_hint   (WnckPager  *pager);
@@ -160,6 +173,7 @@
   pager->priv->workspace_size = 48;
   pager->priv->bg_cache = NULL;
   pager->priv->layout_manager_token = WNCK_NO_MANAGER_TOKEN;
+  gtk_drag_dest_set (GTK_WIDGET(pager), 0, NULL, 0, 0);
 
   GTK_WIDGET_SET_FLAGS (GTK_WIDGET (pager), GTK_CAN_FOCUS);
 }
@@ -184,6 +198,8 @@
   widget_class->motion_notify_event = wnck_pager_motion;
   widget_class->focus = wnck_pager_focus;
   widget_class->get_accessible = wnck_pager_get_accessible;   
+  widget_class->drag_leave = wnck_pager_drag_motion_leave;
+  widget_class->drag_motion = wnck_pager_drag_motion;	
 }
 
 static void
@@ -562,6 +578,7 @@
   double width_ratio, height_ratio;
   int x, y, width, height;
   WnckWorkspace *workspace;
+  GdkRectangle unclipped_win_rect;
   
   workspace = wnck_window_get_workspace (window);
   if (workspace == NULL)
@@ -588,10 +605,12 @@
   if (height < 3)
     height = 3;
 
-  rect->x = x;
-  rect->y = y;
-  rect->width = width;
-  rect->height = height;
+  unclipped_win_rect.x = x;
+  unclipped_win_rect.y = y;
+  unclipped_win_rect.width = width;
+  unclipped_win_rect.height = height;
+
+  gdk_rectangle_intersect (workspace_rect, &unclipped_win_rect, rect);
 }
 
 static void
@@ -1031,7 +1050,7 @@
       space = wnck_screen_get_workspace (pager->priv->screen, space_number);
     }
 
-  if (space)
+  if (space && (pager->priv->display_mode != WNCK_PAGER_DISPLAY_NAME))
     {
       GList *windows;
       GList *tmp;
@@ -1077,6 +1096,89 @@
   return handled;
 }
 
+static gboolean 
+wnck_pager_drag_motion (GtkWidget          *widget,
+                              GdkDragContext     *context,
+                              gint                x,
+                              gint                y,
+                              guint               time)
+{
+  WnckPager *pager;
+  gboolean handled = FALSE;
+  int space_number;
+  WnckWorkspace *space = NULL;
+  GdkRectangle workspace_rect;
+
+  pager = WNCK_PAGER (widget);
+  if (pager->priv->dnd_activate == 0 )
+      pager->priv->dnd_activate = g_timeout_add (TIMEOUT_ACTIVATE,
+                                              wnck_pager_drag_motion_timeout,
+                                              pager);
+
+  space_number = workspace_at_point (pager, x, y, NULL, NULL);
+
+  if (space_number != -1)
+    {
+	  handled = TRUE;
+
+      get_workspace_rect (pager, space_number, &workspace_rect);
+      space = wnck_screen_get_workspace (pager->priv->screen, space_number);
+	  pager->priv->dnd_workspace = space;
+      pager->priv->dnd_window    = NULL;
+    }
+
+  if (space)
+    {
+      GList *windows;
+      GList *tmp;
+
+      windows =
+	get_windows_for_workspace_in_bottom_to_top (pager->priv->screen,
+						    space);
+      
+      /* clicks on top windows first */
+      windows = g_list_reverse (windows);
+      
+      tmp = windows;
+      while (tmp != NULL)
+	{
+	  WnckWindow *win = WNCK_WINDOW (tmp->data);
+	  GdkRectangle winrect;
+	  
+	  get_window_rect (win, &workspace_rect, &winrect);
+	  
+	  if (POINT_IN_RECT (x, y, winrect))
+	    {
+		  // wnck_window_activate (win);
+		  pager->priv->dnd_window = win;
+	      break;
+	    }
+	  
+	  tmp = tmp->next;
+	}
+      
+      g_list_free (windows);
+    }
+ 
+  gdk_drag_status (context,0,time);
+
+  return handled;
+}
+ 
+static gboolean
+wnck_pager_drag_motion_timeout (gpointer data)
+{
+  WnckPager *pager = WNCK_PAGER (data);
+ 
+  pager->priv->dnd_activate = 0;
+  if (wnck_workspace_get_number (wnck_screen_get_active_workspace ( pager->priv->screen))
+	  !=  wnck_workspace_get_number(pager->priv->dnd_workspace))
+    wnck_workspace_activate (pager->priv->dnd_workspace);
+  if(pager->priv->dnd_window && !wnck_window_is_active (pager->priv->dnd_window))
+    wnck_window_activate (pager->priv->dnd_window);
+  return FALSE;
+}
+
 static gboolean
 wnck_pager_motion (GtkWidget        *widget,
                    GdkEventMotion   *event)
@@ -1579,6 +1681,22 @@
 }
 
 static void
+wnck_pager_drag_motion_leave (GtkWidget          *widget,
+                              GdkDragContext     *context,
+                              guint               time)
+{
+  WnckPager          *pager;
+  pager = WNCK_PAGER (widget);
+  if (pager->priv->dnd_activate != 0)
+    {
+      g_source_remove (pager->priv->dnd_activate);
+      pager->priv->dnd_activate = 0;
+      pager->priv->dnd_window = 0;
+	  pager->priv->dnd_workspace = 0;
+    }
+}
+
+static void
 wnck_pager_disconnect_screen (WnckPager  *pager)
 {
   int i;
