From a0feeecda5d62003698aabfeb0426024c3ae86e5 Mon Sep 17 00:00:00 2001
From: Daniel Carl <danielcarl@gmx.de>
Date: Mon, 25 Mar 2013 20:39:14 +0100
Subject: [PATCH] Blur the active element if insert mode is left.

If a editable form element was focussed, vimb browser switched to insert mode.
But if the insert mode was left by hitting <esc> the element kept focused, so
that key-presses went still into the focused element.
---
 src/dom.c  | 18 +++++++++++++++++-
 src/dom.h  |  3 ++-
 src/main.c |  1 +
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/dom.c b/src/dom.c
index d745ace..ab4d3c4 100644
--- a/src/dom.c
+++ b/src/dom.c
@@ -27,10 +27,13 @@ static gboolean dom_editable_focus_cb(Element* element, Event* event);
 static Element* dom_get_active_element(Document* doc);
 
 
-void dom_check_auto_insert()
+void dom_check_auto_insert(void)
 {
     Document* doc   = webkit_web_view_get_dom_document(vb.gui.webview);
     Element* active = dom_get_active_element(doc);
+
+    /* the focus was not set automatically - add event listener to track focus
+     * events on the document */
     if (!dom_auto_insert(active)) {
         HtmlElement* element = webkit_dom_document_get_body(doc);
         if (!element) {
@@ -42,6 +45,19 @@ void dom_check_auto_insert()
     }
 }
 
+/**
+ * Remove focus from active and editable elements.
+ */
+void dom_clear_focus(void)
+{
+    Document* doc   = webkit_web_view_get_dom_document(vb.gui.webview);
+    Element* active = dom_get_active_element(doc);
+
+    if (active) {
+        webkit_dom_element_blur(active);
+    }
+}
+
 /**
  * Indicates if the given dom element is an editable element like text input,
  * password or textarea.
diff --git a/src/dom.h b/src/dom.h
index dd00eda..e9e50c1 100644
--- a/src/dom.h
+++ b/src/dom.h
@@ -39,7 +39,8 @@ typedef struct {
     gulong bottom;
 } DomBoundingRect;
 
-void dom_check_auto_insert();
+void dom_check_auto_insert(void);
+void dom_clear_focus(void);
 gboolean dom_is_editable(Element* element);
 
 #endif /* end of include guard: _DOM_H */
diff --git a/src/main.c b/src/main.c
index 2e9268a..4b88bb7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -241,6 +241,7 @@ gboolean vb_set_mode(Mode mode, gboolean clean)
             } else if (current_mode == VB_MODE_INSERT) {
                 /* clean the input if current mode is insert to remove -- INPUT -- */
                 clean = TRUE;
+                dom_clear_focus();
             } else if (current_mode == VB_MODE_SEARCH) {
                 /* cleaup previous search */
                 command_search(&((Arg){VB_SEARCH_OFF}));
-- 
2.20.1