PK=9fFrcomponents/keyconfig-service.jsXms8ޙZ34 fK/K&QlN$\]lko2"T3r18eEO0I gQT!2bD:dWT䈼~EC҅]@ߒ7oH>t=bar;lQɦcDe^/ex1F2-g1P1?%rwL4A6z ? Hpk@ZX~^N9-VU a`,4bh9(4 ށR"][&S GF8f)Sl!W imhsC.v!𥕄)Fj! Of,՛6LFU7agӻ:8VJ$0}%l}oJV,emet.Wnni(8ZE\ Mʞi|4~d y΅`%5I(4#38i)MM);7o;xkثlI{@9ܰ_JSNug%քƠ[IW.A_W_%@+ƜpcޤAl a„Э1e~{ jڢ̀'è^`gsXxzZyd`e\+tI``蒵6Ã9$\dP ;ܝ@l5|UA\! x9$gsVN!@r?эPK g:defaults/preferences/PK=9w!defaults/preferences/keyconfig.js}ϱ @ ] R$`qY]N#wmkqtΗ URaL55kL6 p}qVC*آh/l, WKL..'Ҍ^d) D)w„{?mv?4Y7eU\\ ~trZ ?9/ PK=9chrome.manifestN0%{z˝AMD ,e]kz:q< ùi7].Jʻٰ ~5:;N%g+i5kǗ "T'L9*W?=2i?Ωv9*ׁP24O B;_?rTVϨӦ%!SJbFȔ7B,JZQBec>+{w`e6Z ~:?y=mP󜮆 5v44n}qF= nށyepᡥPKh< install.rdfVnF} ƒ˫˲dIoKRڈ*D~B?"ҧյLʭ4vgΙ3 F&)YEau '!yB8=2֧l.d!j.ʁ+w, Ah(4罪 Ӷh:O:Iw<;I|ZOYf8 Ac4Kqn-pG>"e/|E0" 9R OC܃q0?70 㶟ax)RJ<یƷ^L ~)&Ut`^\.='B<+}'iHy )e1]ND eMxAcPJ(hˣit)ULgۼpJS> n5K-M9|W z]M/Ŭ欘g *y5jD<Ą F&8+Ie,Q_]}Cvއ֤p'35#lɠZ+=>n,3vOn'BfNkv-8bFی̿٥ăQy4ٜ72^ѕKzat2ˑ*g'y)7we}7iuv5Åڽ.;'wINAԇ='g8Y]C6>=lpŲ7Gh Lb]2¶YQx{ ܣMGW:k2|Hc#jmSq(jT)#$קPu@M[&@0uO2}GgXSm*>|`Dp PĆi鶯?eT̲a @GJ0@j5TYRa3K3VI`ï|T€A@/&z/"{UQqPK =9爍NN keyconfig.zipPK .3content/PK =9tv uucontent/Detect.jsvar XULAppInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo); var modules = []; if(!/^(Firefox|Thunderbird|SeaMonkey|Browser)$/.test(XULAppInfo.name)) { if(ps.getPrefType("toolkit.defaultChromeURI")) ps.setCharPref("keyconfig.UIHook",ps.getCharPref("toolkit.defaultChromeURI")); if(XULAppInfo.name == "Songbird") ps.setCharPref("keyconfig.UIHook","chrome://songbird/"); modules.push('Module("UIHook");'); } eval(modules.join(" ")); ps.deleteBranch("keyconfig.global."); ps.setCharPref("keyconfig.global.20080929",modules.join(" ")); delete modules;PK G8i$ϧcontent/edit.xul PK =9M;;content/keyconfig.jsvar gPrefService = window.opener.keyconfig.service.ps; var gAtomService = Components.classes["@mozilla.org/atom-service;1"].getService(Components.interfaces.nsIAtomService); var gUnicodeConverter = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'] .createInstance(Components.interfaces.nsIScriptableUnicodeConverter); var gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"] .getService(Components.interfaces.nsIClipboardHelper); var gDocument, gLocation, gProfile, gKeys, gUsedKeys, gRemovedKeys; var gExtra2, keyTree, gEditbox, gEdit, gModified; var gLocaleKeys; var gPlatformKeys = new Object(); var gVKNames = []; var gReverseNames; var tryToInvalidateCache; function onLoad() { if(gPrefService.prefHasUserValue("keyconfig.version")) gPrefService.clearUserPref("keyconfig.version"); gUnicodeConverter.charset = "UTF-8"; gExtra2 = document.documentElement.getButton("extra2"); keyTree = document.getElementById("key-tree"); gEditbox = document.getElementById("editbox"); gEdit = document.getElementById("edit"); gLocaleKeys = document.getElementById("localeKeys"); var platformKeys = document.getElementById("platformKeys"); gPlatformKeys.shift = platformKeys.getString("VK_SHIFT"); gPlatformKeys.meta = platformKeys.getString("VK_META"); gPlatformKeys.alt = platformKeys.getString("VK_ALT"); gPlatformKeys.ctrl = platformKeys.getString("VK_CONTROL"); gPlatformKeys.sep = platformKeys.getString("MODIFIER_SEPARATOR"); switch (gPrefService.getIntPref("ui.key.accelKey")){ case 17: gPlatformKeys.accel = gPlatformKeys.ctrl; break; case 18: gPlatformKeys.accel = gPlatformKeys.alt; break; case 224: gPlatformKeys.accel = gPlatformKeys.meta; break; default: gPlatformKeys.accel = (window.navigator.platform.search("Mac") == 0 ? gPlatformKeys.meta : gPlatformKeys.ctrl); } for (var property in KeyEvent) { gVKNames[KeyEvent[property]] = property.replace("DOM_",""); } gVKNames[8] = "VK_BACK"; var XULAppInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo); var isThunderbird = XULAppInfo.name == "Thunderbird"; gReverseNames = isThunderbird ^ gPrefService.getBoolPref("keyconfig.nicenames.reverse_order"); tryToInvalidateCache = gPrefService.getBoolPref("keyconfig.tryToInvalidateCache"); if(gPrefService.getBoolPref("keyconfig.devmode")){ this.getFormattedKey = function(a,b,c) {return (a+"+"+b+c).replace(/null/g,"");} } var windowList = document.getElementById("window-list"); var i, l; for(i = 0, l = windowList.firstChild.childNodes.length; i < l; i++) if(windowList.firstChild.childNodes[i].label == opener.document.title) windowList.selectedIndex = i; init(opener); } function init(target) { if(!target) return; gDocument = target.document; gLocation = gDocument.location.href; gProfile = target.keyconfig.profile; gKeys = []; gRemovedKeys = target.keyconfig.removedKeys; var keys = gDocument.getElementsByTagName("key"); for(var i = 0, l = keys.length; i < l; i++) gKeys.push(new Key(keys[i])); for(i = 0, l = gRemovedKeys.childNodes.length; i < l; i++) gKeys.push(new Key(gRemovedKeys.childNodes[i])); detectUsedKeys(); var elem = keyTree.getElementsByAttribute("sortActive","true")[0] || document.getElementById("name"); gKeys.sort(sorter[elem.id]); if(elem.getAttribute("sortDirection") == "descending") gKeys.reverse(); keyTree.view = keyView; keyTree.view.selection.select(-1); gExtra2.label = gStrings.add; gEditbox.setAttribute("disabled","true"); gEdit.value = ""; gEdit.keys = ["!",null,null]; } function onOK() { if(gModified && gPrefService.getBoolPref("keyconfig.warnOnClose")) alert(gStrings.warn); } function getFormattedKey(modifiers,key,keycode) { if(modifiers == "shift,alt,control,accel" && keycode == "VK_SCROLL_LOCK") return ""; if(key == "" || (!key && keycode == "")) return ""; var val = ""; if(modifiers) val = modifiers .replace(/^[\s,]+|[\s,]+$/g,"").split(/[\s,]+/g).join(gPlatformKeys.sep) .replace("alt",gPlatformKeys.alt) .replace("shift",gPlatformKeys.shift) .replace("control",gPlatformKeys.ctrl) .replace("meta",gPlatformKeys.meta) .replace("accel",gPlatformKeys.accel) +gPlatformKeys.sep; if(key) val += key; if(keycode) try { val += gLocaleKeys.getString(keycode) } catch(e){val += gStrings.unrecognized.replace("$1",keycode);} return val; } function getNameForKey(aKey) { var val; if(aKey.hasAttribute("label")) return aKey.getAttribute("label"); if(aKey.hasAttribute("command") || aKey.hasAttribute("observes")) { var command = aKey.getAttribute("command") || aKey.getAttribute("observes"); var node = gDocument.getElementById(command); if(node && node.hasAttribute("label")) return node.getAttribute("label"); val = getLabel("command", command); if(!val) val = getLabel("observes", command); } if(!val) val = getLabel("key", aKey.id); if(val) return val; var id = aKey.id.replace(/xxx_key.+?_/,""); try {id = gUnicodeConverter.ConvertToUnicode(id);} catch(err) { gUnicodeConverter.charset = "UTF-8"; } if(keyname[id]) { var key = gDocument.getElementById(keyname[id]); if(!key) key = gRemovedKeys.getElementsByAttribute("id",keyname[id])[0]; if(key) return getNameForKey(key); return keyname[id]; } return id; } function getLabel(attr, value) { var Users = gDocument.getElementsByAttribute(attr,value); var User; for(var i = 0, l = Users.length; i < l; i++) if(Users[i].hasAttribute("label") && (!User || User.localName == "menuitem")) User = Users[i]; if(!User) return null; if(User.localName == "menuitem" && User.parentNode.parentNode.parentNode.localName == "menupopup") { if(gReverseNames) return User.parentNode.parentNode.getAttribute("label") + " > " + User.getAttribute("label"); else return User.getAttribute("label") + " [" + User.parentNode.parentNode.getAttribute("label") + "]"; } else return User.getAttribute("label"); } function Recognize(event) { event.preventDefault(); event.stopPropagation(); var modifiers = []; if(event.altKey) modifiers.push("alt"); if(event.ctrlKey) modifiers.push("control"); if(event.metaKey) modifiers.push("meta"); if(event.shiftKey) modifiers.push("shift"); modifiers = modifiers.join(" "); var key = null; var keycode = null; if(event.charCode) key = String.fromCharCode(event.charCode).toUpperCase(); else { keycode = gVKNames[event.keyCode]; if(!keycode) return;} gEdit.value = getFormattedKey(modifiers,key,keycode); gEdit.keys = [modifiers,key,keycode]; if(!(gPrefService.getBoolPref("keyconfig.allowAltCodes") && modifiers == "alt" && key && !isNaN(key))) { if(gPrefService.getBoolPref("keyconfig.warnOnDuplicate") && gEdit.value != gEdit.key.shortcut && gUsedKeys[gEdit.value]) window.setTimeout(alert,0,gStrings.used.replace("$1",gUsedKeys[gEdit.value].join("\n"))); gEdit.nextSibling.focus(); } } function Apply() { var key = gKeys[keyTree.currentIndex]; var node = key.node; keyTree.focus(); if(key.shortcut == gEdit.value) return; key.shortcut = gEdit.value; key.pref.splice(0,3,gEdit.keys[0],gEdit.keys[1],gEdit.keys[2]); gModified = true; detectUsedKeys(); var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); str.data = key.pref.join("]["); gPrefService.setComplexValue(gProfile+node.id, Components.interfaces.nsISupportsString, str); node.removeAttribute("modifiers"); node.removeAttribute("key"); node.removeAttribute("keycode"); node.removeAttribute("charcode"); node.removeAttribute("keyconfig"); if(key.pref[0] == "!") { gRemovedKeys.appendChild(node); } else { if(key.pref[0]) node.setAttribute("modifiers",key.pref[0]); if(key.pref[1]) node.setAttribute("key",key.pref[1]); if(key.pref[2]) node.setAttribute("keycode",key.pref[2]); if(tryToInvalidateCache) try { if(!key.node.parentNode.parentNode) gDocument.getElementsByTagName("keyset")[0].appendChild(key.node); node = node.cloneNode(true); key.node.parentNode.replaceChild(node, key.node); key.node = node; var keyset = key.node; while(keyset.parentNode && keyset.parentNode.localName == "keyset") keyset = keyset.parentNode; keyset.parentNode.insertBefore(keyset, keyset.nextSibling); } catch(err){} } keyTree.treeBoxObject.invalidate(); } function Disable() { gEdit.value = ""; gEdit.keys = ["!",null,null]; Apply(); } function Reset() { var key = gKeys[keyTree.currentIndex]; var node = key.node; try{ gPrefService.clearUserPref(gProfile+node.id); }catch(err){} key.pref = []; key.shortcut = gEdit.value = gStrings.onreset; gEdit.keys = ["!",null,null]; gExtra2.label = gStrings.add; node.setAttribute("keyconfig","resetted"); gModified = true; detectUsedKeys(); keyTree.treeBoxObject.invalidate(); keyTree.focus(); } function Key(aKey) { this.node = aKey; this.name = getNameForKey(aKey); this.shortcut = getFormattedKey( aKey.hasAttribute("modifiers") ? aKey.getAttribute("modifiers") : null, aKey.hasAttribute("key") ? aKey.getAttribute("key").toUpperCase() : aKey.hasAttribute("charcode") ? aKey.getAttribute("charcode").toUpperCase() : null, aKey.hasAttribute("keycode") ? aKey.getAttribute("keycode") : null ); this.id = aKey.id; if(aKey.getAttribute("keyconfig") == "resetted") this.shortcut = gStrings.onreset; try { this.pref = gPrefService.getComplexValue(gProfile+aKey.id, Components.interfaces.nsISupportsString).data.split("]["); } catch(err) { this.pref = []; } if(!aKey.hasAttribute("command") && !aKey.hasAttribute("oncommand")) this.hardcoded = true; } var sorter = { name: function(a,b) { return a.name.localeCompare(b.name); }, id: function(a,b) { return a.id.localeCompare(b.id); }, shortcut: function(a,b) { if(a.shortcut == b.shortcut) return 0; if(!a.shortcut) return 1; if(!b.shortcut) return -1; if(a.shortcut > b.shortcut) return 1; return -1; } } function detectUsedKeys() { gUsedKeys = []; for(var i = 0, l = gKeys.length; i < l; i++) { if(gUsedKeys[gKeys[i].shortcut]) gUsedKeys[gKeys[i].shortcut].push(gKeys[i].name); else gUsedKeys[gKeys[i].shortcut]=[gKeys[i].name]; } gUsedKeys[""] = gUsedKeys[gStrings.onreset] = {length: 0} } function openEditor(type) { var key, code; switch(type) { case 1: key = gKeys[keyTree.currentIndex]; break; case 2: key = gKeys[keyTree.currentIndex]; if(key && !key.pref[3]) code = getCodeFor(key.node); break; } openDialog('chrome://keyconfig/content/edit.xul', '_blank', 'resizable,modal', key, code); } function closeEditor(fields) { var key; if(fields.key) { key = fields.key; gPrefService.clearUserPref(gProfile+key.node.id); } else { gModified = true; key = {node: gDocument.createElement("key"), shortcut: "", pref: ["!",,,";"]} gKeys.push(key); gRemovedKeys.appendChild(key.node); keyTree.treeBoxObject.rowCountChanged(keyTree.view.rowCount-1,1); keyTree.view.selection.select(keyTree.view.rowCount-1); keyTree.treeBoxObject.ensureRowIsVisible(keyTree.view.rowCount-1); } key.name = fields.name.value || "key"+Date.now(); try { key.id = key.node.id = "xxx_key__" + gUnicodeConverter.ConvertFromUnicode(key.name) } catch(err){ gUnicodeConverter.charset = "UTF-8"; } fields.code.value = fields.code.value.replace("][","] ["); key.node.setAttribute("oncommand",fields.code.value || " "); key.pref[3] = fields.code.value || " "; key.pref[4] = fields.global.checked ? "" : gLocation; var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); str.data = key.pref.join("]["); gPrefService.setComplexValue(gProfile+key.node.id, Components.interfaces.nsISupportsString, str); keyTree.treeBoxObject.invalidateRow(keyTree.currentIndex); } var keyView = { get rowCount() { return gKeys.length; }, getCellText : function(row,col){ return gKeys[row][col.id || col];}, setTree: function(treebox) { this.treebox=treebox; }, isContainer: function() { return false; }, isSeparator: function() { return false; }, isSorted: function() { return false; }, getLevel: function() { return 0; }, getImageSrc: function() { return null; }, getRowProperties: function() {}, canDropBeforeAfter: function() { return false; }, canDrop: function() { return false; }, getParentIndex: function() { return -1; }, getCellProperties: function(row,col,props) { var key = gKeys[row]; if(key.hardcoded) props.AppendElement(gAtomService.getAtom("hardcoded")); if(key.pref[0] == "!") props.AppendElement(gAtomService.getAtom("disabled")); if(key.pref[3]) props.AppendElement(gAtomService.getAtom("custom")); if(key.pref.length) props.AppendElement(gAtomService.getAtom("user")); if((col.id || col) == "shortcut" && gUsedKeys[key.shortcut].length > 1) props.AppendElement(gAtomService.getAtom("duplicate")); }, getColumnProperties: function(){}, selectionChanged: function() { var key = gKeys[this.selection.currentIndex]; if(!key) return; gExtra2.label = key.pref[3] ? gStrings.edit : gStrings.add; if(gEditbox.hasAttribute("disabled")) gEditbox.removeAttribute("disabled"); gEdit.key = key; gEdit.value = key.shortcut; }, cycleHeader: function cycleHeader(col, elem) { if(col.id) elem = col.element; var direction = elem.getAttribute("sortDirection") == "ascending" ? "descending" : "ascending"; var columns = this.treebox.firstChild.childNodes; for(var i = 0, l = columns.length; i < l; i++) { columns[i].setAttribute("sortDirection","none"); columns[i].setAttribute("sortActive",false); } elem.setAttribute("sortDirection",direction); elem.setAttribute("sortActive",true); var currentRow = gKeys[this.selection.currentIndex]; gKeys.sort(sorter[col.id || col]); if(direction == "descending") gKeys.reverse(); this.treebox.invalidate(); if(currentRow) { i = -1; do { i++; } while(currentRow != gKeys[i]); this.selection.select(i); this.treebox.ensureRowIsVisible(i); } } } function switchWindow(event) { var mediator = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService(); mediator.QueryInterface(Components.interfaces.nsIWindowDataSource); var target = mediator.getWindowForResource(event.target.getAttribute('id')); if (target) init(target); } function getCodeFor(node) { if(node.hasAttribute("oncommand")) return node.getAttribute("oncommand") else if(node.hasAttribute("command")) return gDocument.getElementById(node.getAttribute("command")).getAttribute("oncommand"); return null; } function copyKey() { var key = gKeys[keyTree.currentIndex]; if(!key) return; var data = 'name: ' + key.name + ', id: ' + key.id + ', shortcut: ' + key.shortcut + ', code:\n' + getCodeFor(key.node); gClipboardHelper.copyString(data); }PK B58kٶ content/keyconfig.xul %keyconfig; %textcontext; ]>