diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index adf3c92..15b678b 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -38,6 +38,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <math.h>
 
 
 #include <glib.h>
@@ -3567,7 +3568,11 @@ gtk_rc_parse_font_name (GScanner   *scanner,
 			GtkRcStyle *rc_style)
 {
   guint token;
-  
+  gint old_size;
+  gchar* font_name;
+  gchar* size_name;
+  gdouble size;
+
   token = g_scanner_get_next_token (scanner);
   if (token != GTK_RC_TOKEN_FONT_NAME)
     return GTK_RC_TOKEN_FONT;
@@ -3581,11 +3586,45 @@ gtk_rc_parse_font_name (GScanner   *scanner,
     return G_TOKEN_STRING;
 
   if (rc_style->font_desc)
-    pango_font_description_free (rc_style->font_desc);
+    {
+      old_size = pango_font_description_get_size (rc_style->font_desc);
+      pango_font_description_free (rc_style->font_desc);
+    }
+  else
+    old_size = PANGO_SCALE * 10;
+
+  font_name = scanner->value.v_string;
+  size = 0;
+
+  if ((size_name = g_strrstr (font_name, " ")))
+    size_name++;
+  else
+    size_name = font_name;
+
+  if (size_name && *size_name)
+    {
+      if (size_name[0] == '+')
+        {
+          size = g_ascii_strtod (size_name, NULL);
+          size = old_size * pow (1.2, size);
+        }
+      else if (size_name[0] == '-')
+        {
+          size = g_ascii_strtod (size_name, NULL) * -1;
+          size = old_size * pow (1 / 1.2, size);
+        }
+
+      if (size)
+        {
+          size_name--;
+          size_name[0] = '\0';
+        }
+    }
+
+  rc_style->font_desc = pango_font_description_from_string (font_name);
+  if (size)
+    pango_font_description_set_size (rc_style->font_desc, size);
 
-  rc_style->font_desc = 
-    pango_font_description_from_string (scanner->value.v_string);
-  
   return G_TOKEN_NONE;
 }
 
