Title: [262939] trunk
Revision
262939
Author
carlo...@webkit.org
Date
2020-06-12 01:42:50 -0700 (Fri, 12 Jun 2020)

Log Message

[GTK4] Get MiniBrowser ready for GTK4
https://bugs.webkit.org/show_bug.cgi?id=210276

Reviewed by Adrian Perez de Castro.

.:

Bump GTK4 required version.

* Source/cmake/OptionsGTK.cmake:

Tools:

Port MiniBrowser to GTK4. BrowserSearchBar has been renamed as BrowserSearchBox, because in GTK GtkSearchBar is
final class, so we derive from GtkBox and to be used as contents of a GtkSearchBar.

* MiniBrowser/gtk/BrowserCellRendererVariant.c:
(browserCellRendererVariantCellRendererSnapshot):
(browser_cell_renderer_variant_class_init):
* MiniBrowser/gtk/BrowserCellRendererVariant.h:
* MiniBrowser/gtk/BrowserSearchBar.c: Removed.
* MiniBrowser/gtk/BrowserSearchBox.c: Added.
(setFailedStyleForEntry):
(doSearch):
(searchNext):
(searchPrevious):
(searchEntryMenuIconPressedCallback):
(searchEntryClearIconReleasedCallback):
(searchEntryChangedCallback):
(searchEntryActivatedCallback):
(searchPreviousButtonCallback):
(searchNextButtonCallback):
(searchMenuCheckButtonToggledCallback):
(findControllerFailedToFindTextCallback):
(findControllerFoundTextCallback):
(browserSearchBoxFinalize):
(browserSearchBoxDispose):
(browserSearchBoxSizeAllocate):
(browser_search_box_class_init):
(browser_search_box_new):
(browser_search_box_get_entry):
* MiniBrowser/gtk/BrowserSearchBox.h: Renamed from Tools/MiniBrowser/gtk/BrowserSearchBar.h.
* MiniBrowser/gtk/BrowserSettingsDialog.c:
(browser_settings_dialog_init):
(browser_settings_dialog_new):
* MiniBrowser/gtk/BrowserSettingsDialog.h:
* MiniBrowser/gtk/BrowserTab.c:
(loadChanged):
(createInfoBarQuestionMessage):
(tlsErrorsDialogResponse):
(loadFailedWithTLSerrors):
(permissionRequestDialogResponse):
(decidePermissionRequest):
(colorChooserRequestFinished):
(runColorChooserCallback):
(tabCloseClicked):
(browserTabConstructed):
(browserTabIsSearchBarOpen):
(browser_tab_start_search):
(browser_tab_stop_search):
(browser_tab_enter_fullscreen):
(browser_tab_leave_fullscreen):
* MiniBrowser/gtk/BrowserWindow.c:
(settingsCallback):
(resetEntryProgress):
(webViewLoadProgressChanged):
(browserWindowCreateBackForwardMenu):
(browserWindowUpdateNavigationMenu):
(navigationButtonPressed):
(navigationButtonPressCallback):
(scrollEventCallback):
(webViewIsLoadingChanged):
(searchCallback):
(insertImageDialogResponse):
(insertImageCommandCallback):
(insertLinkDialogResponse):
(insertLinkCommandCallback):
(typingAttributesChanged):
(browserWindowSaveSession):
(browserWindowFinalize):
(browserWindowDispose):
(addToolbarButton):
(browserWindowSwitchTab):
(browserWindowTabAddedOrRemoved):
(browserWindowBuildPopoverMenu):
(browserWindowCloseRequest):
(browserWindowDeleteEvent):
(browser_window_class_init):
(browser_window_append_view):
(browser_window_set_background_color):
* MiniBrowser/gtk/CMakeLists.txt:

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/ChangeLog (262938 => 262939)


--- trunk/ChangeLog	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/ChangeLog	2020-06-12 08:42:50 UTC (rev 262939)
@@ -1,3 +1,14 @@
+2020-06-12  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [GTK4] Get MiniBrowser ready for GTK4
+        https://bugs.webkit.org/show_bug.cgi?id=210276
+
+        Reviewed by Adrian Perez de Castro.
+
+        Bump GTK4 required version.
+
+        * Source/cmake/OptionsGTK.cmake:
+
 2020-06-07  Philippe Normand  <pnorm...@igalia.com>
 
         Remove ENABLE_VIDEO_TRACK ifdef guards

Modified: trunk/Source/cmake/OptionsGTK.cmake (262938 => 262939)


--- trunk/Source/cmake/OptionsGTK.cmake	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Source/cmake/OptionsGTK.cmake	2020-06-12 08:42:50 UTC (rev 262939)
@@ -8,7 +8,7 @@
 
 if (USE_GTK4)
     set(WEBKITGTK_API_VERSION 5.0)
-    set(GTK_MINIMUM_VERSION 3.98.4)
+    set(GTK_MINIMUM_VERSION 3.98.5)
     CALCULATE_LIBRARY_VERSIONS_FROM_LIBTOOL_TRIPLE(WEBKIT 0 0 0)
 else ()
     set(WEBKITGTK_API_VERSION 4.0)

Modified: trunk/Tools/ChangeLog (262938 => 262939)


--- trunk/Tools/ChangeLog	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/ChangeLog	2020-06-12 08:42:50 UTC (rev 262939)
@@ -1,5 +1,91 @@
 2020-06-12  Carlos Garcia Campos  <cgar...@igalia.com>
 
+        [GTK4] Get MiniBrowser ready for GTK4
+        https://bugs.webkit.org/show_bug.cgi?id=210276
+
+        Reviewed by Adrian Perez de Castro.
+
+        Port MiniBrowser to GTK4. BrowserSearchBar has been renamed as BrowserSearchBox, because in GTK GtkSearchBar is
+        final class, so we derive from GtkBox and to be used as contents of a GtkSearchBar.
+
+        * MiniBrowser/gtk/BrowserCellRendererVariant.c:
+        (browserCellRendererVariantCellRendererSnapshot):
+        (browser_cell_renderer_variant_class_init):
+        * MiniBrowser/gtk/BrowserCellRendererVariant.h:
+        * MiniBrowser/gtk/BrowserSearchBar.c: Removed.
+        * MiniBrowser/gtk/BrowserSearchBox.c: Added.
+        (setFailedStyleForEntry):
+        (doSearch):
+        (searchNext):
+        (searchPrevious):
+        (searchEntryMenuIconPressedCallback):
+        (searchEntryClearIconReleasedCallback):
+        (searchEntryChangedCallback):
+        (searchEntryActivatedCallback):
+        (searchPreviousButtonCallback):
+        (searchNextButtonCallback):
+        (searchMenuCheckButtonToggledCallback):
+        (findControllerFailedToFindTextCallback):
+        (findControllerFoundTextCallback):
+        (browserSearchBoxFinalize):
+        (browserSearchBoxDispose):
+        (browserSearchBoxSizeAllocate):
+        (browser_search_box_class_init):
+        (browser_search_box_new):
+        (browser_search_box_get_entry):
+        * MiniBrowser/gtk/BrowserSearchBox.h: Renamed from Tools/MiniBrowser/gtk/BrowserSearchBar.h.
+        * MiniBrowser/gtk/BrowserSettingsDialog.c:
+        (browser_settings_dialog_init):
+        (browser_settings_dialog_new):
+        * MiniBrowser/gtk/BrowserSettingsDialog.h:
+        * MiniBrowser/gtk/BrowserTab.c:
+        (loadChanged):
+        (createInfoBarQuestionMessage):
+        (tlsErrorsDialogResponse):
+        (loadFailedWithTLSerrors):
+        (permissionRequestDialogResponse):
+        (decidePermissionRequest):
+        (colorChooserRequestFinished):
+        (runColorChooserCallback):
+        (tabCloseClicked):
+        (browserTabConstructed):
+        (browserTabIsSearchBarOpen):
+        (browser_tab_start_search):
+        (browser_tab_stop_search):
+        (browser_tab_enter_fullscreen):
+        (browser_tab_leave_fullscreen):
+        * MiniBrowser/gtk/BrowserWindow.c:
+        (settingsCallback):
+        (resetEntryProgress):
+        (webViewLoadProgressChanged):
+        (browserWindowCreateBackForwardMenu):
+        (browserWindowUpdateNavigationMenu):
+        (navigationButtonPressed):
+        (navigationButtonPressCallback):
+        (scrollEventCallback):
+        (webViewIsLoadingChanged):
+        (searchCallback):
+        (insertImageDialogResponse):
+        (insertImageCommandCallback):
+        (insertLinkDialogResponse):
+        (insertLinkCommandCallback):
+        (typingAttributesChanged):
+        (browserWindowSaveSession):
+        (browserWindowFinalize):
+        (browserWindowDispose):
+        (addToolbarButton):
+        (browserWindowSwitchTab):
+        (browserWindowTabAddedOrRemoved):
+        (browserWindowBuildPopoverMenu):
+        (browserWindowCloseRequest):
+        (browserWindowDeleteEvent):
+        (browser_window_class_init):
+        (browser_window_append_view):
+        (browser_window_set_background_color):
+        * MiniBrowser/gtk/CMakeLists.txt:
+
+2020-06-12  Carlos Garcia Campos  <cgar...@igalia.com>
+
         [GTK] MiniBrowser: stop using GtkToolbar
         https://bugs.webkit.org/show_bug.cgi?id=212898
 

Modified: trunk/Tools/MiniBrowser/gtk/BrowserCellRendererVariant.c (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserCellRendererVariant.c	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserCellRendererVariant.c	2020-06-12 08:42:50 UTC (rev 262939)
@@ -27,8 +27,6 @@
 #include "BrowserMarshal.h"
 #include <errno.h>
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
-
 enum {
     PROP_0,
 
@@ -212,6 +210,16 @@
     return TRUE;
 }
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+static void browserCellRendererVariantCellRendererSnapshot(GtkCellRenderer *cell, GtkSnapshot *snapshot, GtkWidget *widget, const GdkRectangle *bgArea, const GdkRectangle *cellArea, GtkCellRendererState flags)
+{
+    GtkCellRenderer *renderer = browserCellRendererVariantGetRendererForValue(BROWSER_CELL_RENDERER_VARIANT(cell));
+    if (!renderer)
+        return;
+
+    GTK_CELL_RENDERER_GET_CLASS(renderer)->snapshot(renderer, snapshot, widget, bgArea, cellArea, flags);
+}
+#else
 static void browserCellRendererVariantCellRendererRender(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *bgArea, const GdkRectangle *cellArea, GtkCellRendererState flags)
 {
     GtkCellRenderer *renderer = browserCellRendererVariantGetRendererForValue(BROWSER_CELL_RENDERER_VARIANT(cell));
@@ -220,6 +228,7 @@
 
     GTK_CELL_RENDERER_GET_CLASS(renderer)->render(renderer, cr, widget, bgArea, cellArea, flags);
 }
+#endif
 
 static GtkCellEditable *browserCellRendererVariantCellRendererStartEditing(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, const GdkRectangle *bgArea, const GdkRectangle *cellArea, GtkCellRendererState flags)
 {
@@ -308,7 +317,11 @@
     gobjectClass->finalize = browserCellRendererVariantFinalize;
 
     cellRendererClass->activate = browserCellRendererVariantCellRendererActivate;
+#if GTK_CHECK_VERSION(3, 98, 5)
+    cellRendererClass->snapshot = browserCellRendererVariantCellRendererSnapshot;
+#else
     cellRendererClass->render = browserCellRendererVariantCellRendererRender;
+#endif
     cellRendererClass->start_editing = browserCellRendererVariantCellRendererStartEditing;
     cellRendererClass->get_preferred_width = browserCellRendererVariantCellRendererGetPreferredWidth;
     cellRendererClass->get_preferred_height = browserCellRendererVariantCellRendererGetPreferredHeight;
@@ -346,4 +359,3 @@
     return GTK_CELL_RENDERER(g_object_new(BROWSER_TYPE_CELL_RENDERER_VARIANT, NULL));
 }
 
-#endif

Modified: trunk/Tools/MiniBrowser/gtk/BrowserCellRendererVariant.h (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserCellRendererVariant.h	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserCellRendererVariant.h	2020-06-12 08:42:50 UTC (rev 262939)
@@ -28,8 +28,6 @@
 
 #include <gtk/gtk.h>
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
-
 G_BEGIN_DECLS
 
 #define BROWSER_TYPE_CELL_RENDERER_VARIANT            (browser_cell_renderer_variant_get_type())
@@ -49,5 +47,3 @@
 G_END_DECLS
 
 #endif
-
-#endif

Deleted: trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.c (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.c	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.c	2020-06-12 08:42:50 UTC (rev 262939)
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2013 Igalia S.L.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "cmakeconfig.h"
-#include "BrowserSearchBar.h"
-
-#if !GTK_CHECK_VERSION(3, 98, 0)
-
-struct _BrowserSearchBar {
-    GtkSearchBar parent;
-
-    WebKitWebView *webView;
-    GtkWidget *entry;
-    GtkWidget *prevButton;
-    GtkWidget *nextButton;
-    GMenu *optionsMenu;
-    GtkWidget *caseCheckButton;
-    GtkWidget *begginigWordCheckButton;
-    GtkWidget *capitalAsBegginigWordCheckButton;
-};
-
-G_DEFINE_TYPE(BrowserSearchBar, browser_search_bar, GTK_TYPE_SEARCH_BAR)
-
-static void setFailedStyleForEntry(BrowserSearchBar *searchBar, gboolean failedSearch)
-{
-    if (failedSearch)
-        gtk_style_context_add_class(gtk_widget_get_style_context(searchBar->entry), "search-failed");
-    else
-        gtk_style_context_remove_class(gtk_widget_get_style_context(searchBar->entry), "search-failed");
-}
-
-static void doSearch(BrowserSearchBar *searchBar)
-{
-    GtkEntry *entry = GTK_ENTRY(searchBar->entry);
-    if (!gtk_entry_get_text_length(entry)) {
-        setFailedStyleForEntry(searchBar, FALSE);
-        webkit_find_controller_search_finish(webkit_web_view_get_find_controller(searchBar->webView));
-        return;
-    }
-
-    WebKitFindOptions options = WEBKIT_FIND_OPTIONS_WRAP_AROUND;
-    GActionGroup *actionGroup = gtk_widget_get_action_group(GTK_WIDGET(searchBar), "find");
-    GAction *action = "" "case-sensitive");
-    GVariant *state = g_action_get_state(action);
-    if (!g_variant_get_boolean(state))
-        options |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
-    g_variant_unref(state);
-
-    action = "" "beginning-word");
-    state = g_action_get_state(action);
-    if (g_variant_get_boolean(state))
-        options |= WEBKIT_FIND_OPTIONS_AT_WORD_STARTS;
-    g_variant_unref(state);
-
-    action = "" "capital-as-beginning-word");
-    state = g_action_get_state(action);
-    if (g_variant_get_boolean(state))
-        options |= WEBKIT_FIND_OPTIONS_TREAT_MEDIAL_CAPITAL_AS_WORD_START;
-    g_variant_unref(state);
-
-    const gchar *text = gtk_entry_get_text(entry);
-    webkit_find_controller_search(webkit_web_view_get_find_controller(searchBar->webView), text, options, G_MAXUINT);
-}
-
-static void searchNext(BrowserSearchBar *searchBar)
-{
-    webkit_find_controller_search_next(webkit_web_view_get_find_controller(searchBar->webView));
-}
-
-static void searchPrevious(BrowserSearchBar *searchBar)
-{
-    webkit_find_controller_search_previous(webkit_web_view_get_find_controller(searchBar->webView));
-}
-
-static void searchEntryMenuIconPressedCallback(BrowserSearchBar *searchBar, GtkEntryIconPosition iconPosition, GdkEvent *event)
-{
-    if (iconPosition != GTK_ENTRY_ICON_PRIMARY)
-        return;
-
-    GtkWidget *popover = gtk_popover_new_from_model(searchBar->entry, G_MENU_MODEL(searchBar->optionsMenu));
-    GdkRectangle rect;
-    gtk_entry_get_icon_area(GTK_ENTRY(searchBar->entry), GTK_ENTRY_ICON_PRIMARY, &rect);
-    gtk_popover_set_pointing_to(GTK_POPOVER(popover), &rect);
-    gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM);
-    gtk_popover_popup(GTK_POPOVER(popover));
-}
-
-static void searchEntryChangedCallback(GtkSearchEntry *entry, BrowserSearchBar *searchBar)
-{
-    doSearch(searchBar);
-}
-
-static void searchEntryActivatedCallback(BrowserSearchBar *searchBar)
-{
-    searchNext(searchBar);
-}
-
-static void searchPreviousButtonCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
-{
-    searchPrevious(BROWSER_SEARCH_BAR(userData));
-}
-
-static void searchNextButtonCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
-{
-    searchNext(BROWSER_SEARCH_BAR(userData));
-}
-
-static void searchMenuCheckButtonToggledCallback(GSimpleAction *action, GVariant *state, gpointer userData)
-{
-    g_simple_action_set_state(action, state);
-    doSearch(BROWSER_SEARCH_BAR(userData));
-}
-
-static void findControllerFailedToFindTextCallback(BrowserSearchBar *searchBar)
-{
-    setFailedStyleForEntry(searchBar, TRUE);
-}
-
-static void findControllerFoundTextCallback(BrowserSearchBar *searchBar)
-{
-    setFailedStyleForEntry(searchBar, FALSE);
-}
-
-static const GActionEntry actions[] = {
-    { "next", searchNextButtonCallback, NULL, NULL, NULL, { 0 } },
-    { "previous", searchPreviousButtonCallback, NULL, NULL, NULL, { 0 } },
-    { "case-sensitive", NULL, NULL, "false", searchMenuCheckButtonToggledCallback, { 0 } },
-    { "beginning-word", NULL, NULL, "false", searchMenuCheckButtonToggledCallback, { 0 } },
-    { "capital-as-beginning-word", NULL, NULL, "false", searchMenuCheckButtonToggledCallback, { 0 } }
-};
-
-static void browser_search_bar_init(BrowserSearchBar *searchBar)
-{
-    GSimpleActionGroup *actionGroup = g_simple_action_group_new();
-    g_action_map_add_action_entries(G_ACTION_MAP(actionGroup), actions, G_N_ELEMENTS(actions), searchBar);
-    gtk_widget_insert_action_group(GTK_WIDGET(searchBar), "find", G_ACTION_GROUP(actionGroup));
-    g_object_unref(actionGroup);
-
-    GtkWidget *hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-    GtkStyleContext *styleContext = gtk_widget_get_style_context(hBox);
-    gtk_style_context_add_class(styleContext, GTK_STYLE_CLASS_LINKED);
-    gtk_style_context_add_class(styleContext, GTK_STYLE_CLASS_RAISED);
-
-    searchBar->entry = gtk_search_entry_new();
-    gtk_entry_set_icon_activatable(GTK_ENTRY(searchBar->entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
-    gtk_entry_set_icon_sensitive(GTK_ENTRY(searchBar->entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
-    gtk_entry_set_icon_tooltip_text(GTK_ENTRY(searchBar->entry), GTK_ENTRY_ICON_PRIMARY, "Search options");
-    gtk_box_pack_start(GTK_BOX(hBox), searchBar->entry, TRUE, TRUE, 0);
-    gtk_widget_show(searchBar->entry);
-
-    GtkCssProvider *cssProvider = gtk_css_provider_new();
-    gtk_css_provider_load_from_data(cssProvider, ".search-failed { background-color: #ff6666; }", -1, NULL);
-    gtk_style_context_add_provider(gtk_widget_get_style_context(searchBar->entry), GTK_STYLE_PROVIDER(cssProvider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-    g_object_unref(cssProvider);
-
-    searchBar->prevButton = gtk_button_new_from_icon_name("go-up-symbolic", GTK_ICON_SIZE_MENU);
-    GtkButton *button = GTK_BUTTON(searchBar->prevButton);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "find.previous");
-    gtk_widget_set_focus_on_click(searchBar->prevButton, FALSE);
-    gtk_box_pack_start(GTK_BOX(hBox), searchBar->prevButton, FALSE, FALSE, 0);
-    gtk_widget_show(searchBar->prevButton);
-
-    searchBar->nextButton = gtk_button_new_from_icon_name("go-down-symbolic", GTK_ICON_SIZE_MENU);
-    button = GTK_BUTTON(searchBar->nextButton);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "find.next");
-    gtk_widget_set_focus_on_click(searchBar->nextButton, FALSE);
-    gtk_box_pack_start(GTK_BOX(hBox), searchBar->nextButton, FALSE, FALSE, 0);
-    gtk_widget_show(searchBar->nextButton);
-
-    gtk_container_add(GTK_CONTAINER(searchBar), hBox);
-    gtk_widget_show(hBox);
-    gtk_search_bar_connect_entry(GTK_SEARCH_BAR(searchBar), GTK_ENTRY(searchBar->entry));
-    gtk_widget_show(GTK_WIDGET(searchBar));
-
-    searchBar->optionsMenu = g_menu_new();
-    g_menu_append(searchBar->optionsMenu, "Ca_se sensitive", "find.case-sensitive");
-    g_menu_append(searchBar->optionsMenu, "Only at the _beginning of words", "find.beginning-word");
-    g_menu_append(searchBar->optionsMenu, "Capital _always as beginning of word", "find.capital-as-beginning-word");
-
-    g_signal_connect_swapped(searchBar->entry, "icon-press", G_CALLBACK(searchEntryMenuIconPressedCallback), searchBar);
-    g_signal_connect_after(searchBar->entry, "search-changed", G_CALLBACK(searchEntryChangedCallback), searchBar);
-    g_signal_connect_swapped(searchBar->entry, "activate", G_CALLBACK(searchEntryActivatedCallback), searchBar);
-}
-
-static void browserSearchBarFinalize(GObject *gObject)
-{
-    BrowserSearchBar *searchBar = BROWSER_SEARCH_BAR(gObject);
-
-    if (searchBar->webView) {
-        g_object_unref(searchBar->webView);
-        searchBar->webView = NULL;
-    }
-
-    if (searchBar->optionsMenu) {
-        g_object_unref(searchBar->optionsMenu);
-        searchBar->optionsMenu = NULL;
-    }
-
-    G_OBJECT_CLASS(browser_search_bar_parent_class)->finalize(gObject);
-}
-
-static void browser_search_bar_class_init(BrowserSearchBarClass *klass)
-{
-    GObjectClass *gObjectClass = G_OBJECT_CLASS(klass);
-
-    gObjectClass->finalize = browserSearchBarFinalize;
-}
-
-GtkWidget *browser_search_bar_new(WebKitWebView *webView)
-{
-    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
-    GtkWidget *searchBar = GTK_WIDGET(g_object_new(BROWSER_TYPE_SEARCH_BAR, NULL));
-    BROWSER_SEARCH_BAR(searchBar)->webView = g_object_ref(webView);
-    gtk_search_bar_set_show_close_button(GTK_SEARCH_BAR(searchBar), TRUE);
-
-    WebKitFindController *controller = webkit_web_view_get_find_controller(webView);
-    g_signal_connect_swapped(controller, "failed-to-find-text", G_CALLBACK(findControllerFailedToFindTextCallback), searchBar);
-    g_signal_connect_swapped(controller, "found-text", G_CALLBACK(findControllerFoundTextCallback), searchBar);
-
-    return searchBar;
-}
-
-void browser_search_bar_open(BrowserSearchBar *searchBar)
-{
-    g_return_if_fail(BROWSER_IS_SEARCH_BAR(searchBar));
-
-    gtk_search_bar_set_search_mode(GTK_SEARCH_BAR(searchBar), TRUE);
-}
-
-void browser_search_bar_close(BrowserSearchBar *searchBar)
-{
-    g_return_if_fail(BROWSER_IS_SEARCH_BAR(searchBar));
-
-    gtk_search_bar_set_search_mode(GTK_SEARCH_BAR(searchBar), FALSE);
-}
-
-gboolean browser_search_bar_is_open(BrowserSearchBar *searchBar)
-{
-    g_return_val_if_fail(BROWSER_IS_SEARCH_BAR(searchBar), FALSE);
-
-    GtkWidget *revealer = gtk_bin_get_child(GTK_BIN(searchBar));
-    return gtk_revealer_get_reveal_child(GTK_REVEALER(revealer));
-}
-
-#endif

Deleted: trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.h (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.h	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.h	2020-06-12 08:42:50 UTC (rev 262939)
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2013 Igalia S.L.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef BrowserSearchBar_h
-#define BrowserSearchBar_h
-
-#include <gtk/gtk.h>
-#include <webkit2/webkit2.h>
-
-#if !GTK_CHECK_VERSION(3, 98, 0)
-
-G_BEGIN_DECLS
-
-#define BROWSER_TYPE_SEARCH_BAR            (browser_search_bar_get_type())
-#define BROWSER_SEARCH_BAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), BROWSER_TYPE_SEARCH_BAR, BrowserSearchBar))
-#define BROWSER_IS_SEARCH_BAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), BROWSER_TYPE_SEARCH_BAR))
-#define BROWSER_SEARCH_BAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  BROWSER_TYPE_SEARCH_BAR, BrowserSearchBarClass))
-#define BROWSER_IS_SEARCH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  BROWSER_TYPE_SEARCH_BAR))
-#define BROWSER_SEARCH_BAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  BROWSER_TYPE_SEARCH_BAR, BrowserSearchBarClass))
-
-typedef struct _BrowserSearchBar       BrowserSearchBar;
-typedef struct _BrowserSearchBarClass  BrowserSearchBarClass;
-
-struct _BrowserSearchBarClass {
-    GtkSearchBarClass parent_class;
-};
-
-GType browser_search_bar_get_type(void);
-
-GtkWidget *browser_search_bar_new(WebKitWebView *);
-void browser_search_bar_open(BrowserSearchBar *);
-void browser_search_bar_close(BrowserSearchBar *);
-gboolean browser_search_bar_is_open(BrowserSearchBar *);
-
-
-G_END_DECLS
-
-#endif
-
-#endif

Added: trunk/Tools/MiniBrowser/gtk/BrowserSearchBox.c (0 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserSearchBox.c	                        (rev 0)
+++ trunk/Tools/MiniBrowser/gtk/BrowserSearchBox.c	2020-06-12 08:42:50 UTC (rev 262939)
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2013, 2020 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "cmakeconfig.h"
+#include "BrowserSearchBox.h"
+
+struct _BrowserSearchBox {
+    GtkBox parent;
+
+    WebKitWebView *webView;
+    GtkWidget *entry;
+    GtkWidget *prevButton;
+    GtkWidget *nextButton;
+    GActionGroup *actionGroup;
+    GMenu *optionsMenu;
+    GtkWidget *optionsPopover;
+    GtkWidget *caseCheckButton;
+    GtkWidget *begginigWordCheckButton;
+    GtkWidget *capitalAsBegginigWordCheckButton;
+};
+
+G_DEFINE_TYPE(BrowserSearchBox, browser_search_box, GTK_TYPE_BOX)
+
+static void setFailedStyleForEntry(BrowserSearchBox *searchBox, gboolean failedSearch)
+{
+    if (failedSearch)
+        gtk_style_context_add_class(gtk_widget_get_style_context(searchBox->entry), "search-failed");
+    else
+        gtk_style_context_remove_class(gtk_widget_get_style_context(searchBox->entry), "search-failed");
+}
+
+static void doSearch(BrowserSearchBox *searchBox)
+{
+    GtkEntry *entry = GTK_ENTRY(searchBox->entry);
+    if (!gtk_entry_get_text_length(entry)) {
+        setFailedStyleForEntry(searchBox, FALSE);
+        gtk_entry_set_icon_from_icon_name(entry, GTK_ENTRY_ICON_SECONDARY, NULL);
+        webkit_find_controller_search_finish(webkit_web_view_get_find_controller(searchBox->webView));
+        return;
+    }
+
+    if (!gtk_entry_get_icon_name(entry, GTK_ENTRY_ICON_SECONDARY))
+        gtk_entry_set_icon_from_icon_name(entry, GTK_ENTRY_ICON_SECONDARY, "edit-clear-symbolic");
+
+    WebKitFindOptions options = WEBKIT_FIND_OPTIONS_WRAP_AROUND;
+    GAction *action = "" "case-sensitive");
+    GVariant *state = g_action_get_state(action);
+    if (!g_variant_get_boolean(state))
+        options |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
+    g_variant_unref(state);
+
+    action = "" "beginning-word");
+    state = g_action_get_state(action);
+    if (g_variant_get_boolean(state))
+        options |= WEBKIT_FIND_OPTIONS_AT_WORD_STARTS;
+    g_variant_unref(state);
+
+    action = "" "capital-as-beginning-word");
+    state = g_action_get_state(action);
+    if (g_variant_get_boolean(state))
+        options |= WEBKIT_FIND_OPTIONS_TREAT_MEDIAL_CAPITAL_AS_WORD_START;
+    g_variant_unref(state);
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    const gchar *text = gtk_editable_get_text(GTK_EDITABLE(entry));
+#else
+    const gchar *text = gtk_entry_get_text(entry);
+#endif
+    webkit_find_controller_search(webkit_web_view_get_find_controller(searchBox->webView), text, options, G_MAXUINT);
+}
+
+static void searchNext(BrowserSearchBox *searchBox)
+{
+    webkit_find_controller_search_next(webkit_web_view_get_find_controller(searchBox->webView));
+}
+
+static void searchPrevious(BrowserSearchBox *searchBox)
+{
+    webkit_find_controller_search_previous(webkit_web_view_get_find_controller(searchBox->webView));
+}
+
+static void searchEntryMenuIconPressedCallback(BrowserSearchBox *searchBox, GtkEntryIconPosition iconPosition, GdkEvent *event)
+{
+    if (iconPosition != GTK_ENTRY_ICON_PRIMARY)
+        return;
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *popover = gtk_popover_menu_new_from_model(G_MENU_MODEL(searchBox->optionsMenu));
+    gtk_widget_set_parent(popover, GTK_WIDGET(searchBox));
+#else
+    GtkWidget *popover = gtk_popover_menu_new();
+    gtk_popover_bind_model(GTK_POPOVER(popover), G_MENU_MODEL(searchBox->optionsMenu), NULL);
+    gtk_popover_set_relative_to(GTK_POPOVER(popover), searchBox->entry);
+#endif
+    searchBox->optionsPopover = popover;
+    GdkRectangle rect;
+    gtk_entry_get_icon_area(GTK_ENTRY(searchBox->entry), GTK_ENTRY_ICON_PRIMARY, &rect);
+    gtk_popover_set_pointing_to(GTK_POPOVER(popover), &rect);
+    gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM);
+    gtk_popover_popup(GTK_POPOVER(popover));
+}
+
+static void searchEntryClearIconReleasedCallback(BrowserSearchBox *searchBox, GtkEntryIconPosition iconPosition)
+{
+    if (iconPosition != GTK_ENTRY_ICON_SECONDARY)
+        return;
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_editable_set_text(GTK_EDITABLE(searchBox->entry), "");
+#else
+    gtk_entry_set_text(GTK_ENTRY(searchBox->entry), "");
+#endif
+}
+
+static void searchEntryChangedCallback(GtkEntry *entry, BrowserSearchBox *searchBox)
+{
+    doSearch(searchBox);
+}
+
+static void searchEntryActivatedCallback(BrowserSearchBox *searchBox)
+{
+    searchNext(searchBox);
+}
+
+static void searchPreviousButtonCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
+{
+    searchPrevious(BROWSER_SEARCH_BOX(userData));
+}
+
+static void searchNextButtonCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
+{
+    searchNext(BROWSER_SEARCH_BOX(userData));
+}
+
+static void searchMenuCheckButtonToggledCallback(GSimpleAction *action, GVariant *state, gpointer userData)
+{
+    g_simple_action_set_state(action, state);
+    doSearch(BROWSER_SEARCH_BOX(userData));
+}
+
+static void findControllerFailedToFindTextCallback(BrowserSearchBox *searchBox)
+{
+    setFailedStyleForEntry(searchBox, TRUE);
+}
+
+static void findControllerFoundTextCallback(BrowserSearchBox *searchBox)
+{
+    setFailedStyleForEntry(searchBox, FALSE);
+}
+
+static const GActionEntry actions[] = {
+    { "next", searchNextButtonCallback, NULL, NULL, NULL, { 0 } },
+    { "previous", searchPreviousButtonCallback, NULL, NULL, NULL, { 0 } },
+    { "case-sensitive", NULL, NULL, "false", searchMenuCheckButtonToggledCallback, { 0 } },
+    { "beginning-word", NULL, NULL, "false", searchMenuCheckButtonToggledCallback, { 0 } },
+    { "capital-as-beginning-word", NULL, NULL, "false", searchMenuCheckButtonToggledCallback, { 0 } }
+};
+
+static void browser_search_box_init(BrowserSearchBox *searchBox)
+{
+    GSimpleActionGroup *actionGroup = g_simple_action_group_new();
+    searchBox->actionGroup = G_ACTION_GROUP(actionGroup);
+    g_action_map_add_action_entries(G_ACTION_MAP(actionGroup), actions, G_N_ELEMENTS(actions), searchBox);
+    gtk_widget_insert_action_group(GTK_WIDGET(searchBox), "find", G_ACTION_GROUP(actionGroup));
+
+    gtk_orientable_set_orientation(GTK_ORIENTABLE(searchBox), GTK_ORIENTATION_HORIZONTAL);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(GTK_WIDGET(searchBox), GTK_STYLE_CLASS_LINKED);
+    gtk_widget_add_css_class(GTK_WIDGET(searchBox), GTK_STYLE_CLASS_RAISED);
+#else
+    GtkStyleContext *styleContext = gtk_widget_get_style_context(GTK_WIDGET(searchBox));
+    gtk_style_context_add_class(styleContext, GTK_STYLE_CLASS_LINKED);
+    gtk_style_context_add_class(styleContext, GTK_STYLE_CLASS_RAISED);
+#endif
+
+    searchBox->entry = gtk_entry_new();
+    gtk_widget_set_halign(searchBox->entry, GTK_ALIGN_FILL);
+    gtk_widget_set_hexpand(searchBox->entry, TRUE);
+    gtk_entry_set_placeholder_text(GTK_ENTRY(searchBox->entry), "Search");
+    gtk_entry_set_icon_from_icon_name(GTK_ENTRY(searchBox->entry), GTK_ENTRY_ICON_PRIMARY, "edit-find-symbolic");
+    gtk_entry_set_icon_activatable(GTK_ENTRY(searchBox->entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
+    gtk_entry_set_icon_sensitive(GTK_ENTRY(searchBox->entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
+    gtk_entry_set_icon_tooltip_text(GTK_ENTRY(searchBox->entry), GTK_ENTRY_ICON_PRIMARY, "Search options");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(searchBox), searchBox->entry);
+#else
+    gtk_container_add(GTK_CONTAINER(searchBox), searchBox->entry);
+    gtk_widget_show(searchBox->entry);
+#endif
+
+    GtkCssProvider *cssProvider = gtk_css_provider_new();
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_css_provider_load_from_data(cssProvider, ".search-failed { background-color: #ff6666; }", -1);
+#else
+    gtk_css_provider_load_from_data(cssProvider, ".search-failed { background-color: #ff6666; }", -1, NULL);
+#endif
+    gtk_style_context_add_provider(gtk_widget_get_style_context(searchBox->entry), GTK_STYLE_PROVIDER(cssProvider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+    g_object_unref(cssProvider);
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    searchBox->prevButton = gtk_button_new_from_icon_name("go-up-symbolic");
+#else
+    searchBox->prevButton = gtk_button_new_from_icon_name("go-up-symbolic", GTK_ICON_SIZE_MENU);
+#endif
+    GtkButton *button = GTK_BUTTON(searchBox->prevButton);
+    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "find.previous");
+    gtk_widget_set_focus_on_click(searchBox->prevButton, FALSE);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(searchBox), searchBox->prevButton);
+#else
+    gtk_box_pack_start(GTK_BOX(searchBox), searchBox->prevButton, FALSE, FALSE, 0);
+    gtk_widget_show(searchBox->prevButton);
+#endif
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    searchBox->nextButton = gtk_button_new_from_icon_name("go-down-symbolic");
+#else
+    searchBox->nextButton = gtk_button_new_from_icon_name("go-down-symbolic", GTK_ICON_SIZE_MENU);
+#endif
+    button = GTK_BUTTON(searchBox->nextButton);
+    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "find.next");
+    gtk_widget_set_focus_on_click(searchBox->nextButton, FALSE);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(searchBox), searchBox->nextButton);
+#else
+    gtk_box_pack_start(GTK_BOX(searchBox), searchBox->nextButton, FALSE, FALSE, 0);
+    gtk_widget_show(searchBox->nextButton);
+#endif
+
+    searchBox->optionsMenu = g_menu_new();
+    g_menu_append(searchBox->optionsMenu, "Ca_se sensitive", "find.case-sensitive");
+    g_menu_append(searchBox->optionsMenu, "Only at the _beginning of words", "find.beginning-word");
+    g_menu_append(searchBox->optionsMenu, "Capital _always as beginning of word", "find.capital-as-beginning-word");
+
+    g_signal_connect_swapped(searchBox->entry, "icon-press", G_CALLBACK(searchEntryMenuIconPressedCallback), searchBox);
+    g_signal_connect_swapped(searchBox->entry, "icon-release", G_CALLBACK(searchEntryClearIconReleasedCallback), searchBox);
+    g_signal_connect_after(searchBox->entry, "changed", G_CALLBACK(searchEntryChangedCallback), searchBox);
+    g_signal_connect_swapped(searchBox->entry, "activate", G_CALLBACK(searchEntryActivatedCallback), searchBox);
+}
+
+static void browserSearchBoxFinalize(GObject *gObject)
+{
+    BrowserSearchBox *searchBox = BROWSER_SEARCH_BOX(gObject);
+
+    if (searchBox->webView) {
+        g_object_unref(searchBox->webView);
+        searchBox->webView = NULL;
+    }
+
+    if (searchBox->optionsMenu) {
+        g_object_unref(searchBox->optionsMenu);
+        searchBox->optionsMenu = NULL;
+    }
+
+    g_object_unref(searchBox->actionGroup);
+
+    G_OBJECT_CLASS(browser_search_box_parent_class)->finalize(gObject);
+}
+
+static void browserSearchBoxDispose(GObject *object)
+{
+#if GTK_CHECK_VERSION(3, 98, 5)
+    BrowserSearchBox *searchBox = BROWSER_SEARCH_BOX(object);
+    g_clear_pointer(&searchBox->optionsPopover, gtk_widget_unparent);
+#endif
+
+    G_OBJECT_CLASS(browser_search_box_parent_class)->dispose(object);
+}
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+static void browserSearchBoxSizeAllocate(GtkWidget *widget, int width, int height, int baseline)
+{
+    GTK_WIDGET_CLASS(browser_search_box_parent_class)->size_allocate(widget, width, height, baseline);
+
+    BrowserSearchBox *searchBox = BROWSER_SEARCH_BOX(widget);
+    if (searchBox->optionsPopover)
+        gtk_native_check_resize(GTK_NATIVE(searchBox->optionsPopover));
+}
+#endif
+
+static void browser_search_box_class_init(BrowserSearchBoxClass *klass)
+{
+    GObjectClass *gObjectClass = G_OBJECT_CLASS(klass);
+    gObjectClass->finalize = browserSearchBoxFinalize;
+    gObjectClass->dispose = browserSearchBoxDispose;
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidgetClass *widgetClass = GTK_WIDGET_CLASS(klass);
+    widgetClass->size_allocate = browserSearchBoxSizeAllocate;
+#endif
+}
+
+GtkWidget *browser_search_box_new(WebKitWebView *webView)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+    GtkWidget *searchBox = GTK_WIDGET(g_object_new(BROWSER_TYPE_SEARCH_BOX, NULL));
+    BROWSER_SEARCH_BOX(searchBox)->webView = g_object_ref(webView);
+
+    WebKitFindController *controller = webkit_web_view_get_find_controller(webView);
+    g_signal_connect_swapped(controller, "failed-to-find-text", G_CALLBACK(findControllerFailedToFindTextCallback), searchBox);
+    g_signal_connect_swapped(controller, "found-text", G_CALLBACK(findControllerFoundTextCallback), searchBox);
+
+    return searchBox;
+}
+
+GtkEntry *browser_search_box_get_entry(BrowserSearchBox *searchBox)
+{
+    g_return_val_if_fail(BROWSER_IS_SEARCH_BOX(searchBox), NULL);
+
+    return GTK_ENTRY(searchBox->entry);
+}

Copied: trunk/Tools/MiniBrowser/gtk/BrowserSearchBox.h (from rev 262938, trunk/Tools/MiniBrowser/gtk/BrowserSearchBar.h) (0 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserSearchBox.h	                        (rev 0)
+++ trunk/Tools/MiniBrowser/gtk/BrowserSearchBox.h	2020-06-12 08:42:50 UTC (rev 262939)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2013, 2020 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef BrowserSearchBox_h
+#define BrowserSearchBox_h
+
+#include <gtk/gtk.h>
+#include <webkit2/webkit2.h>
+
+G_BEGIN_DECLS
+
+#define BROWSER_TYPE_SEARCH_BOX            (browser_search_box_get_type())
+#define BROWSER_SEARCH_BOX(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), BROWSER_TYPE_SEARCH_BOX, BrowserSearchBox))
+#define BROWSER_IS_SEARCH_BOX(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), BROWSER_TYPE_SEARCH_BOX))
+#define BROWSER_SEARCH_BOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  BROWSER_TYPE_SEARCH_BOX, BrowserSearchBoxClass))
+#define BROWSER_IS_SEARCH_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  BROWSER_TYPE_SEARCH_BOX))
+#define BROWSER_SEARCH_BOX_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  BROWSER_TYPE_SEARCH_BOX, BrowserSearchBoxClass))
+
+typedef struct _BrowserSearchBox       BrowserSearchBox;
+typedef struct _BrowserSearchBoxClass  BrowserSearchBoxClass;
+
+struct _BrowserSearchBoxClass {
+    GtkBoxClass parent_class;
+};
+
+GType browser_search_box_get_type(void);
+
+GtkWidget *browser_search_box_new(WebKitWebView *);
+GtkEntry *browser_search_box_get_entry(BrowserSearchBox *);
+
+G_END_DECLS
+
+#endif

Modified: trunk/Tools/MiniBrowser/gtk/BrowserSettingsDialog.c (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserSettingsDialog.c	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserSettingsDialog.c	2020-06-12 08:42:50 UTC (rev 262939)
@@ -26,8 +26,6 @@
 #include "BrowserSettingsDialog.h"
 #include "BrowserCellRendererVariant.h"
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
-
 enum {
     PROP_0,
 
@@ -129,14 +127,23 @@
     gtk_box_set_spacing(contentArea, 2);
 
     gtk_window_set_default_size(GTK_WINDOW(dialog), 600, 400);
+#if !GTK_CHECK_VERSION(3, 98, 5)
     gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+#endif
     gtk_window_set_title(GTK_WINDOW(dialog), "WebKit View Settings");
     gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
-    gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
     gtk_dialog_add_button(GTK_DIALOG(dialog), "_Close", GTK_RESPONSE_CLOSE);
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
 
     GtkWidget *scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
+    gtk_widget_set_margin_start(scrolledWindow, 5);
+    gtk_widget_set_margin_end(scrolledWindow, 5);
+    gtk_widget_set_margin_top(scrolledWindow, 5);
+    gtk_widget_set_margin_bottom(scrolledWindow, 5);
+    gtk_widget_set_halign(scrolledWindow, GTK_ALIGN_FILL);
+    gtk_widget_set_valign(scrolledWindow, GTK_ALIGN_FILL);
+    gtk_widget_set_hexpand(scrolledWindow, TRUE);
+    gtk_widget_set_vexpand(scrolledWindow, TRUE);
     dialog->settingsList = gtk_tree_view_new();
     GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
     gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(dialog->settingsList),
@@ -152,13 +159,23 @@
                                                 NULL);
     gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(dialog->settingsList), SETTINGS_LIST_COLUMN_BLURB);
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrolledWindow), dialog->settingsList);
+#else
     gtk_container_add(GTK_CONTAINER(scrolledWindow), dialog->settingsList);
     gtk_widget_show(dialog->settingsList);
+#endif
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(contentArea, scrolledWindow);
+
+    g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), NULL);
+#else
     gtk_box_pack_start(contentArea, scrolledWindow, TRUE, TRUE, 0);
     gtk_widget_show(scrolledWindow);
 
     g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL);
+#endif
 }
 
 static void browserSettingsDialogConstructed(GObject *object)
@@ -237,5 +254,3 @@
 
     return GTK_WIDGET(g_object_new(BROWSER_TYPE_SETTINGS_DIALOG, "settings", settings, NULL));
 }
-
-#endif

Modified: trunk/Tools/MiniBrowser/gtk/BrowserSettingsDialog.h (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserSettingsDialog.h	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserSettingsDialog.h	2020-06-12 08:42:50 UTC (rev 262939)
@@ -29,8 +29,6 @@
 #include <gtk/gtk.h>
 #include <webkit2/webkit2.h>
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
-
 G_BEGIN_DECLS
 
 #define BROWSER_TYPE_SETTINGS_DIALOG            (browser_settings_dialog_get_type())
@@ -50,5 +48,3 @@
 G_END_DECLS
 
 #endif
-
-#endif

Modified: trunk/Tools/MiniBrowser/gtk/BrowserTab.c (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserTab.c	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserTab.c	2020-06-12 08:42:50 UTC (rev 262939)
@@ -28,7 +28,7 @@
 #endif
 #include "BrowserTab.h"
 
-#include "BrowserSearchBar.h"
+#include "BrowserSearchBox.h"
 #include "BrowserWindow.h"
 #include <string.h>
 
@@ -42,9 +42,7 @@
     GtkBox parent;
 
     WebKitWebView *webView;
-#if !GTK_CHECK_VERSION(3, 98, 0)
-    BrowserSearchBar *searchBar;
-#endif
+    GtkWidget *searchBar;
     GtkWidget *statusLabel;
     gboolean wasSearchingWhenEnteredFullscreen;
     gboolean inspectorIsVisible;
@@ -98,7 +96,7 @@
 
     return originStr;
 }
-#if !GTK_CHECK_VERSION(3, 98, 0)
+
 static void titleChanged(WebKitWebView *webView, GParamSpec *pspec, BrowserTab *tab)
 {
     const char *title = webkit_web_view_get_title(webView);
@@ -136,7 +134,7 @@
     return TRUE;
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 4)
+#if !GTK_CHECK_VERSION(3, 98, 5)
 static void removeChildIfInfoBar(GtkWidget *child, GtkContainer *tab)
 {
     if (GTK_IS_INFO_BAR(child))
@@ -149,7 +147,15 @@
     if (loadEvent != WEBKIT_LOAD_STARTED)
         return;
 
-#if !GTK_CHECK_VERSION(3, 98, 4)
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *child = gtk_widget_get_first_child(GTK_WIDGET(tab));
+    while (child) {
+        GtkWidget *next = gtk_widget_get_next_sibling(child);
+        if (GTK_IS_INFO_BAR(child))
+            gtk_widget_unparent(child);
+        child = next;
+    }
+#else
     gtk_container_foreach(GTK_CONTAINER(tab), (GtkCallback)removeChildIfInfoBar, tab);
 #endif
 }
@@ -159,28 +165,50 @@
     GtkWidget *dialog = gtk_info_bar_new_with_buttons("No", GTK_RESPONSE_NO, "Yes", GTK_RESPONSE_YES, NULL);
     gtk_info_bar_set_message_type(GTK_INFO_BAR(dialog), GTK_MESSAGE_QUESTION);
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *contentBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+    gtk_box_set_spacing(GTK_BOX(contentBox), 0);
+#else
     GtkWidget *contentBox = gtk_info_bar_get_content_area(GTK_INFO_BAR(dialog));
     gtk_orientable_set_orientation(GTK_ORIENTABLE(contentBox), GTK_ORIENTATION_VERTICAL);
     gtk_box_set_spacing(GTK_BOX(contentBox), 0);
+#endif
 
     GtkLabel *label = GTK_LABEL(gtk_label_new(NULL));
     gchar *markup = g_strdup_printf("<span size='xx-large' weight='bold'>%s</span>", title);
     gtk_label_set_markup(label, markup);
     g_free(markup);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_label_set_wrap(label, TRUE);
+#else
     gtk_label_set_line_wrap(label, TRUE);
+#endif
     gtk_label_set_selectable(label, TRUE);
     gtk_label_set_xalign(label, 0.);
     gtk_label_set_yalign(label, 0.5);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(contentBox), GTK_WIDGET(label));
+#else
     gtk_box_pack_start(GTK_BOX(contentBox), GTK_WIDGET(label), FALSE, FALSE, 2);
     gtk_widget_show(GTK_WIDGET(label));
+#endif
 
     label = GTK_LABEL(gtk_label_new(text));
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_label_set_wrap(label, TRUE);
+#else
     gtk_label_set_line_wrap(label, TRUE);
+#endif
     gtk_label_set_selectable(label, TRUE);
     gtk_label_set_xalign(label, 0.);
     gtk_label_set_yalign(label, 0.5);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(contentBox), GTK_WIDGET(label));
+    gtk_info_bar_add_child(GTK_INFO_BAR(dialog), contentBox);
+#else
     gtk_box_pack_start(GTK_BOX(contentBox), GTK_WIDGET(label), FALSE, FALSE, 0);
     gtk_widget_show(GTK_WIDGET(label));
+#endif
 
     return dialog;
 }
@@ -195,7 +223,11 @@
         soup_uri_free(uri);
         webkit_web_view_load_uri(tab->webView, failingURI);
     }
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_unparent(dialog);
+#else
     gtk_widget_destroy(dialog);
+#endif
 }
 
 static gboolean loadFailedWithTLSerrors(WebKitWebView *webView, const char *failingURI, GTlsCertificate *certificate, GTlsCertificateFlags errors, BrowserTab *tab)
@@ -208,9 +240,13 @@
 
     g_signal_connect(dialog, "response", G_CALLBACK(tlsErrorsDialogResponse), tab);
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_prepend(GTK_BOX(tab), dialog);
+#else
     gtk_box_pack_start(GTK_BOX(tab), dialog, FALSE, FALSE, 0);
     gtk_box_reorder_child(GTK_BOX(tab), dialog, 0);
     gtk_widget_show(dialog);
+#endif
 
     return TRUE;
 }
@@ -239,7 +275,11 @@
         break;
     }
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_unparent(dialog);
+#else
     gtk_widget_destroy(dialog);
+#endif
     g_clear_pointer(&requestData, permissionRequestDataFree);
 }
 
@@ -303,9 +343,13 @@
     g_signal_connect(dialog, "response", G_CALLBACK(permissionRequestDialogResponse), permissionRequestDataNew(request,
         getWebViewOrigin(webView)));
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_prepend(GTK_BOX(tab), dialog);
+#else
     gtk_box_pack_start(GTK_BOX(tab), dialog, FALSE, FALSE, 0);
     gtk_box_reorder_child(GTK_BOX(tab), dialog, 0);
     gtk_widget_show(dialog);
+#endif
 
     return TRUE;
 }
@@ -325,12 +369,21 @@
 static void colorChooserRequestFinished(WebKitColorChooserRequest *request, GtkWidget *popover)
 {
     g_object_unref(request);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_unparent(popover);
+#else
     gtk_widget_destroy(popover);
+#endif
 }
 
 static gboolean runColorChooserCallback(WebKitWebView *webView, WebKitColorChooserRequest *request, BrowserTab *tab)
 {
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *popover = gtk_popover_new();
+    gtk_widget_set_parent(popover, GTK_WIDGET(webView));
+#else
     GtkWidget *popover = gtk_popover_new(GTK_WIDGET(webView));
+#endif
 
     GdkRectangle rectangle;
     webkit_color_chooser_request_get_element_rectangle(request, &rectangle);
@@ -341,8 +394,12 @@
     webkit_color_chooser_request_get_rgba(request, &rgba);
     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorChooser), &rgba);
     g_signal_connect(colorChooser, "notify::rgba", G_CALLBACK(colorChooserRGBAChanged), request);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_popover_set_child(GTK_POPOVER(popover), colorChooser);
+#else
     gtk_container_add(GTK_CONTAINER(popover), colorChooser);
     gtk_widget_show(colorChooser);
+#endif
 
     g_object_ref(request);
     g_signal_connect_object(popover, "hide", G_CALLBACK(popoverColorClosed), request, 0);
@@ -352,7 +409,6 @@
 
     return TRUE;
 }
-#endif
 
 static gboolean inspectorOpenedInWindow(WebKitWebInspector *inspector, BrowserTab *tab)
 {
@@ -386,6 +442,18 @@
 #endif
 }
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+static void tabCloseClicked(BrowserTab *tab)
+{
+    GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(tab));
+    while (parent && !GTK_IS_NOTEBOOK(parent))
+        parent = gtk_widget_get_parent(parent);
+
+    GtkNotebook *notebook = GTK_NOTEBOOK(parent);
+    gtk_notebook_remove_page(notebook, gtk_notebook_page_num(notebook, GTK_WIDGET(tab)));
+}
+#endif
+
 static void browserTabSetProperty(GObject *object, guint propId, const GValue *value, GParamSpec *pspec)
 {
     BrowserTab *tab = BROWSER_TAB(object);
@@ -422,9 +490,21 @@
 
     G_OBJECT_CLASS(browser_tab_parent_class)->constructed(gObject);
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
-    tab->searchBar = BROWSER_SEARCH_BAR(browser_search_bar_new(tab->webView));
-    gtk_box_pack_start(GTK_BOX(tab), GTK_WIDGET(tab->searchBar), FALSE, FALSE, 0);
+    tab->searchBar = gtk_search_bar_new();
+    GtkWidget *searchBox = browser_search_box_new(tab->webView);
+    gtk_search_bar_set_show_close_button(GTK_SEARCH_BAR(tab->searchBar), TRUE);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_search_bar_set_child(GTK_SEARCH_BAR(tab->searchBar), searchBox);
+    gtk_search_bar_connect_entry(GTK_SEARCH_BAR(tab->searchBar),
+        GTK_EDITABLE(browser_search_box_get_entry(BROWSER_SEARCH_BOX(searchBox))));
+    gtk_box_append(GTK_BOX(tab), tab->searchBar);
+#else
+    gtk_container_add(GTK_CONTAINER(tab->searchBar), searchBox);
+    gtk_widget_show(searchBox);
+    gtk_search_bar_connect_entry(GTK_SEARCH_BAR(tab->searchBar),
+        browser_search_box_get_entry(BROWSER_SEARCH_BOX(searchBox)));
+    gtk_container_add(GTK_CONTAINER(tab), tab->searchBar);
+    gtk_widget_show(tab->searchBar);
 #endif
 
     GtkWidget *overlay = gtk_overlay_new();
@@ -438,12 +518,10 @@
     tab->statusLabel = gtk_label_new(NULL);
     gtk_widget_set_halign(tab->statusLabel, GTK_ALIGN_START);
     gtk_widget_set_valign(tab->statusLabel, GTK_ALIGN_END);
-#if !GTK_CHECK_VERSION(3, 98, 0)
     gtk_widget_set_margin_start(tab->statusLabel, 1);
     gtk_widget_set_margin_end(tab->statusLabel, 1);
     gtk_widget_set_margin_top(tab->statusLabel, 1);
     gtk_widget_set_margin_bottom(tab->statusLabel, 1);
-#endif
     gtk_overlay_add_overlay(GTK_OVERLAY(overlay), tab->statusLabel);
 
     tab->fullScreenMessageLabel = gtk_label_new(NULL);
@@ -463,53 +541,76 @@
     gtk_overlay_add_overlay(GTK_OVERLAY(overlay), tab->pointerLockMessageLabel);
 
     gtk_widget_set_vexpand(GTK_WIDGET(tab->webView), TRUE);
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_overlay_set_child(GTK_OVERLAY(overlay), GTK_WIDGET(tab->webView));
+#else
     gtk_container_add(GTK_CONTAINER(overlay), GTK_WIDGET(tab->webView));
     gtk_widget_show(GTK_WIDGET(tab->webView));
-#else
-    gtk_overlay_set_child(GTK_OVERLAY(overlay), GTK_WIDGET(tab->webView));
 #endif
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
     tab->titleBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
 
     GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
     gtk_widget_set_halign(hbox, GTK_ALIGN_CENTER);
+    gtk_widget_set_hexpand(hbox, TRUE);
 
     tab->titleSpinner = gtk_spinner_new();
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(hbox), tab->titleSpinner);
+#else
     gtk_box_pack_start(GTK_BOX(hbox), tab->titleSpinner, FALSE, FALSE, 0);
+#endif
 
     tab->titleLabel = gtk_label_new(NULL);
     gtk_label_set_ellipsize(GTK_LABEL(tab->titleLabel), PANGO_ELLIPSIZE_END);
     gtk_label_set_single_line_mode(GTK_LABEL(tab->titleLabel), TRUE);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(hbox), tab->titleLabel);
+#else
     gtk_box_pack_start(GTK_BOX(hbox), tab->titleLabel, FALSE, FALSE, 0);
     gtk_widget_show(tab->titleLabel);
+#endif
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(tab->titleBox), hbox);
+#else
     gtk_box_pack_start(GTK_BOX(tab->titleBox), hbox, TRUE, TRUE, 0);
     gtk_widget_show(hbox);
+#endif
 
-    tab->titleAudioButton = gtk_button_new();
+#if GTK_CHECK_VERSION(3, 98, 5)
+    tab->titleAudioButton = gtk_button_new_from_icon_name("audio-volume-high-symbolic");
+    gtk_button_set_has_frame(GTK_BUTTON(tab->titleAudioButton), FALSE);
+#else
+    tab->titleAudioButton = gtk_button_new_from_icon_name("audio-volume-high-symbolic", GTK_ICON_SIZE_MENU);
+    gtk_button_set_relief(GTK_BUTTON(tab->titleAudioButton), GTK_RELIEF_NONE);
+#endif
     g_signal_connect(tab->titleAudioButton, "clicked", G_CALLBACK(audioClicked), tab);
-    gtk_button_set_relief(GTK_BUTTON(tab->titleAudioButton), GTK_RELIEF_NONE);
     gtk_widget_set_focus_on_click(tab->titleAudioButton, FALSE);
 
-    GtkWidget *image = gtk_image_new_from_icon_name("audio-volume-high-symbolic", GTK_ICON_SIZE_MENU);
-    gtk_button_set_image(GTK_BUTTON(tab->titleAudioButton), image);
-    gtk_widget_show(image);
-
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(tab->titleBox), tab->titleAudioButton);
+#else
     gtk_box_pack_start(GTK_BOX(tab->titleBox), tab->titleAudioButton, FALSE, FALSE, 0);
+#endif
 
-    tab->titleCloseButton = gtk_button_new();
+#if GTK_CHECK_VERSION(3, 98, 5)
+    tab->titleCloseButton = gtk_button_new_from_icon_name("window-close-symbolic");
+    gtk_button_set_has_frame(GTK_BUTTON(tab->titleCloseButton), FALSE);
+    g_signal_connect_swapped(tab->titleCloseButton, "clicked", G_CALLBACK(tabCloseClicked), tab);
+#else
+    tab->titleCloseButton = gtk_button_new_from_icon_name("window-close-symbolic", GTK_ICON_SIZE_MENU);
+    gtk_button_set_relief(GTK_BUTTON(tab->titleCloseButton), GTK_RELIEF_NONE);
     g_signal_connect_swapped(tab->titleCloseButton, "clicked", G_CALLBACK(gtk_widget_destroy), tab);
-    gtk_button_set_relief(GTK_BUTTON(tab->titleCloseButton), GTK_RELIEF_NONE);
+#endif
     gtk_widget_set_focus_on_click(tab->titleCloseButton, FALSE);
 
-    image = gtk_image_new_from_icon_name("window-close-symbolic", GTK_ICON_SIZE_MENU);
-    gtk_container_add(GTK_CONTAINER(tab->titleCloseButton), image);
-    gtk_widget_show(image);
-
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(tab->titleBox), tab->titleCloseButton);
+#else
     gtk_box_pack_start(GTK_BOX(tab->titleBox), tab->titleCloseButton, FALSE, FALSE, 0);
     gtk_widget_show(tab->titleCloseButton);
+#endif
 
     g_signal_connect(tab->webView, "notify::title", G_CALLBACK(titleChanged), tab);
     g_signal_connect(tab->webView, "notify::is-loading", G_CALLBACK(isLoadingChanged), tab);
@@ -521,7 +622,6 @@
 
     g_object_bind_property(tab->webView, "is-playing-audio", tab->titleAudioButton, "visible", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
     g_signal_connect(tab->webView, "notify::is-muted", G_CALLBACK(audioMutedChanged), tab);
-#endif
 
     WebKitWebInspector *inspector = webkit_web_view_get_inspector(tab->webView);
     g_signal_connect(inspector, "open-window", G_CALLBACK(inspectorOpenedInWindow), tab);
@@ -621,22 +721,28 @@
         webkit_web_inspector_close(inspector);
 }
 
+static gboolean browserTabIsSearchBarOpen(BrowserTab *tab)
+{
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *revealer = gtk_widget_get_first_child(tab->searchBar);
+#else
+    GtkWidget *revealer = gtk_bin_get_child(GTK_BIN(tab->searchBar));
+#endif
+    return gtk_revealer_get_reveal_child(GTK_REVEALER(revealer));
+}
+
 void browser_tab_start_search(BrowserTab *tab)
 {
     g_return_if_fail(BROWSER_IS_TAB(tab));
-#if !GTK_CHECK_VERSION(3, 98, 0)
-    if (!browser_search_bar_is_open(tab->searchBar))
-        browser_search_bar_open(tab->searchBar);
-#endif
+    if (!browserTabIsSearchBarOpen(tab))
+        gtk_search_bar_set_search_mode(GTK_SEARCH_BAR(tab->searchBar), TRUE);
 }
 
 void browser_tab_stop_search(BrowserTab *tab)
 {
     g_return_if_fail(BROWSER_IS_TAB(tab));
-#if !GTK_CHECK_VERSION(3, 98, 0)
-    if (browser_search_bar_is_open(tab->searchBar))
-        browser_search_bar_close(tab->searchBar);
-#endif
+    if (browserTabIsSearchBarOpen(tab))
+        gtk_search_bar_set_search_mode(GTK_SEARCH_BAR(tab->searchBar), FALSE);
 }
 
 static gboolean fullScreenMessageTimeoutCallback(BrowserTab *tab)
@@ -663,10 +769,8 @@
     tab->fullScreenMessageLabelId = g_timeout_add_seconds(2, (GSourceFunc)fullScreenMessageTimeoutCallback, tab);
     g_source_set_name_by_id(tab->fullScreenMessageLabelId, "[WebKit] fullScreenMessageTimeoutCallback");
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
-    tab->wasSearchingWhenEnteredFullscreen = gtk_widget_get_visible(GTK_WIDGET(tab->searchBar));
+    tab->wasSearchingWhenEnteredFullscreen = browserTabIsSearchBarOpen(tab);
     browser_tab_stop_search(tab);
-#endif
 }
 
 void browser_tab_leave_fullscreen(BrowserTab *tab)
@@ -680,17 +784,19 @@
 
     gtk_widget_hide(tab->fullScreenMessageLabel);
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
     if (tab->wasSearchingWhenEnteredFullscreen) {
         /* Opening the search bar steals the focus. Usually, we want
          * this but not when coming back from fullscreen.
          */
+#if GTK_CHECK_VERSION(3, 98, 5)
+        GtkWindow *window = GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(tab)));
+#else
         GtkWindow *window = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(tab)));
+#endif
         GtkWidget *focusWidget = gtk_window_get_focus(window);
         browser_tab_start_search(tab);
         gtk_window_set_focus(window, focusWidget);
     }
-#endif
 }
 
 void browser_tab_set_background_color(BrowserTab *tab, GdkRGBA *rgba)

Modified: trunk/Tools/MiniBrowser/gtk/BrowserWindow.c (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/BrowserWindow.c	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/BrowserWindow.c	2020-06-12 08:42:50 UTC (rev 262939)
@@ -31,7 +31,6 @@
 #include "BrowserWindow.h"
 
 #include "BrowserDownloadsBar.h"
-#include "BrowserSearchBar.h"
 #include "BrowserSettingsDialog.h"
 #include "BrowserTab.h"
 #include <gdk/gdkkeysyms.h>
@@ -50,6 +49,7 @@
     GtkWidget *editToolbar;
     GtkWidget *settingsDialog;
     GtkWidget *notebook;
+    GActionGroup *editActionGroup;
     BrowserTab *activeTab;
     GtkWidget *downloadsBar;
     gboolean searchBarVisible;
@@ -125,7 +125,6 @@
     webkit_web_view_go_forward(webView);
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
 static void settingsCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
 {
     BrowserWindow *window = BROWSER_WINDOW(userData);
@@ -140,7 +139,6 @@
     g_object_add_weak_pointer(G_OBJECT(window->settingsDialog), (gpointer *)&window->settingsDialog);
     gtk_widget_show(window->settingsDialog);
 }
-#endif
 
 static void webViewURIChanged(WebKitWebView *webView, GParamSpec *pspec, BrowserWindow *window)
 {
@@ -169,9 +167,7 @@
 
 static gboolean resetEntryProgress(BrowserWindow *window)
 {
-#if !GTK_CHECK_VERSION(3, 98, 0)
     gtk_entry_set_progress_fraction(GTK_ENTRY(window->uriEntry), 0);
-#endif
     window->resetEntryProgressTimeoutId = 0;
     return FALSE;
 }
@@ -179,9 +175,7 @@
 static void webViewLoadProgressChanged(WebKitWebView *webView, GParamSpec *pspec, BrowserWindow *window)
 {
     gdouble progress = webkit_web_view_get_estimated_load_progress(webView);
-#if !GTK_CHECK_VERSION(3, 98, 0)
     gtk_entry_set_progress_fraction(GTK_ENTRY(window->uriEntry), progress);
-#endif
     if (progress == 1.0) {
         window->resetEntryProgressTimeoutId = g_timeout_add(500, (GSourceFunc)resetEntryProgress, window);
         g_source_set_name_by_id(window->resetEntryProgressTimeoutId, "[WebKit] resetEntryProgress");
@@ -205,7 +199,6 @@
 #endif
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
 static void browserWindowHistoryItemActivated(BrowserWindow *window, GVariant *parameter, GAction *action)
 {
     WebKitBackForwardListItem *item = g_object_get_data(G_OBJECT(action), "back-forward-list-item");
@@ -246,18 +239,26 @@
         g_free(actionName);
     }
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *popover = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu));
+#else
     GtkWidget *popover = gtk_popover_menu_new();
+    gtk_popover_bind_model(GTK_POPOVER(popover), G_MENU_MODEL(menu), NULL);
+#endif
+    g_object_unref(menu);
     gtk_widget_insert_action_group(popover, isBack ? "bf-back" : "bf-forward", G_ACTION_GROUP(actionGroup));
     g_object_unref(actionGroup);
-    gtk_popover_bind_model(GTK_POPOVER(popover), G_MENU_MODEL(menu), NULL);
-    g_object_unref(menu);
 
     GtkWidget *button = isBack ? window->backItem : window->forwardItem;
+#if GTK_CHECK_VERSION(3, 98, 5)
+    g_object_set_data_full(G_OBJECT(button), "history-popover", popover, (GDestroyNotify)gtk_widget_unparent);
+    gtk_widget_set_parent(popover, button);
+#else
     gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
+    g_object_set_data(G_OBJECT(button), "history-popover", popover);
+#endif
     gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM);
-    g_object_set_data(G_OBJECT(button), "history-popover", popover);
 }
-#endif
 
 static void browserWindowUpdateNavigationMenu(BrowserWindow *window, WebKitBackForwardList *backForwardlist)
 {
@@ -267,7 +268,6 @@
     action = "" "go-forward");
     g_simple_action_set_enabled(G_SIMPLE_ACTION(action), webkit_web_view_can_go_forward(webView));
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
     GList *list = g_list_reverse(webkit_back_forward_list_get_back_list_with_limit(backForwardlist, 10));
     browserWindowCreateBackForwardMenu(window, list, TRUE);
     g_list_free(list);
@@ -275,10 +275,20 @@
     list = webkit_back_forward_list_get_forward_list_with_limit(backForwardlist, 10);
     browserWindowCreateBackForwardMenu(window, list, FALSE);
     g_list_free(list);
-#endif
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#if GTK_CHECK_VERSION(3, 98, 5)
+static void navigationButtonPressed(GtkGestureClick *gesture, guint clickCount, double x, double y)
+{
+    GdkEventSequence *sequence = gtk_gesture_single_get_current_sequence(GTK_GESTURE_SINGLE(gesture));
+    gtk_gesture_set_sequence_state(GTK_GESTURE(gesture), sequence, GTK_EVENT_SEQUENCE_CLAIMED);
+
+    GtkWidget *button = gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture));
+    GtkWidget *popover = g_object_get_data(G_OBJECT(button), "history-popover");
+    if (popover)
+        gtk_popover_popup(GTK_POPOVER(popover));
+}
+#else
 static gboolean navigationButtonPressCallback(GtkButton *button, GdkEvent *event, BrowserWindow *window)
 {
     guint eventButton;
@@ -291,6 +301,7 @@
         return GDK_EVENT_PROPAGATE;
 
     gtk_popover_popup(GTK_POPOVER(popover));
+
     return GDK_EVENT_STOP;
 }
 #endif
@@ -494,7 +505,17 @@
     return FALSE;
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#if GTK_CHECK_VERSION(3, 98, 5)
+static gboolean scrollEventCallback(BrowserWindow *window, double deltaX, double deltaY, GtkEventController *controller)
+{
+    GdkModifierType mod = gtk_accelerator_get_default_mod_mask();
+    GdkEvent *event = gtk_event_controller_get_current_event(controller);
+    if ((gdk_event_get_modifier_state(event) & mod) != GDK_CONTROL_MASK)
+        return GDK_EVENT_PROPAGATE;
+
+    return deltaY < 0 ? browserWindowZoomIn(window) : browserWindowZoomOut(window);
+}
+#else
 static gboolean scrollEventCallback(WebKitWebView *webView, const GdkEventScroll *event, BrowserWindow *window)
 {
     GdkModifierType mod = gtk_accelerator_get_default_mod_mask();
@@ -569,8 +590,12 @@
 static void webViewIsLoadingChanged(WebKitWebView *webView, GParamSpec *paramSpec, BrowserWindow *window)
 {
     gboolean isLoading = webkit_web_view_is_loading(webView);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_button_set_icon_name(GTK_BUTTON(window->reloadOrStopButton), isLoading ? "process-stop-symbolic" : "view-refresh-symbolic");
+#else
     GtkWidget *image = gtk_button_get_image(GTK_BUTTON(window->reloadOrStopButton));
     g_object_set(image, "icon-name", isLoading ? "process-stop-symbolic" : "view-refresh-symbolic", NULL);
+#endif
 }
 
 static void zoomInCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
@@ -589,12 +614,10 @@
     webkit_web_view_set_zoom_level(webView, defaultZoomLevel);
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
 static void searchCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
 {
     browser_tab_start_search(BROWSER_WINDOW(userData)->activeTab);
 }
-#endif
 
 static void newTabCallback(GSimpleAction *action, GVariant *parameter, gpointer userData)
 {
@@ -706,7 +729,26 @@
     webkit_web_view_execute_editing_command(webView, g_action_get_name(G_ACTION(action)));
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
+static void insertImageDialogResponse(GtkDialog *dialog, int response, BrowserWindow *window)
+{
+    if (response == GTK_RESPONSE_ACCEPT) {
+        GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(dialog));
+        if (file) {
+            char *uri = g_file_get_uri(file);
+            WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
+            webkit_web_view_execute_editing_command_with_argument(webView, WEBKIT_EDITING_COMMAND_INSERT_IMAGE, uri);
+            g_free(uri);
+            g_object_unref(file);
+        }
+    }
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_window_destroy(GTK_WINDOW(dialog));
+#else
+    gtk_widget_destroy(GTK_WIDGET(dialog));
+#endif
+}
+
 static void insertImageCommandCallback(GtkWidget *widget, BrowserWindow *window)
 {
     GtkWidget *fileChooser = gtk_file_chooser_dialog_new("Insert Image", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN,
@@ -717,16 +759,36 @@
     gtk_file_filter_add_pixbuf_formats(filter);
     gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileChooser), filter);
 
-    if (gtk_dialog_run(GTK_DIALOG(fileChooser)) == GTK_RESPONSE_ACCEPT) {
-        char *uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(fileChooser));
-        if (uri) {
-            WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
-            webkit_web_view_execute_editing_command_with_argument(webView, WEBKIT_EDITING_COMMAND_INSERT_IMAGE, uri);
-            g_free(uri);
+    g_signal_connect(fileChooser, "response", G_CALLBACK(insertImageDialogResponse), window);
+    gtk_widget_show(fileChooser);
+}
+
+typedef struct {
+    GtkWidget *entry;
+    BrowserWindow *window;
+} InsertLinkDialogData;
+
+static void insertLinkDialogResponse(GtkDialog *dialog, int response, InsertLinkDialogData *data)
+{
+    if (response == GTK_RESPONSE_ACCEPT) {
+#if GTK_CHECK_VERSION(3, 98, 5)
+        const char *url = ""
+#else
+        const char *url = ""
+#endif
+        if (url && *url) {
+            WebKitWebView *webView = browser_tab_get_web_view(data->window->activeTab);
+            webkit_web_view_execute_editing_command_with_argument(webView, WEBKIT_EDITING_COMMAND_CREATE_LINK, url);
         }
     }
 
-    gtk_widget_destroy(fileChooser);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_window_destroy(GTK_WINDOW(dialog));
+#else
+    gtk_widget_destroy(GTK_WIDGET(dialog));
+#endif
+
+    g_free(data);
 }
 
 static void insertLinkCommandCallback(GtkWidget *widget, BrowserWindow *window)
@@ -736,39 +798,47 @@
     GtkWidget *entry = gtk_entry_new();
     gtk_entry_set_placeholder_text(GTK_ENTRY(entry), "URL");
     gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry);
+#else
     gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry);
     gtk_widget_show(entry);
-
-    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
-#if GTK_CHECK_VERSION(3, 98, 0)
-        const char *url = ""
-#else
-        const char *url = ""
 #endif
-        if (url && *url) {
-            WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
-            webkit_web_view_execute_editing_command_with_argument(webView, WEBKIT_EDITING_COMMAND_CREATE_LINK, url);
-        }
-    }
 
-    gtk_widget_destroy(dialog);
+    InsertLinkDialogData *data = "" 1);
+    data->entry = entry;
+    data->window = window;
+    g_signal_connect(dialog, "response", G_CALLBACK(insertLinkDialogResponse), data);
+    gtk_widget_show(dialog);
 }
 
 static void typingAttributesChanged(WebKitEditorState *editorState, GParamSpec *spec, BrowserWindow *window)
 {
     unsigned typingAttributes = webkit_editor_state_get_typing_attributes(editorState);
-    GActionGroup *actionGroup = gtk_widget_get_action_group(window->editToolbar, "edit");
-    GAction *action = "" "Bold");
+    GAction *action = "" "Bold");
     g_simple_action_set_state(G_SIMPLE_ACTION(action), g_variant_new_boolean(typingAttributes & WEBKIT_EDITOR_TYPING_ATTRIBUTE_BOLD));
-    action = "" "Italic");
+    action = "" "Italic");
     g_simple_action_set_state(G_SIMPLE_ACTION(action), g_variant_new_boolean(typingAttributes & WEBKIT_EDITOR_TYPING_ATTRIBUTE_ITALIC));
-    action = "" "Underline");
+    action = "" "Underline");
     g_simple_action_set_state(G_SIMPLE_ACTION(action), g_variant_new_boolean(typingAttributes & WEBKIT_EDITOR_TYPING_ATTRIBUTE_UNDERLINE));
-    action = "" "Strikethrough");
+    action = "" "Strikethrough");
     g_simple_action_set_state(G_SIMPLE_ACTION(action), g_variant_new_boolean(typingAttributes & WEBKIT_EDITOR_TYPING_ATTRIBUTE_STRIKETHROUGH));
 }
-#endif
 
+static void browserWindowSaveSession(BrowserWindow *window)
+{
+    if (!window->sessionFile)
+        return;
+
+    WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
+    WebKitWebViewSessionState *state = webkit_web_view_get_session_state(webView);
+    GBytes *bytes = webkit_web_view_session_state_serialize(state);
+    webkit_web_view_session_state_unref(state);
+    g_file_set_contents(window->sessionFile, g_bytes_get_data(bytes, NULL), g_bytes_get_size(bytes), NULL);
+    g_bytes_unref(bytes);
+    g_clear_pointer(&window->sessionFile, g_free);
+}
+
 static void browserWindowFinalize(GObject *gObject)
 {
     BrowserWindow *window = BROWSER_WINDOW(gObject);
@@ -784,7 +854,7 @@
     if (window->resetEntryProgressTimeoutId)
         g_source_remove(window->resetEntryProgressTimeoutId);
 
-    g_free(window->sessionFile);
+    g_clear_object(&window->editActionGroup);
 
     G_OBJECT_CLASS(browser_window_parent_class)->finalize(gObject);
 }
@@ -793,15 +863,21 @@
 {
     BrowserWindow *window = BROWSER_WINDOW(gObject);
 
+    browserWindowSaveSession(window);
+
     if (window->parentWindow) {
         g_object_remove_weak_pointer(G_OBJECT(window->parentWindow), (gpointer *)&window->parentWindow);
         window->parentWindow = NULL;
     }
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    g_object_set_data(G_OBJECT(window->backItem), "history-popover", NULL);
+    g_object_set_data(G_OBJECT(window->forwardItem), "history-popover", NULL);
+#endif
+
     G_OBJECT_CLASS(browser_window_parent_class)->dispose(gObject);
 }
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
 typedef enum {
     TOOLBAR_BUTTON_NORMAL,
     TOOLBAR_BUTTON_TOGGLE,
@@ -808,32 +884,49 @@
     TOOLBAR_BUTTON_MENU
 } ToolbarButtonType;
 
-static GtkWidget *addToolbarButton(GtkWidget* toolbar, ToolbarButtonType type, const char* iconName, const char *actionName)
+static GtkWidget *addToolbarButton(GtkWidget *box, ToolbarButtonType type, const char *iconName, const char *actionName)
 {
     GtkWidget *button;
     switch (type) {
     case TOOLBAR_BUTTON_NORMAL:
+#if GTK_CHECK_VERSION(3, 98, 5)
+        button = gtk_button_new_from_icon_name(iconName);
+#else
         button = gtk_button_new_from_icon_name(iconName, GTK_ICON_SIZE_MENU);
+#endif
         break;
     case TOOLBAR_BUTTON_TOGGLE:
         button = gtk_toggle_button_new();
+#if GTK_CHECK_VERSION(3, 98, 5)
+        gtk_button_set_icon_name(GTK_BUTTON(button), iconName);
+#else
+        gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_icon_name(iconName, GTK_ICON_SIZE_MENU));
+#endif
         break;
     case TOOLBAR_BUTTON_MENU:
         button = gtk_menu_button_new();
+#if GTK_CHECK_VERSION(3, 98, 5)
+        gtk_menu_button_set_icon_name(GTK_MENU_BUTTON(button), iconName);
+#else
+        gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_icon_name(iconName, GTK_ICON_SIZE_MENU));
+#endif
+
         break;
     }
-    if (type != TOOLBAR_BUTTON_NORMAL)
-        gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_icon_name(iconName, GTK_ICON_SIZE_MENU));
 
     gtk_widget_set_focus_on_click(button, FALSE);
     if (actionName)
         gtk_actionable_set_action_name(GTK_ACTIONABLE(button), actionName);
-    gtk_container_add(GTK_CONTAINER(toolbar), button);
+
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(box), button);
+#else
+    gtk_container_add(GTK_CONTAINER(box), button);
     gtk_widget_show(button);
+#endif
 
     return button;
 }
-#endif
 
 static const GActionEntry editActions[] = {
     { "Bold", NULL, NULL, "false", editingActionCallback, { 0 } },
@@ -854,7 +947,6 @@
 
 static void browserWindowSetupEditorToolbar(BrowserWindow *window)
 {
-#if !GTK_CHECK_VERSION(3, 98, 0)
     GtkWidget *toolbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
     window->editToolbar = toolbar;
     gtk_widget_set_margin_top(toolbar, 2);
@@ -863,58 +955,109 @@
     gtk_widget_set_margin_end(toolbar, 2);
 
     GSimpleActionGroup *actionGroup = g_simple_action_group_new();
+    window->editActionGroup = G_ACTION_GROUP(actionGroup);
     g_action_map_add_action_entries(G_ACTION_MAP(actionGroup), editActions, G_N_ELEMENTS(editActions), window);
     gtk_widget_insert_action_group(toolbar, "edit", G_ACTION_GROUP(actionGroup));
-    g_object_unref(actionGroup);
 
     GtkWidget *groupBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(groupBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(groupBox), GTK_STYLE_CLASS_LINKED);
+#endif
     addToolbarButton(groupBox, TOOLBAR_BUTTON_TOGGLE, "format-text-bold-symbolic", "edit.Bold");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_TOGGLE, "format-text-italic-symbolic", "edit.Italic");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_TOGGLE, "format-text-underline-symbolic", "edit.Underline");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_TOGGLE, "format-text-strikethrough-symbolic", "edit.Strikethrough");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), groupBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), groupBox, FALSE, FALSE, 0);
     gtk_widget_show(groupBox);
+#endif
 
     groupBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(groupBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(groupBox), GTK_STYLE_CLASS_LINKED);
+#endif
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "edit-cut-symbolic", "edit.Cut");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "edit-copy-symbolic", "edit.Copy");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "edit-paste-symbolic", "edit.Paste");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), groupBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), groupBox, FALSE, FALSE, 0);
     gtk_widget_show(groupBox);
+#endif
 
     groupBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(groupBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(groupBox), GTK_STYLE_CLASS_LINKED);
+#endif
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "edit-undo-symbolic", "edit.Undo");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "edit-redo-symbolic", "edit.Redo");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), groupBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), groupBox, FALSE, FALSE, 0);
     gtk_widget_show(groupBox);
+#endif
 
     groupBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(groupBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(groupBox), GTK_STYLE_CLASS_LINKED);
+#endif
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "format-justify-left-symbolic", "edit.JustifyLeft");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "format-justify-center-symbolic", "edit.JustifyCenter");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "format-justify-right-symbolic", "edit.JustifyRight");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), groupBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), groupBox, FALSE, FALSE, 0);
     gtk_widget_show(groupBox);
+#endif
 
     groupBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(groupBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(groupBox), GTK_STYLE_CLASS_LINKED);
+#endif
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "format-indent-more-symbolic", "edit.Indent");
     addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "format-indent-less-symbolic", "edit.Outdent");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), groupBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), groupBox, FALSE, FALSE, 0);
     gtk_widget_show(groupBox);
+#endif
 
     groupBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(groupBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(groupBox), GTK_STYLE_CLASS_LINKED);
+#endif
     GtkWidget *button = addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "insert-image-symbolic", NULL);
     g_signal_connect(button, "clicked", G_CALLBACK(insertImageCommandCallback), window);
     button = addToolbarButton(groupBox, TOOLBAR_BUTTON_NORMAL, "insert-link-symbolic", NULL);
     g_signal_connect(button, "clicked", G_CALLBACK(insertLinkCommandCallback), window);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), groupBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), groupBox, FALSE, FALSE, 0);
     gtk_widget_show(groupBox);
+#endif
 
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_insert_child_after(GTK_BOX(window->mainBox), toolbar, window->toolbar);
+#else
     gtk_box_pack_start(GTK_BOX(window->mainBox), toolbar, FALSE, FALSE, 0);
     gtk_box_reorder_child(GTK_BOX(window->mainBox), toolbar, 1);
     gtk_widget_show(toolbar);
@@ -945,9 +1088,7 @@
     WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
     if (webkit_web_view_is_editable(webView)) {
         browserWindowSetupEditorToolbar(window);
-#if !GTK_CHECK_VERSION(3, 98, 0)
         g_signal_connect(webkit_web_view_get_editor_state(webView), "notify::typing-attributes", G_CALLBACK(typingAttributesChanged), window);
-#endif
     }
     webViewURIChanged(webView, NULL, window);
     webViewTitleChanged(webView, NULL, window);
@@ -984,91 +1125,48 @@
     gtk_notebook_set_show_tabs(GTK_NOTEBOOK(window->notebook), gtk_notebook_get_n_pages(notebook) > 1);
 }
 
-#if GTK_CHECK_VERSION(3, 98, 0)
-static GtkWidget* browserWindowSetupToolbarItem(BrowserWindow* window, GtkBox* box, const char* namedIcon, GCallback callback)
-{
-    GtkWidget *button = gtk_button_new_from_icon_name(namedIcon);
-    gtk_button_set_has_frame(GTK_BUTTON(button), FALSE);
-    gtk_box_append(box, button);
-    g_signal_connect_swapped(button, "clicked", callback, (gpointer)window);
-
-    return button;
-}
-#endif
-
 static void browserWindowBuildPopoverMenu(BrowserWindow *window, GtkWidget *parent)
 {
-    GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
-    gtk_widget_set_margin_top(vbox, 12);
-    gtk_widget_set_margin_bottom(vbox, 12);
+    GMenu *menu = g_menu_new();
+    GMenu *section = g_menu_new();
+    GMenuItem *item = g_menu_item_new("Zoom Out", "win.zoom-out");
+    g_menu_item_set_attribute(item, "verb-icon", "s", "zoom-out-symbolic");
+    g_menu_append_item(section, item);
+    g_object_unref(item);
 
-    GtkWidget *zoomBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-    gtk_widget_set_margin_start(zoomBox, 12);
-    gtk_widget_set_margin_end(zoomBox, 12);
-    gtk_box_set_homogeneous(GTK_BOX(zoomBox), TRUE);
-    gtk_style_context_add_class(gtk_widget_get_style_context(zoomBox), GTK_STYLE_CLASS_LINKED);
-    GtkWidget *button = gtk_button_new_from_icon_name("zoom-out-symbolic", GTK_ICON_SIZE_MENU);
-    gtk_widget_set_halign(button, GTK_ALIGN_FILL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.zoom-out");
-    gtk_container_add(GTK_CONTAINER(zoomBox), button);
-    gtk_widget_show(button);
+    item = g_menu_item_new("Zoom Original", "win.zoom-default");
+    g_menu_item_set_attribute(item, "verb-icon", "s", "zoom-original-symbolic");
+    g_menu_append_item(section, item);
+    g_object_unref(item);
 
-    button = gtk_button_new_from_icon_name("zoom-original-symbolic", GTK_ICON_SIZE_MENU);
-    gtk_widget_set_halign(button, GTK_ALIGN_FILL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.zoom-default");
-    gtk_container_add(GTK_CONTAINER(zoomBox), button);
-    gtk_widget_show(button);
+    item = g_menu_item_new("Zoom In", "win.zoom-in");
+    g_menu_item_set_attribute(item, "verb-icon", "s", "zoom-in-symbolic");
+    g_menu_append_item(section, item);
+    g_object_unref(item);
 
-    button = gtk_button_new_from_icon_name("zoom-in-symbolic", GTK_ICON_SIZE_MENU);
-    gtk_widget_set_halign(button, GTK_ALIGN_FILL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.zoom-in");
-    gtk_container_add(GTK_CONTAINER(zoomBox), button);
-    gtk_widget_show(button);
+    GMenuItem *sectionItem = g_menu_item_new_section(NULL, G_MENU_MODEL(section));
+    g_menu_item_set_attribute(sectionItem, "display-hint", "s", "horizontal-buttons");
+    g_menu_append_item(menu, sectionItem);
+    g_object_unref(sectionItem);
+    g_object_unref(section);
 
-    gtk_box_pack_start(GTK_BOX(vbox), zoomBox, FALSE, FALSE, 0);
-    gtk_widget_show(zoomBox);
+    section = g_menu_new();
+    g_menu_insert(section, -1, "_New Private Window", "win.open-private-window");
+    g_menu_insert(section, -1, "_Print…", "win.print");
+    g_menu_insert(section, -1, "Prefere_nces…", "win.preferences");
+    g_menu_insert(section, -1, "_Quit", "win.quit");
+    g_menu_append_section(menu, NULL, G_MENU_MODEL(section));
+    g_object_unref(section);
 
-    GtkWidget *menuBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
-    gtk_widget_set_margin_start(menuBox, 12);
-    gtk_widget_set_margin_end(menuBox, 12);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWidget *popover = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu));
+#else
+    GtkWidget *popover = gtk_popover_menu_new();
+    gtk_popover_bind_model(GTK_POPOVER(popover), G_MENU_MODEL(menu), NULL);
+#endif
+    g_object_unref(menu);
 
-    GtkWidget *separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
-    gtk_widget_set_margin_top(separator, 6);
-    gtk_widget_set_margin_bottom(separator, 6);
-    gtk_box_pack_start(GTK_BOX(menuBox), separator, FALSE, FALSE, 0);
-    gtk_widget_show(separator);
-
-    button = gtk_model_button_new();
-    g_object_set(button, "text", "_New Private Window", NULL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.open-private-window");
-    gtk_box_pack_start(GTK_BOX(menuBox), button, FALSE, FALSE, 0);
-    gtk_widget_show(button);
-
-    button = gtk_model_button_new();
-    g_object_set(button, "text", "_Print…", NULL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.print");
-    gtk_box_pack_start(GTK_BOX(menuBox), button, FALSE, FALSE, 0);
-    gtk_widget_show(button);
-
-    button = gtk_model_button_new();
-    g_object_set(button, "text", "Prefere_nces…", NULL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.preferences");
-    gtk_box_pack_start(GTK_BOX(menuBox), button, FALSE, FALSE, 0);
-    gtk_widget_show(button);
-
-    button = gtk_model_button_new();
-    g_object_set(button, "text", "_Quit", NULL);
-    gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.quit");
-    gtk_box_pack_start(GTK_BOX(menuBox), button, FALSE, FALSE, 0);
-    gtk_widget_show(button);
-
-    gtk_box_pack_start(GTK_BOX(vbox), menuBox, FALSE, FALSE, 0);
-    gtk_widget_show(menuBox);
-
-    GtkWidget *popover = gtk_popover_new(parent);
     gtk_menu_button_set_popover(GTK_MENU_BUTTON(parent), popover);
-    gtk_container_add(GTK_CONTAINER(popover), vbox);
-    gtk_widget_show(vbox);
 }
 
 static const GActionEntry actions[] = {
@@ -1085,10 +1183,8 @@
     { "zoom-in", zoomInCallback, NULL, NULL, NULL, { 0 } },
     { "zoom-out", zoomOutCallback, NULL, NULL, NULL, { 0 } },
     { "zoom-default", defaultZoomCallback, NULL, NULL, NULL, { 0 } },
-#if !GTK_CHECK_VERSION(3, 98, 0)
     { "find", searchCallback, NULL, NULL, NULL, { 0 } },
     { "preferences", settingsCallback, NULL, NULL, NULL, { 0 } },
-#endif
     { "new-tab", newTabCallback, NULL, NULL, NULL, { 0 } },
     { "toggle-fullscreen", toggleFullScreen, NULL, NULL, NULL, { 0 } },
     { "print", printPage, NULL, NULL, NULL, { 0 } },
@@ -1104,25 +1200,8 @@
     gtk_window_set_title(GTK_WINDOW(window), defaultWindowTitle);
     gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
 
-    window->uriEntry = gtk_entry_new();
-    g_signal_connect_swapped(window->uriEntry, "activate", G_CALLBACK(activateUriEntryCallback), (gpointer)window);
-    gtk_entry_set_icon_activatable(GTK_ENTRY(window->uriEntry), GTK_ENTRY_ICON_PRIMARY, FALSE);
-    updateUriEntryIcon(window);
-
     g_action_map_add_action_entries(G_ACTION_MAP(window), actions, G_N_ELEMENTS(actions), window);
 
-#if GTK_CHECK_VERSION(3, 98, 0)
-    GtkWidget *toolbar = gtk_center_box_new();
-    window->toolbar = toolbar;
-    gtk_widget_set_hexpand(window->uriEntry, TRUE);
-    gtk_center_box_set_center_widget(GTK_CENTER_BOX(toolbar), window->uriEntry);
-
-    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-    window->backItem = browserWindowSetupToolbarItem(window, GTK_BOX(box), "go-previous", G_CALLBACK(goBackCallback));
-    window->forwardItem = browserWindowSetupToolbarItem(window, GTK_BOX(box), "go-next", G_CALLBACK(goForwardCallback));
-    window->reloadOrStopButton = browserWindowSetupToolbarItem(window, GTK_BOX(box), "view-refresh", G_CALLBACK(reloadOrStopCallback));
-    gtk_center_box_set_start_widget(GTK_CENTER_BOX(toolbar), box);
-#else
     GtkWidget *toolbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
     window->toolbar = toolbar;
     gtk_widget_set_margin_top(toolbar, 2);
@@ -1131,29 +1210,59 @@
     gtk_widget_set_margin_end(toolbar, 2);
 
     GtkWidget *navigationBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_widget_add_css_class(navigationBox, GTK_STYLE_CLASS_LINKED);
+#else
     gtk_style_context_add_class(gtk_widget_get_style_context(navigationBox), GTK_STYLE_CLASS_LINKED);
+#endif
 
     window->backItem = addToolbarButton(navigationBox, TOOLBAR_BUTTON_NORMAL, "go-previous-symbolic", "win.go-back");
+    window->forwardItem = addToolbarButton(navigationBox, TOOLBAR_BUTTON_NORMAL, "go-next-symbolic", "win.go-forward");
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkGesture *gesture = gtk_gesture_click_new();
+    gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), GDK_BUTTON_SECONDARY);
+    g_signal_connect(gesture, "pressed", G_CALLBACK(navigationButtonPressed), NULL);
+    gtk_widget_add_controller(window->backItem, GTK_EVENT_CONTROLLER(gesture));
+
+    gesture = gtk_gesture_click_new();
+    gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), GDK_BUTTON_SECONDARY);
+    g_signal_connect(gesture, "pressed", G_CALLBACK(navigationButtonPressed), NULL);
+    gtk_widget_add_controller(window->forwardItem, GTK_EVENT_CONTROLLER(gesture));
+#else
     g_signal_connect(window->backItem, "button-press-event", G_CALLBACK(navigationButtonPressCallback), window);
-    window->forwardItem = addToolbarButton(navigationBox, TOOLBAR_BUTTON_NORMAL, "go-next-symbolic", "win.go-forward");
     g_signal_connect(window->forwardItem, "button-press-event", G_CALLBACK(navigationButtonPressCallback), window);
+#endif
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), navigationBox);
+#else
     gtk_box_pack_start(GTK_BOX(toolbar), navigationBox, FALSE, FALSE, 0);
     gtk_widget_show(navigationBox);
+#endif
 
     addToolbarButton(toolbar, TOOLBAR_BUTTON_NORMAL, "go-home-symbolic", "win.load-homepage");
     addToolbarButton(toolbar, TOOLBAR_BUTTON_NORMAL, "tab-new-symbolic", "win.new-tab");
 
-    gtk_box_pack_start(GTK_BOX(toolbar), window->uriEntry, TRUE, TRUE, 0);
+    window->uriEntry = gtk_entry_new();
+    gtk_widget_set_halign(window->uriEntry, GTK_ALIGN_FILL);
+    gtk_widget_set_hexpand(window->uriEntry, TRUE);
+    g_signal_connect_swapped(window->uriEntry, "activate", G_CALLBACK(activateUriEntryCallback), (gpointer)window);
+    gtk_entry_set_icon_activatable(GTK_ENTRY(window->uriEntry), GTK_ENTRY_ICON_PRIMARY, FALSE);
+    updateUriEntryIcon(window);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(toolbar), window->uriEntry);
+#else
+    gtk_container_add(GTK_CONTAINER(toolbar), window->uriEntry);
     gtk_widget_show(window->uriEntry);
+#endif
 
     window->reloadOrStopButton = addToolbarButton(toolbar, TOOLBAR_BUTTON_NORMAL, "view-refresh-symbolic", "win.reload-stop");
     addToolbarButton(toolbar, TOOLBAR_BUTTON_NORMAL, "edit-find-symbolic", "win.find");
     GtkWidget *button = addToolbarButton(toolbar, TOOLBAR_BUTTON_MENU, "open-menu-symbolic", NULL);
     browserWindowBuildPopoverMenu(window, button);
-#endif
+
     GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     window->mainBox = vbox;
-#if GTK_CHECK_VERSION(3, 98, 4)
+#if GTK_CHECK_VERSION(3, 98, 5)
     gtk_box_append(GTK_BOX(vbox), toolbar);
 #else
     gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
@@ -1166,41 +1275,34 @@
     g_signal_connect(window->notebook, "page-removed", G_CALLBACK(browserWindowTabAddedOrRemoved), window);
     gtk_notebook_set_show_tabs(GTK_NOTEBOOK(window->notebook), FALSE);
     gtk_notebook_set_show_border(GTK_NOTEBOOK(window->notebook), FALSE);
-#if !GTK_CHECK_VERSION(3, 98, 4)
+#if GTK_CHECK_VERSION(3, 98, 5)
+    gtk_box_append(GTK_BOX(window->mainBox), window->notebook);
+    gtk_window_set_child(GTK_WINDOW(window), vbox);
+#else
     gtk_box_pack_start(GTK_BOX(window->mainBox), window->notebook, TRUE, TRUE, 0);
     gtk_widget_show(window->notebook);
     gtk_container_add(GTK_CONTAINER(window), vbox);
     gtk_widget_show(vbox);
-#else
-    gtk_box_append(GTK_BOX(window->mainBox), window->notebook);
-    gtk_window_set_child(GTK_WINDOW(window), vbox);
 #endif
-}
 
-static void browserWindowConstructed(GObject *gObject)
-{
-    G_OBJECT_CLASS(browser_window_parent_class)->constructed(gObject);
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkEventController *controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
+    gtk_event_controller_set_propagation_phase(controller, GTK_PHASE_CAPTURE);
+    g_signal_connect_swapped(controller, "scroll", G_CALLBACK(scrollEventCallback), window);
+    gtk_widget_add_controller(GTK_WIDGET(window), controller);
+#endif
 }
 
-static void browserWindowSaveSession(BrowserWindow *window)
+#if GTK_CHECK_VERSION(3, 98, 5)
+static gboolean browserWindowCloseRequest(GtkWindow *window)
 {
-    if (!window->sessionFile)
-        return;
-
-    WebKitWebView *webView = browser_tab_get_web_view(window->activeTab);
-    WebKitWebViewSessionState *state = webkit_web_view_get_session_state(webView);
-    GBytes *bytes = webkit_web_view_session_state_serialize(state);
-    webkit_web_view_session_state_unref(state);
-    g_file_set_contents(window->sessionFile, g_bytes_get_data(bytes, NULL), g_bytes_get_size(bytes), NULL);
-    g_bytes_unref(bytes);
+    browserWindowTryClose(NULL, NULL, BROWSER_WINDOW(window));
+    return FALSE;
 }
-
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#else
 static gboolean browserWindowDeleteEvent(GtkWidget *widget, GdkEventAny* event)
 {
-    BrowserWindow *window = BROWSER_WINDOW(widget);
-    browserWindowSaveSession(window);
-    browserWindowTryClose(NULL, NULL, window);
+    browserWindowTryClose(NULL, NULL, BROWSER_WINDOW(widget));
     return TRUE;
 }
 #endif
@@ -1208,12 +1310,13 @@
 static void browser_window_class_init(BrowserWindowClass *klass)
 {
     GObjectClass *gobjectClass = G_OBJECT_CLASS(klass);
-
-    gobjectClass->constructed = browserWindowConstructed;
     gobjectClass->dispose = browserWindowDispose;
     gobjectClass->finalize = browserWindowFinalize;
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#if GTK_CHECK_VERSION(3, 98, 5)
+    GtkWindowClass *windowClass = GTK_WINDOW_CLASS(klass);
+    windowClass->close_request = browserWindowCloseRequest;
+#else
     GtkWidgetClass *widgetClass = GTK_WIDGET_CLASS(klass);
     widgetClass->delete_event = browserWindowDeleteEvent;
 #endif
@@ -1260,10 +1363,12 @@
     GtkWidget *tab = browser_tab_new(webView);
 #if !GTK_CHECK_VERSION(3, 98, 0)
     if (gtk_widget_get_app_paintable(GTK_WIDGET(window)))
+#endif
         browser_tab_set_background_color(BROWSER_TAB(tab), &window->backgroundColor);
-#endif
     gtk_notebook_append_page(GTK_NOTEBOOK(window->notebook), tab, browser_tab_get_title_widget(BROWSER_TAB(tab)));
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#if GTK_CHECK_VERSION(3, 98, 5)
+    g_object_set(gtk_notebook_get_page(GTK_NOTEBOOK(window->notebook), tab), "tab-expand", TRUE, NULL);
+#else
     gtk_container_child_set(GTK_CONTAINER(window->notebook), tab, "tab-expand", TRUE, NULL);
 #endif
     gtk_widget_show(tab);
@@ -1318,7 +1423,12 @@
 
     window->backgroundColor = *rgba;
 
-#if !GTK_CHECK_VERSION(3, 98, 0)
+#if GTK_CHECK_VERSION(3, 98, 5)
+    /* FIXME: transparent colors don't work. In GTK4 there's no gtk_widget_set_app_paintable(),
+     * what we can do instead is removing the background css class from the window, but that
+     * would affect other parts of the window, like toolbar or even title bar background.
+     */
+#else
     GdkVisual *rgbaVisual = gdk_screen_get_rgba_visual(gtk_window_get_screen(GTK_WINDOW(window)));
     if (!rgbaVisual)
         return;

Modified: trunk/Tools/MiniBrowser/gtk/CMakeLists.txt (262938 => 262939)


--- trunk/Tools/MiniBrowser/gtk/CMakeLists.txt	2020-06-12 08:28:10 UTC (rev 262938)
+++ trunk/Tools/MiniBrowser/gtk/CMakeLists.txt	2020-06-12 08:42:50 UTC (rev 262939)
@@ -8,8 +8,8 @@
     BrowserCellRendererVariant.h
     BrowserDownloadsBar.c
     BrowserDownloadsBar.h
-    BrowserSearchBar.c
-    BrowserSearchBar.h
+    BrowserSearchBox.c
+    BrowserSearchBox.h
     BrowserSettingsDialog.c
     BrowserSettingsDialog.h
     BrowserTab.c
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to