Blur the active element if insert mode is left.
authorDaniel Carl <danielcarl@gmx.de>
Mon, 25 Mar 2013 19:39:14 +0000 (20:39 +0100)
committerDaniel Carl <danielcarl@gmx.de>
Mon, 25 Mar 2013 19:39:14 +0000 (20:39 +0100)
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
src/dom.h
src/main.c

index d745ace..ab4d3c4 100644 (file)
--- 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.
index dd00eda..e9e50c1 100644 (file)
--- 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 */
index 2e9268a..4b88bb7 100644 (file)
@@ -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}));