diff --git a/src/ZuulTerm/chrome/content/Term.js b/src/ZuulTerm/chrome/content/Term.js index 6a4f8895ef0a3f115ccebcd5ea38f9954f28759b..62ee0e0807efc9f2adfe2482f7dfa4c761b71d4a 100644 --- a/src/ZuulTerm/chrome/content/Term.js +++ b/src/ZuulTerm/chrome/content/Term.js @@ -6,9 +6,13 @@ function writeHTML(data) var doc=frame.contentDocument; var win=frame.contentWindow; var term=doc.getElementById("terminal"); - var top; + var bottom; + var offe; term.innerHTML += data; + + var winVisible=win.innerHeight-win.scrollMaxY; + /* Scroll to bottom of terminal container */ if(term.scroll != undefined && term.clientHeight != undefined) { term.scroll(0, term.clientHeight); } @@ -19,6 +23,29 @@ function writeHTML(data) if(term.scrollTop != top) term.scrollTop=top; } + else { + alert("Scroll problems!"); + } + + /* Scroll window so that the bottom of the terminal container is visible */ + bottom=term.offsetHeight; + offe=term; + do { + bottom += offe.offsetTop; + offe = offe.offsetParent; + } while(offe && offe.tagName != 'BODY'); + top = win.scrollY; + if(bottom > win.scrollY+winVisible) { + top=bottom-winVisible; + } + else if(bottom < win.scrollY) { + /* TODO: Just show some of the bottom */ + top=bottom-winVisible; + } + if(top < 0) + top=0; + if(top != win.scrollY) + win.scroll(win.scrollX,top); } function writeText(data) @@ -46,7 +73,18 @@ function handleCtrl(byte) case '\r': break; case '\b': - term.innerHTML = term.innerHTML.replace(/[^\x00-\x1F]$/,''); + if(term.innerHTML.length > 0) { + switch(term.innerHTML.charCodeAt(term.innerHTML.length-1)) { + case ';': + term.innerHTML = term.innerHTML.replace(/&[^&]+;$/,''); + break; + case '>': + break; + default: + term.innerHTML = term.innerHTML.replace(/.$/,''); + break; + } + } break; case '\x0c': // Formfeed -- clear screen term.innerHTML = ''; @@ -55,7 +93,7 @@ function handleCtrl(byte) sound.beep(); break; case '\x85': // NEL (Next Line) - writeText("\r\n"); + writeHTML("<br>"); break; } }