summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c57
1 files changed, 54 insertions, 3 deletions
diff --git a/src/main.c b/src/main.c
index 65adadf..0603b03 100644
--- a/src/main.c
+++ b/src/main.c
@@ -41,19 +41,70 @@ key_press_event_cb (GtkWidget *widget, GdkEventKey *ev, GtkStack *tabs)
return TRUE;
} else if (ev->keyval == GDK_KEY_w) {
GtkWidget *current_tab = gtk_stack_get_visible_child(tabs);
- if (current_tab) {
+ if (current_tab != NULL) {
gtk_widget_destroy(current_tab);
+ return TRUE;
+ }
+ } else if (ev->keyval == GDK_KEY_s) {
+ GtkWidget *current_tab = gtk_stack_get_visible_child(tabs);
+ if (current_tab != NULL) {
+ BrowserBox *bb = BROWSER_BOX(current_tab);
+ if (bb->search_state == SEARCH_INACTIVE) {
+ bb->search_state = SEARCH_FORWARD;
+ browser_box_display_search_status(bb);
+ } else if (bb->search_state == SEARCH_FORWARD) {
+ TextSearchState *tss = &(DOCUMENT_BOX(bb->builder_state->docbox)->search);
+ if (tss->state == FOUND) {
+ tss->start++;
+ }
+ document_box_find(DOCUMENT_BOX(bb->builder_state->docbox), bb->search_string);
+ browser_box_display_search_status(bb);
+ }
+ return TRUE;
+ }
+ } else if (ev->keyval == GDK_KEY_g) {
+ GtkWidget *current_tab = gtk_stack_get_visible_child(tabs);
+ if (current_tab != NULL) {
+ BrowserBox *bb = BROWSER_BOX(current_tab);
+ if (bb->search_state != SEARCH_INACTIVE) {
+ bb->search_state = SEARCH_INACTIVE;
+ bb->search_string[0] = 0;
+ browser_box_set_status(bb, "Interrupted");
+ }
}
- return TRUE;
}
}
GtkWidget *current_tab = gtk_stack_get_visible_child(tabs);
if (current_tab != NULL) {
BrowserBox *bb = BROWSER_BOX(current_tab);
- if (ev->keyval == GDK_KEY_Back || ev->keyval == GDK_KEY_BackSpace) {
+ if (ev->keyval == GDK_KEY_Back ||
+ (bb->search_state == SEARCH_INACTIVE &&
+ ev->keyval == GDK_KEY_BackSpace)) {
return history_back(bb);
} else if (ev->keyval == GDK_KEY_Forward) {
return history_forward(bb);
+ } else if (bb->search_state != SEARCH_INACTIVE &&
+ bb->builder_state != NULL &&
+ bb->builder_state->docbox != NULL) {
+ size_t ss_len = strlen(bb->search_string);
+ DocumentBox *db = DOCUMENT_BOX(bb->builder_state->docbox);
+ if (ev->keyval == GDK_KEY_BackSpace && ss_len > 0) {
+ /* todo: this won't work well for unicode */
+ bb->search_string[ss_len - 1] = 0;
+ document_box_find(db, bb->search_string);
+ browser_box_display_search_status(bb);
+ return TRUE;
+ }
+ if (ss_len + 4 < MAX_SEARCH_STRING_LEN) {
+ gunichar c = gdk_keyval_to_unicode(ev->keyval);
+ gint c_len = g_unichar_to_utf8(c, bb->search_string + ss_len);
+ if (c_len > 0) {
+ bb->search_string[ss_len + c_len] = 0;
+ browser_box_display_search_status(bb);
+ document_box_find(db, bb->search_string);
+ return TRUE;
+ }
+ }
}
}
return FALSE;