| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/gtk/menu_bar_helper.h" | 5 #include "chrome/browser/ui/gtk/menu_bar_helper.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "chrome/browser/ui/gtk/gtk_util.h" | 10 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 11 #include "ui/base/gtk/gtk_signal_registrar.h" | 11 #include "ui/base/gtk/gtk_signal_registrar.h" |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 // Recursively find all the GtkMenus that are attached to menu item |child| | 15 // Recursively find all the GtkMenus that are attached to menu item |child| |
| 16 // and add them to |data|, which is a vector of GtkWidgets. | 16 // and add them to |data|, which is a vector of GtkWidgets. |
| 17 void PopulateSubmenus(GtkWidget* child, gpointer data) { | 17 void PopulateSubmenus(GtkWidget* child, gpointer data) { |
| 18 std::vector<GtkWidget*>* submenus = | 18 std::vector<GtkWidget*>* submenus = |
| 19 static_cast<std::vector<GtkWidget*>*>(data); | 19 static_cast<std::vector<GtkWidget*>*>(data); |
| 20 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(child)); | 20 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(child)); |
| 21 if (submenu) { | 21 if (submenu) { |
| 22 submenus->push_back(submenu); | 22 submenus->push_back(submenu); |
| 23 gtk_container_foreach(GTK_CONTAINER(submenu), PopulateSubmenus, submenus); | 23 gtk_container_foreach(GTK_CONTAINER(submenu), PopulateSubmenus, submenus); |
| 24 } | 24 } |
| 25 } | 25 } |
| 26 | 26 |
| 27 // Is the cursor over |menu| or one of its parent menus? | 27 // Is the cursor over |menu| or one of its parent menus? |
| 28 bool MotionIsOverMenu(GtkWidget* menu, GdkEventMotion* motion) { | 28 bool MotionIsOverMenu(GtkWidget* menu, GdkEventMotion* motion) { |
| 29 GtkAllocation allocation; |
| 30 gtk_widget_get_allocation(menu, &allocation); |
| 31 |
| 29 if (motion->x >= 0 && motion->y >= 0 && | 32 if (motion->x >= 0 && motion->y >= 0 && |
| 30 motion->x < menu->allocation.width && | 33 motion->x < allocation.width && |
| 31 motion->y < menu->allocation.height) { | 34 motion->y < allocation.height) { |
| 32 return true; | 35 return true; |
| 33 } | 36 } |
| 34 | 37 |
| 35 while (menu) { | 38 while (menu) { |
| 36 GtkWidget* menu_item = gtk_menu_get_attach_widget(GTK_MENU(menu)); | 39 GtkWidget* menu_item = gtk_menu_get_attach_widget(GTK_MENU(menu)); |
| 37 if (!menu_item) | 40 if (!menu_item) |
| 38 return false; | 41 return false; |
| 39 GtkWidget* parent = gtk_widget_get_parent(menu_item); | 42 GtkWidget* parent = gtk_widget_get_parent(menu_item); |
| 40 | 43 |
| 41 if (gtk_util::WidgetContainsCursor(parent)) | 44 if (gtk_util::WidgetContainsCursor(parent)) |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 gint last_y = y; | 127 gint last_y = y; |
| 125 if (!gtk_widget_translate_coordinates( | 128 if (!gtk_widget_translate_coordinates( |
| 126 last_button, button, last_x, last_y, &x, &y)) { | 129 last_button, button, last_x, last_y, &x, &y)) { |
| 127 // |button| may not be realized. | 130 // |button| may not be realized. |
| 128 continue; | 131 continue; |
| 129 } | 132 } |
| 130 } | 133 } |
| 131 | 134 |
| 132 last_button = button; | 135 last_button = button; |
| 133 | 136 |
| 134 if (x >= 0 && y >= 0 && x < button->allocation.width && | 137 GtkAllocation allocation; |
| 135 y < button->allocation.height) { | 138 gtk_widget_get_allocation(button, &allocation); |
| 139 |
| 140 if (x >= 0 && y >= 0 && x < allocation.width && y < allocation.height) { |
| 136 if (button != button_showing_menu_) | 141 if (button != button_showing_menu_) |
| 137 delegate_->PopupForButton(button); | 142 delegate_->PopupForButton(button); |
| 138 return TRUE; | 143 return TRUE; |
| 139 } | 144 } |
| 140 } | 145 } |
| 141 | 146 |
| 142 return FALSE; | 147 return FALSE; |
| 143 } | 148 } |
| 144 | 149 |
| 145 void MenuBarHelper::OnMenuHiddenOrDestroyed(GtkWidget* menu) { | 150 void MenuBarHelper::OnMenuHiddenOrDestroyed(GtkWidget* menu) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 174 break; | 179 break; |
| 175 } | 180 } |
| 176 default: | 181 default: |
| 177 return; | 182 return; |
| 178 } | 183 } |
| 179 | 184 |
| 180 // This signal doesn't have a return value; we have to manually stop its | 185 // This signal doesn't have a return value; we have to manually stop its |
| 181 // propagation. | 186 // propagation. |
| 182 g_signal_stop_emission_by_name(menu, "move-current"); | 187 g_signal_stop_emission_by_name(menu, "move-current"); |
| 183 } | 188 } |
| OLD | NEW |