- a/Source/WebCore/ChangeLog +11 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2020-04-28  Carlos Garcia Campos  <cgarcia@igalia.com>
2
3
        [GTK4] Add support for key events
4
        https://bugs.webkit.org/show_bug.cgi?id=211128
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        * platform/gtk/GtkVersioning.h:
9
        (gdk_event_get_keyval):
10
        (gdk_event_get_keycode):
11
1
2020-04-28  Charlie Turner  <cturner@igalia.com>
12
2020-04-28  Charlie Turner  <cturner@igalia.com>
2
13
3
        [EME][CDMProxy] Default initialize m_numDecryptorsWaitingForKey member
14
        [EME][CDMProxy] Default initialize m_numDecryptorsWaitingForKey member
- a/Source/WebCore/platform/gtk/GtkVersioning.h +16 lines
Lines 135-138 gdk_event_get_button(const GdkEvent* event, guint* button) a/Source/WebCore/platform/gtk/GtkVersioning.h_sec1
135
        *button = gdk_button_event_get_button(const_cast<GdkEvent*>(event));
135
        *button = gdk_button_event_get_button(const_cast<GdkEvent*>(event));
136
    return true;
136
    return true;
137
}
137
}
138
139
static inline gboolean
140
gdk_event_get_keyval(const GdkEvent* event, guint* keyval)
141
{
142
    if (keyval)
143
        *keyval = gdk_key_event_get_keyval(const_cast<GdkEvent*>(event));
144
    return TRUE;
145
}
146
147
static inline gboolean
148
gdk_event_get_keycode(const GdkEvent* event, guint16* keycode)
149
{
150
    if (keycode)
151
        *keycode = gdk_key_event_get_keycode(const_cast<GdkEvent*>(event));
152
    return TRUE;
153
}
138
#endif // USE(GTK4)
154
#endif // USE(GTK4)
- a/Source/WebKit/ChangeLog +34 lines
Lines 1-3 a/Source/WebKit/ChangeLog_sec1
1
2020-04-28  Carlos Garcia Campos  <cgarcia@igalia.com>
2
3
        [GTK4] Add support for key events
4
        https://bugs.webkit.org/show_bug.cgi?id=211128
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Handle key-pressed and key-released events using a GtkEventControllerKey. To receive key events the widget needs
9
        to be focused, so also implement GtkWidgetClass::grab_focus and handle enter and leave focus events. GTK4 needs
10
        the widget used by the key bindings translator to be added to a parent to be able to forward key events, so it's
11
        now added as a child internal widget of the WebKitWeViewBase.
12
13
        * Shared/gtk/WebEventFactory.cpp:
14
        (WebKit::WebEventFactory::createWebKeyboardEvent):
15
        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
16
        (webkitWebViewChildIsInternalWidget):
17
        (webkitWebViewBaseContainerRemove):
18
        (webkitWebViewBaseContainerForall):
19
        (webkitWebViewBaseFocusEnter):
20
        (webkitWebViewBaseFocusLeave):
21
        (webkitWebViewBaseKeyPressed):
22
        (webkitWebViewBaseKeyReleased):
23
        (webkitWebViewBaseGrabFocus):
24
        (webkitWebViewBaseConstructed):
25
        (webkit_web_view_base_class_init):
26
        * UIProcess/gtk/KeyBindingTranslator.cpp:
27
        (WebKit::KeyBindingTranslator::KeyBindingTranslator):
28
        (WebKit::KeyBindingTranslator::~KeyBindingTranslator):
29
        (WebKit::handleCustomKeyBindings):
30
        (WebKit::KeyBindingTranslator::commandsForKeyEvent):
31
        * UIProcess/gtk/KeyBindingTranslator.h:
32
        (WebKit::KeyBindingTranslator::widget const):
33
        (WebKit::KeyBindingTranslator::destroyed):
34
1
2020-04-27  Carlos Garcia Campos  <cgarcia@igalia.com>
35
2020-04-27  Carlos Garcia Campos  <cgarcia@igalia.com>
2
36
3
        [GTK4] Add support for motion events
37
        [GTK4] Add support for motion events
- a/Source/WebKit/Shared/gtk/WebEventFactory.cpp -5 lines
Lines 281-295 WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, const a/Source/WebKit/Shared/gtk/WebEventFactory.cpp_sec1
281
281
282
WebKeyboardEvent WebEventFactory::createWebKeyboardEvent(const GdkEvent* event, const String& text, bool handledByInputMethod, Optional<Vector<CompositionUnderline>>&& preeditUnderlines, Optional<EditingRange>&& preeditSelectionRange, Vector<String>&& commands)
282
WebKeyboardEvent WebEventFactory::createWebKeyboardEvent(const GdkEvent* event, const String& text, bool handledByInputMethod, Optional<Vector<CompositionUnderline>>&& preeditUnderlines, Optional<EditingRange>&& preeditSelectionRange, Vector<String>&& commands)
283
{
283
{
284
#if USE(GTK4)
285
    guint keyval = 0;
286
    guint16 keycode = 0;
287
#else
288
    guint keyval;
284
    guint keyval;
289
    gdk_event_get_keyval(event, &keyval);
285
    gdk_event_get_keyval(event, &keyval);
290
    guint16 keycode;
286
    guint16 keycode;
291
    gdk_event_get_keycode(event, &keycode);
287
    gdk_event_get_keycode(event, &keycode);
292
#endif
293
    GdkEventType type = gdk_event_get_event_type(const_cast<GdkEvent*>(event));
288
    GdkEventType type = gdk_event_get_event_type(const_cast<GdkEvent*>(event));
294
289
295
    return WebKeyboardEvent(
290
    return WebKeyboardEvent(
- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp -6 / +97 lines
Lines 466-472 static void webkitWebViewBaseUnrealize(GtkWidget* widget) a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec1
466
static bool webkitWebViewChildIsInternalWidget(WebKitWebViewBase* webViewBase, GtkWidget* widget)
466
static bool webkitWebViewChildIsInternalWidget(WebKitWebViewBase* webViewBase, GtkWidget* widget)
467
{
467
{
468
    WebKitWebViewBasePrivate* priv = webViewBase->priv;
468
    WebKitWebViewBasePrivate* priv = webViewBase->priv;
469
    return widget == priv->inspectorView || widget == priv->dialog;
469
    return widget == priv->inspectorView || widget == priv->dialog || widget == priv->keyBindingTranslator.widget();
470
}
470
}
471
471
472
static void webkitWebViewBaseContainerAdd(GtkContainer* container, GtkWidget* widget)
472
static void webkitWebViewBaseContainerAdd(GtkContainer* container, GtkWidget* widget)
Lines 528-534 static void webkitWebViewBaseContainerRemove(GtkContainer* container, GtkWidget* a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec2
528
        priv->dialog = nullptr;
528
        priv->dialog = nullptr;
529
        if (gtk_widget_get_visible(widgetContainer))
529
        if (gtk_widget_get_visible(widgetContainer))
530
            gtk_widget_grab_focus(widgetContainer);
530
            gtk_widget_grab_focus(widgetContainer);
531
    } else {
531
    } else if (priv->keyBindingTranslator.widget() == widget)
532
        priv->keyBindingTranslator.destroyed();
533
    else {
532
        ASSERT(priv->children.contains(widget));
534
        ASSERT(priv->children.contains(widget));
533
        priv->children.remove(widget);
535
        priv->children.remove(widget);
534
    }
536
    }
Lines 553-558 static void webkitWebViewBaseContainerForall(GtkContainer* container, gboolean i a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec3
553
            (*callback)(child, callbackData);
555
            (*callback)(child, callbackData);
554
    }
556
    }
555
557
558
    if (includeInternals && priv->keyBindingTranslator.widget())
559
        (*callback)(priv->keyBindingTranslator.widget(), callbackData);
560
556
    if (includeInternals && priv->inspectorView)
561
    if (includeInternals && priv->inspectorView)
557
        (*callback)(priv->inspectorView, callbackData);
562
        (*callback)(priv->inspectorView, callbackData);
558
563
Lines 876-882 static gboolean webkitWebViewBaseKeyReleaseEvent(GtkWidget* widget, GdkEventKey* a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec4
876
881
877
    return GDK_EVENT_STOP;
882
    return GDK_EVENT_STOP;
878
}
883
}
884
#endif
885
886
#if USE(GTK4)
887
static void webkitWebViewBaseFocusEnter(WebKitWebViewBase* webViewBase, GtkEventController*)
888
{
889
    webkitWebViewBaseSetFocus(webViewBase, true);
890
}
891
892
static void webkitWebViewBaseFocusLeave(WebKitWebViewBase* webViewBase, GtkEventController*)
893
{
894
    webkitWebViewBaseSetFocus(webViewBase, false);
895
}
896
897
static gboolean webkitWebViewBaseKeyPressed(WebKitWebViewBase* webViewBase, unsigned keyval, unsigned, GdkModifierType state, GtkEventController* controller)
898
{
899
    WebKitWebViewBasePrivate* priv = webViewBase->priv;
900
901
#if ENABLE(DEVELOPER_MODE) && OS(LINUX)
902
    if ((state & GDK_CONTROL_MASK) && (state & GDK_SHIFT_MASK) && keyval == GDK_KEY_G) {
903
        auto& preferences = priv->pageProxy->preferences();
904
        preferences.setResourceUsageOverlayVisible(!preferences.resourceUsageOverlayVisible());
905
        return GDK_EVENT_STOP;
906
    }
907
#endif
879
908
909
    if (priv->dialog)
910
        return gtk_event_controller_key_forward(GTK_EVENT_CONTROLLER_KEY(controller), priv->dialog);
911
912
#if ENABLE(FULLSCREEN_API)
913
    if (priv->fullScreenModeActive) {
914
        switch (keyval) {
915
        case GDK_KEY_Escape:
916
        case GDK_KEY_f:
917
        case GDK_KEY_F:
918
            priv->pageProxy->fullScreenManager()->requestExitFullScreen();
919
            return GDK_EVENT_STOP;
920
        default:
921
            break;
922
        }
923
    }
924
#endif
925
926
    auto* event = gtk_event_controller_get_current_event(controller);
927
    auto filterResult = priv->inputMethodFilter.filterKeyEvent(event);
928
    if (!filterResult.handled) {
929
        priv->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(event, filterResult.keyText,
930
            NativeWebKeyboardEvent::HandledByInputMethod::No, WTF::nullopt, WTF::nullopt, priv->keyBindingTranslator.commandsForKeyEvent(GTK_EVENT_CONTROLLER_KEY(controller))));
931
    }
932
933
    return GDK_EVENT_STOP;
934
}
935
936
static void webkitWebViewBaseKeyReleased(WebKitWebViewBase* webViewBase, unsigned, unsigned, GdkModifierType, GtkEventController* controller)
937
{
938
    WebKitWebViewBasePrivate* priv = webViewBase->priv;
939
940
    auto* event = gtk_event_controller_get_current_event(controller);
941
    if (!priv->inputMethodFilter.filterKeyEvent(event).handled) {
942
        priv->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(event, { },
943
            NativeWebKeyboardEvent::HandledByInputMethod::No, WTF::nullopt, WTF::nullopt, { }));
944
    }
945
}
946
#endif
947
948
#if !USE(GTK4)
880
static void webkitWebViewBaseHandleMouseEvent(WebKitWebViewBase* webViewBase, GdkEvent* event)
949
static void webkitWebViewBaseHandleMouseEvent(WebKitWebViewBase* webViewBase, GdkEvent* event)
881
{
950
{
882
    WebKitWebViewBasePrivate* priv = webViewBase->priv;
951
    WebKitWebViewBasePrivate* priv = webViewBase->priv;
Lines 1524-1529 static void webkitWebViewBaseHierarchyChanged(GtkWidget* widget, GtkWidget* oldT a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec5
1524
}
1593
}
1525
#endif
1594
#endif
1526
1595
1596
#if USE(GTK4)
1597
static gboolean webkitWebViewBaseGrabFocus(GtkWidget* widget)
1598
{
1599
    gtk_root_set_focus(gtk_widget_get_root(widget), widget);
1600
    return TRUE;
1601
}
1602
#endif
1603
1527
static gboolean webkitWebViewBaseFocus(GtkWidget* widget, GtkDirectionType direction)
1604
static gboolean webkitWebViewBaseFocus(GtkWidget* widget, GtkDirectionType direction)
1528
{
1605
{
1529
    // If a dialog is active, we need to forward focus events there. This
1606
    // If a dialog is active, we need to forward focus events there. This
Lines 1553-1567 static void webkitWebViewBaseConstructed(GObject* object) a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec6
1553
1630
1554
    GtkWidget* viewWidget = GTK_WIDGET(object);
1631
    GtkWidget* viewWidget = GTK_WIDGET(object);
1555
    gtk_widget_set_can_focus(viewWidget, TRUE);
1632
    gtk_widget_set_can_focus(viewWidget, TRUE);
1633
1634
    WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
1635
    priv->pageClient = makeUnique<PageClientImpl>(viewWidget);
1636
    gtk_container_add(GTK_CONTAINER(viewWidget), priv->keyBindingTranslator.widget());
1637
1556
#if !USE(GTK4)
1638
#if !USE(GTK4)
1557
    gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), nullptr, 0,
1639
    gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), nullptr, 0,
1558
        static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
1640
        static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
1559
    gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::singleton().targetList());
1641
    gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::singleton().targetList());
1560
#endif
1642
#endif
1561
1643
1562
    WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
1563
    priv->pageClient = makeUnique<PageClientImpl>(viewWidget);
1564
1565
#if USE(GTK4)
1644
#if USE(GTK4)
1566
    auto* controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
1645
    auto* controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
1567
    g_signal_connect_object(controller, "scroll", G_CALLBACK(webkitWebViewBaseScroll), viewWidget, G_CONNECT_SWAPPED);
1646
    g_signal_connect_object(controller, "scroll", G_CALLBACK(webkitWebViewBaseScroll), viewWidget, G_CONNECT_SWAPPED);
Lines 1572-1577 static void webkitWebViewBaseConstructed(GObject* object) a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec7
1572
    g_signal_connect_object(controller, "motion", G_CALLBACK(webkitWebViewBaseMotion), viewWidget, G_CONNECT_SWAPPED);
1651
    g_signal_connect_object(controller, "motion", G_CALLBACK(webkitWebViewBaseMotion), viewWidget, G_CONNECT_SWAPPED);
1573
    g_signal_connect_object(controller, "leave", G_CALLBACK(webkitWebViewBaseLeave), viewWidget, G_CONNECT_SWAPPED);
1652
    g_signal_connect_object(controller, "leave", G_CALLBACK(webkitWebViewBaseLeave), viewWidget, G_CONNECT_SWAPPED);
1574
    gtk_widget_add_controller(viewWidget, controller);
1653
    gtk_widget_add_controller(viewWidget, controller);
1654
1655
    controller = gtk_event_controller_focus_new();
1656
    g_signal_connect_object(controller, "enter", G_CALLBACK(webkitWebViewBaseFocusEnter), viewWidget, G_CONNECT_SWAPPED);
1657
    g_signal_connect_object(controller, "leave", G_CALLBACK(webkitWebViewBaseFocusLeave), viewWidget, G_CONNECT_SWAPPED);
1658
    gtk_widget_add_controller(viewWidget, controller);
1659
1660
    controller = gtk_event_controller_key_new();
1661
    g_signal_connect_object(controller, "key-pressed", G_CALLBACK(webkitWebViewBaseKeyPressed), viewWidget, G_CONNECT_SWAPPED);
1662
    g_signal_connect_object(controller, "key-released", G_CALLBACK(webkitWebViewBaseKeyReleased), viewWidget, G_CONNECT_SWAPPED);
1663
    gtk_widget_add_controller(viewWidget, controller);
1575
#endif
1664
#endif
1576
}
1665
}
1577
1666
Lines 1594-1601 static void webkit_web_view_base_class_init(WebKitWebViewBaseClass* webkitWebVie a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp_sec8
1594
#endif
1683
#endif
1595
    widgetClass->map = webkitWebViewBaseMap;
1684
    widgetClass->map = webkitWebViewBaseMap;
1596
    widgetClass->unmap = webkitWebViewBaseUnmap;
1685
    widgetClass->unmap = webkitWebViewBaseUnmap;
1597
#if !USE(GTK4)
1686
#if USE(GTK4)
1687
    widgetClass->grab_focus = webkitWebViewBaseGrabFocus;
1598
    widgetClass->focus = webkitWebViewBaseFocus;
1688
    widgetClass->focus = webkitWebViewBaseFocus;
1689
#else
1599
    widgetClass->focus_in_event = webkitWebViewBaseFocusInEvent;
1690
    widgetClass->focus_in_event = webkitWebViewBaseFocusInEvent;
1600
    widgetClass->focus_out_event = webkitWebViewBaseFocusOutEvent;
1691
    widgetClass->focus_out_event = webkitWebViewBaseFocusOutEvent;
1601
    widgetClass->key_press_event = webkitWebViewBaseKeyPressEvent;
1692
    widgetClass->key_press_event = webkitWebViewBaseKeyPressEvent;
- a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.cpp -28 / +46 lines
Lines 173-195 static void moveCursorCallback(GtkWidget* widget, GtkMovementStep step, gint cou a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.cpp_sec1
173
KeyBindingTranslator::KeyBindingTranslator()
173
KeyBindingTranslator::KeyBindingTranslator()
174
    : m_nativeWidget(gtk_text_view_new())
174
    : m_nativeWidget(gtk_text_view_new())
175
{
175
{
176
    g_signal_connect(m_nativeWidget.get(), "backspace", G_CALLBACK(backspaceCallback), this);
176
    g_signal_connect(m_nativeWidget, "backspace", G_CALLBACK(backspaceCallback), this);
177
    g_signal_connect(m_nativeWidget.get(), "cut-clipboard", G_CALLBACK(cutClipboardCallback), this);
177
    g_signal_connect(m_nativeWidget, "cut-clipboard", G_CALLBACK(cutClipboardCallback), this);
178
    g_signal_connect(m_nativeWidget.get(), "copy-clipboard", G_CALLBACK(copyClipboardCallback), this);
178
    g_signal_connect(m_nativeWidget, "copy-clipboard", G_CALLBACK(copyClipboardCallback), this);
179
    g_signal_connect(m_nativeWidget.get(), "paste-clipboard", G_CALLBACK(pasteClipboardCallback), this);
179
    g_signal_connect(m_nativeWidget, "paste-clipboard", G_CALLBACK(pasteClipboardCallback), this);
180
    g_signal_connect(m_nativeWidget.get(), "select-all", G_CALLBACK(selectAllCallback), this);
180
    g_signal_connect(m_nativeWidget, "select-all", G_CALLBACK(selectAllCallback), this);
181
    g_signal_connect(m_nativeWidget.get(), "move-cursor", G_CALLBACK(moveCursorCallback), this);
181
    g_signal_connect(m_nativeWidget, "move-cursor", G_CALLBACK(moveCursorCallback), this);
182
    g_signal_connect(m_nativeWidget.get(), "delete-from-cursor", G_CALLBACK(deleteFromCursorCallback), this);
182
    g_signal_connect(m_nativeWidget, "delete-from-cursor", G_CALLBACK(deleteFromCursorCallback), this);
183
    g_signal_connect(m_nativeWidget.get(), "toggle-overwrite", G_CALLBACK(toggleOverwriteCallback), this);
183
    g_signal_connect(m_nativeWidget, "toggle-overwrite", G_CALLBACK(toggleOverwriteCallback), this);
184
#if !USE(GTK4)
184
#if !USE(GTK4)
185
    g_signal_connect(m_nativeWidget.get(), "popup-menu", G_CALLBACK(popupMenuCallback), this);
185
    g_signal_connect(m_nativeWidget, "popup-menu", G_CALLBACK(popupMenuCallback), this);
186
    g_signal_connect(m_nativeWidget.get(), "show-help", G_CALLBACK(showHelpCallback), this);
186
    g_signal_connect(m_nativeWidget, "show-help", G_CALLBACK(showHelpCallback), this);
187
#endif
187
#endif
188
#if GTK_CHECK_VERSION(3, 24, 0)
188
#if GTK_CHECK_VERSION(3, 24, 0)
189
    g_signal_connect(m_nativeWidget.get(), "insert-emoji", G_CALLBACK(insertEmojiCallback), this);
189
    g_signal_connect(m_nativeWidget, "insert-emoji", G_CALLBACK(insertEmojiCallback), this);
190
#endif
190
#endif
191
}
191
}
192
192
193
KeyBindingTranslator::~KeyBindingTranslator()
194
{
195
    ASSERT(!m_nativeWidget);
196
}
197
193
struct KeyCombinationEntry {
198
struct KeyCombinationEntry {
194
    unsigned gdkKeyCode;
199
    unsigned gdkKeyCode;
195
    unsigned state;
200
    unsigned state;
Lines 211-234 static const KeyCombinationEntry customKeyBindings[] = { a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.cpp_sec2
211
    { GDK_KEY_ISO_Enter, GDK_SHIFT_MASK,   "InsertLineBreak" },
216
    { GDK_KEY_ISO_Enter, GDK_SHIFT_MASK,   "InsertLineBreak" },
212
};
217
};
213
218
214
Vector<String> KeyBindingTranslator::commandsForKeyEvent(GdkEventKey* event)
219
static Vector<String> handleCustomKeyBindings(unsigned keyval, GdkModifierType state)
215
{
220
{
216
    ASSERT(m_pendingEditorCommands.isEmpty());
217
218
    guint keyval;
219
    GdkModifierType state;
220
#if USE(GTK4)
221
    keyval = 0;
222
    state = static_cast<GdkModifierType>(0);
223
#else
224
    gdk_event_get_keyval(reinterpret_cast<GdkEvent*>(event), &keyval);
225
    gdk_event_get_state(reinterpret_cast<GdkEvent*>(event), &state);
226
227
    gtk_bindings_activate_event(G_OBJECT(m_nativeWidget.get()), event);
228
#endif
229
    if (!m_pendingEditorCommands.isEmpty())
230
        return WTFMove(m_pendingEditorCommands);
231
232
    // For keypress events, we want charCode(), but keyCode() does that.
221
    // For keypress events, we want charCode(), but keyCode() does that.
233
    unsigned mapKey = (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) << 16 | keyval;
222
    unsigned mapKey = (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) << 16 | keyval;
234
    if (!mapKey)
223
    if (!mapKey)
Lines 242-245 Vector<String> KeyBindingTranslator::commandsForKeyEvent(GdkEventKey* event) a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.cpp_sec3
242
    return { };
231
    return { };
243
}
232
}
244
233
234
#if USE(GTK4)
235
Vector<String> KeyBindingTranslator::commandsForKeyEvent(GtkEventControllerKey* controller)
236
{
237
    ASSERT(m_pendingEditorCommands.isEmpty());
238
239
    gtk_event_controller_key_forward(GTK_EVENT_CONTROLLER_KEY(controller), m_nativeWidget);
240
    if (!m_pendingEditorCommands.isEmpty())
241
        return WTFMove(m_pendingEditorCommands);
242
243
    auto* event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(controller));
244
    return handleCustomKeyBindings(gdk_key_event_get_keyval(event), gdk_event_get_modifier_state(event));
245
}
246
#else
247
Vector<String> KeyBindingTranslator::commandsForKeyEvent(GdkEventKey* event)
248
{
249
    ASSERT(m_pendingEditorCommands.isEmpty());
250
251
    gtk_bindings_activate_event(G_OBJECT(m_nativeWidget), event);
252
    if (!m_pendingEditorCommands.isEmpty())
253
        return WTFMove(m_pendingEditorCommands);
254
255
    guint keyval;
256
    gdk_event_get_keyval(reinterpret_cast<GdkEvent*>(event), &keyval);
257
    GdkModifierType state;
258
    gdk_event_get_state(reinterpret_cast<GdkEvent*>(event), &state);
259
    return handleCustomKeyBindings(keyval, state);
260
}
261
#endif
262
245
} // namespace WebKit
263
} // namespace WebKit
- a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.h -10 / +14 lines
Lines 1-5 a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.h_sec1
1
/*
1
/*
2
 * Copyright (C) 2010, 2011 Igalia S.L.
2
 * Copyright (C) 2010, 2011, 2020 Igalia S.L.
3
 *
3
 *
4
 *  This library is free software; you can redistribute it and/or
4
 *  This library is free software; you can redistribute it and/or
5
 *  modify it under the terms of the GNU Lesser General Public
5
 *  modify it under the terms of the GNU Lesser General Public
Lines 16-31 a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.h_sec2
16
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
16
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17
 */
17
 */
18
18
19
#ifndef KeyBindingTranslator_h
19
#pragma once
20
#define KeyBindingTranslator_h
21
20
22
#include <WebCore/GRefPtrGtk.h>
23
#include <wtf/Vector.h>
21
#include <wtf/Vector.h>
24
#include <wtf/text/WTFString.h>
22
#include <wtf/text/WTFString.h>
25
23
24
typedef struct _GtkWidget GtkWidget;
25
26
#if USE(GTK4)
26
#if USE(GTK4)
27
typedef struct _GdkKeyEvent GdkKeyEvent;
27
typedef struct _GtkEventControllerKey GtkEventControllerKey;
28
typedef GdkKeyEvent GdkEventKey;
29
#else
28
#else
30
typedef struct _GdkEventKey GdkEventKey;
29
typedef struct _GdkEventKey GdkEventKey;
31
#endif
30
#endif
Lines 35-51 namespace WebKit { a/Source/WebKit/UIProcess/gtk/KeyBindingTranslator.h_sec3
35
class KeyBindingTranslator {
34
class KeyBindingTranslator {
36
public:
35
public:
37
    KeyBindingTranslator();
36
    KeyBindingTranslator();
37
    ~KeyBindingTranslator();
38
39
    GtkWidget* widget() const { return m_nativeWidget; }
40
    void destroyed() { m_nativeWidget = nullptr; }
38
41
42
#if USE(GTK4)
43
    Vector<String> commandsForKeyEvent(GtkEventControllerKey*);
44
#else
39
    Vector<String> commandsForKeyEvent(GdkEventKey*);
45
    Vector<String> commandsForKeyEvent(GdkEventKey*);
46
#endif
40
    void addPendingEditorCommand(const char* command) { m_pendingEditorCommands.append(command); }
47
    void addPendingEditorCommand(const char* command) { m_pendingEditorCommands.append(command); }
41
48
42
private:
49
private:
43
    GRefPtr<GtkWidget> m_nativeWidget;
50
    GtkWidget* m_nativeWidget;
44
    Vector<String> m_pendingEditorCommands;
51
    Vector<String> m_pendingEditorCommands;
45
};
52
};
46
53
47
} // namespace WebKit
54
} // namespace WebKit
48
55
49
#endif
50
51

Return to Bug 211128