summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/gtk/PopupMenuGtk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/gtk/PopupMenuGtk.cpp')
-rw-r--r--WebCore/platform/gtk/PopupMenuGtk.cpp112
1 files changed, 5 insertions, 107 deletions
diff --git a/WebCore/platform/gtk/PopupMenuGtk.cpp b/WebCore/platform/gtk/PopupMenuGtk.cpp
index b2466c5..e7ff78e 100644
--- a/WebCore/platform/gtk/PopupMenuGtk.cpp
+++ b/WebCore/platform/gtk/PopupMenuGtk.cpp
@@ -5,7 +5,6 @@
* Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
* Copyright (C) 2008 Collabora Ltd.
* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
- * Copyright (C) 2010 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -28,22 +27,16 @@
#include "PopupMenuGtk.h"
#include "FrameView.h"
-#include "GOwnPtr.h"
#include "GtkVersioning.h"
#include "HostWindow.h"
#include "PlatformString.h"
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
#include <wtf/text/CString.h>
+#include <gtk/gtk.h>
namespace WebCore {
-static const uint32_t gSearchTimeoutMs = 1000;
-
PopupMenuGtk::PopupMenuGtk(PopupMenuClient* client)
: m_popupClient(client)
- , m_previousKeyEventCharacter(0)
- , m_currentlySelectedMenuItem(0)
{
}
@@ -61,16 +54,12 @@ void PopupMenuGtk::show(const IntRect& rect, FrameView* view, int index)
if (!m_popup) {
m_popup = GTK_MENU(gtk_menu_new());
- g_signal_connect(m_popup.get(), "unmap", G_CALLBACK(PopupMenuGtk::menuUnmapped), this);
- g_signal_connect(m_popup.get(), "key-press-event", G_CALLBACK(PopupMenuGtk::keyPressEventCallback), this);
+ g_signal_connect(m_popup.get(), "unmap", G_CALLBACK(menuUnmapped), this);
} else
gtk_container_foreach(GTK_CONTAINER(m_popup.get()), reinterpret_cast<GtkCallback>(menuRemoveItem), this);
- int x = 0;
- int y = 0;
- GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(view->hostWindow()->platformPageClient()));
- if (window)
- gdk_window_get_origin(window, &x, &y);
+ int x, y;
+ gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(view->hostWindow()->platformPageClient())), &x, &y);
m_menuPosition = view->contentsToWindow(rect.location());
m_menuPosition = IntPoint(m_menuPosition.x() + x, m_menuPosition.y() + y + rect.height());
m_indexMap.clear();
@@ -84,8 +73,7 @@ void PopupMenuGtk::show(const IntRect& rect, FrameView* view, int index)
item = gtk_menu_item_new_with_label(client()->itemText(i).utf8().data());
m_indexMap.add(item, i);
- g_signal_connect(item, "activate", G_CALLBACK(PopupMenuGtk::menuItemActivated), this);
- g_signal_connect(item, "select", G_CALLBACK(PopupMenuGtk::selectItemCallback), this);
+ g_signal_connect(item, "activate", G_CALLBACK(menuItemActivated), this);
// FIXME: Apply the PopupMenuStyle from client()->itemStyle(i)
gtk_widget_set_sensitive(item, client()->itemIsEnabled(i));
@@ -150,77 +138,6 @@ void PopupMenuGtk::disconnectClient()
m_popupClient = 0;
}
-bool PopupMenuGtk::typeAheadFind(GdkEventKey* event)
-{
- // If we were given a non-printable character just skip it.
- gunichar unicodeCharacter = gdk_keyval_to_unicode(event->keyval);
- if (!unicodeCharacter) {
- resetTypeAheadFindState();
- return false;
- }
-
- glong charactersWritten;
- GOwnPtr<gunichar2> utf16String(g_ucs4_to_utf16(&unicodeCharacter, 1, 0, &charactersWritten, 0));
- if (!utf16String) {
- resetTypeAheadFindState();
- return false;
- }
-
- // If the character is the same as the last character, the user is probably trying to
- // cycle through the menulist entries. This matches the WebCore behavior for collapsed
- // menulists.
- bool repeatingCharacter = unicodeCharacter != m_previousKeyEventCharacter;
- if (event->time - m_previousKeyEventTimestamp > gSearchTimeoutMs)
- m_currentSearchString = String(static_cast<UChar*>(utf16String.get()), charactersWritten);
- else if (repeatingCharacter)
- m_currentSearchString.append(String(static_cast<UChar*>(utf16String.get()), charactersWritten));
-
- m_previousKeyEventTimestamp = event->time;
- m_previousKeyEventCharacter = unicodeCharacter;
-
- // Like the Chromium port, we case fold before searching, because
- // strncmp does not handle non-ASCII characters.
- GOwnPtr<gchar> searchStringWithCaseFolded(g_utf8_casefold(m_currentSearchString.utf8().data(), -1));
- size_t prefixLength = strlen(searchStringWithCaseFolded.get());
-
- GList* children = gtk_container_get_children(GTK_CONTAINER(m_popup.get()));
- if (!children)
- return true;
-
- // If a menu item has already been selected, start searching from the current
- // item down the list. This will make multiple key presses of the same character
- // advance the selection.
- GList* currentChild = children;
- if (m_currentlySelectedMenuItem) {
- currentChild = g_list_find(children, m_currentlySelectedMenuItem);
- if (!currentChild) {
- m_currentlySelectedMenuItem = 0;
- currentChild = children;
- }
-
- // Repeating characters should iterate.
- if (repeatingCharacter) {
- if (GList* nextChild = g_list_next(currentChild))
- currentChild = nextChild;
- }
- }
-
- GList* firstChild = currentChild;
- do {
- currentChild = g_list_next(currentChild);
- if (!currentChild)
- currentChild = children;
-
- GOwnPtr<gchar> itemText(g_utf8_casefold(gtk_menu_item_get_label(GTK_MENU_ITEM(currentChild->data)), -1));
- if (!strncmp(searchStringWithCaseFolded.get(), itemText.get(), prefixLength)) {
- gtk_menu_shell_select_item(GTK_MENU_SHELL(m_popup.get()), GTK_WIDGET(currentChild->data));
- return true;
- }
- } while (currentChild != firstChild);
-
- return true;
-}
-
void PopupMenuGtk::menuItemActivated(GtkMenuItem* item, PopupMenuGtk* that)
{
ASSERT(that->client());
@@ -231,7 +148,6 @@ void PopupMenuGtk::menuItemActivated(GtkMenuItem* item, PopupMenuGtk* that)
void PopupMenuGtk::menuUnmapped(GtkWidget*, PopupMenuGtk* that)
{
ASSERT(that->client());
- that->resetTypeAheadFindState();
that->client()->popupDidHide();
}
@@ -242,29 +158,11 @@ void PopupMenuGtk::menuPositionFunction(GtkMenu*, gint* x, gint* y, gboolean* pu
*pushIn = true;
}
-void PopupMenuGtk::resetTypeAheadFindState()
-{
- m_currentlySelectedMenuItem = 0;
- m_previousKeyEventCharacter = 0;
- m_currentSearchString = "";
-}
-
void PopupMenuGtk::menuRemoveItem(GtkWidget* widget, PopupMenuGtk* that)
{
ASSERT(that->m_popup);
gtk_container_remove(GTK_CONTAINER(that->m_popup.get()), widget);
}
-int PopupMenuGtk::selectItemCallback(GtkMenuItem* item, PopupMenuGtk* that)
-{
- that->m_currentlySelectedMenuItem = GTK_WIDGET(item);
- return FALSE;
-}
-
-int PopupMenuGtk::keyPressEventCallback(GtkWidget* widget, GdkEventKey* event, PopupMenuGtk* that)
-{
- return that->typeAheadFind(event);
-}
-
}