summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-30 20:53:24 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-30 20:53:24 +0000
commitfc88d33d2850a2aa30018dea93db021b2408c342 (patch)
tree4c8ae35975d97d4809da6f526f0264efb693b80f /views
parent644bdcae0edf0cfa3ac9644edf3b52a0d3162489 (diff)
downloadchromium_src-fc88d33d2850a2aa30018dea93db021b2408c342.zip
chromium_src-fc88d33d2850a2aa30018dea93db021b2408c342.tar.gz
chromium_src-fc88d33d2850a2aa30018dea93db021b2408c342.tar.bz2
Makes sure gtk menus fit on screen before showing them.
BUG=none TEST=none Review URL: http://codereview.chromium.org/434106 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33328 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/controls/menu/native_menu_gtk.cc16
1 files changed, 12 insertions, 4 deletions
diff --git a/views/controls/menu/native_menu_gtk.cc b/views/controls/menu/native_menu_gtk.cc
index 42284f9..f3e303b 100644
--- a/views/controls/menu/native_menu_gtk.cc
+++ b/views/controls/menu/native_menu_gtk.cc
@@ -258,14 +258,22 @@ void NativeMenuGtk::MenuPositionFunc(GtkMenu* menu,
gboolean* push_in,
void* data) {
Position* position = reinterpret_cast<Position*>(data);
+
+ GtkRequisition menu_req;
+ gtk_widget_size_request(GTK_WIDGET(menu), &menu_req);
+
// TODO(beng): RTL
*x = position->point.x();
*y = position->point.y();
- if (position->alignment == Menu2::ALIGN_TOPRIGHT) {
- GtkRequisition menu_req;
- gtk_widget_size_request(GTK_WIDGET(menu), &menu_req);
+ if (position->alignment == Menu2::ALIGN_TOPRIGHT)
*x -= menu_req.width;
- }
+
+ // Make sure the popup fits on screen.
+ GdkScreen* screen = gtk_widget_get_screen(GTK_WIDGET(menu));
+ *x = std::max(0, std::min(gdk_screen_get_width(screen) - menu_req.width, *x));
+ *y = std::max(0, std::min(gdk_screen_get_height(screen) - menu_req.height,
+ *y));
+
*push_in = FALSE;
}