Title: [260939] trunk/Source/WebKit
Revision
260939
Author
[email protected]
Date
2020-04-30 04:23:28 -0700 (Thu, 30 Apr 2020)

Log Message

[GTK4] Add support click events
https://bugs.webkit.org/show_bug.cgi?id=211175

Reviewed by Adrian Perez de Castro.

Handle button pressed and released events using a GtkGestureClick.

* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(ClickCounter::currentClickCountForGdkButtonEvent):
(webkitWebViewBaseButtonPressed):
(webkitWebViewBaseButtonReleased):
(webkitWebViewBaseConstructed):
(webkitWebViewBaseResetClickCounter):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (260938 => 260939)


--- trunk/Source/WebKit/ChangeLog	2020-04-30 10:43:05 UTC (rev 260938)
+++ trunk/Source/WebKit/ChangeLog	2020-04-30 11:23:28 UTC (rev 260939)
@@ -1,3 +1,19 @@
+2020-04-30  Carlos Garcia Campos  <[email protected]>
+
+        [GTK4] Add support click events
+        https://bugs.webkit.org/show_bug.cgi?id=211175
+
+        Reviewed by Adrian Perez de Castro.
+
+        Handle button pressed and released events using a GtkGestureClick.
+
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (ClickCounter::currentClickCountForGdkButtonEvent):
+        (webkitWebViewBaseButtonPressed):
+        (webkitWebViewBaseButtonReleased):
+        (webkitWebViewBaseConstructed):
+        (webkitWebViewBaseResetClickCounter):
+
 2020-04-29  Simon Fraser  <[email protected]>
 
         Use initializers in PlatformMouseEvent and WebEvent

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp (260938 => 260939)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2020-04-30 10:43:05 UTC (rev 260938)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2020-04-30 11:23:28 UTC (rev 260939)
@@ -82,6 +82,7 @@
 using namespace WebKit;
 using namespace WebCore;
 
+#if !USE(GTK4)
 struct ClickCounter {
 public:
     void reset()
@@ -94,7 +95,6 @@
 
     int currentClickCountForGdkButtonEvent(GdkEvent* event)
     {
-#if !USE(GTK4)
         int doubleClickDistance = 250;
         int doubleClickTime = 5;
         g_object_get(gtk_settings_get_for_screen(gdk_event_get_screen(event)),
@@ -131,7 +131,6 @@
         previousClickPoint = IntPoint(x, y);
         previousClickButton = button;
         previousClickTime = eventTime;
-#endif
 
         return currentClickCount;
     }
@@ -142,6 +141,7 @@
     unsigned previousClickButton;
     int previousClickTime;
 };
+#endif
 
 typedef HashMap<GtkWidget*, IntRect> WebKitWebViewChildrenMap;
 typedef HashMap<uint32_t, GUniquePtr<GdkEvent>> TouchEventsMap;
@@ -181,7 +181,9 @@
     RefPtr<WebPageProxy> pageProxy;
     bool shouldForwardNextKeyEvent { false };
     bool shouldForwardNextWheelEvent { false };
+#if !USE(GTK4)
     ClickCounter clickCounter;
+#endif
     CString tooltipText;
     IntRect tooltipArea;
     GRefPtr<AtkObject> accessible;
@@ -1025,7 +1027,48 @@
 
     return GDK_EVENT_STOP;
 }
+#endif
 
+#if USE(GTK4)
+static void webkitWebViewBaseButtonPressed(WebKitWebViewBase* webViewBase, int clickCount, double x, double y, GtkGesture* gesture)
+{
+    WebKitWebViewBasePrivate* priv = webViewBase->priv;
+    if (priv->dialog)
+        return;
+
+    if (clickCount == 1)
+        priv->inputMethodFilter.cancelComposition();
+    gtk_widget_grab_focus(GTK_WIDGET(webViewBase));
+
+    auto* sequence = gtk_gesture_single_get_current_sequence(GTK_GESTURE_SINGLE(gesture));
+    gtk_gesture_set_sequence_state(gesture, sequence, GTK_EVENT_SEQUENCE_CLAIMED);
+
+    auto button = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture));
+    auto* event = gtk_gesture_get_last_event(gesture, sequence);
+
+    // If it's a right click event save it as a possible context menu event.
+    if (button == GDK_BUTTON_SECONDARY)
+        priv->contextMenuEvent.reset(gdk_event_copy(event));
+
+    priv->pageProxy->handleMouseEvent(NativeWebMouseEvent(event, { clampToInteger(x), clampToInteger(y) }, clickCount, WTF::nullopt));
+}
+
+static void webkitWebViewBaseButtonReleased(WebKitWebViewBase* webViewBase, int clickCount, double x, double y, GtkGesture* gesture)
+{
+    WebKitWebViewBasePrivate* priv = webViewBase->priv;
+    if (priv->dialog)
+        return;
+
+    gtk_widget_grab_focus(GTK_WIDGET(webViewBase));
+
+    auto* sequence = gtk_gesture_single_get_current_sequence(GTK_GESTURE_SINGLE(gesture));
+    gtk_gesture_set_sequence_state(gesture, sequence, GTK_EVENT_SEQUENCE_CLAIMED);
+
+    priv->pageProxy->handleMouseEvent(NativeWebMouseEvent(gtk_gesture_get_last_event(gesture, sequence), { clampToInteger(x), clampToInteger(y) }, clickCount, WTF::nullopt));
+}
+#endif
+
+#if !USE(GTK4)
 static void webkitWebViewBaseHandleWheelEvent(WebKitWebViewBase* webViewBase, GdkEvent* event, Optional<WebWheelEvent::Phase> phase = WTF::nullopt, Optional<WebWheelEvent::Phase> momentum = WTF::nullopt)
 {
     ViewGestureController* controller = webkitWebViewBaseViewGestureController(webViewBase);
@@ -1659,6 +1702,12 @@
     g_signal_connect_object(controller, "key-pressed", G_CALLBACK(webkitWebViewBaseKeyPressed), viewWidget, G_CONNECT_SWAPPED);
     g_signal_connect_object(controller, "key-released", G_CALLBACK(webkitWebViewBaseKeyReleased), viewWidget, G_CONNECT_SWAPPED);
     gtk_widget_add_controller(viewWidget, controller);
+
+    auto* gesture = gtk_gesture_click_new();
+    gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 0);
+    g_signal_connect_object(gesture, "pressed", G_CALLBACK(webkitWebViewBaseButtonPressed), viewWidget, G_CONNECT_SWAPPED);
+    g_signal_connect_object(gesture, "released", G_CALLBACK(webkitWebViewBaseButtonReleased), viewWidget, G_CONNECT_SWAPPED);
+    gtk_widget_add_controller(viewWidget, GTK_EVENT_CONTROLLER(gesture));
 #endif
 }
 
@@ -1950,7 +1999,9 @@
 
 void webkitWebViewBaseResetClickCounter(WebKitWebViewBase* webkitWebViewBase)
 {
+#if !USE(GTK4)
     webkitWebViewBase->priv->clickCounter.reset();
+#endif
 }
 
 void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase, const LayerTreeContext& layerTreeContext)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to