polk90
Очевидно тебе надо обновить Сustom Buttons на Custom Buttons • View topic - [Signed fixed extension attached] CB broken on Firefox 48+
Отсутствует
Gladius333
Автоскрытие панели поиска
Спасибо пойдет, только жаль что один код надо в кнопке держать, а один в стиле.
Но все равно спасибо! Кстати в кнопке "Toggle Find+" есть все что надо, но хотелось обойтись без кнопки а функций в код, -1 кнопка которая маячит.
Отсутствует
Кнопка VT ( Firefox10+ )
В консоле ошибок
"Метка времени: 02.09.2017 6:46:45
Ошибка: TypeError: bgc.match(...) is null
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button0@init line 1 > Function
Строка: 226"
Pale Moon 27.4.2 Win7 32
Отредактировано rgdru (02-09-2017 06:54:00)
Отсутствует
Помогите найти кнопку. Кнопка регулировала количество загрузки вкладок. Похожа на это дополнение.
Также хочу задать вопрос о кнопке VT. Можно ли в ней ограничить размер иконок? Скажем, чтобы иконки были 16 пикс.
Отсутствует
Кнопка VT ( Firefox10+ )
В консоле ошибок
"Метка времени: 02.09.2017 6:46:45
Ошибка: TypeError: bgc.match(...) is null
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button0@init line 1 > Function
Строка: 226"
Pale Moon 27.4.2 Win7 32
А ты менял тему или обои? Попробуй это:
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0432%u0435%u0440%u0442%u0438%u043A%u0430%u043B%u044C%u043D%u0443%u044E%20%u043F%u0430%u043D%u0435%u043B%u044C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAKP+AAIX/gAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAFf+AABUAAAAAAAAAAAAAAAAAAAAA/4AAJP+AAP//gAD//4AA//+AACQAAAAAAAAAAAAAAAAAAAAA/4AAEv+AAP//gAD//4AAEgAAAAAAAAAA/4AAIP+AAP//gAD//4AA//+AAP//gAD//4AAJgAAAAAAAAAAAAAAAP+AABH/gAD//4AA//+AABEAAAAAAAAAAP+AAP//gAD//4AA//+AADb/gAD//4AA//+AAP//gAAQAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AACAAAAAA/4AAIP+AAP//gAD//4AAEQAAAAAAAAAA/4AAD/+AAP//gAD//4AADwAAAAAAAAAA/4AA//+AAP//gAAMAAAAAP+AAAz/gAD//4AA//+AAA8AAAAAAAAAAP+AAA//gAD//4AA//+AAA8AAAAAAAAAAP+AAP//gAD//4AADwAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AAA8AAAAA/4AAD/+AAP//gAD//4AADAAAAAAAAAAA/4AACv+AAP//gAD//4AACgAAAAAAAAAA/4AA//+AAP//gAAPAAAAAP+AAA//gAD//4AA//+AAAv/gAAL/4AADP+AACH/gAD//4AA//+AACH/gAAK/4AAD/+AAP//gAD//4AAEQAAAAD/gAAR/4AA//+AAP//gAAm/4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AABIAAAAA/4AAEv+AAP//gAD//4AAJ/+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AAEf+AABIAAAAAAAAAAAAAAAD/gAAV/4AAEgAAAAD/gAAQ/4AAEf+AAA//gAAP/4AAD/+AAA//gAAP/4AADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQe//rEHH56xBg8OsQQHDrEEAw6xBEMOsQRDDrEEQw6xBEMOsQRAArEEQAKxBEACsQTkArEH//6xB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20button%20%3D%20this%3B%0A%0Aconst%20sideBarAutoClose%20%3D%20false%3B%20%20//%20true%20%3D%3E%20%u0432%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0435%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%20%0Aconst%20autoCloseDelay%20%3D%20500%3B%20%20%20%20%20//%20ms%0A%0Aconst%20showDelay%20%3D%20250%3B%09%09//%20ms%0Aconst%20distanceShow%20%3D%202%3B%09%09//%20px%0Aconst%20distanceHide%20%3D%2064%3B%09//%20px%0Aconst%20vtWidthCorrection%20%3D%20-1%3B%09//%20px%20%28%20number%20%5B%20+%20or%20-%20%5D%20%29%0A%0Aconst%20toolbarId%20%3D%20%22vertical_toolbar%22%3B%0Aconst%20toolboxId%20%3D%20toolbarId%20+%20%22_toolbox%22%3B%0Aconst%20sep%20%3D%20%22%5Cu00A0%22%3B%0Aconst%20firstAttributes%20%3D%20%22%5C%0Aid%20%25id%25%20class%20chromeclass-toolbar%20fullscreentoolbar%20true%20context%20toolbar-context-menu%20_width%2020%20%5C%0Acustomizable%20true%20flex%201%20iconize%20large%20mode%20icons%20orient%20vertical%20widthcorr%200%22%0A.replace%28/%20/g%2C%20sep%29.replace%28/%25id%25/%2C%20toolbarId%29%3B%0A%0A//%20....................................................................................................%0A%0Aconst%20pn%20%3D%20%22custombutton.verticaltoolbar.attributes%22%3B%0Avar%20prefs%20%3D%20Application.prefs%3B%0Aif%20%28%21prefs.has%28pn%29%29%20prefs.setValue%28pn%2C%20firstAttributes%29%3B%0Avar%20pref%20%3D%20prefs.get%28pn%29%3B%0Afunction%20getAttr_pref%28%29%20%7B%0A%09return%20pref.value%0A%7D%0Afunction%20setAttr_pref%28%29%20%7B%0A%09pref.value%20%3D%20%22%22%3B%0A%09Array.slice%28document.getElementById%28toolbarId%29.attributes%29.forEach%28function%28attr%29%20%7B%0A%09%09pref.value%20+%3D%20%28attr.name%20+%20sep%20+%20attr.value%20+%20sep%29%3B%0A%09%7D%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Avar%20browser%20%3D%20document.getElementById%28%22browser%22%29%3B%0Avar%20toolbar%20%3D%20document.getElementById%28toolbarId%29%3B%0Avar%20toolbox%20%3D%20document.getElementById%28toolboxId%29%3B%0A%0Aif%20%28%21toolbar%29%20%7B%0A%0A%09toolbox%20%3D%20document.createElement%28%22toolbox%22%29%3B%0A%09toolbox.id%20%3D%20toolboxId%3B%0A%09toolbox.palette%20%3D%20gNavToolbox.palette%3B%0A%09%0A%09toolbar%20%3D%20document.createElement%28%22toolbar%22%29%3B%0A%09toolbar.style.minWidth%20%3D%20%2220px%22%3B%0A%09%0A%09browser.insertBefore%28toolbox%2C%20browser.firstChild%29%3B%0A%09toolbox.appendChild%28toolbar%29%3B%0A%0A//%20....................................................................................................%0A//%20Thanks%20-%20http%3A//nanto.asablo.jp/blog/2007/04/22/1459018%0A%0A%09const%20style%20%3D%27%5C%0A%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%7B%5Cn%5C%0A%09%09-moz-appearance%3A%20none%3B%5Cn%5C%0A%09%09border-bottom%3A%200px%20none%3B%5Cn%5C%0A%09%09border-top%3A%200px%20none%3B%5Cn%5C%0A%09%09border-right%3A%201px%20solid%20rgb%28170%2C%20188%2C%20207%29%3B%5Cn%5C%0A%09%09background%3A%20none%20repeat%20scroll%200%25%200%25%20rgb%28207%2C%20219%2C%20236%29%3B%5Cn%5C%0A%09%09-image%3A%20-moz-linear-gradient%28rgba%28255%2C%20255%2C%20255%2C%20.5%29%2C%20rgba%28255%2C%20255%2C%20255%2C%200%29%2027px%29%20%21important%3B%5Cn%5C%0A%7D%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20toolbarseparator%2C%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20%5Bid%5E%3D%22wrapper-separator%22%5D%20%7B%5Cn%5C%0A%09%09-moz-appearance%3A%20none%20%21important%3B%5Cn%5C%0A%09%09margin%3A%200.2em%202px%3B%5Cn%5C%0A%09%09border-bottom%3A%201px%20solid%20ThreeDHighlight%3B%5Cn%5C%0A%09%09border-top%3A%201px%20solid%20ThreeDShadow%3B%5Cn%5C%0A%09%09height%3A%202px%3B%5Cn%5C%0A%09%09border-left%3A%20none%3B%5Cn%5C%0A%09%09border-right%3A%20none%3B%5Cn%5C%0A%7D%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20toolbarspacer%2C%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20%5Bid%5E%3D%22wrapper-spacer%22%5D%20%7B%20height%3A%2015px%3B%20%7D%27%0A%0A%09var%20sspi%20%3D%20document.createProcessingInstruction%28%27xml-stylesheet%27%2C%0A%09%09%20%20%27type%3D%22text/css%22%20href%3D%22data%3Atext/css%2C%27%20+%20encodeURI%28style%29%20+%20%27%22%27%29%3B%0A%09document.insertBefore%28sspi%2C%20document.documentElement%29%3B%0A%0A//%20....................................................................................................%0A%0A%09var%20attr%20%3D%20getAttr_pref%28%29.split%28sep%29%3B%0A%09for%20%28var%20i%3D0%3B%20i%3C%28attr.length-1%29%3B%20i+%3D2%29%20%7B%20toolbar.setAttribute%28attr%5Bi%5D%2C%20attr%5Bi+1%5D%29%3B%20%7D%0A%0A%09var%20currentSet%20%3D%20toolbar.getAttribute%28%22currentset%22%29.split%28%22%2C%22%29%3B%0A%09currentSet.forEach%28function%28id%29%7B%20toolbar.insertItem%28id%29%3B%20%7D%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Avar%20et%20%3D%20gNavToolbox.externalToolbars%3B%0Avar%20already%20%3D%20false%3B%0Afor%20%28var%20i%3D0%3B%20i%3Cet.length%3B%20i++%29%20%7B%20if%20%28et%5Bi%5D%20%3D%3D%20toolbar%29%20%7B%20already%20%3D%20true%3B%20break%20%7D%20%7D%0Aif%20%28%21already%29%20et%5Bet.length%5D%20%3D%20toolbar%3B%0A%0Avar%20delta%20%3D%20toolbar.getAttribute%28%22widthcorr%22%29%20-%20vtWidthCorrection%3B%0Atoolbar.setAttribute%28%22widthcorr%22%2C%20vtWidthCorrection%29%3B%0Aif%20%28delta%29%20toolbar.setAttribute%28%22_width%22%2C%20toolbar.getAttribute%28%22_width%22%29%20-%20delta%29%3B%0A%0Afunction%20lock%28%29%20%7B%0A%0A%09var%20width%20%3D%20toolbar.getAttribute%28%22_width%22%29%3B%0A%09%0A%09toolbox.style.position%20%3D%20toolbar.hasAttribute%28%22autohide%22%29%20%3F%20%22%22%20%3A%20%22fixed%22%3B%0A%09toolbox.style.height%20%3D%0A%09toolbar.style.height%20%3D%20browser.boxObject.height%20+%20%22px%22%3B%0A%0A%09toolbar.style.maxWidth%20%3D%0A%09toolbar.style.minWidth%20%3D%0A%09toolbox.style.maxWidth%20%3D%0A%09toolbox.style.minWidth%20%3D%20width%20*%20%21toolbar.collapsed%20+%20%22px%22%3B%09%0A%7D%0Afunction%20beforeCustomize%28%29%20%7B%0A%0A%09toolbox.removeAttribute%28%22style%22%29%3B%0A%09toolbox.removeAttribute%28%22width%22%29%3B%0A%09toolbar.removeAttribute%28%22style%22%29%3B%0A%09toolbar.style.minWidth%20%3D%20%2220px%22%3B%0A%7D%0Afunction%20customizationChange%28%29%20%7B%0A%09window.setTimeout%28function%28%29%20%7B%0A%09%09toolbar.setAttribute%28%22_width%22%2C%20toolbar.boxObject.width%20+%20vtWidthCorrection%29%3B%0A%09%7D%2C%20640%29%3B%0A%7D%0Afunction%20afterCustomize%28%29%20%7B%0A%0A%09setAttr_pref%28%29%3B%0A%09removeListeners%28%29%3B%0A%09lock%28%29%3B%0A%7D%0Afunction%20collapser%28e%29%20%7B%0A%0A%09var%20distance%20%3D%20e.screenX%20-%20browser.boxObject.screenX%3B%0A%09if%20%28toolbar.waiting%29%20return%3B%0A%0A%09if%20%28%28distance%20%3C%3D%20distanceShow%29%20%26%26%20%28toolbar.collapsed%29%29%20%7B%0A%0A%09%09if%20%28showDelay%20%3C%201%29%20%7B%20toolbar.collapsed%20%3D%20false%3B%20lock%28%29%3B%20return%3B%20%7D%0A%0A%09%09toolbar.waiting%20%3D%20true%3B%0A%09%09window.setTimeout%28function%28%29%20%7B%0A%0A%09%09%09if%20%28distance%20%3E%3D%20distanceShow%29%20%7B%20toolbar.waiting%20%3D%20false%3B%20return%3B%20%7D%0A%09%09%09toolbar.collapsed%20%3D%20false%3B%0A%09%09%09lock%28%29%3B%0A%09%09%09toolbar.waiting%20%3D%20false%3B%0A%0A%09%09%7D%2C%20showDelay%29%3B%0A%09%7D%0A%09if%20%28%28distance%20%3E%3D%20distanceHide%29%20%26%26%20%28%21toolbar.collapsed%29%29%20%7B%0A%09%09toolbar.collapsed%20%3D%20true%3B%0A%09%09lock%28%29%3B%0A%09%7D%0A%7D%0Afunction%20removeListeners%28%29%20%7B%0A%0A%09gNavToolbox.removeEventListener%28%22beforecustomization%22%2C%20beforeCustomize%2C%20false%29%3B%0A%09gNavToolbox.removeEventListener%28%22customizationchange%22%2C%20customizationChange%2C%20false%29%3B%0A%09gNavToolbox.removeEventListener%28%22aftercustomization%22%2C%20afterCustomize%2C%20false%29%3B%0A%7D%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%20%0A%0A%09if%20%28e.button%29%20return%3B%0A%0A%09var%20autohide%20%3D%20toolbar.hasAttribute%28%22autohide%22%29%3B%0A%09toolbar.collapsed%20%3D%20autohide%3B%0A%0A%09if%20%28%21autohide%29%20%7B%0A%09%09browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09%09toolbar.setAttribute%28%22autohide%22%2C%20%22true%22%29%3B%0A%09%7D%0A%09else%20%7B%0A%09%09browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09%09toolbar.removeAttribute%28%22autohide%22%29%3B%0A%09%7D%0A%09lock%28%29%3B%0A%7D%0A%0Atoolbar.ondblclick%20%3D%20function%28e%29%20%7B%0A%0A%09if%20%28%20e.button%20%7C%7C%20e.target.nodeName%20%3D%3D%20%22toolbarbutton%22%0A%09%20%20%09%20%20%20%20%20%20%7C%7C%20e.target.nodeName%20%3D%3D%20%22toolbaritem%22%20%29%20return%3B%0A%09button.click%28%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Aif%20%28%21toolbar.hasAttribute%28%22autohide%22%29%29%20%7B%0A%09browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%7D%0Aelse%20toolbar.setAttribute%28%22autohide%22%2C%20%22true%22%29%3B%0A%0Alock%28%29%3B%0A%0AgNavToolbox.addEventListener%28%22beforecustomization%22%2C%20beforeCustomize%2C%20false%29%3B%0AgNavToolbox.addEventListener%28%22customizationchange%22%2C%20customizationChange%2C%20false%29%3B%0AgNavToolbox.addEventListener%28%22aftercustomization%22%2C%20afterCustomize%2C%20false%29%3B%0A%0A%0A%0A%0Afunction%20addBackground%28e%29%20%7B%0A%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20toolbar%20%3D%20document.getElementById%28%27vertical_toolbar%27%29%3B%0A%20%20%20%20%20%20var%20win%20%3D%20document.getElementById%28%22main-window%22%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20image%20%3D%20win.style.backgroundImage%3B%0A%20%20%20%20%20%20if%20%28%20image%20%3D%3D%20%27%27%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20toolbar.style.background%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20toolbar.style.background%20%3D%20image%3B%0A%20%20%20%20%20%20toolbar.style.backgroundSize%20%3D%20%27auto%20100%25%27%3B%0A%20%20%20%7D%2C%20500%29%3B%0A%7D%3B%0AaddBackground%28%29%3B%20%0AServices.obs.addObserver%28addBackground%2C%20%22lightweight-theme-styling-update%22%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.obs.removeObserver%28addBackground%2C%20%22lightweight-theme-styling-update%22%29%20%29%3B%20%0A%0A%0A%0A%0Aconst%20MPT%20%3D%20window.MousePosTracker%20%7C%7C%20%7B%20_x%3A%200%2C%20handleEvent%3A%20function%28e%29%20this._x%20%3D%20e.screenX%20%7D%3B%0Afunction%20handlePopup%28e%29%20%7B%0A%0A%20%20%20%20if%20%28toolbar.hasAttribute%28%22autohide%22%29%20%7C%7C%20toolbar.collapsed%20%7C%7C%20e.target.nodeName%20%21%3D%20%22menupopup%22%29%20return%3B%0A%0A%20%20%20%20var%20count%20%3D%20Array.filter%28document.getElementsByTagName%28%22menupopup%22%29%2C%20function%28popup%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28popup.state%20%21%3D%20%22open%22%29%20return%20false%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20node%20%3D%20popup.triggerNode%20%7C%7C%20popup%3B%20node%3B%20node%20%3D%20node.parentNode%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28node%20%3D%3D%20toolbar%29%20return%20true%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%29.length%3B%0A%0A%20%20%20%20if%20%28e.type%20%3D%3D%20%22popupshown%22%20%26%26%20count%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%21MPT._y%20%26%26%20window.addEventListener%28%22mousemove%22%2C%20MPT%2C%20false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28e.type%20%3D%3D%20%22popuphidden%22%20%26%26%20count%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%21MPT._y%20%26%26%20window.removeEventListener%28%22mousemove%22%2C%20MPT%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20MPT._x%20%3E%20distanceHide%20%26%26%20lock%28toolbar.collapsed%20%3D%20true%29%3B%0A%20%20%20%20%7D%0A%7D%0A%5B%22popupshown%22%2C%20%22popuphidden%22%5D.forEach%28function%28type%29%20addEventListener%28type%2C%20handlePopup%2C%20true%29%29%3B%0A%0Aconst%20topic%20%3D%20custombuttons.cbService.getNotificationPrefix%28window%29%20+%20%22removeButton%22%3B%0Aconst%20obsrv%20%3D%20%7B%20observe%3A%20function%28%29%20handlePopup%28%7B%20type%3A%20%22popuphidden%22%2C%20target%3A%20%7B%20nodeName%3A%20%22menupopup%22%20%7D%20%7D%29%20%7D%3B%0AServices.obs.addObserver%28obsrv%2C%20topic%2C%20false%29%3B%0AaddDestructor%28function%28%29%20Services.obs.removeObserver%28obsrv%2C%20topic%29%29%3B%0A%0A%0A%0Afunction%20fsl%28%29%20FullScreen._isAnimating%20%3F%20lock%28setTimeout%28fsl%2C%2050%29%29%20%3A%20window.setTimeout%28lock%2C%2050%29%3B%0AaddEventListener%28%22fullscreen%22%2C%20function%28%29%20setTimeout%28lock%2C%200%29%20%26%26%20fsl%28%29%2C%20true%29%3B%0A%0A%0A%0Afunction%20n%28id%29%20document.getElementById%28id%29%3B%0Aconst%20page%20%3D%20n%28%22content%22%29%2C%20box%20%3D%20n%28%22sidebar-box%22%29%2C%20sidebar%20%3D%20n%28%22sidebar%22%29%3B%0Avar%20tvtc%2C%20timeout%3B%0A%0Afunction%20listenMO%28node%2C%20listen%29%20%7B%0A%20%20%20%20var%20func%20%3D%20node%20%3D%3D%20box%20%3F%20onBMO%20%3A%20onPMO%3B%0A%20%20%20%20%28listen%20%3F%20addEventListener%20%3A%20removeEventListener%29%0A%20%20%20%20.apply%28this%2C%20%5B%22mouseover%22%2C%20func%2C%20false%2C%20node%5D%29%3B%0A%7D%0Afunction%20onPMO%28%29%20%7B%0A%20%20%20%20listenMO%28page%2C%20false%29%3B%0A%20%20%20%20timeout%20%3D%20setTimeout%28hideSB%2C%20autoCloseDelay%20%29%3B%0A%20%20%20%20listenMO%28box%2C%20true%29%3B%0A%7D%0Afunction%20onBMO%28%29%20%7B%0A%20%20%20%20listenMO%28box%2C%20false%29%3B%0A%20%20%20%20clearTimeout%28timeout%29%3B%0A%20%20%20%20listenMO%28page%2C%20true%29%3B%0A%7D%0Afunction%20hideSB%28%29%20%7B%0A%20%20%20%20listenMO%28box%2C%20false%29%3B%0A%20%20%20%20if%20%28box.hidden%29%20return%3B%0A%20%20%20%20var%20id%20%3D%20box.getAttribute%28%22sidebarcommand%22%29%20%7C%7C%20%22viewBookmarksSidebar%22%3B%0A%20%20%20%20n%28id%29.setAttribute%28%22checked%22%2C%20true%29%3B%0A%20%20%20%20toggleSidebar%28id%29%3B%0A%7D%0Afunction%20onSBL%28%29%20%7B%0A%20%20%20%20var%20time%20%3D%20Date.now%28%29%3B%0A%20%20%20%20listenMO%28page%2C%20false%29%3B%0A%20%20%20%20if%20%28time%20-%20tvtc%20%3C%20800%29%20listenMO%28page%2C%20true%29%3B%0A%7D%0Afunction%20onVTC%28e%29%20%7B%0A%20%20%20%20var%20time%20%3D%20Date.now%28%29%3B%0A%20%20%20%20for%20%28var%20node%20%3D%20e.target%3B%20node%3B%20node%20%3D%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28node%20%21%3D%20toolbar%29%20continue%3B%0A%20%20%20%20%20%20%20%20tvtc%20%3D%20time%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%7D%0Afunction%20ael%28add%29%20%7B%0A%20%20%20%20%5B%20%20%20%20%5B%22DOMContentLoaded%22%2C%20onSBL%2C%20false%2C%20sidebar%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22click%22%2C%20onVTC%2C%20false%2C%20window%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22command%22%2C%20onVTC%2C%20false%2C%20window%5D%0A%20%20%20%20%5D.forEach%28function%28args%29%20%7B%0A%20%20%20%20%20%20%20%20%28add%20%3F%20addEventListener%20%3A%20removeEventListener%29.apply%28this%2C%20args%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%0Aif%20%28%20sideBarAutoClose%20%29%20ael%28true%29%3B%0A%0A%0A%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%09browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09if%20%28%21toolbar.hasAttribute%28%22customizing%22%29%29%20removeListeners%28%29%3B%0A%09if%20%28reason%20%3D%3D%20%22delete%22%29%20pref.reset%28%29%3B%0A%09if%20%28%21getAttr_pref%28%29%29%20return%3B%0A%09setAttr_pref%28%29%3B%0A%09%0A%09ael%28false%29%3B%0A%7D%3B%0A%0A%0A%0Athis.style.cssText%20%3D%20%22opacity%3A%201%20%21important%3B%22%3B%20//%20Css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Добавлено 02-09-2017 10:26:22
Также хочу задать вопрос о кнопке VT. Можно ли в ней ограничить размер иконок? Скажем, чтобы иконки были 16 пикс.
Да, можно. В userChrome.css:
#vertical_toolbar .toolbarbutton-icon { -moz-appearance: none !important; height: 16px !important; width: 16px !important; }
Отредактировано bunda1 (02-09-2017 10:26:22)
Отсутствует
Помогите найти кнопку. Кнопка регулировала количество загрузки вкладок. Похожа на это дополнение.
Посмотрите здесь Приведённый ниже код почти то же, но учитывает конфликт с расширением Link Status Redux:
var allTabMax = 20; // максимальное число табов var tabArray = []; // Отслеживать открытие, закрытие вкладок и восстановление сессии ..... function tabHandler(e) { var tab = e.target; var selTabPos = gBrowser.selectedTab._tPos; var xbw = XULBrowserWindow.statusTextField.label.split(' ') [(XULBrowserWindow.statusTextField.label.split(' ').length>1)+0]; // прятать и закрывать лишние вкладки, сохранить их адреса в массив if ( e.type !== "TabClose" && gBrowser.tabs.length > allTabMax ) { tabArray.push( (e.type == 'TabOpen') ? (tab.label == "Новая вкладка") ? xbw : tab.label : tab.linkedBrowser.contentDocument.location ); tab.style.display = 'none'; setTimeout(function() { gBrowser.removeTab( tab ); }, 150); // открывать сохранение адреса и удалять их из массива if ( e.type == "TabClose" && gBrowser.tabs.length < allTabMax && tabArray.length > 0 ) { gBrowser.loadOneTab( (tabArray.shift()).trim(), null, null, null, true, false); } }; var container = gBrowser.tabContainer; addEventListener("TabOpen", tabHandler, true, container ); addEventListener("TabClose", tabHandler, false, container ); addEventListener("SSTabRestoring", tabHandler, false, container );
Отредактировано difabor (02-09-2017 11:02:40)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Посмотрите здесь Приведённый ниже код почти то же, но учитывает конфликт с расширением Link Status Redux:
Похожее, но не то, и на РМ не работает.
Отредактировано Quartz1t (02-09-2017 22:02:46)
Отсутствует
не работатет кнопка Tab History, (брал там)
позволяла новой вкладке наследовать историю родительской вкладки,
var TU_hookCode = TU_hookMethod; function TU_hookMethod(aStr) { try { var namespaces = aStr.split("."); try { var object = this; while (namespaces.length > 1) { object = object[namespaces.shift()]; } } catch (e) { throw TypeError(aStr + " is not a function"); } var method = namespaces.pop(); if (typeof object[method] != "function") throw TypeError(aStr + " is not a function"); return object[method] = TU_hookFunc.apply(this, Array.concat(object[method], Array.slice(arguments, 1))); } catch (e) { Components.utils.reportError("Failed to hook " + aStr + ": " + e.message); } } function TU_hookFunc(aFunc) { var myCode = aFunc.toString(); for (var i = 1; i < arguments.length;) { if (arguments[i].constructor.name == "Array") { var [orgCode, newCode, flags] = arguments[i++]; } else { var [orgCode, newCode, flags] = [arguments[i++], arguments[i++], arguments[i++]]; } if (typeof newCode == "function" && newCode.length == 0) newCode = newCode.toString().replace(/^.*{|}$/g, ""); switch (orgCode) { case "{": [orgCode, newCode] = [/{/, "$&\n" + newCode];break; case "}": [orgCode, newCode] = [/}$/, newCode + "\n$&"];break; } if (typeof orgCode == "string") orgCode = RegExp(orgCode.replace(/[{[(\\^|$.?*+/)\]}]/g, "\\$&"), flags || ""); myCode = myCode.replace(orgCode, newCode); } return eval("(" + myCode + ")"); } TU_hookCode("gBrowser.loadOneTab", ["{", function() { var currentTab = this.mCurrentTab; }], [/(?=return tab;)/, function() { if (aReferrerURI/* && TU_getPref("extensions.tabutils.openLinkWithHistory", false)*/) { let currentHistory = currentTab.linkedBrowser.sessionHistory; let newHistory = tab.linkedBrowser.sessionHistory.QueryInterface(Ci.nsISHistoryInternal); for (let i = 0; i <= currentHistory.index; i++) { newHistory.addEntry(currentHistory.getEntryAtIndex(i, false), true); } } }] );
Отсутствует
опять не работает кнопка вставки спецсимволов
код взят Insert special symbol(Firefox) All the versions
раньше всё работало ,не могу понять в чём проблема
пробовал с версией CB из магазина (вообще кнопки не работают)
скачал с sourceforge.net custom_buttons-0.0.5.8.9-fixed4-signed.xpi.zip
удалил старую версию CB и саму кнопку ,поставил новую = другие кнопки заработали ,а эта не работает
пробовал отключать все дополнения стили и темы (оставил только CB)
Firefox 52.3.0 (64бити)ESR Linux
Отредактировано SOTVM (13-09-2017 09:19:13)
Никто не знает столько,сколько не знаю Я.
Отсутствует
Спасибо за отличную кнопку: https://forum.mozilla-russia.org/viewtopic.php?pid=708281#p708281
С помощью этой кнопки создаю различные кнопки запусков .CMD файлов.
Можно добавить сюда?:
cmd и bat
и еще, на данный момент иконку невозможно назначить, если запуск указан cmd и bat файла.
Иконка не отображается, а если зайти в редактирование панелей - видно назначенную иконку.
Спасибо!
Отсутствует
делюсь способом быстрого бэкапа firefox, возможно, кому-то пригодится)
Backup Firefox.cmd - кладем в корень портативного Ferefox.
Нужен 7-Zip
Отредактировано firepox (14-09-2017 01:16:01)
Отсутствует
опять не работает кнопка вставки спецсимволов
код взят Insert special symbol(Firefox) All the versions
раньше всё работало ,не могу понять в чём проблема
пробовал с версией CB из магазина (вообще кнопки не работают)
скачал с sourceforge.net custom_buttons-0.0.5.8.9-fixed4-signed.xpi.zip
удалил старую версию CB и саму кнопку ,поставил новую = другие кнопки заработали ,а эта не работает
пробовал отключать все дополнения стили и темы (оставил только CB)Firefox 52.3.0 (64бити)ESR Linux
А что именно не работает?
У меня на Windows работает. Правда, у меня она слегка модифицирована...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
А что именно не работает?
У меня на Windows работает. Правда, у меня она слегка модифицирована...
уже починил пол дня "парился"
когда вставлял свои символы в код,затёр случайно пару символов в самом конце строки ";
нашёл методом сравнения двух файлов/кода по содержанию (в linux программа Meld
Отредактировано SOTVM (14-09-2017 08:22:14)
Никто не знает столько,сколько не знаю Я.
Отсутствует
Прошу поправить кнопку Save( Firefox 24 + ) от 07.03.2017 для работы в Pale Moon 27.
Не работют пункты меню "Сохранить выделенную область страницы как PNG-изображение,
Сохранить выбранный элемент страницы как PNG-изображение,
Сохранить видимую область страницы как PNG-изображение,
Сохранить всю страницу как PNG-изображение".
В Консоле ошибок запись
Метка времени: 22.09.2017 14:11:25
Ошибка: NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIWebBrowserPersist.saveURI]
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button36@init line 1 > Function
Строка: 75
Отсутствует
Not enough arguments
Отсутствует
Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?
Кажется Dumby что то такое делал с VT. Может посмотри в его комментариях год или два назад.
Отсутствует
difabor пишетМожно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?Кажется Dumby что то такое делал с VT. Может посмотри в его комментариях год или два назад.
Спасибо.
Я комментарии Dumby не нашёл, но сумел полуклонировать его VT, чтобы получился второй VT, рядом с первым так, чтобы они выскакивали оба сразу и была возможность посадить на них в два раза больше иконок.
Изменения должны быть минимальными:
1. Надо изменить id: в оригинале: id: "cb-vt" -> я изменил на id: "cb-vt2". Менять надо это ещё в одном месте (почти в конце кода): var toolbar = document.getElementById('cb-vt'); -> var toolbar = document.getElementById('cb-vt2');
2. Надо изменить имя: name: "VT" -> name: "VT2" - это тоже в самом начале. Если это не изменить, катастрофы не произойдёт, но будет некрасиво - будут присутствовать два тулбара с одним и тем же именем. А вот id надо менять обязательно!
3. Надо изменить в стиле (это ближе к концу кода, ищите 'style: "-moz-appearance" и в этой строке добавить: left: 33px; после position: fixed; Примечание: 33рх - у меня, я немного сузил сам тулбар, вы должны подобрать для себя своё значение.
Сделайте сначала больше, скажем, >40рх. Между тулбарами при выскакивании будет щёлочка, оценив её величину -> уменьшите выбранное вами значение до приемлемого, чтобы щёлочка исчезла, но тулбары не налазили друг на друга.
4. Увеличьте distanceHide: (это в начале кода) на эту величину, чтобы второй тулбар прятался не вместе с первым.
----------------------------------------------------------------------------------------------------------------------
При перетаскивании иконок на второй тулбар, первый должен быть закрыт, и наоборот, если перетаскиваете иконку на первый тулбар. Открыт должен быть только тот верт. тулбар, на который вы собираетесь иконку перетащить
Если вы собираетесь перетащить иконку с одного тулбара на другой, используйте для этого промежуточный тулбар: сначала перетащите на него, выйдите из режима перетаскивания, закройте тот верт.тулбар, с которого перетаскивали и откройте тот, куда будете перетаскивать. Затем снова включите режим перетаскивания и перетащите с промежуточного тулбара на вертикальный.
----------------------------------------------------------------------------------------------------------------------
В принципе можно создать сколько угодно VT, а вне VT оставить только иконки-информеры, несущие какую-то информацию (часы, расход памяти и т.д., а также иконки самих VT)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
Была кнопка VT2, панели появлялись и справа и слева, но она перестала работать в новых версиях, может удастся исправить.
const leftVT = true; const optLeftVT = { showDelay: 0, distanceShow: 10, distanceHide: 100, // relative ∏↔ widthCorrection: 7, animateTime: 0 }; const rightVT = true; const optRightVT = { showDelay: 0, distanceShow: 1, distanceHide: 50, // relative ↔∏ widthCorrection: 7, animateTime: 0 }; this.tooltipText = "L: toggle left VT\nM: toggle background image\nR: toggle right VT"; const sep = "\u00A0"; const firstAttributes = "\ class chromeclass-toolbar fullscreentoolbar true context toolbar-context-menu pwidth 20 \ customizable true flex 1 iconize large mode icons orient vertical bgimage true".replace(/ /g, sep); const pn = "custombutton.VT2.", pnl = pn + "left", pnr = pn + "right"; const prefs = Application.prefs; if (!prefs.has(pnl)) prefs.setValue(pnl, firstAttributes); if (!prefs.has(pnr)) prefs.setValue(pnr, firstAttributes); const vtlPref = prefs.get(pnl), vtrPref = prefs.get(pnr); function setAttrs(vt) { vt.textContent = ""; var attrs = (vt == vtl ? vtlPref : vtrPref).value.split(sep); for (var i = 0, l = attrs.length - 1; i < l; i += 2) vt.setAttribute(attrs[i], attrs[i + 1]); var currentSet = vt.getAttribute("currentset").split(","); currentSet.forEach(function(id) vt.insertItem(id)); } function saveAttrs(vt) { var pref = vt == vtl ? vtlPref : vtrPref; if (!pref.value) return; pref.value = ""; Array.slice(vt.attributes).forEach(function(attr) { if (attr.name != "width" && attr.name != "height") pref.value += attr.name + sep + attr.value + sep; }); } const idp = "cb-vt"; function n(id) document.getElementById(id); var vtl = n(idp + "-left"), vtlBox = n(idp + "-left-box"); var vtr = n(idp + "-right"), vtrBox = n(idp + "-right-box"); const browser = n("browser"); function createVT(left) { var side = left ? "-left" : "-right" var toolbox = document.createElement("toolbox"); toolbox.id = idp + side + "-box"; toolbox.palette = gNavToolbox.palette; var toolbar = document.createElement("toolbar"); toolbar.id = idp + side; if (left) { vtlBox = browser.insertBefore(toolbox, browser.firstChild); vtl = toolbox.appendChild(toolbar); } else { vtrBox = browser.appendChild(toolbox); vtr = toolbox.appendChild(toolbar); } setAttrs(toolbar); gNavToolbox.externalToolbars.push(toolbar); } function removeButtons(vt) { Array.slice(vt.children).forEach(function(node) { var nn = node.nodeName; if (nn == "toolbarbutton" || nn == "toolbaritem") gNavToolbox.palette.appendChild(node); }); } function removeVT(vt) { removeButtons(vt); gNavToolbox.externalToolbars.forEach(function(et, i, ets) { if (et == vt) ets.splice(i, 1); }); browser.removeChild(vt.parentNode); if (vt == vtl) vtl = null; if (vt == vtr) vtr = null; } function forEachVT(func) { var toolbars = []; if (vtl) toolbars.push(vtl); if (vtr) toolbars.push(vtr); toolbars.forEach(func); } function forEachBtn(func, arg) { var btns = []; var en = Services.ww.getWindowEnumerator(); while(en.hasMoreElements()) { var win = en.getNext(); var btn = win.document.getElementById(self.id); if (btn) btns.push(btn); } btns.forEach(function(btn) { btn[func.name].call(this, arg); }); } function widthCorr(vt) vt.setAttribute("width", parseInt(vt.getAttribute("pwidth")) + vt.opt.widthCorrection); if (leftVT && !vtl) createVT(true); if (!leftVT && vtl) removeVT(vtl); if (rightVT && !vtr) createVT(false); if (!rightVT && vtr) removeVT(vtr); forEachVT(function(vt) { vt.opt = vt == vtl ? optLeftVT : optRightVT; widthCorr(vt); }); function setHeight(box) { box.style.height = box.firstChild.style.height = browser.boxObject.height + "px"; } function onMousemove(e) { var distanceLeft = e.screenX - browser.boxObject.screenX; var distanceRight = browser.boxObject.width - distanceLeft; if (vtl) { vtlBox.show = distanceLeft <= vtl.opt.distanceShow; vtlBox.hide = distanceLeft > vtl.opt.distanceHide + vtlBox.boxObject.width; vt(vtlBox); } if (vtr) { vtrBox.show = distanceRight <= vtr.opt.distanceShow; vtrBox.hide = distanceRight > vtr.opt.distanceHide + vtrBox.boxObject.width; vt(vtrBox); } function vt(box) { var vt = box.firstChild; if (box.show) { if (box.waiting) return; box.waiting = true; setTimeout(function() { box.waiting = false; if (box.hide) return; box.setAttribute("show", true); setHeight(box); }, vt.opt.showDelay); } if (box.hide) { var st = "-" + vt.boxObject.width + "px"; box.style[box == vtlBox ? "left" : "right"] = st; box.removeAttribute("show"); setHeight(box); } } } function mm() onMousemove({ screenX: browser.boxObject.screenX + browser.boxObject.width / 2 }); mm(); function onBeforecustomization() { forEachVT(function(vt) { var st = vt.parentNode.style; st[vt == vtl ? "left" : "right"] = 0; st.position = "static"; vt.removeAttribute("width"); }); } addEventListener("beforecustomization", onBeforecustomization, false, gNavToolbox); function toggleAutohide(e) { var ahBefore, ahAfter; forEachVT(function(vt) { if (vt.hasAttribute("autohide")) ahBefore = true; if (e && !e.button && vt == vtr) return; if (e && e.button == 2 && vt == vtl) return; var box = vt.parentNode; if (vt.hasAttribute("autohide")) { vt.removeAttribute("autohide"); box.style.position = "static"; } else { vt.setAttribute("autohide", true); box.style.position = "fixed"; } saveAttrs(vt); }); forEachVT(function(vt) { if (vt.hasAttribute("autohide")) ahAfter = true; }); var func; if (ahBefore && !ahAfter) func = removeEventListener; if ((!ahBefore || !e) && ahAfter) func = addEventListener; if (func) func("mousemove", onMousemove, false, browser); } toggleAutohide({ button: -1 }), toggleAutohide(); this.onclick = function(e) { if (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) return; if (e.button == 1) { forEachBtn(toggleBackgroundImage, true); return; } if (vtr) e.preventDefault(); forEachBtn(toggleAutohide, e); }; forEachVT(function(vt) { vt.ondblclick = function(e) { var nn = e.target.nodeName; if ( (["toolbar", "toolbarspring", "toolbarspacer", "toolbarseparator"].indexOf(nn) > -1) && !e.button && (e.target.parentNode == this || e.target == this) ) { forEachBtn(toggleAutohide, { button: this == vtl ? 0 : 2 }) mm(); } } }); [setAttrs, removeButtons, forEachVT, widthCorr, toggleAutohide, toggleBackgroundImage] .forEach(function(f) self[f.name] = f); var upd; forEachVT(function(vt) { if (vt.upd) { upd = true; delete vt.upd; } }); if (upd) { var en = Services.ww.getWindowEnumerator(); while(en.hasMoreElements()) { var win = en.getNext(); var btn = win.document.getElementById(this.id); if (!btn || win == window) continue; btn.forEachVT(function(vt) { btn.removeButtons(vt); btn.setAttrs(vt); btn.widthCorr(vt); btn.toggleBackgroundImage(false); }); } } const cssStr = '\ \ toolbar[id^="%idp%"] {\n\ -moz-appearance: none;\n\ border-bottom: 0;\n\ border-top: 0;\n\ }\n\ toolbar[id^="%idp%"] > toolbarseparator,\n\ toolbar[id^="%idp%"] > [id^="wrapper-separator"] {\n\ -moz-appearance: none;\n\ margin: 0.2em 2px;\n\ border-bottom: 1px solid ThreeDHighlight;\n\ border-top: 1px solid ThreeDShadow;\n\ height: 2px;\n\ border-left: none;\n\ border-right: none;\n\ }\n\ toolbar[id^="%idp%"] > toolbarspacer,\n\ toolbar[id^="%idp%"] > [id^="wrapper-spacer"] {\n\ height: 15px;\n\ }\n\ toolbox[id^="%idp%"] {\n\ -moz-appearance: none; border-top: 0;\n\ }\n\ \n\ #%idp%-left-box[show] {\n\ left: 0;\n\ }\n\ #%idp%-left-box {\n\ -moz-transition: left %lefttime%s ease;\n\ }\n\ #%idp%-right-box[show] {\n\ right: 0;\n\ }\n\ #%idp%-right-box {\n\ -moz-transition: right %righttime%s ease;\n\ }\n\ \n\ toolbar[id^="%idp%"][customizing] {\n\ min-width: 20px;\n\ }\n\ toolbar[id^="%idp%"] toolbarpaletteitem {\n\ margin-top: -2px;\n\ margin-bottom: -2px;\n\ border-top: 2px solid transparent;\n\ border-bottom: 2px solid transparent;\n\ border-left-color: transparent;\n\ border-right-color: transparent;\n\ }\n\ toolbar[id^="%idp%"] toolbarpaletteitem[dragover="left"] {\n\ border-top-color: black;\n\ }\n\ toolbar[id^="%idp%"] toolbarpaletteitem[dragover="right"] {\n\ border-bottom-color: black;\n\ }\ ' .replace(/;/g, " !important;") .replace(/%idp%/g, idp) .replace("%lefttime%", optLeftVT.animateTime) .replace("%righttime%", optRightVT.animateTime); const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); const cssURI = makeURI("data:text/css," + encodeURIComponent(cssStr), null, null); if (!sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET); function setBackground(backgroundColor, borderColor) { forEachVT(function(vt) { vt.style.backgroundColor = backgroundColor; var side = vt == vtl ? "Right" : "Left"; vt.style["border" + side] = "1px solid " + borderColor; toggleBackgroundImage(false); }); } function onLWT() { setTimeout(function() { var win = n("main-window"); var backgroundImage = window.getComputedStyle(win).backgroundImage; if (backgroundImage == "none") { var backgroundColor = window.getComputedStyle(win).backgroundColor; var borderColors = backgroundColor.match(/\d+/g).map(function(color) Math.round(color / 1.5)); var borderColor = "rgb(" + borderColors.join(", ") + ")"; setBackground(backgroundColor, borderColor); return; } var url = backgroundImage.replace('url("', "").replace('")', ""); var img = document.createElementNS(xhtmlns, "img"); var canvas = document.createElementNS(xhtmlns, "canvas"); img.src = url; img.onload = function() { var width = canvas.width = img.width; var height = canvas.height = img.height; var context = canvas.getContext("2d"); context.drawImage(img, 0, 0); var arr = context.getImageData(0, 0, width, height).data; var r = 0, g = 0, b = 0; var len = arr.length; for (var i = 0; i < len; i += 4) { r += arr[i]; g += arr[i + 1]; b += arr[i + 2]; } var colors = [r, g, b]; var backgroundColors = colors.map(function(color) Math.round(4 * color / len)); var borderColors = backgroundColors.map(function(color) Math.round(color / 1.5)); var backgroundColor = "rgb(" + backgroundColors.join(", ") + ")"; var borderColor = "rgb(" + borderColors.join(", ") + ")"; setBackground(backgroundColor, borderColor); } }, 200); } onLWT(); function toggleBackgroundImage(toggle) { forEachVT(function(vt) { var st = vt.style; if (vt.hasAttribute("bgimage") - !toggle) { vt.removeAttribute("bgimage"); st.backgroundImage = ""; } else { vt.setAttribute("bgimage", true); st.backgroundImage = n("main-window").style.backgroundImage; } saveAttrs(vt); }); } toggleBackgroundImage(false); const observer = { observe: onLWT }; const topic = "lightweight-theme-styling-update"; Services.obs.addObserver(observer, topic, false); this.onDestroy = function(reason) { try { Services.obs.removeObserver(observer, topic) } catch(ex) {} if (reason == "update" || reason == "delete") { if (sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.unregisterSheet(cssURI, sss.USER_SHEET); } if (reason == "constructor") { forEachVT(function(vt) { vt.removeAttribute("width"); vt.setAttribute("pwidth", Math.max(vt.boxObject.width, 20)); saveAttrs(vt); vt.upd = true; }); } if (reason == "delete") { forEachVT(function(vt) removeVT(vt)); if (custombuttons.confirmBox("VT2", "Reset prefs ?", "Yes", "No")) { vtlPref.reset(); vtrPref.reset(); } } };
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
difabor
Была кнопка VT2, панели появлялись и справа и слева, но она перестала работать в новых версиях, может удастся исправить.
Вы знаете, villa7, а ведь иметь два вертикальных тулбара рядом имхо даже удобнее...
Не надо думать - какие кнопки слева, какие справа. Выскакивают они вместе - создаётся впечатление одного широкого...
Я, конечно, подумаю как сделать открытие справа (для спортивного интереса), но так даже лучше.
Я бы вообще подумал бы над тем, как размешать в одну строку несколько кнопок на широком VT.
Тогда кнопки можно было бы группировать по 2-3 в один ряд - была бы лучшая организация кнопок - каждый ряд имел бы некое семантическое значение.
Но это мне пока не по зубам...
Отредактировано difabor (01-10-2017 00:56:43)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Господа здравствуйте, есть такая кнопка SONCO Timer можно сделать чтоб она отображала кириллицу? Спасибо.
'use strict'; var {classes: Cc, interfaces: Ci, utils: Cu} = Components, helpCSS = encodeURIComponent(this.Help); Cu.import("resource://gre/modules/Timer.jsm"); const sound = Cc['@mozilla.org/sound;1'].getService(Ci.nsISound), aFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile), as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService), ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService), sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService), wm = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getMostRecentWindow; pref.root = 'extensions.custombuttons.soncoTimer' + this.id.match(/\d+/) + '.'; pref.defaults = { alertCancel: 'Do you wish to cancel the alert?', alertEmpty: 'Alert message', alertHour: 0, alertIcon: 'https://raw.githubusercontent.com/srazzano/Images/master/Aalarm.gif', alertLabel: 'Change Alert Icon', alertTerminatedIcon: 'https://raw.githubusercontent.com/srazzano/Images/master/Aclock1-48.png', alertMinute: 0, alertNo: 'No', alertSecond: 0, alertTerminated: 'Alert Terminated', alertTitle: 'Alert Notification', alertYes: 'Yes', am: 'AM', audio: true, audioFile: 'Sound', audioLabel: 'Play Sound File', cancel: 'Cancel', clear: 'Clear Message Field', close: 'Close', countdown: 0, editPreset: 'Edit Presets', getFile: 'Get Sound File', getIcon: 'Change Toolbarbutton Icon', hours: 12, hour12Label: '12hr', hour24Label: '24hr', hrLabel: 'Hrs', image: 'https://raw.githubusercontent.com/srazzano/Images/master/Aclock1-16.png', imageLabel: 'Change Button Icon', message: '', messageLabel: 'Message:', minLabel: 'Min', pm: 'PM', posAlertLeft: 200, posAlertTop: 200, posEditLeft: 200, posEditTop: 200, posTimerLeft: 200, posTimerTop: 200, preset1: 'Preset Message 1', preset2: 'Preset Message 2', preset3: 'Preset Message 3', preset4: 'Preset Message 4', preset5: 'Preset Message 5', presetLabel1: 'Preset 1', presetLabel2: 'Preset 2', presetLabel3: 'Preset 3', presetLabel4: 'Preset 4', presetLabel5: 'Preset 5', reset1: 'Clear Hrs Field', reset2: 'Clear Min Field', reset3: 'Clear Sec Field', repeat: 'Repeat', secLabel: 'Sec', showTime: true, showTimeLabel: 'Show Current Time', soundFile: 'C:\\Windows\\Media\\notify.wav', soundFileLabel: 'Sound File', startTimer: 'Start Timer', timer: 'Duration:', timerNotSet: 'Timer not set', timerTitle: 'Timer Notification', timerWarning: 'https://raw.githubusercontent.com/srazzano/Images/master/Aalarm2-64.png', timestart: '', tt1: 'Left-click to set timer', tt2: 'Middle-click to terminate the timer', tt3: 'Hover to view remainig time when active', tt4: 'SONCO Timer remaining time', urlbar: false, urlbarLabel: 'In Urlbar' } for (let key in pref.defaults) { if (pref.defaults.hasOwnProperty(key)) { let val = pref.defaults[key]; switch (typeof val) { case 'boolean': Services.prefs.getDefaultBranch(pref.root).setBoolPref(key, val); break; case 'number': Services.prefs.getDefaultBranch(pref.root).setIntPref(key, val); break; case 'string': let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString); str.data = val; Services.prefs.getDefaultBranch(pref.root).setComplexValue((key), Ci.nsISupportsString, str); break; } } } pref.observe = function(prefs, callback) { let {root} = pref; function observe(subject, topic, data) { if (topic !== 'nsPref:changed') return; let pref = data.slice(root.length); if (prefs.indexOf(pref) === -1) return; callback(pref); } Services.prefs.addObserver(root, observe, false); unload => Services.prefs.removeObserver(root, observe); } var gRoot = Services.prefs.getBranch(pref.root), alertTimer = 0, dialog, curTime, remTime; function pref(key) { let {branch, defaults} = pref; if (branch == null) branch = Services.prefs.getBranch(pref.root); switch (typeof defaults[key]) { case 'boolean': return branch.getBoolPref(key); case 'number': return branch.getIntPref(key); case 'string': return branch.getCharPref(key); } return null; } function getSS(filepath) { return ios.newURI('data:text/css,' + filepath, null, null) } function loadSheet(filepath) { sss.loadAndRegisterSheet(getSS(filepath), sss.AGENT_SHEET) } function unloadSheet(filepath) { let uri = getSS(filepath); if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) sss.unregisterSheet(uri, sss.AGENT_SHEET); } function getCurrentTime() { if (pref('showTime')) { var today = new Date(), h = today.getHours(), m = today.getMinutes(), s = today.getSeconds(), ampm = ''; m = checkCurrentTime(m); s = checkCurrentTime(s); if (pref('hours') === 12) { ampm = (h < 12) ? pref('am') : pref('pm'); if (h > 12) {h = h - 12;} if (h === 0) {h = 12;} } if (wm('sonco:timer')) var mrw = wm('sonco:timer'); else var mrw = wm('sonco:alert'); mrw.document.getElementById('time').value = h + ':' + m + ':' + s + ' ' + ampm; } } function checkCurrentTime(i) { if (i < 10) {i = '0' + i}; return i; } function formatTimeDuration(millisec) { var seconds = (millisec / 1000).toFixed(0), minutes = Math.floor(seconds / 60), hours = ''; if (minutes > 59) { hours = Math.floor(minutes / 60); minutes = minutes - (hours * 60); } minutes = (minutes >= 10) ? minutes : '0' + minutes; seconds = Math.floor(seconds % 60); seconds = (seconds >= 10) ? seconds : '0' + seconds; if (hours != '') return hours + ':' + minutes + ':' + seconds; return '0:' + minutes + ':' + seconds; } function remainingTime() { if (pref('countdown')) { var val = Date.now() - pref('timestart'), diff = getTimerDuration() - parseInt(val), mrw = wm('sonco:timer'), mrd = wm('navigator:browser'); mrd.document.getElementById('sonco-time-remaining').value = formatTimeDuration(diff); mrw.document.getElementById('remaining').value = formatTimeDuration(diff); } else mrw.document.getElementById('remaining').value = ''; } function getTimerDuration() { var a = pref('alertHour'), h = a * 3600000, b = pref('alertMinute'), m = b * 60000, c = pref('alertSecond'), s = c * 1000; return h + m + s; } this.image = pref('image'); this.tooltipText = this.label + '\n\u2022 ' + pref('tt1') + '\n\u2022 ' + pref('tt2'); loadSheet(helpCSS); this.onclick = function(e) { if (e.button == 0) { if (wm('sonco:timer')) { wm('sonco:timer').focus(); return; } this.onTimer(); } if (e.button === 1) { if (wm('sonco:alert')) wm('sonco:alert').close(); if (wm('sonco:timer')) wm('sonco:timer').close(); var el = document.getElementById('sonco-time-remaining'), mra = wm('sonco:alert'), mrt = wm('sonco:timer'); if (pref('countdown')) as.showAlertNotification(pref('alertTerminatedIcon'), pref('alertTitle'), pref('alertTerminated'), false, '', null); gRoot.setIntPref('countdown', 0); gRoot.setCharPref('timestart', ''); el.parentNode.removeChild(el); clearInterval(curTime); clearInterval(remTime); alertTimer = 0; } } this.onAlert = function() { if (pref('countdown') === 0) return; var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\ <window xmlns="' + xulns + '" windowtype="sonco:alert" id="soncoAlert" title="' + pref("alertTitle") + '" \ minwidth="300" onload="self.onAlertLoad(this)" onclose="self.onAlertClose(this)">\ <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\ <hbox id="hbox1" class="hbox" align="center">\ <vbox id="vbox1">\ <textbox id="time" class="textbox"/>\ <hbox id="image-container" pack="center">\ <image id="alertImage" src="' + pref("alertIcon") + '"/>\ </hbox>\ </vbox>\ <textbox id="alertMessage" class="textbox" value="' + pref("message") + '" multiline="true" rows="4" flex="1"/>\ </hbox>\ <hbox id="buttonGroup" class="hbox" align="center">\ <button id="alertIcon" class="button" label="' + pref("alertLabel") + '" oncommand="self.onButton(this)"/>\ <spacer id="alert-spacer" flex="1"/>\ <button id="repeat" class="button" label="' + pref("repeat") +'" oncommand="self.onButton(this); close()"/>\ </hbox>\ </window>'; data = data.replace(/self/g, 'opener.document.getElementById("' + self.id + '")'); var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data); dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable'); } this.onAlertLoad = function(e) { var mrw = wm('navigator:browser'); mrw.document.getElementById(self.id).hidden = false; e.document.getElementById('time').hidden = !pref('showTime'); gRoot.setIntPref('countdown', 0); gRoot.setCharPref('timestart', ''); e.moveTo(pref('posAlertLeft'), pref('posAlertTop')); wm('sonco:timer').close() alertTimer = 0; clearInterval(remTime); if (pref("showTime")) curTime = setInterval(getCurrentTime, 200); else clearInterval(curTime); e.removeAttribute('height'); e.sizeToContent(); } this.onAlertClose = function(e) { gRoot.setIntPref("posAlertLeft", e.screenX); gRoot.setIntPref("posAlertTop", e.screenY); clearInterval(curTime); } this.onButton = function(e) { switch (e.id) { case 'audioFile': var mrw = wm('sonco:timer'), fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker); fp.init(window, null, fp.modeOpen); fp.appendFilters(fp.filterAudio); if (fp.show() != fp.returnCancel) { var file = fp.fileURL.spec.replace('file:///', '').replace(/\//g, '\\').replace(/%20/g, ' '); gRoot.setCharPref('soundFile', file); e.nextSibling.value = file; } mrw.focus(); break; case 'image': case 'alertIcon': if (e.id === 'image') var mrw = wm('sonco:timer'); else var mrw = wm('sonco:alert'); var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker); fp.init(window, null, fp.modeOpen); fp.appendFilters(fp.filterImages); if (fp.show() != fp.returnCancel) { var url = fp.fileURL.spec; gRoot.setCharPref(e.id, url); if (e.id === 'image') { e.nextSibling.src = url; wm('navigator:browser').document.getElementById(this.id).image = pref('image'); } if (e.id === 'alertIcon') { var mrw = wm('sonco:alert'); mrw.document.getElementById('alertImage').src = pref('alertIcon'); } } mrw.focus(); break; case 'startTimer': var mrw = wm('sonco:timer'); this.onStartTimer(); mrw.close(); break; case 'repeat': this.onStartTimer(); break; case 'preset1': case 'preset2': case 'preset3': case 'preset4': case 'preset5': var mrw = wm('sonco:timer'); mrw.document.getElementById('message').value = pref(e.id); gRoot.setCharPref('message', mrw.document.getElementById('message').value); break; case 'reset1': case 'reset2': case 'reset3': var mrw = wm('sonco:timer'); e.previousSibling.value = ''; e.previousSibling.select(); break; case 'clear': var mrw = wm('sonco:timer'); mrw.document.getElementById('message').value = ''; mrw.document.getElementById('message').select(); gRoot.setCharPref('message', ''); break; case 'editPreset': this.onEdit(); break; } } this.onCheckbox = function(e) { gRoot.setBoolPref(e.id, pref(e.id) !== false ? false : true); if (e.id === 'url') { var mrw = wm('navigator:browser'), textbox = mrw.document.getElementById('sonco-time-remaining'); mrw.document.removeElement(tetbox); } if (e.id === 'showTime') { var mrt = wm('sonco:timer'); mrt.document.getElementById('time').hidden = !pref('showTime'); if (pref('showTime')) curTime = setInterval(getCurrentTime, 200); else clearInterval(curTime); e.nextSibling.disabled = !pref('showTime'); } } this.onDestroy = function(reason) { if (reason === 'delete') { clearInterval(curTime); clearInterval(remTime); unloadSheet(this.Help); } } this.onEdit = function() { if (wm('sonco:edit')) { wm('sonco:edit').focus(); return; } var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\ <window xmlns="' + xulns + '" windowtype="sonco:edit" id="soncoEdit" title="' + pref("editPreset") + '" \ minwidth="445" onload="self.onEditLoad(this)" onclose="self.onEditClose(this)" persist="width height screenX screenY">\ <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\ <hbox id="hbox1" class="hbox" align="center">\ <label class="label" value="' + pref("presetLabel1") + '"/>\ <textbox id="preset1" class="textbox" value="' + pref("preset1") + '" multiline="true" rows="1" flex="1" \ oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\ </hbox>\ <hbox id="hbox2" class="hbox" align="center">\ <label class="label" value="' + pref("presetLabel2") + '"/>\ <textbox id="preset2" class="textbox" value="' + pref("preset2") + '" multiline="true" rows="1" flex="1" \ oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\ </hbox>\ <hbox id="hbox3" class="hbox" align="center">\ <label class="label" value="' + pref("presetLabel3") + '"/>\ <textbox id="preset3" class="textbox" value="' + pref("preset3") + '" multiline="true" rows="1" flex="1" \ oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\ </hbox>\ <hbox id="hbox4" class="hbox" align="center">\ <label class="label" value="' + pref("presetLabel4") + '"/>\ <textbox id="preset4" class="textbox" value="' + pref("preset4") + '" multiline="true" rows="1" flex="1" \ oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\ </hbox>\ <hbox id="hbox5" class="hbox" align="center">\ <label class="label" value="' + pref("presetLabel5") + '"/>\ <textbox id="preset5" class="textbox" value="' + pref("preset5") + '" multiline="true" rows="1" flex="1" \ oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\ </hbox>\ </window>'; data = data.replace(/self/g, 'opener.document.getElementById("' + self.id + '")'); var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data); dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable'); dialog.focus(); } this.onEditLoad = function(e) { e.moveTo(pref("posEditLeft"), pref("posEditTop")) } this.onEditClose = function(e) { gRoot.setIntPref("posEditLeft", e.screenX); gRoot.setIntPref("posEditTop", e.screenY); wm('sonco:timer').close(); this.onTimer(); } this.onRadio = function(e) { gRoot.setIntPref(e.id, e.value) } this.onRemaining = function(e) { if (e === 0) self.onTimer(); if (e === 1) { var mrw = wm('navigator:browser'), mrd = wm('sonco:timer'), toolbar = mrw.document.getElementById('sonco-time-remaining'); as.showAlertNotification(pref('alertTerminatedIcon'), pref('alertTitle'), pref('alertTerminated'), false, '', null); toolbar.parentNode.removeChild(toolbar); mrw.document.getElementById(self.id).hidden = false; gRoot.setIntPref('countdown', 0); gRoot.setCharPref('timestart', ''); mrd.close(); clearInterval(curTime); clearInterval(remTime); alertTimer = 0; } } this.onRemoveTime = function() { var mrw = wm('navigator:browser'), mrt = wm('sonco:timer'); if (pref('urlbar')) var toolbar = mrw.document.getElementById('urlbar'); else { var toolbar = mrw.document.getElementById(this.parentNode.id) mrw.document.getElementById(self.id).hidden = false; } toolbar.removeChild(document.getElementById('sonco-time-remaining')); mrt.document.getElementById('remaining').value = ''; } this.onStartTimer = function() { if (!getTimerDuration()) { as.showAlertNotification(pref('timerWarning'), pref('timerTitle'), pref('timerNotSet'), false, '', null); return; } var start = new Date(), mrw = wm('navigator:browser'), tbIcon = mrw.document.getElementById(self.id), textbox = mrw.document.createElement('textbox'); gRoot.setIntPref('countdown', getTimerDuration()); gRoot.setCharPref('timestart', start.getTime()); textbox.id = 'sonco-time-remaining'; textbox.tooltipText = pref('tt4') + '\n\u2022 ' + pref('tt1') + '\n\u2022 ' + pref('tt2'); textbox.onclick = function(e){self.onRemaining(e.button);} if (pref('urlbar')) { var toolbar = mrw.document.getElementById('urlbar'); toolbar.appendChild(textbox); tbIcon.hidden = false; } else { var toolbar = mrw.document.getElementById(self.parentNode.id); toolbar.insertBefore(textbox, self.nextSibling); tbIcon.hidden = true; } remTime = setInterval(remainingTime, 200); alertTimer = setTimeout(function() { if (pref('audio') && pref('soundFile')) { var file = pref('soundFile').replace('file:///', '').replace(/\//g, '\\'); aFile.initWithPath(file); sound.play(ios.newFileURI(aFile)); } toolbar.removeChild(textbox); self.onAlert(); }, getTimerDuration()); } this.onTextbox = function(e) { if (e.id.match('alert')) { var mrw = wm('navigator:browser'); e.value = e.value.replace(/[^\d+]/g, ''); gRoot.setIntPref(e.id, e.value); mrw.document.getElementById(self.id).hidden = false; gRoot.setIntPref('countdown', 0); gRoot.setCharPref('timestart', ''); alertTimer = 0; } else { gRoot.setCharPref(e.id, e.value); gRoot.setCharPref('message', e.value); } } this.onTimer = function() { var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\ <window xmlns="' + xulns + '" windowtype="sonco:timer" id="soncoTimer" title="' + this.label + '" \ onload="self.onTimerLoad(this)" onclose="self.onTimerClose(this)">\ <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\ <hbox id="hbox1" class="hbox" align="center">\ <label id="timer" class="caption" value="' + pref("timer") + '"/>\ <textbox id="alertHour" class="integer" value="' + pref("alertHour") + '" oninput="self.onTextbox(this)" \ onmousedown="self.onRemoveTime()"/>\ <button id="reset1" class="reset button" label="' + pref("hrLabel") + '" tooltiptext="' + pref("reset1") + '" \ oncommand="self.onButton(this)"/>\ <textbox id="alertMinute" class="integer" value="' + pref("alertMinute") + '" oninput="self.onTextbox(this)" \ onmousedown="self.onRemoveTime()"/>\ <button id="reset2" class="reset button" label="' + pref("minLabel") + '" tooltiptext="' + pref("reset2") + '" \ oncommand="self.onButton(this)"/>\ <textbox id="alertSecond" class="integer" value="' + pref("alertSecond") + '" oninput="self.onTextbox(this)" \ onmousedown="self.onRemoveTime()"/>\ <button id="reset3" class="reset button" label="' + pref("secLabel") + '" tooltiptext="' + pref("reset3") + '" \ oncommand="self.onButton(this)"/>\ <textbox id="time" class="textbox"/>\ <textbox id="remaining" class="textbox"/>\ </hbox>\ <hbox id="hbox2" class="hbox" align="center">\ <label id="messageLabel" class="caption" value="' + pref("messageLabel") + '"/>\ <button id="preset1" class="preset" label="' + pref("presetLabel1") + '" tooltiptext="' + pref("preset1") + '" \ oncommand="self.onButton(this)"/>\ <button id="preset2" class="preset" label="' + pref("presetLabel2") + '" tooltiptext="' + pref("preset2") + '" \ oncommand="self.onButton(this)"/>\ <button id="preset3" class="preset" label="' + pref("presetLabel3") + '" tooltiptext="' + pref("preset3") + '" \ oncommand="self.onButton(this)"/>\ <button id="preset4" class="preset" label="' + pref("presetLabel4") + '" tooltiptext="' + pref("preset4") + '" \ oncommand="self.onButton(this)"/>\ <button id="preset5" class="preset" label="' + pref("presetLabel5") + '" tooltiptext="' + pref("preset5") + '" \ oncommand="self.onButton(this)"/>\ <spacer id="spacer1" class="spacer" flex="1"/>\ <button id="clear" class="button" tooltiptext="' + pref("clear") + '" \ oncommand="self.onButton(this)"/>\ </hbox>\ <hbox id="hbox3" class="hbox" align="center">\ <textbox id="message" class="textbox" value="' + pref("message") + '" oninput="self.onTextbox(this)" \ multiline="true" rows="1" flex="1" placeholder="' + pref("alertEmpty") + '"/>\ </hbox>\ <hbox id="hbox4" class="hbox" align="center">\ <button id="audioFile" class="button" label="' + pref("audioFile") + '" tooltiptext="' + pref("getFile") + '" \ oncommand="self.onButton(this)"/>\ <textbox id="soundFile" class="textbox" flex="1" value="' + pref("soundFile") + '" placeholder="' + pref("soundFileLabel") + '"/>\ </hbox>\ <hbox id="hbox5" class="hbox" align="center">\ <checkbox id="urlbar" class="checkbox" label="' + pref("urlbarLabel") + '" checked="' + pref("urlbar") + '" \ oncommand="self.onCheckbox(this)"/>\ <checkbox id="audio" class="checkbox" label="' + pref("audioLabel") + '" checked="' + pref("audio") + '" \ oncommand="self.onCheckbox(this)"/>\ <checkbox id="showTime" class="checkbox" label="' + pref("showTimeLabel") + '" checked="' + pref("showTime") + '" \ oncommand="self.onCheckbox(this)"/>\ <radiogroup id="hours" value="' + pref("hours") + '" orient="horizontal" onclick="self.onRadio(this)">\ <radio id="hour12" class="radio" label="' + pref("hour12Label") + '" value="12"/>\ <radio id="hour24" class="radio" label="' + pref("hour24Label") + '" value="24"/>\ </radiogroup>\ </hbox>\ <hbox id="buttonGroup" class="hbox" align="center">\ <button id="image" class="button" label="' + pref("imageLabel") + '" tooltiptext="' + pref("getIcon") + '" \ oncommand="self.onButton(this)"/>\ <image id="imageIcon" src="' + pref("image") + '"/>\ <spacer id="spacer2" class="spacer" flex="1"/>\ <button id="editPreset" class="button" label="' + pref("editPreset") + '" oncommand="self.onButton(this)"/>\ <button id="startTimer" class="button" label="' + pref("startTimer") + '" oncommand="self.onButton(this)"/>\ </hbox>\ </window>'; data = data.replace(/self/g, 'opener.document.getElementById("' + self.id + '")'); var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data); dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable'); dialog.focus(); } this.onTimerLoad = function(e) { e.moveTo(pref("posTimerLeft"), pref("posTimerTop")); if (pref('showTime')) curTime = setInterval(getCurrentTime, 200); else clearInterval(curTime); e.document.getElementById('time').hidden = !pref('showTime'); e.document.getElementById('hours').disabled = !pref('showTime'); if (pref('countdown')) { remTime = setInterval(remainingTime, 200); e.document.getElementById('remaining').style.display = '-moz-box'; } else { clearInterval(remTime); e.document.getElementById('remaining').value= ''; e.document.getElementById('remaining').style.display = 'none'; } } this.onTimerClose = function(e) { gRoot.setIntPref("posTimerLeft", e.screenX); gRoot.setIntPref("posTimerTop", e.screenY); clearInterval(curTime); clearInterval(remTime); } // BUTTON ATTRIBUTES // Name: SONCO Timer // Author: Sonny Razzano a.k.a. srazzano // Updated: Oct 15, 2017 // Download: https://sonco.synthasite.com/custom-buttons-%E2%96%BA.php // Discussion: http://custombuttons.sourceforge.net/forum/viewtopic.php?f=4&t=866
Отсутствует