summaryrefslogtreecommitdiff
path: root/src/browserbox.c
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2019-08-24 13:38:44 +0300
committerdefanor <defanor@uberspace.net>2019-08-24 13:38:44 +0300
commitf308e319f3170a2949624e211adf75002ee5d3f1 (patch)
treed086626c17e1a88860dcf44c3bbb5f74ce41d869 /src/browserbox.c
parent2395d5ab1e83507530fdbd675c917d0c55187e66 (diff)
Introduce incremental text search
It is quite rough and should be refined, but as with most of the other features, introducing it at this stage primarily to ensure that it will not require major changes.
Diffstat (limited to 'src/browserbox.c')
-rw-r--r--src/browserbox.c85
1 files changed, 43 insertions, 42 deletions
diff --git a/src/browserbox.c b/src/browserbox.c
index fe69cde..9179ad1 100644
--- a/src/browserbox.c
+++ b/src/browserbox.c
@@ -118,26 +118,46 @@ static void builder_state_class_init (BuilderStateClass *klass)
object_class->dispose = builder_state_dispose;
}
+void scroll_to (BuilderState *bs, GObject *target)
+{
+ GtkAllocation widget_alloc, *alloc;
+ if (GTK_IS_WIDGET(target)) {
+ gtk_widget_get_allocation(GTK_WIDGET(target), &widget_alloc);
+ alloc = &widget_alloc;
+ } else if (IS_IB_TEXT(target)) {
+ alloc = &IB_TEXT(target)->alloc;
+ } else {
+ puts("Shouldn't happen");
+ return;
+ }
+ GtkAdjustment *adj =
+ gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(bs->docbox));
+ gtk_adjustment_set_value(adj, alloc->y);
+ gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(bs->docbox),
+ adj);
+}
void scroll_to_identifier(BuilderState *bs, const char *identifier)
{
- GtkWidget *target = g_hash_table_lookup(bs->identifiers, identifier);
- if (target) {
- GtkAllocation widget_alloc, *alloc;
- if (GTK_IS_WIDGET(target)) {
- gtk_widget_get_allocation(target, &widget_alloc);
- alloc = &widget_alloc;
- } else if (IS_IB_TEXT(target)) {
- alloc = &IB_TEXT(target)->alloc;
- } else {
- puts("Shouldn't happen");
- return;
- }
- GtkAdjustment *adj =
- gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(bs->docbox));
- gtk_adjustment_set_value(adj, alloc->y);
- gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(bs->docbox),
- adj);
+ GObject *target = g_hash_table_lookup(bs->identifiers, identifier);
+ if (target != NULL) {
+ scroll_to(bs, target);
+ }
+}
+
+void browser_box_set_status(BrowserBox *bb, const gchar *status_str) {
+ gtk_statusbar_remove_all(GTK_STATUSBAR(bb->status_bar),
+ gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"));
+ gtk_statusbar_push(GTK_STATUSBAR(bb->status_bar),
+ gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"),
+ status_str);
+}
+
+void browser_box_display_search_status (BrowserBox *bb) {
+ gchar status[MAX_SEARCH_STRING_LEN + 33];
+ if (bb->search_state == SEARCH_FORWARD) {
+ sprintf(status, "Forward search: %s", bb->search_string);
+ browser_box_set_status(bb, status);
}
}
@@ -1212,11 +1232,7 @@ void hover_link_cb (void *ptr,
gchar *url,
BrowserBox *bb)
{
- gtk_statusbar_remove_all(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"));
- gtk_statusbar_push(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"),
- url);
+ browser_box_set_status(bb, url);
}
@@ -1238,11 +1254,7 @@ void document_loaded(SoupSession *session,
htmlParseChunk(bs->parser, "", 0, 1);
gtk_widget_grab_focus(GTK_WIDGET(bs->docbox));
printf("word cache: %u\n", g_hash_table_size(word_cache));
- gtk_statusbar_remove_all(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"));
- gtk_statusbar_push(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"),
- "Ready");
+ browser_box_set_status(bb, "Ready");
}
void got_chunk(SoupMessage *msg,
@@ -1251,11 +1263,7 @@ void got_chunk(SoupMessage *msg,
{
BrowserBox *bb = ptr;
BuilderState *bs = bb->builder_state;
- gtk_statusbar_remove_all(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"));
- gtk_statusbar_push(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"),
- "Loading");
+ browser_box_set_status(bb, "Loading");
if (bs->parser == NULL) {
/* todo: maybe move it into got_headers */
char *uri_str = soup_uri_to_string(bs->uri, FALSE);
@@ -1285,11 +1293,7 @@ void got_chunk(SoupMessage *msg,
void got_headers(SoupMessage *msg, gpointer ptr)
{
BrowserBox *bb = ptr;
- gtk_statusbar_remove_all(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"));
- gtk_statusbar_push(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"),
- "Got headers");
+ browser_box_set_status(bb, "Got headers");
/* todo: check content type, don't assume HTML */
if (bb->builder_state != NULL) {
if (bb->builder_state->docbox != NULL) {
@@ -1306,11 +1310,7 @@ void got_headers(SoupMessage *msg, gpointer ptr)
void document_request_sm (BrowserBox *bb, SoupMessage *sm)
{
- gtk_statusbar_remove_all(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"));
- gtk_statusbar_push(GTK_STATUSBAR(bb->status_bar),
- gtk_statusbar_get_context_id(GTK_STATUSBAR(bb->status_bar), "status"),
- "Requesting");
+ browser_box_set_status(bb, "Requesting");
if (bb->builder_state != NULL) {
bb->builder_state->active = FALSE;
}
@@ -1394,6 +1394,7 @@ browser_box_init (BrowserBox *bb)
bb->forms = NULL;
bb->history = NULL;
bb->history_position = NULL;
+ bb->search_string[0] = 0;
return;
}