Title: [262482] trunk/Source/WebKit
Revision
262482
Author
[email protected]
Date
2020-06-03 02:12:00 -0700 (Wed, 03 Jun 2020)

Log Message

[GTK4] Implement emoji chooser
https://bugs.webkit.org/show_bug.cgi?id=212330

Reviewed by Adrian Perez de Castro.

GtkEmojiChooser is public API in GTK4, so just use that instead of our own.

* UIProcess/API/gtk/WebKitEmojiChooser.cpp:
(emojiActivated): Close the popover before emitting emoji-picked for consistency with GTK.
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(_WebKitWebViewBasePrivate::_WebKitWebViewBasePrivate):
(_WebKitWebViewBasePrivate::releaseEmojiChooserTimerFired):
(webkitWebViewBaseDispose):
(emojiChooserClosed):
(webkitWebViewBaseShowEmojiChooser):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (262481 => 262482)


--- trunk/Source/WebKit/ChangeLog	2020-06-03 07:31:29 UTC (rev 262481)
+++ trunk/Source/WebKit/ChangeLog	2020-06-03 09:12:00 UTC (rev 262482)
@@ -1,3 +1,21 @@
+2020-06-03  Carlos Garcia Campos  <[email protected]>
+
+        [GTK4] Implement emoji chooser
+        https://bugs.webkit.org/show_bug.cgi?id=212330
+
+        Reviewed by Adrian Perez de Castro.
+
+        GtkEmojiChooser is public API in GTK4, so just use that instead of our own.
+
+        * UIProcess/API/gtk/WebKitEmojiChooser.cpp:
+        (emojiActivated): Close the popover before emitting emoji-picked for consistency with GTK.
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (_WebKitWebViewBasePrivate::_WebKitWebViewBasePrivate):
+        (_WebKitWebViewBasePrivate::releaseEmojiChooserTimerFired):
+        (webkitWebViewBaseDispose):
+        (emojiChooserClosed):
+        (webkitWebViewBaseShowEmojiChooser):
+
 2020-06-03  Youenn Fablet  <[email protected]>
 
         Add more logging related to service worker fetch event handling

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp (262481 => 262482)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp	2020-06-03 07:31:29 UTC (rev 262481)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp	2020-06-03 09:12:00 UTC (rev 262482)
@@ -194,6 +194,8 @@
 
 static void emojiActivated(GtkFlowBox* box, GtkFlowBoxChild* child, WebKitEmojiChooser* chooser)
 {
+    gtk_popover_popdown(GTK_POPOVER(chooser));
+
     GtkWidget* label = gtk_bin_get_child(GTK_BIN(gtk_bin_get_child(GTK_BIN(child))));
     GUniquePtr<char> text(g_strdup(gtk_label_get_label(GTK_LABEL(label))));
 
@@ -201,8 +203,6 @@
     auto modifier = static_cast<gunichar>(GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(child), "modifier")));
     webkitEmojiChooserAddRecentItem(chooser, item, modifier);
     g_signal_emit(chooser, signals[EMOJI_PICKED], 0, text.get());
-
-    gtk_popover_popdown(GTK_POPOVER(chooser));
 }
 
 static bool emojiDataHasVariations(GVariant* emojiData)

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


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2020-06-03 07:31:29 UTC (rev 262481)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2020-06-03 09:12:00 UTC (rev 262482)
@@ -225,11 +225,11 @@
 struct _WebKitWebViewBasePrivate {
     _WebKitWebViewBasePrivate()
         : updateActivityStateTimer(RunLoop::main(), this, &_WebKitWebViewBasePrivate::updateActivityStateTimerFired)
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
         , releaseEmojiChooserTimer(RunLoop::main(), this, &_WebKitWebViewBasePrivate::releaseEmojiChooserTimerFired)
 #endif
     {
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
         releaseEmojiChooserTimer.setPriority(RunLoopSourcePriority::ReleaseUnusedResourcesTimer);
 #endif
     }
@@ -242,13 +242,17 @@
         activityStateFlagsToUpdate = { };
     }
 
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
     void releaseEmojiChooserTimerFired()
     {
+#if USE(GTK4)
+        g_clear_pointer(&emojiChooser, gtk_widget_unparent);
+#else
         if (emojiChooser) {
             gtk_widget_destroy(emojiChooser);
             emojiChooser = nullptr;
         }
+#endif
     }
 #endif
 
@@ -314,7 +318,7 @@
     bool isBackForwardNavigationGestureEnabled { false };
 #endif
 
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
     GtkWidget* emojiChooser;
     CompletionHandler<void(String)> emojiChooserCompletionHandler;
     RunLoop::Timer<WebKitWebViewBasePrivate> releaseEmojiChooserTimer;
@@ -686,7 +690,7 @@
 #endif
 }
 
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
 static void webkitWebViewBaseCompleteEmojiChooserRequest(WebKitWebViewBase* webView, const String& text)
 {
     if (auto completionHandler = std::exchange(webView->priv->emojiChooserCompletionHandler, nullptr))
@@ -702,6 +706,7 @@
     webkitWebViewBaseRemoveWebInspector(webView, webView->priv->inspectorView);
     if (auto* widget = webView->priv->keyBindingTranslator.widget())
         gtk_widget_unparent(widget);
+    g_clear_pointer(&webView->priv->emojiChooser, gtk_widget_unparent);
 #else
     g_clear_pointer(&webView->priv->dialog, gtk_widget_destroy);
     webkitWebViewBaseSetToplevelOnScreenWindow(webView, nullptr);
@@ -708,7 +713,7 @@
 #endif
     if (webView->priv->accessible)
         webkitWebViewAccessibleSetWebView(WEBKIT_WEB_VIEW_ACCESSIBLE(webView->priv->accessible.get()), nullptr);
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
     webkitWebViewBaseCompleteEmojiChooserRequest(webView, emptyString());
 #endif
     if (webView->priv->pointerLockManager) {
@@ -2377,7 +2382,7 @@
 #endif
 }
 
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
 static void emojiChooserEmojiPicked(WebKitWebViewBase* webkitWebViewBase, const char* text)
 {
     webkitWebViewBaseCompleteEmojiChooserRequest(webkitWebViewBase, String::fromUTF8(text));
@@ -2385,7 +2390,11 @@
 
 static void emojiChooserClosed(WebKitWebViewBase* webkitWebViewBase)
 {
-    webkitWebViewBaseCompleteEmojiChooserRequest(webkitWebViewBase, emptyString());
+    // The emoji chooser first closes the popover and then emits emoji-picked signal, so complete
+    // the request if the emoji isn't picked before the next run loop iteration.
+    RunLoop::main().dispatch([webViewBase = GRefPtr<WebKitWebViewBase>(webkitWebViewBase)] {
+        webkitWebViewBaseCompleteEmojiChooserRequest(webViewBase.get(), emptyString());
+    });
     webkitWebViewBase->priv->releaseEmojiChooserTimer.startOneShot(2_min);
 }
 #endif
@@ -2392,15 +2401,20 @@
 
 void webkitWebViewBaseShowEmojiChooser(WebKitWebViewBase* webkitWebViewBase, const IntRect& caretRect, CompletionHandler<void(String)>&& completionHandler)
 {
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
     WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
     priv->releaseEmojiChooserTimer.stop();
 
     if (!priv->emojiChooser) {
+#if USE(GTK4)
+        priv->emojiChooser = gtk_emoji_chooser_new();
+        gtk_widget_set_parent(priv->emojiChooser, GTK_WIDGET(webkitWebViewBase));
+#else
         priv->emojiChooser = webkitEmojiChooserNew();
+        gtk_popover_set_relative_to(GTK_POPOVER(priv->emojiChooser), GTK_WIDGET(webkitWebViewBase));
+#endif
         g_signal_connect_swapped(priv->emojiChooser, "emoji-picked", G_CALLBACK(emojiChooserEmojiPicked), webkitWebViewBase);
         g_signal_connect_swapped(priv->emojiChooser, "closed", G_CALLBACK(emojiChooserClosed), webkitWebViewBase);
-        gtk_popover_set_relative_to(GTK_POPOVER(priv->emojiChooser), GTK_WIDGET(webkitWebViewBase));
     }
 
     priv->emojiChooserCompletionHandler = WTFMove(completionHandler);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to