diff --git a/exec/lbshell.js b/exec/lbshell.js index 4eb694ad8997b1ad38102b4a3bf0972ee8bc7588..de0b170fadb3096ba45729d8ffc49c396ecd8b8c 100644 --- a/exec/lbshell.js +++ b/exec/lbshell.js @@ -51,6 +51,17 @@ var lastmessage_type=0; var orig_passthru=console.ctrlkey_passthru; var hangup_now=false; +/* + * TODO: This mangles the ANSI sequence so it will pass through inkey() + * properly... inkey re-inserts ESC back into the stream using ungetkey() + * which changes the order of if the string, putting sequence arguments + * at the end. + */ +function mangle_mouse_seq(seq) +{ + return seq[0]+seq[5]+seq.substr(1,4); +} + function handle_a_ctrlkey(key) { var i; @@ -233,6 +244,7 @@ ShellLB.prototype.rpadding="\xb3"; ShellLB.prototype.timeout=100; ShellLB.prototype.callback = message_callback; ShellLB.prototype.hotkeys = KEY_LEFT+KEY_RIGHT+"\b\x7f\x1b"+ctrl('O')+ctrl('U')+ctrl('T')+ctrl('K')+ctrl('P'); +ShellLB.prototype.mouse_miss_key = '\b'; function Mainbar() { @@ -241,6 +253,7 @@ function Mainbar() this.xpos=2; this.ypos=1; this.hotkeys=KEY_DOWN+";"+ctrl('O')+ctrl('U')+ctrl('T')+ctrl('K')+ctrl('P'); + this.mouse_miss_key = undefined; this.add("|File","F",undefined,undefined,undefined,bbs.compare_ars("REST T")); this.add("|Messages","M"); this.add("|Email","E",undefined,undefined,undefined,bbs.compare_ars("REST SE")); @@ -639,8 +652,13 @@ while(bbs.online) { main_right(); break; } - if(x_sec=='\b' || x_sec=='\x7f' || x_sec=='\x1b') + if(x_sec=='\b' || x_sec=='\x7f' || x_sec=='\x1b') { + if (xtrnsec.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(xtrnsec.mouse_miss_str)); + delete xtrnsec.mouse_miss_str; + } break; + } if(x_sec==ctrl('O') || x_sec==ctrl('U') || x_sec==ctrl('T') @@ -663,6 +681,10 @@ while(bbs.online) { } if(x_prog==KEY_RIGHT || x_prog=='\b' || x_prog=='\x7f' || x_prog=='\x1b') { this_xtrnsec.erase(); + if (this_xtrnsec.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(this_xtrnsec.mouse_miss_str)); + delete this_xtrnsec.mouse_miss_str; + } break; } if(x_prog==ctrl('O') @@ -758,6 +780,10 @@ while(bbs.online) { break infoloop; case KEY_RIGHT: case '\b': + if (userlists.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(userlists.mouse_miss_str)); + delete userlists.mouse_miss_str; + } case '\x7f': case '\x1b': userlists.erase(); @@ -797,6 +823,10 @@ while(bbs.online) { done=1; break infoloop; case '\b': + if (infomenu.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(infomenu.mouse_miss_str)); + delete infomenu.mouse_miss_str; + } case '\x7f': case '\x1b': break infoloop; @@ -914,6 +944,10 @@ function show_filemenu() menus_displayed.pop(); return; case '\b': + if (filemenu.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(filemenu.mouse_miss_str)); + delete filemenu.mouse_miss_str; + } case '\x7f': case '\x1b': filemenu.erase(); @@ -1571,6 +1605,10 @@ function show_messagemenu() main_left(); return; case '\b': + if (messagemenu.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(messagemenu.mouse_miss_str)); + delete messagemenu.mouse_miss_str; + } case '\x7f': case '\x1b': cleararea(messagemenu.xpos,messagemenu.ypos,messagemenu.items[0].text.length,messagemenu.items.length,true); @@ -1975,6 +2013,10 @@ function show_emailmenu() menus_displayed.pop(); return; case '\b': + if (emailmenu.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(emailmenu.mouse_miss_str)); + delete emailmenu.mouse_miss_str; + } case '\x7f': case '\x1b': cleararea(emailmenu.xpos,emailmenu.ypos,emailmenu.items[0].text.length,emailmenu.items.length,true); @@ -2133,6 +2175,10 @@ function show_chatmenu() menus_displayed.pop(); return; case '\b': + if (chatmenu.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(chatmenu.mouse_miss_str)); + delete chatmenu.mouse_miss_str; + } case '\x7f': case '\x1b': cleararea(chatmenu.xpos,chatmenu.ypos,chatmenu.items[0].text.length,chatmenu.items.length,true); @@ -2290,6 +2336,10 @@ function show_settingsmenu() menus_displayed.pop(); return; case '\b': + if (settingsmenu.mouse_miss_str !== undefined) { + console.ungetstr(mangle_mouse_seq(settingsmenu.mouse_miss_str)); + delete settingsmenu.mouse_miss_str; + } case '\x7f': case '\x1b': settingsmenu.erase(); diff --git a/exec/load/lightbar.js b/exec/load/lightbar.js index 10a2e923abfde2c2ecfb0bcfcacc70b666c5fe51..be0915ac6abb3664a1d211145f74101015e1165d 100644 --- a/exec/load/lightbar.js +++ b/exec/load/lightbar.js @@ -76,6 +76,8 @@ Lightbar.prototype.hblanks=2; Lightbar.prototype.hotkeys=''; Lightbar.prototype.callback=undefined; Lightbar.prototype.timeout=0; +Lightbar.prototype.mouse_miss_key=undefined; +Lightbar.prototype.mouse_miss_str=undefined; Lightbar.prototype.add = function(txt, retval, width, lpadding, rpadding, disabled, nodraw) { @@ -138,24 +140,82 @@ Lightbar.prototype.getval = function(current,key) var ret=undefined; var last_cur; var ansi = ''; - + var button; + var x; + var y; + + function restuff() + { + console.ungetstr(ansi.substr(1)); + ansi = ''; + } + if(!this.nodraw) this.draw(); - + delete this.mouse_miss_str; + /* Main loop */ while(bbs.online) { - last_cur=this.current; /* Get input */ if(key==undefined || key=='' || key==null || ansi.length > 0) { if(this.callback != undefined) this.callback(); + console.write("\x1b[?1000h"); if(this.timeout>1) key=console.inkey(K_UPPER,this.timeout); else key=console.getkey(K_UPPER|K_NOSPIN); + console.write("\x1b[?1000l"); + if (key !== '') { + if (key === '\x1b') { + if (ansi.length > 0) { + ansi += key; + restuff(); + key = '\x1b'; + } + else { + ansi += key; + key = undefined; + } + } + else if (ansi.length === 1) { + if (key === '[') { + ansi += key; + key = undefined; + } + else { + ansi += key; + restuff(); + key = '\x1b'; + } + } + else if (ansi.length === 2) { + if (key === 'M') { + ansi += key; + key = undefined; + } + else { + ansi += key; + restuff(); + key = '\x1b'; + } + } + else if (ansi.length > 2) { + ansi += key; + key = undefined; + if (ansi.length >= 6) { + button = ascii(ansi[3]) - ascii(' '); + x = ascii(ansi[4]) - ascii('!') + 1; + y = ascii(ansi[5]) - ascii('!') + 1; + key = 'Mouse'; + this.mouse_miss_str = ansi; + ansi = ''; + } + } + } } - + else { if(this.hotkeys.indexOf(key)!=-1) { this.nodraw=false; @@ -163,6 +223,27 @@ Lightbar.prototype.getval = function(current,key) } switch(key) { + case 'Mouse': + ansi = ''; + if (button === 0) { + var hit = this.mouse_hit(x, y); + if (hit === -1) { + if (this.mouse_miss_key !== undefined) { + return this.mouse_miss_key; + } + } + else { + delete this.mouse_miss_str; + this.draw(hit); + this.nodraw=false; + if(this.items[this.current].retval==undefined) + return(undefined); + return(this.items[this.current].retval); + } + } + else + delete this.mouse_miss_str; + break; case KEY_UP: if(this.direction==0) { do { @@ -248,6 +329,77 @@ Lightbar.prototype.getval = function(current,key) } }; +Lightbar.prototype.mouse_hit = function(x, y) +{ + if(this.direction < 0 || this.direction > 1) { + alert("Unknown lightbar direction!"); + return -1; + } + + var i; + var curx=this.xpos; + var cury=this.ypos; + + for(i=0; i<this.items.length; i++) { + var width; + + // Some basic validation. + if(this.items[i]==undefined) { + alert("Sparse items array!"); + return -1; + } + if(this.items[i].text==undefined) { + alert("No text for item "+i+"!"); + return -1; + } + + // Set up a cleaned version for length calculations. + var cleaned=this.items[i].text; + cleaned=cleaned.replace(/\|/g,''); + + /* + * Calculate the width. Forced width, item width, text width + * In that order. First one wins. + */ + if(this.force_width>0) + width=this.force_width; + else { + if(this.items[i].width!=undefined) + width=this.items[i].width; + else + width=cleaned.length; + } + + var lpadding=this.lpadding; + if(this.items[i].lpadding!=undefined) + lpadding=this.items[i].lpadding; + + if(lpadding != undefined && lpadding != null) { + curx+=lpadding.length; + } + + if (cury === y) { + if (x >= curx && x <= curx + width) + return i; + } + curx += width; + + var rpadding=this.rpadding; + if(this.items[i].rpadding!=undefined) + rpadding=this.items[i].rpadding; + curx += rpadding.length; + + if(this.direction==0) { + cury++; + curx=this.xpos; + } + else { + curx += this.hblanks; + } + } + return -1; +}; + Lightbar.prototype.draw = function(current) { var attr=this.bg<<4|this.fg;