назначить на один из Ctrl открытие старого во вкладке
Так?
(async ( id = "ucf-open-about-config", label = "about:config", tooltiptext = "ЛКМ: Открыть about:config\nShift+ЛКМ: Искать содержимое буфера обмена в about:config\nCtrl+ЛКМ: Искать содержимое буфера обмена в about:cfg\nСКМ: Открыть about:cfg\nПКМ: Открыть окно about:cfg\nShift+ПКМ: Искать выделенное в about:config\nCtrl+ПКМ: Искать выделенное в about:cfg\nAlt+ПКМ: Искать выделенное в окне about:cfg", img = "chrome://user_chrome_files/content/vertical_top_bottom_bar/svg/about-config-16.svg", aboutoldurl = "about:cfg", about_config = { get clipboardHelp() { delete this.clipboardHelp; return this.clipboardHelp = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); }, readFromClipboard(win) { var url = ""; try { var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable); trans.init(win.docShell.QueryInterface(Ci.nsILoadContext)); trans.addDataFlavor("text/unicode"); var clipboard = Services.clipboard; clipboard.getData(trans, clipboard.kGlobalClipboard); var data = {}; trans.getTransferData("text/unicode", data, {}); if (data.value) { data = data.value.QueryInterface(Ci.nsISupportsString); url = data.data; } } catch (ex) {} return url; }, openClipboardConfigTab(win, clip = "", copy, url = "about:config") { var filter = this.readFromClipboard(win), nowarn = false, pref = url === "about:config" ? "browser.aboutConfig.showWarning" : "general.warnOnAboutConfig"; if (copy && clip != filter) this.clipboardHelp.copyString(clip); if (Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } var browser = win.gBrowser.getBrowserForTab(win.gBrowser.selectedTab = this.addTab(win, url)); browser.addEventListener("pageshow", e => { var doc = e.target; var input = doc && doc.querySelector("input#about-config-search, search-textbox#textbox"); if (input && filter) { input.value = filter; input.focus(); input.dispatchEvent(new doc.defaultView.Event("input", { bubbles: true })); } if (nowarn) win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); }, { once: true }); }, openSelectedConfig(win, url, oldwin) { var clip = this.readFromClipboard(win); win.goDoCommand("cmd_copy"); win.setTimeout(() => { if (!oldwin) this.openClipboardConfigTab(win, clip, true, url); else this.openOldConfigWin(win, clip, true); }, 100); }, addTab(win, url, params = {}) { params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); params.index = win.gBrowser.selectedTab._tPos + 1; return win.gBrowser.addTab(url, params); }, get configoldurl() { delete this.configoldurl; var mod = Cc[`@mozilla.org/network/protocol/about;1?what=${aboutoldurl.split(":")[1]}`].getService(Ci.nsIAboutModule); var url; try { url = mod.getChromeURI(Services.io.newURI(aboutoldurl)).spec; } catch (e) { url = mod.wrappedJSObject.uri?.spec; } return this.configoldurl = url || aboutoldurl; }, async openOldConfigWin(win, clip = "", copy) { var filter, input; if (copy) { filter = this.readFromClipboard(win); if (clip != filter) this.clipboardHelp.copyString(clip); } var type = "Preferences:ConfigManager", id = "config"; var _win = Services.wm.getMostRecentWindow(type); if (!_win) { let nowarn = false, pref = "general.warnOnAboutConfig"; if (copy && Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } let url = this.configoldurl; let xs = Services.xulStore; let sx = xs.getValue(url, id, "screenX"); let sy = xs.getValue(url, id, "screenY"); let wh = xs.getValue(url, id, "width"); let ht = xs.getValue(url, id, "height"); let sm = xs.getValue(url, id, "sizemode"); let features = `chrome,dialog=no,resizable,${sx && sy ? `screenX=${sx !== "0" ? sx : "1"},screenY=${sy !== "0" ? sy : "1"}` : "centerscreen"}${wh && ht ? `,width=${wh},height=${ht}` : ""}`; _win = win.openDialog(url, type, features); await new Promise(resolve => { _win.windowRoot.addEventListener("DOMContentLoaded", () => { _win.windowRoot.addEventListener("MozUpdateWindowPos", () => { if (sm === "maximized") _win.maximize(); }, { once: true, capture: true }); resolve(); }, { once: true }); }); if (copy && nowarn) _win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); } var doc = _win.document; var docEl = doc.documentElement; docEl.setAttribute("windowtype", type); docEl.id = id; docEl.setAttribute("persist", "screenX screenY width height sizemode"); _win.focus(); if (!copy || !(input = doc.querySelector("search-textbox#textbox"))) return; input.value = filter; input.focus(); input.dispatchEvent(new _win.Event("input", { bubbles: true })); }, }) => { CustomizableUI.createWidget({ id: id, type: "custom", label: label, tooltiptext: tooltiptext, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onBuild(doc) { var win = doc.defaultView; var trbn = doc.createXULElement("toolbarbutton"); trbn.id = id; trbn.className = "toolbarbutton-1 chromeclass-toolbar-additional"; trbn.setAttribute("label", label); trbn.setAttribute("context", ""); trbn.setAttribute("tooltiptext", tooltiptext); trbn.style.setProperty("list-style-image", `url("${img}")`, "important"); trbn.addEventListener("click", e => { if (e.button == 0) { if (e.shiftKey) about_config.openClipboardConfigTab(win); else if (e.getModifierState("Accel")) about_config.openClipboardConfigTab(win, "", false, aboutoldurl); else win.gBrowser.selectedTab = about_config.addTab(win, "about:config"); } else if (e.button == 1) win.gBrowser.selectedTab = about_config.addTab(win, aboutoldurl); else if (e.button == 2) { e.preventDefault(); e.stopPropagation(); if (e.shiftKey) about_config.openSelectedConfig(win); else if (e.getModifierState("Accel")) about_config.openSelectedConfig(win, aboutoldurl); else if (e.altKey) about_config.openSelectedConfig(win, undefined, true); else about_config.openOldConfigWin(win); } }); return trbn; } }); })();
Отредактировано Vitaliy V. (18-10-2021 14:08:48)
Отсутствует
Так?
А можете сделать вариант, чтоб остались только пункты для about:cfg? А то кнопка получилась сильно перегруженной, труднее выбирать, а все необходимое для about:config есть уже в кнопке в Add Toolbar Buttons
Отсутствует
как через userChrome.css уменьшить расстояние между иконками на панели навигации в 93 ?
так, понятно, Vitaliy V. может я неправильно сформулировал, тогда подскажите код, который регулирует их горизонтальное размещение в оной панели? (сам покопаюсь) ...
UPD. вот этот
#nav-bar-customization-target > .toolbarbutton-1 > .toolbarbutton-icon{margin-right: -1px !important; margin-left: -1px !important;}
работал в 85 , а в 93 не работает ...
Отредактировано ALEX_45_ORP (18-10-2021 06:28:56)
Win 10х64
Отсутствует
Возможно модифицировать плеер который используется в функции "Картинка в картинке" через userChrome.css
Добавив функционалу кнопки громкости и перемотки.
Отредактировано f480185 (18-10-2021 09:30:29)
Отсутствует
может я неправильно сформулировал
А чего тут формулировать, понятно всё, просто не забывайте пользоваться поиском https://forum.mozilla-russia.org/viewto … 00#p793900
Это есть практически в каждом коде для компактности Протона https://forum.mozilla-russia.org/viewto … 22#p790422
Отсутствует
sandro79 привет, ничего не помогло ... цифры менял разные, никаких результатов, как будто и нет этих кодов в userChrome.css.
ЗЫ. почитал материал по ссылкам - меня интересует код только для компактного режима значков.
Отредактировано ALEX_45_ORP (18-10-2021 10:44:20)
Win 10х64
Отсутствует
ALEX_45_ORP
:root { --toolbarbutton-outer-padding: 1px !important; /* внешний отступ между кнопками */ --toolbarbutton-inner-padding: 4px !important; /* внутренний отступ иконки от границ кнопки */ }
Отсутствует
_zt
этот код действует только на вертикальное регулирование, а мне надо горизонтальное панели навигации в компактном режиме значков ...
Win 10х64
Отсутствует
Так?
Ну почти.
// Этот скрипт можно использовать для создания кнопок с помощью CustomizableUI.createWidget // Отдельная кнопка about:config с альт.управлением и открытием "about:cfg" от Vitaliy V. // https://forum.mozilla-russia.org/viewtopic.php?pid=795555#p795555 (async ( id = "ucf-open-about-config", label = "about:config", tooltiptext = " ЛКМ : Открыть about:config\n Ctrl+ЛКМ : Искать выделенное / буфер в about:config\nShift+ЛКМ : Открыть окно about:cfg\n ПКМ : Открыть вкладку about:cfg\n Ctrl+ПКМ : Искать выделенное / буфер во вкладке about:cfg\nShift+ПКМ : Искать выделенное / буфер в окне about:cfg", aboutoldurl = "about:cfg", about_config = { get clipboardHelp() { delete this.clipboardHelp; return this.clipboardHelp = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); }, readFromClipboard(win) { var url = ""; try { var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable); trans.init(win.docShell.QueryInterface(Ci.nsILoadContext)); trans.addDataFlavor("text/unicode"); var clipboard = Services.clipboard; clipboard.getData(trans, clipboard.kGlobalClipboard); var data = {}; trans.getTransferData("text/unicode", data, {}); if (data.value) { data = data.value.QueryInterface(Ci.nsISupportsString); url = data.data; } } catch (ex) {} return url; }, openClipboardConfigTab(win, clip = "", copy, url = "about:config") { var filter = this.readFromClipboard(win), nowarn = false, pref = url === "about:config" ? "browser.aboutConfig.showWarning" : "general.warnOnAboutConfig"; if (copy && clip != filter) this.clipboardHelp.copyString(clip); if (Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } var browser = win.gBrowser.getBrowserForTab(win.gBrowser.selectedTab = this.addTab(win, url)); browser.addEventListener("pageshow", e => { var doc = e.target; var input = doc && doc.querySelector("input#about-config-search, search-textbox#textbox"); if (input && filter) { input.value = filter; input.focus(); input.dispatchEvent(new doc.defaultView.Event("input", { bubbles: true })); } if (nowarn) win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); }, { once: true }); }, openSelectedConfig(win, url, oldwin) { var clip = this.readFromClipboard(win); win.goDoCommand("cmd_copy"); win.setTimeout(() => { if (!oldwin) this.openClipboardConfigTab(win, clip, true, url); else this.openSelectedOldConfigWin(win, clip); }, 100); }, addTab(win, url, params = {}) { params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); params.index = win.gBrowser.selectedTab._tPos + 1; return win.gBrowser.addTab(url, params); }, get configoldurl() { delete this.configoldurl; let mod = Cc[`@mozilla.org/network/protocol/about;1?what=${aboutoldurl.split(":")[1]}`].getService(Ci.nsIAboutModule); let url; try { url = mod.getChromeURI(Services.io.newURI(aboutoldurl)).spec; } catch (e) { url = mod.wrappedJSObject.uri?.spec; } return this.configoldurl = url || aboutoldurl; }, async openSelectedOldConfigWin(win, clip) { var filter = this.readFromClipboard(win); if (clip != filter) this.clipboardHelp.copyString(clip); var type = "Preferences:ConfigManager", id = "config"; var _win = Services.wm.getMostRecentWindow(type); if (!_win) { let nowarn = false, pref = "general.warnOnAboutConfig"; if (Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } let url = this.configoldurl; let xs = Services.xulStore; let sx = xs.getValue(url, id, "screenX"); let sy = xs.getValue(url, id, "screenY"); let wh = xs.getValue(url, id, "width"); let ht = xs.getValue(url, id, "height"); let sm = xs.getValue(url, id, "sizemode"); let features = `chrome,dialog=no,resizable,${sx && sy ? `screenX=${sx !== "0" ? sx : "1"},screenY=${sy !== "0" ? sy : "1"}` : "centerscreen"}${wh && ht ? `,width=${wh},height=${ht}` : ""}`; _win = win.openDialog(url, type, features); await new Promise(resolve => { _win.windowRoot.addEventListener("DOMContentLoaded", () => { _win.windowRoot.addEventListener("MozUpdateWindowPos", () => { if (sm === "maximized") _win.maximize(); }, { once: true, capture: true }); resolve(); }, { once: true }); }); if (nowarn) _win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); } var doc = _win.document; var docEl = doc.documentElement; docEl.setAttribute("windowtype", type); docEl.id = id; docEl.setAttribute("persist", "screenX screenY width height sizemode"); _win.focus(); var input = doc.querySelector("search-textbox#textbox"); if (!input) return; input.value = filter; input.focus(); input.dispatchEvent(new _win.Event("input", { bubbles: true })); }, }) => { CustomizableUI.createWidget({ id: id, type: "custom", label: label, tooltiptext: tooltiptext, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onBuild(doc) { var win = doc.defaultView; var trbn = doc.createXULElement("toolbarbutton"); trbn.id = id; trbn.className = "toolbarbutton-1 chromeclass-toolbar-additional"; trbn.setAttribute("label", label); trbn.setAttribute("context", ""); trbn.setAttribute("tooltiptext", tooltiptext); trbn.setAttribute("image", "chrome://user_chrome_files/content/vertical_top_bottom_bar/svg/about-config-16.svg"); trbn.addEventListener("click", function(e) { if (e.button == 0) { if (e.shiftKey) about_config.openSelectedConfig(win); if (e.getModifierState("Accel")) about_config.openSelectedConfig(win); else win.gBrowser.selectedTab = about_config.addTab(win, "about:config"); } else if (e.button == 1) about_config.openSelectedConfig(win); else if (e.button == 2) { e.preventDefault(); e.stopPropagation(); if (e.shiftKey) about_config.openSelectedConfig(win, undefined, true); else if (e.getModifierState("Accel")) about_config.openSelectedConfig(win, "about:cfg"); else win.gBrowser.selectedTab = about_config.addTab(win, "about:cfg"); } }); return trbn; } }); })();
Отредактировано _zt (18-10-2021 12:41:49)
Отсутствует
to Dumby (насчет этого)
Да, вот теперь работает и в FF-36/45 — спасибо! :). В них не работало, как я понимаю, из-за того, что "insertAdjacentElement" появился в FireFox с v48 (кто бы мог подумать! Ведь в IE он с v5, хе-хе). Но у меня возник один вопрос, это не особо важно, но если можете, то пожалуйста ответьте.
Только я поясню, что я помещаю код не прямо в userChrome.css, а в отдельный XML-файл (чтобы не загромождать userChrome) — я назвал его binding.xml. Получается примерно так:
userChrome.css
menuitem#bookmarksShowAll > hbox {
-moz-binding: url('binding.xml#move_BMB_viewBookmarksSidebar') !important;}
binding.xml
<binding id="move_BMB_viewBookmarksSidebar">
<implementation>
<constructor>
<![CDATA[
(id => {
var menuitem = this.parentNode.parentNode.insertBefore(document.getElementById(id), this.parentNode.nextSibling);
menuitem.id = "menu_" + id; // (?)
menuitem.removeAttribute("class");
})("BMB_viewBookmarksSidebar");
]]>
</constructor>
</implementation>
</binding>
Так вот, я попробовал переписать ваш код без богомерзкого оператора "=>" (он некошерный, ибо в IE его нет, да и синтаксис его трудно-понимаем), получилось так:
binding.xml
<binding id="move_BMB_viewBookmarksSidebar">
<implementation>
<constructor>
<![CDATA[
(function(id) {
var menuitem = this.parentNode.parentNode.insertBefore(document.getElementById(id), this.parentNode.nextSibling);
menuitem.id = "menu_" + id; // (?)
menuitem.removeAttribute("class");
})("BMB_viewBookmarksSidebar");
]]>
</constructor>
</implementation>
</binding>
Но это у меня почему-то не работает. Подскажите, что я сделал не так? Можете сделать вариант без "=>"? Это, конечно, моя блажь, но просто в целях, так сказать, общего развития :)
Отсутствует
Только дайте строку простого открытия окна "about:cfg"
Изменил, добавил так
СКМ: Открыть about:cfg
ПКМ: Открыть окно about:cfg
Alt+ПКМ: Искать выделенное в окне about:cfg
чтоб остались только пункты для about:cfg?
Ну например так, если заменить trbn.addEventListener("click", e => { ... });
trbn.addEventListener("click", e => { if (e.button == 0) { if (e.getModifierState("Accel")) about_config.openClipboardConfigTab(win, "", false, aboutoldurl); else win.gBrowser.selectedTab = about_config.addTab(win, aboutoldurl); } else if (e.button == 1) win.gBrowser.selectedTab = about_config.addTab(win, aboutoldurl); else if (e.button == 2) { e.preventDefault(); e.stopPropagation(); if (e.getModifierState("Accel")) about_config.openSelectedConfig(win, aboutoldurl); else if (e.altKey) about_config.openSelectedConfig(win, undefined, true); else about_config.openOldConfigWin(win); } });
Отсутствует
Ну например так, если заменить trbn.addEventListener("click", e => { ... });
Дык так пункты для окна about:cfg пропали.
Отредактировано voqabuhe (18-10-2021 16:04:57)
Отсутствует
voqabuhe
надо сначала обновить было, для окна эти
ПКМ: Открыть окно about:cfg
Alt+ПКМ: Искать выделенное в окне about:cfg
Отредактировано Vitaliy V. (18-10-2021 16:11:04)
Отсутствует
надо сначала обновить было, для окна эти
ПКМ: Открыть окно about:cfg
Alt+ПКМ: Искать выделенное в окне about:cfg
Не понял, как их обновить?
Отсутствует
В общем для себя так сделал:
// Этот скрипт можно использовать для создания кнопок с помощью CustomizableUI.createWidget // Отдельная кнопка about:config с альт.управлением и открытием "about:cfg" от Vitaliy V. // https://forum.mozilla-russia.org/viewtopic.php?pid=795555#p795555 (async ( id = "ucf-open-about-config", label = "about:config", tooltiptext = " ЛКМ : Открыть about:config\n Ctrl+ЛКМ : Искать выделенное / буфер в about:config\n ПКМ : Открыть вкладку about:cfg\n Ctrl+ПКМ : Искать выделенное / буфер во вкладке about:cfg\nShift+ЛКМ : Открыть окно about:cfg\nShift+ПКМ : Искать выделенное / буфер в окне about:cfg", img = "chrome://user_chrome_files/content/vertical_top_bottom_bar/svg/about-config-16.svg", aboutoldurl = "about:cfg", about_config = { get clipboardHelp() { delete this.clipboardHelp; return this.clipboardHelp = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); }, readFromClipboard(win) { var url = ""; try { var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable); trans.init(win.docShell.QueryInterface(Ci.nsILoadContext)); trans.addDataFlavor("text/unicode"); var clipboard = Services.clipboard; clipboard.getData(trans, clipboard.kGlobalClipboard); var data = {}; trans.getTransferData("text/unicode", data, {}); if (data.value) { data = data.value.QueryInterface(Ci.nsISupportsString); url = data.data; } } catch (ex) {} return url; }, openClipboardConfigTab(win, clip = "", copy, url = "about:config") { var filter = this.readFromClipboard(win), nowarn = false, pref = url === "about:config" ? "browser.aboutConfig.showWarning" : "general.warnOnAboutConfig"; if (copy && clip != filter) this.clipboardHelp.copyString(clip); if (Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } var browser = win.gBrowser.getBrowserForTab(win.gBrowser.selectedTab = this.addTab(win, url)); browser.addEventListener("pageshow", e => { var doc = e.target; var input = doc && doc.querySelector("input#about-config-search, search-textbox#textbox"); if (input && filter) { input.value = filter; input.focus(); input.dispatchEvent(new doc.defaultView.Event("input", { bubbles: true })); } if (nowarn) win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); }, { once: true }); }, openSelectedConfig(win, url, oldwin) { var clip = this.readFromClipboard(win); win.goDoCommand("cmd_copy"); win.setTimeout(() => { if (!oldwin) this.openClipboardConfigTab(win, clip, true, url); else this.openOldConfigWin(win, clip, true); }, 100); }, addTab(win, url, params = {}) { params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); params.index = win.gBrowser.selectedTab._tPos + 1; return win.gBrowser.addTab(url, params); }, get configoldurl() { delete this.configoldurl; var mod = Cc[`@mozilla.org/network/protocol/about;1?what=${aboutoldurl.split(":")[1]}`].getService(Ci.nsIAboutModule); var url; try { url = mod.getChromeURI(Services.io.newURI(aboutoldurl)).spec; } catch (e) { url = mod.wrappedJSObject.uri?.spec; } return this.configoldurl = url || aboutoldurl; }, async openOldConfigWin(win, clip = "", copy) { var filter, input; if (copy) { filter = this.readFromClipboard(win); if (clip != filter) this.clipboardHelp.copyString(clip); } var type = "Preferences:ConfigManager", id = "config"; var _win = Services.wm.getMostRecentWindow(type); if (!_win) { let nowarn = false, pref = "general.warnOnAboutConfig"; if (copy && Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } let url = this.configoldurl; let xs = Services.xulStore; let sx = xs.getValue(url, id, "screenX"); let sy = xs.getValue(url, id, "screenY"); let wh = xs.getValue(url, id, "width"); let ht = xs.getValue(url, id, "height"); let sm = xs.getValue(url, id, "sizemode"); let features = `chrome,dialog=no,resizable,${sx && sy ? `screenX=${sx !== "0" ? sx : "1"},screenY=${sy !== "0" ? sy : "1"}` : "centerscreen"}${wh && ht ? `,width=${wh},height=${ht}` : ""}`; _win = win.openDialog(url, type, features); await new Promise(resolve => { _win.windowRoot.addEventListener("DOMContentLoaded", () => { _win.windowRoot.addEventListener("MozUpdateWindowPos", () => { if (sm === "maximized") _win.maximize(); }, { once: true, capture: true }); resolve(); }, { once: true }); }); if (copy && nowarn) _win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); } var doc = _win.document; var docEl = doc.documentElement; docEl.setAttribute("windowtype", type); docEl.id = id; docEl.setAttribute("persist", "screenX screenY width height sizemode"); _win.focus(); if (!copy || !(input = doc.querySelector("search-textbox#textbox"))) return; input.value = filter; input.focus(); input.dispatchEvent(new _win.Event("input", { bubbles: true })); }, }) => { CustomizableUI.createWidget({ id: id, type: "custom", label: label, tooltiptext: tooltiptext, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onBuild(doc) { var win = doc.defaultView; var trbn = doc.createXULElement("toolbarbutton"); trbn.id = id; trbn.className = "toolbarbutton-1 chromeclass-toolbar-additional"; trbn.setAttribute("label", label); trbn.setAttribute("context", ""); trbn.setAttribute("tooltiptext", tooltiptext); trbn.style.setProperty("list-style-image", `url("${img}")`, "important"); trbn.addEventListener("click", e => { if (e.button == 0) { if (e.shiftKey) about_config.openOldConfigWin(win); else if (e.getModifierState("Accel")) about_config.openSelectedConfig(win); else win.gBrowser.selectedTab = about_config.addTab(win, "about:config"); } else if (e.button == 1) about_config.openSelectedConfig(win); else if (e.button == 2) { e.preventDefault(); e.stopPropagation(); if (e.shiftKey) about_config.openSelectedConfig(win, undefined, true); else if (e.getModifierState("Accel")) about_config.openSelectedConfig(win, "about:cfg"); else win.gBrowser.selectedTab = about_config.addTab(win, "about:cfg"); } }); return trbn; } }); })();
// Этот скрипт можно использовать для создания кнопок с помощью CustomizableUI.createWidget // Отдельная кнопка about:config с альт.управлением и открытием "about:cfg" от Vitaliy V. // https://forum.mozilla-russia.org/viewtopic.php?pid=795555#p795555 (async ( id = "ucf-open-about-config", label = "about:config", tooltiptext = " ЛКМ : Открыть окно about:cfg\n Ctrl+ЛКМ : Искать выделенное / буфер в окне about:cfg\n ПКМ : Открыть вкладку about:cfg\n Ctrl+ПКМ : Искать выделенное / буфер во вкладке about:cfg", img = "chrome://user_chrome_files/content/vertical_top_bottom_bar/svg/about-config-16.svg", aboutoldurl = "about:cfg", about_config = { get clipboardHelp() { delete this.clipboardHelp; return this.clipboardHelp = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); }, readFromClipboard(win) { var url = ""; try { var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable); trans.init(win.docShell.QueryInterface(Ci.nsILoadContext)); trans.addDataFlavor("text/unicode"); var clipboard = Services.clipboard; clipboard.getData(trans, clipboard.kGlobalClipboard); var data = {}; trans.getTransferData("text/unicode", data, {}); if (data.value) { data = data.value.QueryInterface(Ci.nsISupportsString); url = data.data; } } catch (ex) {} return url; }, openClipboardConfigTab(win, clip = "", copy, url = "about:config") { var filter = this.readFromClipboard(win), nowarn = false, pref = url === "about:config" ? "browser.aboutConfig.showWarning" : "general.warnOnAboutConfig"; if (copy && clip != filter) this.clipboardHelp.copyString(clip); if (Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } var browser = win.gBrowser.getBrowserForTab(win.gBrowser.selectedTab = this.addTab(win, url)); browser.addEventListener("pageshow", e => { var doc = e.target; var input = doc && doc.querySelector("input#about-config-search, search-textbox#textbox"); if (input && filter) { input.value = filter; input.focus(); input.dispatchEvent(new doc.defaultView.Event("input", { bubbles: true })); } if (nowarn) win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); }, { once: true }); }, openSelectedConfig(win, url, oldwin) { var clip = this.readFromClipboard(win); win.goDoCommand("cmd_copy"); win.setTimeout(() => { if (!oldwin) this.openClipboardConfigTab(win, clip, true, url); else this.openOldConfigWin(win, clip, true); }, 100); }, addTab(win, url, params = {}) { params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); params.index = win.gBrowser.selectedTab._tPos + 1; return win.gBrowser.addTab(url, params); }, get configoldurl() { delete this.configoldurl; var mod = Cc[`@mozilla.org/network/protocol/about;1?what=${aboutoldurl.split(":")[1]}`].getService(Ci.nsIAboutModule); var url; try { url = mod.getChromeURI(Services.io.newURI(aboutoldurl)).spec; } catch (e) { url = mod.wrappedJSObject.uri?.spec; } return this.configoldurl = url || aboutoldurl; }, async openOldConfigWin(win, clip = "", copy) { var filter, input; if (copy) { filter = this.readFromClipboard(win); if (clip != filter) this.clipboardHelp.copyString(clip); } var type = "Preferences:ConfigManager", id = "config"; var _win = Services.wm.getMostRecentWindow(type); if (!_win) { let nowarn = false, pref = "general.warnOnAboutConfig"; if (copy && Services.prefs.getBoolPref(pref, true)) { Services.prefs.setBoolPref(pref, false); nowarn = true; } let url = this.configoldurl; let xs = Services.xulStore; let sx = xs.getValue(url, id, "screenX"); let sy = xs.getValue(url, id, "screenY"); let wh = xs.getValue(url, id, "width"); let ht = xs.getValue(url, id, "height"); let sm = xs.getValue(url, id, "sizemode"); let features = `chrome,dialog=no,resizable,${sx && sy ? `screenX=${sx !== "0" ? sx : "1"},screenY=${sy !== "0" ? sy : "1"}` : "centerscreen"}${wh && ht ? `,width=${wh},height=${ht}` : ""}`; _win = win.openDialog(url, type, features); await new Promise(resolve => { _win.windowRoot.addEventListener("DOMContentLoaded", () => { _win.windowRoot.addEventListener("MozUpdateWindowPos", () => { if (sm === "maximized") _win.maximize(); }, { once: true, capture: true }); resolve(); }, { once: true }); }); if (copy && nowarn) _win.setTimeout(() => { Services.prefs.setBoolPref(pref, true); }, 200); } var doc = _win.document; var docEl = doc.documentElement; docEl.setAttribute("windowtype", type); docEl.id = id; docEl.setAttribute("persist", "screenX screenY width height sizemode"); _win.focus(); if (!copy || !(input = doc.querySelector("search-textbox#textbox"))) return; input.value = filter; input.focus(); input.dispatchEvent(new _win.Event("input", { bubbles: true })); }, }) => { CustomizableUI.createWidget({ id: id, type: "custom", label: label, tooltiptext: tooltiptext, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onBuild(doc) { var win = doc.defaultView; var trbn = doc.createXULElement("toolbarbutton"); trbn.id = id; trbn.className = "toolbarbutton-1 chromeclass-toolbar-additional"; trbn.setAttribute("label", label); trbn.setAttribute("context", ""); trbn.setAttribute("tooltiptext", tooltiptext); trbn.style.setProperty("list-style-image", `url("${img}")`, "important"); trbn.addEventListener("click", e => { if (e.button == 0) { if (e.shiftKey) win.gBrowser.selectedTab = about_config.addTab(win, "about:config"); else if (e.getModifierState("Accel")) about_config.openSelectedConfig(win, undefined, true); else about_config.openOldConfigWin(win); } else if (e.button == 1) about_config.openSelectedConfig(win); else if (e.button == 2) { e.preventDefault(); e.stopPropagation(); if (e.shiftKey) about_config.openSelectedConfig(win); else if (e.getModifierState("Accel")) about_config.openSelectedConfig(win, "about:cfg"); else win.gBrowser.selectedTab = about_config.addTab(win, "about:cfg"); } }); return trbn; } }); })();
Отсутствует
Привет. Перестали работать скрипты *.js
Подскажите, пожалуйста, как исправить. Спасибо
UPD. Сделал по методу 2. https://github.com/Aris-t2/CustomJSforFx
Отредактировано yuriymos (18-10-2021 17:29:33)
Отсутствует
Ошибок нет?
Как то не последовательно подсказка записана 2 ЛКМ 2 ПКМ потом опять ЛКМ, СКМ вообще пропущена
а так нет ошибок
Я вообще не понимаю необходимость отдельных openClipboard, разве openSelected где-то иначе работает, чем у меня. У меня он ищет выделенное, если есть, а если нет, то открывает буфер.
Так это надо следить чтобы ничего не было выделено или как найти из буфера не убирая выделения?! и т.д.
Отредактировано Vitaliy V. (18-10-2021 17:19:01)
Отсутствует
Vitaliy V.
А всё, понял свою ошибку, правил вчерашнюю редакцию вашей кнопки, не заметил, что вы её сегодня отредактировали. Спасибо.
Добавлено 18-10-2021 18:04:30
Vitaliy V., только не хватает ещё, искать в отдельном окне из буфера. Как бы это на СКМ подвесить?
А, нашёл.
Отредактировано voqabuhe (18-10-2021 18:07:38)
Отсутствует
Vitaliy V.
СКМ мне не нужна, а последовательность такая: about:config на ЛКМ, about:cfg во вкладке на ПКМ и редко нужные мне окна about:cfg на шифте. Т.е. последовательность по группе + частоте использования мной.
Так это надо следить чтобы ничего не было выделено или как найти из буфера не убирая выделения?! и т.д.
Ясно. А я уж подумал что у меня punto или программа истории буфера вмешивается. Мои сценарии работы не предусматривают сохранение выделения.
А если вы имели ввиду то что я говорил про контекстное меню, то там можно просто забыть о выделении и в итоге при щелчке по ссылке или картинке в меню будут лишние пункты, причем почти в самом верху контекстного меню. С about:config же такое вряд ли произойдет, это более обдуманное действие, чем почти рефлекторные щелчки на странице.
Отсутствует
Всем здравия . Есть css : tabs_multiple_lines.css
#tabbrowser-tabs{
min-height: unset !important;
padding-inline-start: 0px !important
}
@-moz-document url(chrome://browser/content/browser.xhtml){
#scrollbutton-up~spacer,
#scrollbutton-up,
#scrollbutton-down{
display: var(--scrollbutton-display-model,initial);
}
scrollbox[part][orient="horizontal"]{
display: flex;
flex-wrap: wrap;
overflow-y: auto;
max-height: calc(var(--tab-min-height_mlt) * var(--tabs-lines));
scrollbar-color: currentColor transparent;
scrollbar-width: thin;
}
}
.scrollbox-clip[orient="horizontal"],
#tabbrowser-arrowscrollbox{
overflow: -moz-hidden-unscrollable;
display: block;
--scrollbutton-display-model: none;
}
.tabbrowser-tab{
height: var(--tab-min-height_mlt);
}
:is(.tabs-newtab-button,#tabs-newtab-button) {
height: var(--tab-min-height_mlt) !important;
}
#tabbrowser-tabs .tabbrowser-tab[pinned]{
position: static !important;
margin-inline-start: 0px !important;
}
.tabbrowser-tab[fadein]:not([pinned]) {
flex-grow: 1;
min-width: var(--tab_min_width_mlt) !important;
max-width: var(--tab_max_width_mlt) !important;
}
.tabbrowser-tab > stack{
width: 100%;
height: 100%;
}
#alltabs-button,
:root:not([customizing]) #TabsToolbar #new-tab-button,
#tabbrowser-arrowscrollbox > spacer,
.tabbrowser-tab::after{
display: none !important;
}
.tab-background {
margin-block: unset !important;
}
Отсутствует
Подключил твики aris-t2 к Firefox 78.15.0esr
Все устраивает, кроме стрелочек которые "перелистывают" табы влево/вправо, они белые и их плохо видно.
Было подключено:
@import "./config/color_variables_aero.css";
@import "./css/tabs/classic_squared_tabs.css";
@import "./css/tabs/classic_squared_tabs_fully_squared.css";
@import "./css/tabs/tabs_below_main_content_fx74.css";
@import "./css/tabs/tab_close_always_visible.css";
@import "./css/generalui/close_icon_windows7inverted.css";
Подскажите что можно добавить, что-бы стрелки управления табами стали темными, как все остальное?
Отсутствует
Но это у меня почему-то не работает. Подскажите, что я сделал не так?
А не работает, если интересно, потому, что при такой записи,
ключевое слово this внутри function будет ссылаться на глобальный объект,
то есть на window, а не на <hbox>, как в случае со стрелочной функцией
(у них нет своего this, где функция родилась — оттуда this и берётся).
Переделать можно, например, так
Или без call() — вызов с this напрямую,
и сответственно добавляем именованный аргумент,
а внутри функции меняем все this на его имя.
Отсутствует
Подскажите что можно добавить, что-бы стрелки управления табами стали темными, как все остальное?
Попробуйте так, должно помочь
Отсутствует