diff --git a/src/shell-global.c b/src/shell-global.c
index c20c07c..0ab4bd5 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -817,6 +817,8 @@ update_font_options (GtkSettings  *settings,
   cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_NONE;
   gint antialias;
   cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_NONE;
+  gchar *rgba_str;
+  cairo_subpixel_order_t rgba_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
   cairo_font_options_t *options;
 
   g_object_get (settings,
@@ -824,6 +826,7 @@ update_font_options (GtkSettings  *settings,
                 "gtk-xft-antialias", &antialias,
                 "gtk-xft-hinting", &hinting,
                 "gtk-xft-hintstyle", &hint_style_str,
+                "gtk-xft-rgba", &rgba_str,
                 NULL);
 
   context = st_theme_context_get_for_stage (stage);
@@ -864,14 +867,41 @@ update_font_options (GtkSettings  *settings,
 
   cairo_font_options_set_hint_style (options, hint_style);
 
-  /* We don't want to turn on subpixel anti-aliasing; since Clutter
-   * doesn't currently have the code to support ARGB masks,
-   * generating them then squashing them back to A8 is pointless.
-   */
-  antialias_mode = (antialias < 0 || antialias) ? CAIRO_ANTIALIAS_GRAY
-                                                : CAIRO_ANTIALIAS_NONE;
+  if (!antialias)
+    {
+      antialias_mode = CAIRO_ANTIALIAS_NONE;
+      rgba_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+    }
+  else if (rgba_str == NULL)
+    {
+      antialias_mode = CAIRO_ANTIALIAS_GRAY;
+      rgba_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+    }
+  else
+    {
+      antialias_mode = CAIRO_ANTIALIAS_SUBPIXEL;
+
+      if (strcmp (rgba_str, "unknown") == 0)
+        rgba_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+      else if (strcmp (rgba_str, "rgb") == 0)
+        rgba_order = CAIRO_SUBPIXEL_ORDER_RGB;
+      else if (strcmp (rgba_str, "bgr") == 0)
+        rgba_order = CAIRO_SUBPIXEL_ORDER_BGR;
+      else if (strcmp (rgba_str, "vrgb") == 0)
+        rgba_order = CAIRO_SUBPIXEL_ORDER_VRGB;
+      else if (strcmp (rgba_str, "vbgr") == 0)
+        rgba_order = CAIRO_SUBPIXEL_ORDER_VBGR;
+      else if (strcmp (rgba_str, "none") == 0)
+        {
+          antialias_mode = CAIRO_ANTIALIAS_GRAY;
+          rgba_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+        }
+    }
+
+  g_free (rgba_str);
 
   cairo_font_options_set_antialias (options, antialias_mode);
+  cairo_font_options_set_subpixel_order (options, rgba_order);
 
   clutter_backend_set_font_options (backend, options);
   cairo_font_options_destroy (options);
@@ -909,6 +939,8 @@ shell_fonts_init (ClutterStage *stage)
                     G_CALLBACK (settings_notify_cb), stage,
                     "signal::notify::gtk-xft-hintstyle",
                     G_CALLBACK (settings_notify_cb), stage,
+                    "signal::notify::gtk-xft-rgba",
+                    G_CALLBACK (settings_notify_cb), stage,
                     NULL);
   update_font_options (settings, stage);
 }
