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