This patch reverts fully rev.1.50 of xstuff.c and rev.1.22 of xstuff.h, as
well as partially rev.1.302 of session.c and rev.1.176 of basep-widget.c.
The goal is to make Nautilus recognizing presence of the panel on screen,
so that it doesn't put its icons under the panel(s). For some reason,
advertized in ChangeLog _NET_WM_WORKAREA isn't recognised by Nautilus-2.0.0
available at this time.

--- gnome-panel/xstuff.c.orig	Sun Aug  4 18:30:21 2002
+++ gnome-panel/xstuff.c	Thu Aug  8 22:19:15 2002
@@ -8,46 +8,97 @@
  *          Mark McLoughlin <mark@skynet.ie>
  */
 #include <config.h>
-#include <string.h>
-
-#include <gdk/gdk.h>
 #include <gdk/gdkx.h>
+#include <string.h>
 
+#include <X11/Xmd.h>
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 
-#include "xstuff.h"
+/* Yes, yes I know, now bugger off ... */
+#define WNCK_I_KNOW_THIS_IS_UNSTABLE
+#include <libwnck/libwnck.h>
 
+#include "xstuff.h"
+#include "multiscreen-stuff.h"
+#include "basep-widget.h"
+#include "foobar-widget.h"
 #include "global-keys.h"
 
-static Atom
-panel_atom_get (Display    *display,
-		const char *atom_name)
+/*list of all panel widgets created*/
+extern GSList *panel_list;
+
+static void xstuff_setup_global_desktop_area (int left, int right,
+					int top, int bottom);
+
+#define ATOM(name) xstuff_atom_intern(GDK_DISPLAY(),name)
+/* Once we have multiple display support we need to only use
+ * the below ones */
+
+#define ATOMD(display,name) xstuff_atom_intern(display,name)
+#define ATOMEV(event,name) xstuff_atom_intern(((XAnyEvent *)event)->display,name)
+#define ATOMGDK(win,name) xstuff_atom_intern(GDK_WINDOW_XDISPLAY(win),name)
+
+Atom
+xstuff_atom_intern (Display *display, const char *name)
 {
-	static GHashTable *atom_hash;
-	Atom               retval;
+	static GHashTable *cache = NULL;
+	char *key;
+	Atom atom;
 
 	g_return_val_if_fail (display != NULL, None);
-	g_return_val_if_fail (atom_name != NULL, None);
+	g_return_val_if_fail (name != NULL, None);
+
+	if (cache == 0)
+	    cache = g_hash_table_new (g_str_hash, g_str_equal);
 
-	if (!atom_hash)
-		atom_hash = g_hash_table_new_full (
-				g_str_hash, g_str_equal, g_free, NULL);
-
-	retval = GPOINTER_TO_UINT (g_hash_table_lookup (atom_hash, atom_name));
-	if (!retval) {
-		retval = XInternAtom (display, atom_name, FALSE);
-
-		if (retval != None)
-			g_hash_table_insert (atom_hash, g_strdup (atom_name),
-					     GUINT_TO_POINTER (retval));
+	key = g_strdup_printf ("%p %s", display, name);
+
+	atom = (Atom)g_hash_table_lookup (cache, key);
+	if (atom == 0) {
+	    	atom = XInternAtom (display, name, False);
+		g_hash_table_insert (cache, key, (gpointer)atom);
+	} else {
+	   	g_free (key);
 	}
 
-	return retval;
+    	return atom;
+}
+
+void
+xstuff_init (void)
+{
+       /* setup the keys filter */
+       gdk_window_add_filter (gdk_get_default_root_window (),
+                              panel_global_keys_filter,
+                              NULL);
+
+       gdk_error_trap_push ();
+
+       xstuff_setup_global_desktop_area (0, 0, 0, 0);
+
+       gdk_error_trap_pop ();
+}
+
+void
+xstuff_set_simple_hint (GdkWindow *w, const char *name, long val)
+{
+       Atom atom = ATOMGDK (w, name);
+
+       gdk_error_trap_push ();
+
+       XChangeProperty (GDK_DISPLAY (),
+                        GDK_WINDOW_XWINDOW (w),
+                        atom, atom,
+                        32, PropModeReplace,
+                        (unsigned char*)&val, 1);
+
+       gdk_flush ();
+       gdk_error_trap_pop ();
 }
 
 /* Stolen from deskguide */
-static gpointer
+gpointer
 get_typed_property_data (Display *xdisplay,
 			 Window   xwindow,
 			 Atom     property,
@@ -156,7 +207,7 @@
         
 	data = get_typed_property_data (GDK_DISPLAY (),
 					GDK_ROOT_WINDOW (),
-					panel_atom_get (GDK_DISPLAY (), "_NET_SUPPORTED"),
+					ATOM ("_NET_SUPPORTED"),
 					XA_ATOM,
 					&size, 32);
 	if (data != NULL) {
@@ -176,11 +227,9 @@
 
 	XDeleteProperty (GDK_WINDOW_XDISPLAY (win),
 			 GDK_WINDOW_XWINDOW (win),
-			 panel_atom_get (GDK_WINDOW_XDISPLAY (win),
-					 "WM_CLIENT_LEADER"));
+			 ATOMGDK (win, "WM_CLIENT_LEADER"));
 
-	old_wmhints = XGetWMHints (GDK_WINDOW_XDISPLAY (win),
-				   GDK_WINDOW_XWINDOW (win));
+	old_wmhints = XGetWMHints (GDK_DISPLAY (), GDK_WINDOW_XWINDOW (win));
 	/* General paranoia */
 	if (old_wmhints != NULL) {
 		memcpy (&wmhints, old_wmhints, sizeof (XWMHints));
@@ -197,16 +246,124 @@
 		wmhints.input = False;
 		wmhints.initial_state = NormalState;
 	}
-
-	XSetWMHints (GDK_WINDOW_XDISPLAY (win),
+	XSetWMHints (GDK_DISPLAY (),
 		     GDK_WINDOW_XWINDOW (win),
 		     &wmhints);
 }
 
+
+static void
+xstuff_setup_global_desktop_area (int left, int right, int top, int bottom)
+{
+       long vals[4];
+       static int old_left = -1, old_right = -1, old_top = -1, old_bottom = -1;+
+       left = left >= 0 ? left : old_left;
+       right = right >= 0 ? right : old_right;
+       top = top >= 0 ? top : old_top;
+       bottom = bottom >= 0 ? bottom : old_bottom;
+
+      if (old_left == left &&
+           old_right == right &&
+           old_top == top &&
+           old_bottom == bottom)
+               return;
+
+       vals[0] = left;
+       vals[1] = right;
+       vals[2] = top;
+       vals[3] = bottom;
+
+       XChangeProperty (GDK_DISPLAY (),
+                        GDK_ROOT_WINDOW (),
+                        ATOM ("GNOME_PANEL_DESKTOP_AREA"),
+                        XA_CARDINAL,
+                        32, PropModeReplace,
+                        (unsigned char *)vals, 4);
+
+       old_left = left;
+       old_right = right;
+       old_top = top;
+       old_bottom = bottom;
+}
+
+void
+xstuff_setup_desktop_area (int screen, int left, int right, int top, int bottom)
+{
+       char *screen_atom;
+       long vals[4];
+       static int screen_width = -1, screen_height = -1;
+
+       if (screen_width < 0)
+               screen_width = gdk_screen_width ();
+       if (screen_height < 0)
+               screen_height = gdk_screen_height ();
+
+       vals[0] = left;
+       vals[1] = right;
+       vals[2] = top;
+       vals[3] = bottom;
+
+       gdk_error_trap_push ();
+
+       /* Note, when we do standard multihead and we have per screen
+        * root window, this should just set the GNOME_PANEL_DESKTOP_AREA */
+       screen_atom = g_strdup_printf ("GNOME_PANEL_DESKTOP_AREA_%d",
+                                      screen);
+       XChangeProperty (GDK_DISPLAY (),
+                        GDK_ROOT_WINDOW (),
+                        ATOM (screen_atom),
+                        XA_CARDINAL,
+                        32, PropModeReplace,
+                        (unsigned char *)vals, 4);
+
+       g_free (screen_atom);
+
+       xstuff_setup_global_desktop_area
+               ((multiscreen_x (screen)      == 0)             ? left   : -1,
+                (multiscreen_x (screen) +
+                 multiscreen_width (screen)  == screen_width)  ? right  : -1,
+                (multiscreen_y (screen)      == 0)             ? top    : -1,
+                (multiscreen_y (screen) +
+                 multiscreen_height (screen) == screen_height) ? bottom : -1);
+
+       gdk_flush ();
+       gdk_error_trap_pop ();
+}
+
+void
+xstuff_unsetup_desktop_area (void)
+{
+       int i;
+       char *screen_atom;
+
+       gdk_error_trap_push ();
+
+       XDeleteProperty (GDK_DISPLAY (),
+                        GDK_ROOT_WINDOW (),
+                        ATOM ("GNOME_PANEL_DESKTOP_AREA"));
+
+       for (i = 0; i < multiscreen_screens (); i++) {
+               screen_atom =
+                       g_strdup_printf ("GNOME_PANEL_DESKTOP_AREA_%d", i);
+
+               XDeleteProperty (GDK_DISPLAY (),
+                                GDK_ROOT_WINDOW (),
+                                ATOM (screen_atom));
+
+               g_free (screen_atom);
+       }
+
+       gdk_flush ();
+       gdk_error_trap_pop ();
+}
+
+
+
 /* This is such a broken stupid function. */   
 void
 xstuff_set_pos_size (GdkWindow *window, int x, int y, int w, int h)
 {
+	Window win = GDK_WINDOW_XWINDOW (window);
 	XSizeHints size_hints;
 	int old_x, old_y, old_w, old_h;
 
@@ -231,9 +388,7 @@
   
 	gdk_error_trap_push ();
 
-	XSetWMNormalHints (GDK_WINDOW_XDISPLAY (window),
-			   GDK_WINDOW_XWINDOW (window),
-			   &size_hints);
+	XSetWMNormalHints (GDK_DISPLAY (), win, &size_hints);
 
 	gdk_window_move_resize (window, x, y, w, h);
 
@@ -250,33 +405,29 @@
 xstuff_set_wmspec_dock_hints (GdkWindow *window,
 			      gboolean autohide)
 {
-        Atom atoms [2] = { None, None };
+	Atom atoms[2] = { None, None };
         
-	if (!autohide)
-		atoms [0] = panel_atom_get (GDK_WINDOW_XDISPLAY (window),
-					    "_NET_WM_WINDOW_TYPE_DOCK");
-	else {
-		atoms [0] = panel_atom_get (GDK_WINDOW_XDISPLAY (window),
-					    "_GNOME_WINDOW_TYPE_AUTOHIDE_PANEL");
-		atoms [1] = panel_atom_get (GDK_WINDOW_XDISPLAY (window),
-					    "_NET_WM_WINDOW_TYPE_DOCK");
+	if (autohide) {
+		atoms[0] = ATOMGDK (window, "_GNOME_WINDOW_TYPE_AUTOHIDE_PANEL");
+		atoms[1] = ATOMGDK (window, "_NET_WM_WINDOW_TYPE_DOCK");
+	} else {
+		atoms[0] = ATOMGDK (window, "_NET_WM_WINDOW_TYPE_DOCK");
 	}
 
         XChangeProperty (GDK_WINDOW_XDISPLAY (window),
                          GDK_WINDOW_XWINDOW (window),
-			 panel_atom_get (GDK_WINDOW_XDISPLAY (window),
-					 "_NET_WM_WINDOW_TYPE"),
+			 ATOMGDK (window, "_NET_WM_WINDOW_TYPE"),
                          XA_ATOM, 32, PropModeReplace,
-                         (unsigned char *) atoms, 
+			 (guchar *)atoms,
 			 autohide ? 2 : 1);
 }
 
 void
 xstuff_set_wmspec_strut (GdkWindow *window,
-			 int        left,
-			 int        right,
-			 int        top,
-			 int        bottom)
+			int left,
+			int right,
+			int top,
+			int bottom)
 {
 	long vals [4];
         
@@ -287,25 +438,15 @@
 
         XChangeProperty (GDK_WINDOW_XDISPLAY (window),
                          GDK_WINDOW_XWINDOW (window),
-			 panel_atom_get (GDK_WINDOW_XDISPLAY (window),
-					 "_NET_WM_STRUT"),
+			 ATOMGDK (window, "_NET_WM_STRUT"),
                          XA_CARDINAL, 32, PropModeReplace,
-                         (unsigned char *) vals, 4);
+			 (guchar *)vals, 4);
 }
 
 void
 xstuff_delete_property (GdkWindow *window, const char *name)
 {
-	Display *xdisplay = GDK_WINDOW_XDISPLAY (window);
-	Window   xwindow  = GDK_WINDOW_XWINDOW (window);
-
-        XDeleteProperty (xdisplay, xwindow,
-			 panel_atom_get (xdisplay, name));
-}
-
-void
-xstuff_init (void)
-{
-	gdk_window_add_filter (gdk_get_default_root_window (),
-			       panel_global_keys_filter, NULL);
+	XDeleteProperty (GDK_WINDOW_XDISPLAY (window),
+			GDK_WINDOW_XWINDOW (window),
+			ATOMGDK (window, name));
 }
--- gnome-panel/xstuff.h.orig	Fri Jun 21 02:07:59 2002
+++ gnome-panel/xstuff.h	Thu Aug  8 22:11:31 2002
@@ -1,15 +1,36 @@
-#ifndef __XSTUFF_H__
-#define __XSTUFF_H__
+#ifndef XSTUFF_H
 
-#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+
+#include <X11/Xmd.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
 
 void xstuff_init			(void);
+Atom xstuff_atom_intern                        (Display *display,
+					const char *name);
+void xstuff_set_simple_hint            (GdkWindow *w,
+					const char *name,
+					long val);
 void xstuff_delete_property		(GdkWindow *window,
 					 const char *name);
 gboolean xstuff_is_compliant_wm		(void);
 
+gpointer get_typed_property_data       (Display *xdisplay,
+					Window   xwindow,
+					Atom     property,
+					Atom     requested_type,
+					gint    *size_p,
+					guint    expected_format);
+
 void xstuff_set_no_group_and_no_input	(GdkWindow *win);
 
+void xstuff_setup_desktop_area         (int screen,
+					int left,
+					int right,
+					int top,
+					int bottom);
+
 void xstuff_unsetup_desktop_area	(void);
 void xstuff_set_pos_size		(GdkWindow *window,
 					 int x, int y,
@@ -22,4 +43,4 @@
 					 int top,
 					 int bottom);
 
-#endif /* __XSTUFF_H__ */
+#endif
--- gnome-panel/basep-widget.c.orig	Sun Aug  4 18:29:17 2002
+++ gnome-panel/basep-widget.c	Thu Aug  8 22:11:37 2002
@@ -2508,6 +2508,11 @@
 		    BASEP_WIDGET (panel)->screen == screen)
 			gtk_widget_queue_resize (panel);
 	}
+	xstuff_setup_desktop_area (screen,
+				   sb->left,
+				   sb->right,
+				   sb->top,
+				   sb->bottom);
 }
 
 static guint  queue_recalc_id = 0;
--- gnome-panel/session.c.orig	Wed Jul 31 20:02:15 2002
+++ gnome-panel/session.c	Thu Aug  8 22:11:41 2002
@@ -242,6 +242,8 @@
 
 	gnome_config_sync ();
 
+	xstuff_unsetup_desktop_area ();
+
 	panel_shell_unregister ();
 	
 	gtk_main_quit();
