void PopupMenuGtk::show(const IntRect& rect, FrameView* view, int index) { ASSERT(client()); if (!m_popup) { m_popup = GtkPopupMenu::create(); g_signal_connect(m_popup->platformMenu(), "unmap", G_CALLBACK(PopupMenuGtk::menuUnmapped), this); } else m_popup->clear(); const int size = client()->listSize(); for (int i = 0; i < size; ++i) { if (client()->itemIsSeparator(i)) m_popup->appendSeparator(); else { GRefPtr<GtkAction> action = adoptGRef(createGtkActionForMenuItem(i)); m_popup->appendItem(action.get()); } } IntPoint menuPosition = convertWidgetPointToScreenPoint(GTK_WIDGET(view->hostWindow()->platformPageClient()), view->contentsToWindow(rect.location())); menuPosition.move(0, rect.height()); GOwnPtr<GdkEvent> currentEvent(gtk_get_current_event()); m_popup->popUp(rect.size(), menuPosition, size, index, currentEvent.get()); // GTK can refuse to actually open the menu when mouse grabs fails. // Ensure WebCore does not go into some pesky state. if (!gtk_widget_get_visible(m_popup->platformMenu())) client()->popupDidHide(); }
void PopupMenuGtk::show(const IntRect& rect, FrameView* view, int index) { ASSERT(client()); if (!m_popup) { m_popup = GtkPopupMenu::create(); g_signal_connect(m_popup->platformMenu(), "unmap", G_CALLBACK(PopupMenuGtk::menuUnmapped), this); } else m_popup->clear(); const int size = client()->listSize(); for (int i = 0; i < size; ++i) { if (client()->itemIsSeparator(i)) m_popup->appendSeparator(); else { GRefPtr<GtkAction> action = adoptGRef(createGtkActionForMenuItem(i)); m_popup->appendItem(action.get()); } } IntPoint menuPosition = convertWidgetPointToScreenPoint(GTK_WIDGET(view->hostWindow()->platformPageClient()), view->contentsToWindow(rect.location())); menuPosition.move(0, rect.height()); m_popup->popUp(rect.size(), menuPosition, size, index, gtk_get_current_event()); }
void WebPopupMenuProxyGtk::populatePopupMenu(const Vector<WebPopupItem>& items) { int itemIndex = 0; for (const auto& item : items) { if (item.m_type == WebPopupItem::Separator) { GtkWidget* menuItem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(m_popup), menuItem); gtk_widget_show(menuItem); } else { GRefPtr<GtkAction> action = adoptGRef(createGtkActionForMenuItem(item, itemIndex)); GtkWidget* menuItem = gtk_action_create_menu_item(action.get()); gtk_widget_set_tooltip_text(menuItem, gtk_action_get_tooltip(action.get())); g_signal_connect(menuItem, "select", G_CALLBACK(selectItemCallback), this); gtk_menu_shell_append(GTK_MENU_SHELL(m_popup), menuItem); if (gtk_action_is_visible(action.get())) gtk_widget_show(menuItem); } itemIndex++; } }