Set mode according to current focused widget.
authorDaniel Carl <danielcarl@gmx.de>
Thu, 26 Sep 2013 23:50:19 +0000 (01:50 +0200)
committerDaniel Carl <danielcarl@gmx.de>
Thu, 26 Sep 2013 23:50:19 +0000 (01:50 +0200)
src/ex.c
src/hints.c
src/main.c
src/mode.c
src/mode.h
src/normal.c
src/normal.h

index f753a47..0220bbd 100644 (file)
--- a/src/ex.c
+++ b/src/ex.c
@@ -190,11 +190,9 @@ VbResult ex_keypress(unsigned int key)
     GtkTextBuffer *buffer = vb.gui.buffer;
     GtkTextMark *mark;
 
-    /* delegate call to the submode if hinting is active */
-    if (vb.mode->flags & FLAG_HINTING) {
-        if (RESULT_COMPLETE == hints_keypress(key)) {
-            return RESULT_COMPLETE;
-        }
+    /* delegate call to the submode */
+    if (RESULT_COMPLETE == hints_keypress(key)) {
+        return RESULT_COMPLETE;
     }
 
     switch (key) {
index d49c687..e62bf63 100644 (file)
@@ -51,6 +51,12 @@ void hints_init(WebKitWebFrame *frame)
 
 VbResult hints_keypress(unsigned int key)
 {
+    /* if we are not already in hint mode we expect to get a ; to start
+     * hinting */
+    if (!(vb.mode->flags & FLAG_HINTING) && key != ';') {
+        return RESULT_ERROR;
+    }
+
     if (key == '\n') {
         hints_fire();
 
index 67b1aeb..b245eaa 100644 (file)
@@ -671,7 +671,7 @@ static void init_core(void)
 
     /* initialize the modes */
     mode_init();
-    mode_add('n', normal_enter, normal_leave, normal_keypress, normal_input_changed);
+    mode_add('n', normal_enter, normal_leave, normal_keypress, NULL);
     mode_add('c', ex_enter, ex_leave, ex_keypress, ex_input_changed);
     mode_add('i', input_enter, input_leave, input_keypress, NULL);
     mode_add('p', pass_enter, pass_leave, pass_keypress, NULL);
@@ -747,6 +747,12 @@ static void setup_signals()
     g_signal_connect(
         G_OBJECT(vb.gui.window), "key-press-event", G_CALLBACK(map_keypress), NULL
     );
+    g_object_connect(
+        G_OBJECT(vb.gui.input),
+        "signal::focus-in-event", G_CALLBACK(mode_input_focusin), NULL,
+        "signal::focus-out-event", G_CALLBACK(mode_input_focusout), NULL,
+        NULL
+    );
     g_object_connect(
         G_OBJECT(vb.gui.buffer),
         "signal::changed", G_CALLBACK(mode_input_changed), NULL,
index 7bd3f75..ae79ad2 100644 (file)
@@ -114,6 +114,22 @@ VbResult mode_handle_key(unsigned int key)
     return RESULT_ERROR;
 }
 
+gboolean mode_input_focusin(GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+    /* enter the command mode if the focus is on inputbox */
+    mode_enter('c');
+
+    return false;
+}
+
+gboolean mode_input_focusout(GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+    /* if focus is lesft from inputbox - switch back to normal mode */
+    mode_enter('n');
+
+    return false;
+}
+
 /**
  * Process input changed event on current active mode.
  */
index b32c870..cd50159 100644 (file)
@@ -29,6 +29,8 @@ void mode_add(char id, ModeTransitionFunc enter, ModeTransitionFunc leave,
     ModeKeyFunc keypress, ModeInputChangedFunc input_changed);
 void mode_enter(char id);
 VbResult mode_handle_key(unsigned int key);
+gboolean mode_input_focusin(GtkWidget *widget, GdkEventFocus *event, gpointer data);
+gboolean mode_input_focusout(GtkWidget *widget, GdkEventFocus *event, gpointer data);
 void mode_input_changed(GtkTextBuffer* buffer, gpointer data);
 
 #endif /* end of include guard: _MODE_H */
index 2b75240..c087a02 100644 (file)
@@ -408,15 +408,6 @@ VbResult normal_keypress(unsigned int key)
     return res;
 }
 
-/**
- * Handles changes in the inputbox. If there are usergenerated changes, we
- * switch to command mode.
- */
-void normal_input_changed(const char *text)
-{
-    /*mode_enter('i');*/
-}
-
 static VbResult normal_clear_input(const NormalCmdInfo *info)
 {
     vb_set_input_text("");
index 6fb9f3f..02a887f 100644 (file)
@@ -28,6 +28,5 @@ typedef struct NormalCmdInfo_s NormalCmdInfo;
 void normal_enter(void);
 void normal_leave(void);
 VbResult normal_keypress(unsigned int key);
-void normal_input_changed(const char *text);
 
 #endif /* end of include guard: _NORMAL_H */