diff --git a/src/e-util/e-html-editor-actions.c b/src/e-util/e-html-editor-actions.c index 44a87a2afd..aa80657afc 100644 --- a/src/e-util/e-html-editor-actions.c +++ b/src/e-util/e-html-editor-actions.c @@ -347,22 +347,43 @@ static void action_insert_emoji_cb (GtkAction *action, EHTMLEditor *editor) { - if (!editor->priv->emoji_chooser) { - GtkWidget *popover; + EContentEditor *cnt_editor; + GtkPopover *popover; + GtkWidget *relative_to; + GdkRectangle rect = { 0, 0, -1, -1 }; - popover = e_gtk_emoji_chooser_new (); + if (editor->priv->emoji_chooser) { + popover = GTK_POPOVER (editor->priv->emoji_chooser); + } else { + popover = GTK_POPOVER (e_gtk_emoji_chooser_new ()); - gtk_popover_set_relative_to (GTK_POPOVER (popover), GTK_WIDGET (editor)); gtk_popover_set_position (GTK_POPOVER (popover), GTK_POS_BOTTOM); gtk_popover_set_modal (GTK_POPOVER (popover), TRUE); g_signal_connect_object (popover, "emoji-picked", G_CALLBACK (emoji_chooser_emoji_picked_cb), editor, G_CONNECT_SWAPPED); - editor->priv->emoji_chooser = popover; + editor->priv->emoji_chooser = GTK_WIDGET (popover); } - gtk_popover_popup (GTK_POPOVER (editor->priv->emoji_chooser)); + cnt_editor = e_html_editor_get_content_editor (editor); + e_content_editor_get_caret_client_rect (cnt_editor, &rect); + + if (rect.width >= 0 && rect.height >= 0 && rect.x + rect.width >= 0 && rect.y + rect.height >= 0) { + relative_to = GTK_WIDGET (cnt_editor); + } else { + relative_to = GTK_WIDGET (editor); + + rect.x = 0; + rect.y = 0; + rect.width = gtk_widget_get_allocated_width (relative_to); + rect.height = 0; + } + + gtk_popover_set_relative_to (popover, relative_to); + gtk_popover_set_pointing_to (popover, &rect); + + gtk_popover_popup (popover); } static void