WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
wkgtk4-emoji-picker.diff (text/plain), 7.31 KB, created by
Carlos Garcia Campos
on 2020-06-02 07:03:51 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2020-06-02 07:03:51 PDT
Size:
7.31 KB
patch
obsolete
>diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 875541b3d2a1..b4db6fa669b4 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,21 @@ >+2020-06-02 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK4] Implement emoji chooser >+ https://bugs.webkit.org/show_bug.cgi?id=212330 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-02 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK4] Implement data list drop down menu >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp >index 17e94309847e..cbca0f1266af 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp >@@ -194,6 +194,8 @@ static void webkitEmojiChooserAddRecentItem(WebKitEmojiChooser* chooser, GVarian > > 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 @@ static void emojiActivated(GtkFlowBox* box, GtkFlowBoxChild* child, WebKitEmojiC > 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) >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >index 2e08bcd64d90..e164766d5f61 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >@@ -225,11 +225,11 @@ typedef HashMap<uint32_t, GUniquePtr<GdkEvent>> TouchEventsMap; > 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 @@ struct _WebKitWebViewBasePrivate { > 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 @@ struct _WebKitWebViewBasePrivate { > 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 @@ void webkitWebViewBaseRemoveWebInspector(WebKitWebViewBase* webViewBase, GtkWidg > #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,13 +706,14 @@ static void webkitWebViewBaseDispose(GObject* gobject) > 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); > #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) { >@@ -2381,7 +2386,7 @@ void webkitWebViewBaseDidRestoreScrollPosition(WebKitWebViewBase* webkitWebViewB > #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)); >@@ -2389,22 +2394,31 @@ static void emojiChooserEmojiPicked(WebKitWebViewBase* webkitWebViewBase, const > > 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 > > 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);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
aperez
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 212330
: 400816