static gboolean editable_blur_cb(Element *element, Event *event) { if (vb.mode->id == 'i') { vb_enter('n'); } return false; }
VbResult pass_keypress(Client *c, int key) { if (key == CTRL('[')) { /* esc */ vb_enter(c, 'n'); } c->state.processed_key = FALSE; return RESULT_COMPLETE; }
/** * Handles the keypress events from webview and inputbox. */ VbResult input_keypress(Client *c, int key) { static gboolean ctrlo = FALSE; if (ctrlo) { /* if we are in ctrl-O mode perform the next keys as normal mode * commands until the command is complete or error */ VbResult res = normal_keypress(c, key); if (res != RESULT_MORE) { ctrlo = FALSE; /* Don't overwrite the mode label in case we landed in another * mode. This might occurre by CTRL-0 CTRL-Z or after running ex * command, where we mainly end up in normal mode. */ if (c->mode->id == 'i') { /* reenter the input mode */ input_enter(c); } } return res; } switch (key) { case CTRL('['): /* esc */ vb_enter(c, 'n'); return RESULT_COMPLETE; case CTRL('O'): /* enter CTRL-0 mode to execute next command in normal mode */ ctrlo = TRUE; c->mode->flags |= FLAG_NOMAP; vb_modelabel_update(c, "-- (input) --"); return RESULT_MORE; case CTRL('T'): return input_open_editor(c); case CTRL('Z'): vb_enter(c, 'p'); return RESULT_COMPLETE; } c->state.processed_key = FALSE; return RESULT_ERROR; }
static gboolean auto_insert(Element *element) { /* Change only the mode if we are in normal mode - passthrough should not * be disturbed by this and if the user iy typing into inputbox we don't * want to remove the content and force a switch to input mode. And to * switch to input mode when this is already active makes no sense. */ if (vb.mode->id == 'n' && dom_is_editable(element)) { vb_enter('i'); return true; } return false; }
/** * Find the first editable element and set the focus on it and enter input * mode. * Returns true if there was an editable element focused. */ gboolean dom_focus_input(Document *doc) { WebKitDOMNode *html, *node; WebKitDOMDOMWindow *win; WebKitDOMNodeList *list; WebKitDOMXPathNSResolver *resolver; WebKitDOMXPathResult* result; Document *frame_doc; guint i, len; win = webkit_dom_document_get_default_view(doc); list = webkit_dom_document_get_elements_by_tag_name(doc, "html"); if (!list) { return false; } html = webkit_dom_node_list_item(list, 0); g_object_unref(list); resolver = webkit_dom_document_create_ns_resolver(doc, html); if (!resolver) { return false; } /* Use translate to match xpath expression case insensitive so that also * intput filed of type="TEXT" are matched. */ result = webkit_dom_document_evaluate( doc, "//input[not(@type) " "or translate(@type,'ETX','etx')='text' " "or translate(@type,'ADOPRSW','adoprsw')='password' " "or translate(@type,'CLOR','clor')='color' " "or translate(@type,'ADET','adet')='date' " "or translate(@type,'ADEIMT','adeimt')='datetime' " "or translate(@type,'ACDEILMOT','acdeilmot')='datetime-local' " "or translate(@type,'AEILM','aeilm')='email' " "or translate(@type,'HMNOT','hmnot')='month' " "or translate(@type,'BEMNRU','bemnru')='number' " "or translate(@type,'ACEHRS','acehrs')='search' " "or translate(@type,'ELT','elt')='tel' " "or translate(@type,'EIMT','eimt')='time' " "or translate(@type,'LRU','lru')='url' " "or translate(@type,'EKW','ekw')='week' " "]|//textarea", html, resolver, 5, NULL, NULL ); if (!result) { return false; } while ((node = webkit_dom_xpath_result_iterate_next(result, NULL))) { if (element_is_visible(win, WEBKIT_DOM_ELEMENT(node))) { vb_enter('i'); webkit_dom_element_focus(WEBKIT_DOM_ELEMENT(node)); return true; } } /* Look for editable elements in frames too. */ list = webkit_dom_document_get_elements_by_tag_name(doc, "iframe"); len = webkit_dom_node_list_get_length(list); for (i = 0; i < len; i++) { node = webkit_dom_node_list_item(list, i); frame_doc = webkit_dom_html_iframe_element_get_content_document(WEBKIT_DOM_HTML_IFRAME_ELEMENT(node)); /* Stop on first frame with focused element. */ if (dom_focus_input(frame_doc)) { g_object_unref(list); return true; } } g_object_unref(list); return false; }
/** * Handles the keypress events from webview and inputbox. */ VbResult ex_keypress(int key) { GtkTextIter start, end; gboolean check_empty = false; GtkTextBuffer *buffer = vb.gui.buffer; GtkTextMark *mark; VbResult res; const char *text; /* delegate call to hint mode if this is active */ if (vb.mode->flags & FLAG_HINTING && RESULT_COMPLETE == hints_keypress(key)) { return RESULT_COMPLETE; } /* process the register */ if (info.phase == PHASE_REG) { info.reg = (char)key; info.phase = PHASE_REG; /* insert the register text at cursor position */ text = vb_register_get((char)key); if (text) { gtk_text_buffer_insert_at_cursor(buffer, text, strlen(text)); } res = RESULT_COMPLETE; } else { res = RESULT_COMPLETE; switch (key) { case KEY_TAB: complete(1); break; case KEY_SHIFT_TAB: complete(-1); break; case CTRL('['): case CTRL('C'): vb_enter('n'); vb_set_input_text(""); break; case KEY_CR: input_activate(); break; case KEY_UP: history(true); break; case KEY_DOWN: history(false); break; /* basic command line editing */ case CTRL('H'): /* delete the last char before the cursor */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &start, mark); gtk_text_buffer_backspace(buffer, &start, true, true); check_empty = true; break; case CTRL('W'): /* delete word backward from cursor */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); /* copy the iter to build start and end point for deletion */ start = end; /* move the iterator to the beginning of previous word */ if (gtk_text_iter_backward_word_start(&start)) { gtk_text_buffer_delete(buffer, &start, &end); } check_empty = true; break; case CTRL('B'): /* move the cursor direct behind the prompt */ gtk_text_buffer_get_iter_at_offset(buffer, &start, strlen(vb.state.prompt)); gtk_text_buffer_place_cursor(buffer, &start); break; case CTRL('E'): /* move the cursor to the end of line */ gtk_text_buffer_get_end_iter(buffer, &start); gtk_text_buffer_place_cursor(buffer, &start); break; case CTRL('U'): /* remove everything between cursor and prompt */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); gtk_text_buffer_get_iter_at_offset(buffer, &start, strlen(vb.state.prompt)); gtk_text_buffer_delete(buffer, &start, &end); break; case CTRL('R'): info.phase = PHASE_REG; vb.mode->flags |= FLAG_NOMAP; res = RESULT_MORE; break; default: /* if is printable ascii char, than write it at the cursor * position into input box */ if (key >= 0x20 && key <= 0x7e) { gtk_text_buffer_insert_at_cursor(buffer, (char[2]){key, 0}, 1); } else {
static VbResult normal_pass(Client *c, const NormalCmdInfo *info) { vb_enter(c, 'p'); return RESULT_COMPLETE; }