*** empty log message ***
authorhanda <handa>
Wed, 10 Mar 2010 07:48:55 +0000 (07:48 +0000)
committerhanda <handa>
Wed, 10 Mar 2010 07:48:55 +0000 (07:48 +0000)
xex.js

diff --git a/xex.js b/xex.js
index 542e94d..90fd2d3 100644 (file)
--- a/xex.js
+++ b/xex.js
@@ -2,23 +2,20 @@
 
 var Xex = {
   LogNode: null,
-  LogSuspended: '',
-  Log: function (arg, indent, suspend)
+  Log: function (arg, indent)
   {
     if (! Xex.LogNode)
       return;
     if (! arg)
       Xex.LogNode.value = '';
-    else if (suspend)
-      Xex.LogSuspended += arg;
     else
       {
-       var str = Xex.LogSuspended;
-       Xex.LogSuspended = '';
+       var str = '';
        if (indent != undefined)
          for (var i = 0; i <= indent; i++)
            str += '  ';
-       Xex.LogNode.value = str + arg + "\n" + Xex.LogNode.value;
+       Xex.LogNode.value += "\n" + str + arg;
+       Xex.LogNode.scrollTop = Xex.LogNode.scrollHeight;
       }
   }
 };
@@ -1395,7 +1392,6 @@ var MIM = {
   MIM.Key = function (val)
   {
     this.key;
-    this.has_modifier = false;
     if (val instanceof Xex.Term)
       this.key = val.val;
     else if (typeof val == 'string' || val instanceof String)
@@ -1426,7 +1422,6 @@ var MIM = {
   MIM.KeySeq = function (seq)
   {
     this.val = new Array ();
-    this.has_modifier = false;
 
     if (seq)
       {
@@ -1751,6 +1746,13 @@ MIM.Keymap = function ()
     var sub;
 
     if (index < keys.val.length && this.submaps
+       && ! keys.val[index])
+      {
+       Xex.Log ('invalid key at ' + index);
+       throw 'invalid key';
+      }
+
+    if (index < keys.val.length && this.submaps
        && (sub = this.submaps[keys.val[index].key]))
       {
        index++;
@@ -2486,24 +2488,26 @@ MIM.im_domain.DefType (MIM.State.prototype);
 
   function handle_key ()
   {
-    var out = this.keymap.Lookup (this.keys, this.key_head);
+    Xex.Log ('Key(' + this.key_head + ') "' + this.keys.val[this.key_head]
+            + '" in ' + this.state.name + ':' + this.keymap.name
+            + " key/state/commit-head/len:"
+            + this.key_head + '/' + this.state_key_head + '/' + this.commit_key_head + '/' + this.keys.val.length);
+    var out = this.state.keymap.Lookup (this.keys, this.state_key_head);
     var sub = out.map;
 
-    Xex.Log ('handling ' + this.keys.val[this.key_head]
-            + ' in ' + this.state.name + ':' + this.keymap.name, 0, true);
-    this.key_head = out.index;
-    if (sub != this.keymap)
+    if (out.index > this.key_head)
       {
-       Xex.Log (' with submap');
+       this.key_head = out.index;
+       Xex.Log (' with submap for ' + this.key_head + 'keys');
        restore_state.call (this);
        this.keymap = sub;
-       if (this.keymap.map_actions)
+       if (sub.map_actions)
          {
            Xex.Log ('taking map actions:');
-           if (! this.take_actions (this.keymap.map_actions))
+           if (! this.take_actions (sub.map_actions))
              return false;
          }
-       else if (this.keymap.submaps)
+       else if (sub.submaps)
          {
            Xex.Log ('no map actions');
            for (var i = this.state_key_head; i < this.key_head; i++)
@@ -2512,7 +2516,7 @@ MIM.im_domain.DefType (MIM.State.prototype);
                this.ins (this.keys.val[i].key, null);
              }
          }
-       if (! this.keymap.submaps)
+       if (! sub.submaps)
          {
            Xex.Log ('terminal:');
            if (this.keymap.branch_actions != null)
@@ -2521,13 +2525,14 @@ MIM.im_domain.DefType (MIM.State.prototype);
                if (! this.take_actions (this.keymap.branch_actions))
                  return false;
              }
-           if (this.keymap != this.state.keymap)
+           if (sub != this.state.keymap)
              this.shift (this.state);
          }
       }
     else
       {
        Xex.Log (' without submap');
+       this.keymap = sub;
        var current_state = this.state;
        var map = this.keymap;
 
@@ -2770,6 +2775,7 @@ MIM.im_domain.DefType (MIM.State.prototype);
        if (this.key_head > this.keys.val.length)
          this.key_head = this.keys.val.length;
       }
+      Xex.Log ('0: key head = ' + this.key_head); 
     },
 
     pop: function ()
@@ -2821,7 +2827,6 @@ MIM.im_domain.DefType (MIM.State.prototype);
        this.changed |= MIM.ChangedStatus.StateTitle;
       this.state = state;
       this.keymap = state.keymap;
-      this.state_key_head = this.key_head;
       save_state.call (this);
     },
 
@@ -2870,12 +2875,23 @@ MIM.im_domain.DefType (MIM.State.prototype);
        {
          this.keys.val.splice (0, this.commit_key_head);
          this.key_head -= this.commit_key_head;
+         if (this.key_head < 0)
+           {
+             Xex.Log ('RECOVER key_head');
+             this.key_head = 0;
+           }
          this.state_key_head -= this.commit_key_head;
+         if (this.state_key_head < 0)
+           {
+             Xex.Log ('RECOVER state_key_head');
+             this.state_key_head = 0;
+           }
          this.commit_key_head = 0;
        }
       if (this.key_unhandled)
        {
          this.keys.val.length = 0;
+         //this.keys.val.splice (0, this.keys.val.length);
          this.key_head = this.state_key_head = this.commit_key_head = 0;
        }
       return (! this.key_unhandled
@@ -3140,13 +3156,10 @@ MIM.focus_in = function (event)
       else
        {
          Xex.Log ('focus_in in ' + target.tagName);
-         try {
-           ic.Filter (MIM.Key.FocusIn);
-           MIM.update (target, ic);
-           // Ignore further focus-in caused by setSelectionRange ().
-           // target.mim_ignore_focus_in = true;
-         }
-         catch (e) { Xex.Log ('Error:' + e); throw (e); }
+         ic.Filter (MIM.Key.FocusIn);
+         MIM.update (target, ic);
+         // Ignore further focus-in caused by setSelectionRange ().
+         target.mim_ignore_focus_in = true;
        }
     }
 }
@@ -3259,7 +3272,7 @@ MIM.keypress = function (event)
     try {
       var result = ic.Filter (ic.key);
     } catch (e) {
-      Xex.Log ('Error;' + e);
+      Xex.Log ('Error:' + e);
       throw (e);
     }
     MIM.update (target, ic);