InputMethodFilterGtk.cpp [plain text]
#include "config.h"
#include "InputMethodFilter.h"
#include "WebKitInputMethodContextImplGtk.h"
#include "WebKitInputMethodContextPrivate.h"
#include "WebKitWebViewBaseInternal.h"
#include <WebCore/GUniquePtrGtk.h>
#include <WebCore/IntRect.h>
#include <gdk/gdk.h>
#include <wtf/SetForScope.h>
namespace WebKit {
using namespace WebCore;
IntRect InputMethodFilter::platformTransformCursorRectToViewCoordinates(const IntRect& cursorRect)
{
IntRect translatedRect = cursorRect;
GtkAllocation allocation;
gtk_widget_get_allocation(GTK_WIDGET(webkitInputMethodContextGetWebView(m_context.get())), &allocation);
translatedRect.move(allocation.x, allocation.y);
return translatedRect;
}
bool InputMethodFilter::platformEventKeyIsKeyPress(PlatformEventKey* event) const
{
#if USE(GTK4)
if (UNLIKELY(m_filteringContext.isFakeKeyEventForTesting))
return reinterpret_cast<KeyEvent*>(event)->type == GDK_KEY_PRESS;
#endif
return gdk_event_get_event_type(event) == GDK_KEY_PRESS;
}
InputMethodFilter::FilterResult InputMethodFilter::filterKeyEvent(unsigned type, unsigned keyval, unsigned keycode, unsigned modifiers)
{
if (!isEnabled() || !m_context)
return { };
#if USE(GTK4)
if (WEBKIT_IS_INPUT_METHOD_CONTEXT_IMPL_GTK(m_context.get()))
return { };
SetForScope<bool> isFakeKeyEventForTesting(m_filteringContext.isFakeKeyEventForTesting, true);
KeyEvent event { type, keyval, modifiers };
return filterKeyEvent(reinterpret_cast<GdkEvent*>(&event));
#else
auto* webView = webkitInputMethodContextGetWebView(m_context.get());
ASSERT(webView);
GUniquePtr<GdkEvent> event(gdk_event_new(static_cast<GdkEventType>(type)));
event->key.window = gtk_widget_get_window(GTK_WIDGET(webView));
g_object_ref(event->key.window);
event->key.time = GDK_CURRENT_TIME;
event->key.keyval = keyval;
event->key.hardware_keycode = keycode;
event->key.state = modifiers;
gdk_event_set_device(event.get(), gdk_seat_get_keyboard(gdk_display_get_default_seat(gtk_widget_get_display(GTK_WIDGET(webView)))));
return filterKeyEvent(event.get());
#endif
}
}