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;
}
}
};
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)
MIM.KeySeq = function (seq)
{
this.val = new Array ();
- this.has_modifier = false;
if (seq)
{
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++;
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++)
this.ins (this.keys.val[i].key, null);
}
}
- if (! this.keymap.submaps)
+ if (! sub.submaps)
{
Xex.Log ('terminal:');
if (this.keymap.branch_actions != null)
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;
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 ()
this.changed |= MIM.ChangedStatus.StateTitle;
this.state = state;
this.keymap = state.keymap;
- this.state_key_head = this.key_head;
save_state.call (this);
},
{
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
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;
}
}
}
try {
var result = ic.Filter (ic.key);
} catch (e) {
- Xex.Log ('Error;' + e);
+ Xex.Log ('Error:' + e);
throw (e);
}
MIM.update (target, ic);