summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Carl <danielcarl@gmx.de>2014-11-30 22:22:08 +0100
committerDaniel Carl <danielcarl@gmx.de>2014-11-30 22:28:31 +0100
commita03a3465979a79510d667c4c8ae9ec0bef291ddc (patch)
tree6d98560858aa51d709cfa76e6af71028aa5dd357 /src
parent29d87dc5586fdaf36998975735463c9276ca1d3c (diff)
Fixed none working focus event observing (#112).
Now the strict-focus=on prevents vimb only from switching to input mode if focus is on editable element on page load (for example set by a body onload script). Vimb follow all further focus events.
Diffstat (limited to 'src')
-rw-r--r--src/dom.c39
-rw-r--r--src/hints.c6
2 files changed, 25 insertions, 20 deletions
diff --git a/src/dom.c b/src/dom.c
index bd6f6a5..561e3b8 100644
--- a/src/dom.c
+++ b/src/dom.c
@@ -32,24 +32,28 @@ static Element *get_active_element(Document *doc);
void dom_check_auto_insert(WebKitWebView *view)
{
- Document *doc = webkit_web_view_get_dom_document(view);
- Element *active = get_active_element(doc);
+ Element *active;
+ HtmlElement *element;
+ Document *doc = webkit_web_view_get_dom_document(view);
+
+ if (vb.config.strict_focus) {
+ /* if there is focus on an element right after page load - remove it
+ * if strict-focus is enabled */
+ dom_clear_focus(view);
+ } else {
+ /* if active element is editable - switch vimb to input mode */
+ active = get_active_element(doc);
+ auto_insert(active);
+ }
- if (vb.config.strict_focus || !auto_insert(active)) {
- /* if the strict-focus is on also blur the possible active element */
- if (vb.config.strict_focus) {
- dom_clear_focus(view);
- }
- /* the focus was not set automatically - add event listener to track
- * focus events on the document */
- HtmlElement *element = webkit_dom_document_get_body(doc);
- if (!element) {
- element = WEBKIT_DOM_HTML_ELEMENT(webkit_dom_document_get_document_element(doc));
- }
- webkit_dom_event_target_add_event_listener(
- WEBKIT_DOM_EVENT_TARGET(element), "focus", G_CALLBACK(editable_focus_cb), false, NULL
- );
+ /* add event listener to track focus events on the document */
+ element = webkit_dom_document_get_body(doc);
+ if (!element) {
+ element = WEBKIT_DOM_HTML_ELEMENT(webkit_dom_document_get_document_element(doc));
}
+ webkit_dom_event_target_add_event_listener(
+ WEBKIT_DOM_EVENT_TARGET(element), "focus", G_CALLBACK(editable_focus_cb), true, NULL
+ );
}
/**
@@ -209,9 +213,6 @@ static gboolean auto_insert(Element *element)
static gboolean editable_focus_cb(Element *element, Event *event)
{
- webkit_dom_event_target_remove_event_listener(
- WEBKIT_DOM_EVENT_TARGET(element), "focus", G_CALLBACK(editable_focus_cb), false
- );
if (vb.mode->id != 'i') {
EventTarget *target = webkit_dom_event_get_target(event);
auto_insert((void*)target);
diff --git a/src/hints.c b/src/hints.c
index fbeb631..9dec4ad 100644
--- a/src/hints.c
+++ b/src/hints.c
@@ -302,7 +302,11 @@ static gboolean call_hints_function(const char *func, int count, JSValueRef para
/* following return values mark fired hints */
if (!strncmp(value, "DONE:", 5)) {
fire_timeout(false);
- if (!hints.gmode) {
+ /* Change to normal mode only if we are crrently in command mode and
+ * we are not in g-mode hinting. This is required to not switch to
+ * normal mode when the hinting triggered a click that set focus on
+ * editable element that lead vimb to switch to input mode. */
+ if (!hints.gmode && vb.mode->id == 'c') {
mode_enter('n');
}
} else if (!strncmp(value, "INSERT:", 7)) {