summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2026-06-05 13:10:13 -0400
committerVictor Kareh <[email protected]>2026-06-09 12:38:12 -0400
commitb1a648b9583b1368b80b988df3aa0bc0db7dc004 (patch)
tree5d46a6740d2a608462fbf52352dd66e357b6bf99 /shell
parent3e7daa36411678717b833eac7866a7efd03f0bdd (diff)
downloadatril-libgepub-support.tar.bz2
atril-libgepub-support.tar.xz
epub: Implement search using WebKit find controllerlibgepub-support
Bypass the threaded EvJobFind for EPUB documents and use WebKit's WebKitFindController directly. The threaded find job was incompatible with GepubDoc's single-threaded design and caused segfaults. The new approach searches within the current page using WebKit's built-in text search and highlighting, which is both simpler and thread-safe. Assisted-by: OpenCode:claude-opus-4-6
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-window.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c
index cc45f883..d046113b 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -453,7 +453,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
else if (has_document && document->iswebdocument) {
can_get_text = TRUE;
}
- if (has_pages && EV_IS_DOCUMENT_FIND (document)) {
+ if (has_pages && (EV_IS_DOCUMENT_FIND (document) || document->iswebdocument)) {
can_find = TRUE;
}
@@ -1733,7 +1733,7 @@ ev_window_setup_document (EvWindow *ev_window)
info = ev_document_get_info (document);
update_document_mode (ev_window, info->mode);
- if (EV_IS_DOCUMENT_FIND (document)) {
+ if (EV_IS_DOCUMENT_FIND (document) || document->iswebdocument) {
if (ev_window->priv->search_string &&
!EV_WINDOW_IS_PRESENTATION (ev_window)) {
ev_window_show_find_bar (ev_window);
@@ -2509,7 +2509,7 @@ ev_window_open_document (EvWindow *ev_window,
break;
}
- if (search_string && EV_IS_DOCUMENT_FIND (document) &&
+ if (search_string && (EV_IS_DOCUMENT_FIND (document) || document->iswebdocument) &&
mode != EV_WINDOW_MODE_PRESENTATION) {
ev_window_show_find_bar (ev_window);
egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar),
@@ -5858,13 +5858,6 @@ ev_window_find_job_updated_cb (EvJobFind *job,
EvWindow *ev_window)
{
ev_window_update_actions (ev_window);
-#if ENABLE_EPUB
- if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) {
- ev_web_view_find_changed(EV_WEB_VIEW(ev_window->priv->webview),
- job->results,job->text, job->case_sensitive);
- }
- else
-#endif
{
ev_view_find_changed (EV_VIEW (ev_window->priv->view),
ev_job_find_get_results (job),
@@ -5938,11 +5931,27 @@ ev_window_search_start (EvWindow *ev_window)
EggFindBar *find_bar = EGG_FIND_BAR (ev_window->priv->find_bar);
const char *search_string;
- if (!ev_window->priv->document || !EV_IS_DOCUMENT_FIND (ev_window->priv->document))
+ if (!ev_window->priv->document)
return;
search_string = egg_find_bar_get_search_string (find_bar);
+#if ENABLE_EPUB
+ if (ev_window->priv->document->iswebdocument) {
+ if (search_string && search_string[0]) {
+ ev_web_view_find_changed (EV_WEB_VIEW (ev_window->priv->webview),
+ search_string,
+ egg_find_bar_get_case_sensitive (find_bar));
+ } else {
+ ev_web_view_find_cancel (EV_WEB_VIEW (ev_window->priv->webview));
+ }
+ return;
+ }
+#endif
+
+ if (!EV_IS_DOCUMENT_FIND (ev_window->priv->document))
+ return;
+
ev_window_clear_find_job (ev_window);
if (search_string && search_string[0]) {
@@ -5966,9 +5975,7 @@ ev_window_search_start (EvWindow *ev_window)
ev_window_update_actions (ev_window);
egg_find_bar_set_status_text (find_bar, NULL);
ev_find_sidebar_clear (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar));
- if (ev_window->priv->document->iswebdocument == FALSE) {
- gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view));
- }
+ gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view));
}
}
@@ -5999,15 +6006,16 @@ find_bar_visibility_changed_cb (EggFindBar *find_bar,
visible = gtk_widget_get_visible (GTK_WIDGET (find_bar));
if (ev_window->priv->document &&
- EV_IS_DOCUMENT_FIND (ev_window->priv->document)) {
+ (EV_IS_DOCUMENT_FIND (ev_window->priv->document) ||
+ ev_window->priv->document->iswebdocument)) {
if (!ev_window->priv->document->iswebdocument) {
ev_view_find_set_highlight_search (EV_VIEW (ev_window->priv->view), visible);
}
#if ENABLE_EPUB
else {
- ev_web_view_find_search_changed(EV_WEB_VIEW(ev_window->priv->webview));
- ev_web_view_set_handler(EV_WEB_VIEW(ev_window->priv->webview),visible);
+ if (!visible)
+ ev_web_view_find_cancel (EV_WEB_VIEW (ev_window->priv->webview));
}
#endif
ev_window_update_actions (ev_window);
@@ -6038,7 +6046,9 @@ ev_window_show_find_bar (EvWindow *ev_window)
if (gtk_widget_get_visible (ev_window->priv->find_bar))
return;
- if (ev_window->priv->document == NULL || !EV_IS_DOCUMENT_FIND (ev_window->priv->document)) {
+ if (ev_window->priv->document == NULL ||
+ (!EV_IS_DOCUMENT_FIND (ev_window->priv->document) &&
+ !ev_window->priv->document->iswebdocument)) {
g_error ("Find action should be insensitive since document doesn't support find");
return;
}