diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-20 13:01:08 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-20 13:01:08 +0200 |
commit | 49233e234e5c787396cadb2cea33b31ae0cd65c1 (patch) | |
tree | 5410cb9a8fd53168bb60d62c54b654d86f03c38d /Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp | |
parent | b211c645d8ab690f713515dfdc84d80b11c27d2c (diff) | |
download | qtwebkit-49233e234e5c787396cadb2cea33b31ae0cd65c1.tar.gz |
Imported WebKit commit 3a8c29f35d00659d2ce7a0ccdfa8304f14e82327 (http://svn.webkit.org/repository/webkit/trunk@120813)
New snapshot with Windows build fixes
Diffstat (limited to 'Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp b/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp index d85b3dda2..d80f24ce7 100644 --- a/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp +++ b/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp @@ -26,10 +26,12 @@ #include "config.h" #include "WebContextMenuProxyGtk.h" +#if ENABLE(CONTEXT_MENUS) + #include "NativeWebMouseEvent.h" #include "WebContextMenuItemData.h" +#include "WebKitWebViewBasePrivate.h" #include "WebPageProxy.h" -#include <WebCore/ContextMenu.h> #include <WebCore/GtkUtilities.h> #include <gtk/gtk.h> #include <wtf/text/CString.h> @@ -51,59 +53,64 @@ static void contextMenuItemActivatedCallback(GtkAction* action, WebPageProxy* pa page->contextMenuItemSelected(item); } -GtkMenu* WebContextMenuProxyGtk::createGtkMenu(const Vector<WebContextMenuItemData>& items) +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); + } + + m_menu.appendItem(menuItem); +} + +void WebContextMenuProxyGtk::populate(Vector<ContextMenuItem>& items) +{ + for (size_t i = 0; i < items.size(); i++) + append(items.at(i)); +} + +void WebContextMenuProxyGtk::populate(const Vector<WebContextMenuItemData>& items) { - ContextMenu menu; for (size_t i = 0; i < items.size(); i++) { - const WebContextMenuItemData& item = items.at(i); - ContextMenuItem menuItem(item.type(), item.action(), item.title(), item.enabled(), item.checked()); - GtkAction* action = menuItem.gtkAction(); - - if (action && (item.type() == WebCore::ActionType || item.type() == WebCore::CheckableActionType)) { - g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(item.action())); - g_signal_connect(action, "activate", G_CALLBACK(contextMenuItemActivatedCallback), m_page); - } - - if (item.type() == WebCore::SubmenuType) { - ContextMenu subMenu(createGtkMenu(item.submenu())); - menuItem.setSubMenu(&subMenu); - } - menu.appendItem(menuItem); + ContextMenuItem menuitem = items.at(i).core(); + append(menuitem); } - return menu.releasePlatformDescription(); } void WebContextMenuProxyGtk::showContextMenu(const WebCore::IntPoint& position, const Vector<WebContextMenuItemData>& items) { - if (items.isEmpty()) + if (!items.isEmpty()) + populate(items); + + if (!m_menu.itemCount()) return; - m_popup = createGtkMenu(items); m_popupPosition = convertWidgetPointToScreenPoint(m_webView, position); // Display menu initiated by right click (mouse button pressed = 3). NativeWebMouseEvent* mouseEvent = m_page->currentlyProcessedMouseDownEvent(); const GdkEvent* event = mouseEvent ? mouseEvent->nativeEvent() : 0; - gtk_menu_popup(m_popup, 0, 0, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, + gtk_menu_popup(m_menu.platformDescription(), 0, 0, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, event ? event->button.button : 3, event ? event->button.time : GDK_CURRENT_TIME); } void WebContextMenuProxyGtk::hideContextMenu() { - gtk_menu_popdown(m_popup); + gtk_menu_popdown(m_menu.platformDescription()); } WebContextMenuProxyGtk::WebContextMenuProxyGtk(GtkWidget* webView, WebPageProxy* page) : m_webView(webView) , m_page(page) - , m_popup(0) { + webkitWebViewBaseSetActiveContextMenuProxy(WEBKIT_WEB_VIEW_BASE(m_webView), this); } WebContextMenuProxyGtk::~WebContextMenuProxyGtk() { - if (m_popup) - gtk_widget_destroy(GTK_WIDGET(m_popup)); + webkitWebViewBaseSetActiveContextMenuProxy(WEBKIT_WEB_VIEW_BASE(m_webView), 0); } void WebContextMenuProxyGtk::menuPositionFunction(GtkMenu* menu, gint* x, gint* y, gboolean* pushIn, WebContextMenuProxyGtk* popupMenu) @@ -124,3 +131,4 @@ void WebContextMenuProxyGtk::menuPositionFunction(GtkMenu* menu, gint* x, gint* } } // namespace WebKit +#endif // ENABLE(CONTEXT_MENUS) |