From 1f2a14c5f369dfc7660de2e52596faf6df11d442 Mon Sep 17 00:00:00 2001 From: Marko Andjelic Date: Sat, 11 Jul 2026 19:36:09 +0100 Subject: [PATCH] add snap when finishing search --- app/UI.hs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/app/UI.hs b/app/UI.hs index 26cb21e..4b4f609 100644 --- a/app/UI.hs +++ b/app/UI.hs @@ -201,14 +201,14 @@ wireEvents ctx = do case keyval of Gdk.KEY_Down -> WebKit.findControllerSearchNext fc >> pure True Gdk.KEY_Up -> WebKit.findControllerSearchPrevious fc >> pure True - Gdk.KEY_Escape -> Gtk.setEditableText entry "" >> WebKit.findControllerSearchFinish fc >> Gtk.widgetGrabFocus (appWebView (ctxWidgets ctx)) >> pure True + Gdk.KEY_Escape -> Gtk.setEditableText entry "" >> WebKit.findControllerSearchFinish fc >> Gtk.widgetGrabFocus (appWebView (ctxWidgets ctx)) >> snapPagination ctx >> pure True _ -> pure False Gtk.widgetAddController entry searchKeys _ <- on entry #searchChanged $ do q <- Gtk.editableGetText entry if T.null q - then WebKit.findControllerSearchFinish fc + then WebKit.findControllerSearchFinish fc >> snapPagination ctx else WebKit.findControllerSearch fc q findOpts maxBound let runfwd = runSearch ctx nextMatch _ <- on entry #activate $ runfwd -- pressing enter while having search text @@ -525,6 +525,26 @@ wrapHtml (Html body) start mode = let safe = T.filter (\c -> c /= '"' && c /= '\\') f in "" + +-- | Re-align the paginated view after an in-page find. WebKit reveals a match +-- by scrolling the (multi-column) layout, which leaves the transform-based +-- pager out of sync so several half-pages show at once once the search ends. +-- Reset the scroll offset back to zero and re-apply the current page transform. +-- No-op in scrolling mode, which scrolls natively and needs no fix-up. +snapPagination :: Ctx -> IO () +snapPagination ctx = do + mode <- getMode ctx + when (mode == Paginated) $ + evalJSBool + (appWebView (ctxWidgets ctx)) + ( T.concat + [ "var d=document.documentElement,b=document.body;", + "d.scrollLeft=0;d.scrollTop=0;if(b){b.scrollLeft=0;b.scrollTop=0;}", + "window.scrollTo(0,0);if(typeof apply==='function'){apply();}true" + ] + ) + (\_ -> pure ()) + evalJSBool :: WebKit.WebView -> T.Text -> (Bool -> IO ()) -> IO () evalJSBool wv src k = WebKit.webViewEvaluateJavascript wv src (-1) Nothing Nothing (Nothing :: Maybe Gio.Cancellable)