diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-08-21 10:57:44 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-08-21 10:57:44 +0200 |
commit | 5ef7c8a6a70875d4430752d146bdcb069605d71d (patch) | |
tree | f6256640b6c46d7da221435803cae65326817ba2 /Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp | |
parent | decad929f578d8db641febc8740649ca6c574638 (diff) | |
download | qtwebkit-5ef7c8a6a70875d4430752d146bdcb069605d71d.tar.gz |
Imported WebKit commit 356d83016b090995d08ad568f2d2c243aa55e831 (http://svn.webkit.org/repository/webkit/trunk@126147)
New snapshot including various build fixes for newer Qt 5
Diffstat (limited to 'Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp | 68 |
1 files changed, 62 insertions, 6 deletions
diff --git a/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp b/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp index 236ffca05..ed2b4df8f 100644 --- a/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp +++ b/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp @@ -53,22 +53,78 @@ static void contextMenuItemActivatedCallback(GtkAction* action, WebPageProxy* pa page->contextMenuItemSelected(item); } +static void contextMenuItemVisibilityChanged(GtkAction* action, GParamSpec*, WebContextMenuProxyGtk* contextMenuProxy) +{ + GtkMenu* menu = contextMenuProxy->gtkMenu(); + if (!menu) + return; + + GOwnPtr<GList> items(gtk_container_get_children(GTK_CONTAINER(menu))); + bool previousVisibleItemIsNotASeparator = false; + GtkWidget* lastItemVisibleSeparator = 0; + for (GList* iter = items.get(); iter; iter = g_list_next(iter)) { + GtkWidget* widget = GTK_WIDGET(iter->data); + + if (GTK_IS_SEPARATOR_MENU_ITEM(widget)) { + if (previousVisibleItemIsNotASeparator) { + gtk_widget_show(widget); + lastItemVisibleSeparator = widget; + previousVisibleItemIsNotASeparator = false; + } else + gtk_widget_hide(widget); + } else if (gtk_widget_get_visible(widget)) { + lastItemVisibleSeparator = 0; + previousVisibleItemIsNotASeparator = true; + } + } + + if (lastItemVisibleSeparator) + gtk_widget_hide(lastItemVisibleSeparator); +} + void WebContextMenuProxyGtk::append(ContextMenuItem& menuItem) { GtkAction* action = menuItem.gtkAction(); - - if (action && (menuItem.type() == ActionType || menuItem.type() == CheckableActionType)) { - g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(menuItem.action())); - g_signal_connect(action, "activate", G_CALLBACK(contextMenuItemActivatedCallback), m_page); + if (action) { + switch (menuItem.type()) { + case ActionType: + case CheckableActionType: + g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(menuItem.action())); + g_signal_connect(action, "activate", G_CALLBACK(contextMenuItemActivatedCallback), m_page); + // Fall through. + case SubmenuType: + g_signal_connect(action, "notify::visible", G_CALLBACK(contextMenuItemVisibilityChanged), this); + break; + case SeparatorType: + break; + } } m_menu.appendItem(menuItem); } +// Populate the context menu ensuring that: +// - There aren't separators next to each other. +// - There aren't separators at the beginning of the menu. +// - There aren't separators at the end of the menu. void WebContextMenuProxyGtk::populate(Vector<ContextMenuItem>& items) { - for (size_t i = 0; i < items.size(); i++) - append(items.at(i)); + bool previousIsSeparator = false; + bool isEmpty = true; + for (size_t i = 0; i < items.size(); i++) { + ContextMenuItem& menuItem = items.at(i); + if (menuItem.type() == SeparatorType) { + previousIsSeparator = true; + continue; + } + + if (previousIsSeparator && !isEmpty) + append(items.at(i - 1)); + previousIsSeparator = false; + + append(menuItem); + isEmpty = false; + } } void WebContextMenuProxyGtk::populate(const Vector<WebContextMenuItemData>& items) |