diff -Naur metacity-2.24.0.orig/src/core/workspace.c metacity-2.24.0.switcher_wrap/src/core/workspace.c
--- metacity-2.24.0.orig/src/core/workspace.c	2008-09-22 09:19:52.000000000 -0600
+++ metacity-2.24.0.switcher_wrap/src/core/workspace.c	2009-10-07 00:29:33.000000000 -0600
@@ -777,6 +777,12 @@
       break;
     }
 
+  // new(cx1): experimental edge wrapping feature
+  // todo: use a pref to choose the new non-default mode
+  // note: probably something like -
+  //       if (meta_prefs_get_switcher_wrap_mode () == META_SWITCHER_WRAP_TRUE/true...
+
+  /*
   if (layout.current_col < 0)
     layout.current_col = 0;
   if (layout.current_col >= layout.cols)
@@ -785,6 +791,59 @@
     layout.current_row = 0;
   if (layout.current_row >= layout.rows)
     layout.current_row = layout.rows - 1;
+  */
+
+  // left edge condition
+  if (layout.current_col < 0) {
+    if (layout.current_row <= 0) {
+      // nowhere to wrap to
+      layout.current_row = 0;
+      layout.current_col = 0;
+    } else {
+      // wrap
+      layout.current_row -= 1;
+      layout.current_col = layout.cols - 1;
+    }
+  }
+
+  // right edge condition
+  if (layout.current_col >= layout.cols) {
+    if (layout.current_row >= (layout.rows - 1)) {
+      // nowhere to wrap to
+      layout.current_row = layout.rows - 1;
+      layout.current_col = layout.cols - 1;
+    } else {
+      // wrap
+      layout.current_row += 1;
+      layout.current_col = 0;
+    }
+  }
+
+  // top edge condition
+  if (layout.current_row < 0) {
+    if (layout.current_col <= 0) {
+      // nowhere to wrap to
+      layout.current_row = 0;
+      layout.current_col = 0;
+    } else {
+      // wrap
+      layout.current_row = layout.rows - 1;
+      layout.current_col -= 1;
+    }
+  }
+
+  // bottom edge condition
+  if (layout.current_row >= layout.rows) {
+    if (layout.current_col >= (layout.cols - 1)) {
+      // nowhere to wrap to
+      layout.current_row = layout.rows - 1;
+      layout.current_col = layout.cols - 1;
+    } else {
+      // wrap
+      layout.current_row = 0;
+      layout.current_col += 1;
+    }
+  }
 
   i = layout.grid[layout.current_row * layout.cols + layout.current_col];
 
