diff --git a/gun.js b/gun.js index c0f42f12..52e8d3ac 100644 --- a/gun.js +++ b/gun.js @@ -1289,7 +1289,7 @@ if(tmp = cat.soul){ return cb(tmp, as, cat), gun } if(tmp = cat.link){ return cb(tmp, as, cat), gun } gun.get(function(msg, ev){ - if(u === msg.put && (tmp = (obj_map(cat.root.opt.peers, function(v,k,t){t(k)})||[]).length) && acks++ <= tmp){ + if(u === msg.put && (tmp = (obj_map(cat.root.opt.peers, function(v,k,t){t(k)})||[]).length) && ++acks < tmp){ return; } ev.rid(msg); diff --git a/lib/meta.js b/lib/meta.js new file mode 100644 index 00000000..b89e4725 --- /dev/null +++ b/lib/meta.js @@ -0,0 +1,360 @@ +$(function(){ + var m = window.meta = {edit:[], os:{}}, ua = '', u; + try{ua = navigator.userAgent.toLowerCase()}catch(e){} + m.os.is = { + win: (ua.search("win") >= 0)? "windows":false, + lin: (ua.search("linux") >= 0)? "linux":false, + mac: (ua.search("mac") >= 0)? "macintosh":false, + and: (ua.search("android") >= 0)? "android":false, + ios: (ua.search('ipod') >= 0 + || ua.search('iphone') >= 0 + || ua.search('ipad') >= 0)? "ios":false + } + var k = m.key = {ctrl: 17, cmd: 91}; + k.meta = (m.os.is.win||m.os.is.lin||m.os.is.and)? k.ctrl : k.cmd; + k.down = function(eve){ + if($(eve.target).is('input') || eve.repeat){ return } + (k.eve = m.eve = eve).which = eve.which || eve.fake || eve.keyCode; + if(!eve.fake && eve.which === k.last){ return } + if(k.meta === (k.last = eve.which)){ k.down.meta = m.flip(k.wipe()) || true } + if(m.flip.is()){ + (k.combo || (k.combo = [])).push(eve.which); + m.check('on', eve.which, k.at || (k.at = m.edit)); + } + if(eve.metaKey && (k.meta !== eve.which)){ k.up(eve) } // on some systems, meta hijacks keyup + } + k.up = function(eve){ var tmp; + if($(eve.target).is('input')){ return } + k.eve = m.eve = eve; + k.last = null; + eve.which = eve.which || eve.fake || eve.keyCode; + if(m.flip.is()){ m.check('up', eve.which) } + if(tmp = (k.meta === eve.which)){ k.down.meta = false } + if(tmp && k.at === m.edit){ k.wipe() } + if(27 === eve.which){ return m.flip(false) } + } + m.flip = function(tmp, aid){ + if(aid){ + m.flip.aid = true; + setTimeout(function(){$(document).one('click',function(eve){m.flip(m.flip.aid = false)})},250); // ugly but important for visual aid. + } + var board = $('#meta .meta-menu'); + ((tmp === false) || (!tmp && board.is(':visible')))? + board.addClass('meta-none') + : board.removeClass('meta-none'); + } + m.flip.is = function(){ + if(m.flip.aid && ((m.eve||{}).fake || k.at !== m.edit)){ m.flip.aid = false } + return !m.flip.aid && $('#meta .meta-menu').is(':visible'); + } + m.flip.wait = 500; + m.check = function(how, key, at){ + at = k.at || m.edit; + //m.list(at); + var edit = at[key], tmp; + if(!edit){ return } + if(k.eve && k.eve.preventDefault){ k.eve.preventDefault() } + if(edit[how]){ + edit[how](m.eve); + if(k.at !== m.edit && 'up' === how){ + if(k.down.meta){ m.list(k.at = m.edit) } + else { k.wipe() } + } + } + if('up' != how){ return } + edit.back = at; + m.list(edit, at); + } + m.list = function(at){ + var l = []; + $.each(at, function(i,k){ 'back' != i && k.combo && l.push(k) }); + if(!l.length){ return } + k.at = at; + l = l.sort(function(a,b){ + a = a.combo.slice(-1)[0] || 0; + if(a.length){ a = a.toUpperCase().charCodeAt(0) } + b = b.combo.slice(-1)[0] || 0; + if(b.length){ b = b.toUpperCase().charCodeAt(0) } + return (a < b)? -1 : 1; + }); + var $ul = $('#meta .meta-menu ul') + $ul.children('li').addClass('meta-none').hide(); setTimeout(function(){ $ul.children('.meta-none').remove() },250); // necessary fix for weird bug glitch + $.each(l, function(i, k){ + $ul.append($('