Index: src/workspace.c
===================================================================
--- src/workspace.c	(revision 3194)
+++ src/workspace.c	(working copy)
@@ -721,6 +721,7 @@
 {
   MetaWorkspaceLayout layout;  
   int i, current_space, num_workspaces;
+  gboolean ltr;
 
   current_space = meta_workspace_index (workspace);
   num_workspaces = meta_screen_get_n_workspaces (workspace->screen);
@@ -730,13 +731,15 @@
   meta_verbose ("Getting neighbor of %d in direction %s\n",
                 current_space, meta_motion_direction_to_string (direction));
   
+  ltr = meta_ui_get_direction() == META_UI_DIRECTION_LTR;
+
   switch (direction) 
     {
     case META_MOTION_LEFT:
-      layout.current_col -= 1;
+      layout.current_col -= ltr ? 1 : -1;
       break;
     case META_MOTION_RIGHT:
-      layout.current_col += 1;
+      layout.current_col += ltr ? 1 : -1;
       break;
     case META_MOTION_UP:
       layout.current_row -= 1;
Index: src/menu.c
===================================================================
--- src/menu.c	(revision 3194)
+++ src/menu.c	(working copy)
@@ -116,7 +116,10 @@
 
   *x = pos->x;
   *y = pos->y;
-  
+ 
+  if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
+    *x = MAX (0, *x - req.width); 
+
   /* Ensure onscreen */
   *x = CLAMP (*x, 0, MAX (0, gdk_screen_width () - req.width));
   *y = CLAMP (*y, 0, MAX (0, gdk_screen_height () - req.height));
Index: src/ui.c
===================================================================
--- src/ui.c	(revision 3194)
+++ src/ui.c	(working copy)
@@ -952,3 +952,12 @@
 
   return threshold;
 }
+
+MetaUIDirection
+meta_ui_get_direction (void)
+{
+  if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL)
+    return META_UI_DIRECTION_RTL;
+
+  return META_UI_DIRECTION_LTR;
+}
Index: src/ui.h
===================================================================
--- src/ui.h	(revision 3194)
+++ src/ui.h	(working copy)
@@ -40,6 +40,12 @@
 
 typedef gboolean (* MetaEventFunc) (XEvent *xevent, gpointer data);
 
+typedef enum
+{
+  META_UI_DIRECTION_LTR,
+  META_UI_DIRECTION_RTL
+} MetaUIDirection;
+
 void meta_ui_init (int *argc, char ***argv);
 
 Display* meta_ui_get_display (void);
@@ -194,6 +200,8 @@
 
 int      meta_ui_get_drag_threshold       (MetaUI *ui);
 
+MetaUIDirection meta_ui_get_direction (void);
+
 #include "tabpopup.h"
 
 #endif
Index: src/window.c
===================================================================
--- src/window.c	(revision 3194)
+++ src/window.c	(working copy)
@@ -6477,6 +6477,7 @@
   MetaWindowMenu *menu;
   MetaWorkspaceLayout layout;
   int n_workspaces;
+  gboolean ltr;
   
   if (window->display->window_menu)
     {
@@ -6507,12 +6508,13 @@
 
   if (!window->on_all_workspaces)
     {
+      ltr = meta_ui_get_direction() == META_UI_DIRECTION_LTR;
 
       if (layout.current_col > 0)
-        ops |= META_MENU_OP_MOVE_LEFT;
+        ops |= ltr ? META_MENU_OP_MOVE_LEFT : META_MENU_OP_MOVE_RIGHT;
       if ((layout.current_col < layout.cols - 1) &&
           (layout.current_row * layout.cols + (layout.current_col + 1) < n_workspaces))
-        ops |= META_MENU_OP_MOVE_RIGHT;
+        ops |= ltr ? META_MENU_OP_MOVE_RIGHT : META_MENU_OP_MOVE_LEFT;
       if (layout.current_row > 0)
         ops |= META_MENU_OP_MOVE_UP;
       if ((layout.current_row < layout.rows - 1) &&
