diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index ccda6ad..160d982 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -1,5 +1,6 @@
 /* gtkcombobox.c
  * Copyright (C) 2002, 2003  Kristian Rietveld <kris@gtk.org>
+ * Copyright (C) 2015 Leslie Zhai <xiang.zhai@i-soft.com.cn>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -159,6 +160,9 @@ struct _GtkComboBoxPrivate
   GdkDevice *grab_keyboard;
 
   gchar *tearoff_title;
+
+  guint y_root;
+  guint active_item;
 };
 
 /* While debugging this evil code, I have learned that
@@ -1125,6 +1129,9 @@ gtk_combo_box_init (GtkComboBox *combo_box)
   priv->text_column = -1;
   priv->text_renderer = NULL;
   priv->id_column = -1;
+
+  priv->y_root = 0;
+  priv->active_item = 0;
 }
 
 static void
@@ -1898,6 +1905,14 @@ gtk_combo_box_menu_position_below (GtkMenu  *menu,
    *push_in = FALSE;
 }
 
+static void m_get_monitor_geo(GdkRectangle *r)
+{
+  GdkDisplay *display = gdk_display_get_default();
+  GdkScreen *screen = gdk_display_get_default_screen(display);
+  gint mon_id = gdk_screen_get_primary_monitor(screen);
+  gdk_screen_get_monitor_geometry(screen, mon_id, r);
+}
+
 static void
 gtk_combo_box_menu_position_over (GtkMenu  *menu,
                                   gint     *x,
@@ -1916,6 +1931,7 @@ gtk_combo_box_menu_position_over (GtkMenu  *menu,
   gint            menu_xpos;
   gint            menu_ypos;
   gint            menu_width;
+  GdkRectangle    display_rect;
 
   combo_box = GTK_COMBO_BOX (user_data);
   widget = GTK_WIDGET (combo_box);
@@ -1956,6 +1972,13 @@ gtk_combo_box_menu_position_over (GtkMenu  *menu,
       children = children->next;
     }
 
+  gtk_widget_get_allocation(GTK_WIDGET(menu), &allocation);
+  m_get_monitor_geo(&display_rect);
+  if (display_rect.height - combo_box->priv->y_root < allocation.height) {
+    menu_ypos -= allocation.height;
+    menu_ypos += combo_box->priv->active_item * child_allocation.height;
+  }
+
   if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
     menu_xpos = menu_xpos + allocation.width - menu_width;
 
@@ -2244,6 +2267,7 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box,
     }
 
   /* FIXME handle nested menus better */
+  priv->active_item = active_item;
   gtk_menu_set_active (GTK_MENU (priv->popup_widget), active_item);
 
   if (priv->wrap_width == 0)
@@ -3237,6 +3261,8 @@ gtk_combo_box_menu_button_press (GtkWidget      *widget,
           !gtk_widget_has_focus (priv->button))
         gtk_widget_grab_focus (priv->button);
 
+      priv->y_root = event->y_root;
+
       gtk_combo_box_menu_popup (combo_box, event->button, event->time);
 
       return TRUE;
