Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№1142618-10-2021 01:37:37

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 94.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

назначить на один из 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;
        }
    });
})();


зависит от №11574

Отредактировано Vitaliy V. (18-10-2021 14:08:48)

Отсутствует

 

№1142718-10-2021 02:13:27

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Так?

А можете сделать вариант, чтоб остались только пункты для about:cfg? А то кнопка получилась сильно перегруженной, труднее выбирать, а все необходимое для about:config есть уже в кнопке в Add Toolbar Buttons

Отсутствует

 

№1142818-10-2021 06:20:06

ALEX_45_ORP
Участник
 
Группа: Members
Зарегистрирован: 18-01-2018
Сообщений: 162
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

ALEX_45_ORP пишет

как через userChrome.css уменьшить расстояние между иконками на панели навигации в 93 [firefox]?

так, понятно, Vitaliy V. может я неправильно сформулировал, тогда подскажите код, который регулирует их горизонтальное размещение в оной панели? (сам покопаюсь) ...
UPD. вот этот

Выделить код

Код:

#nav-bar-customization-target > .toolbarbutton-1 > .toolbarbutton-icon{margin-right: -1px !important; margin-left: -1px !important;}

работал в 85 [firefox], а в 93 не работает ...

Отредактировано ALEX_45_ORP (18-10-2021 06:28:56)


Win 10х64

Отсутствует

 

№1142918-10-2021 09:25:09

f480185
Участник
 
Группа: Members
Зарегистрирован: 05-04-2012
Сообщений: 158
UA: Firefox 92.0

Re: Настройка внешнего вида Firefox в userChrome.css

Возможно модифицировать плеер который используется в функции "Картинка в картинке" через userChrome.css
Добавив функционалу кнопки  громкости и перемотки.

Отредактировано f480185 (18-10-2021 09:30:29)

Отсутствует

 

№1143018-10-2021 10:11:02

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

ALEX_45_ORP пишет

может я неправильно сформулировал

А чего тут формулировать, понятно всё, просто не забывайте пользоваться поиском https://forum.mozilla-russia.org/viewto … 00#p793900
Это есть практически в каждом коде для компактности Протона https://forum.mozilla-russia.org/viewto … 22#p790422

Так ещё можно

Выделить код

Код:

toolbar .toolbarbutton-1 {
    padding: 0 1px !important;
}

Отсутствует

 

№1143118-10-2021 10:27:27

ALEX_45_ORP
Участник
 
Группа: Members
Зарегистрирован: 18-01-2018
Сообщений: 162
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79 привет, ничего не помогло ... цифры менял разные, никаких результатов, как будто и нет этих кодов в userChrome.css.
ЗЫ. почитал материал по ссылкам - меня интересует код только для компактного режима значков.

Отредактировано ALEX_45_ORP (18-10-2021 10:44:20)


Win 10х64

Отсутствует

 

№1143218-10-2021 10:55:14

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

ALEX_45_ORP

Выделить код

Код:

:root {
    --toolbarbutton-outer-padding: 1px !important; /* внешний отступ между кнопками */
    --toolbarbutton-inner-padding: 4px !important; /* внутренний отступ иконки от границ кнопки */
}

Отсутствует

 

№1143318-10-2021 11:02:47

ALEX_45_ORP
Участник
 
Группа: Members
Зарегистрирован: 18-01-2018
Сообщений: 162
UA: Firefox 85.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt
этот код действует только на вертикальное регулирование, а мне надо горизонтальное панели навигации в компактном режиме значков ...


Win 10х64

Отсутствует

 

№1143418-10-2021 11:19:38

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

ALEX_45_ORP
У меня он действует только на горизонтальное. Но я не уверен, что он подойдет для компактного режима, не проверял.

Отсутствует

 

№1143518-10-2021 11:52:54

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Так?

Ну почти.

скрытый текст

Выделить код

Код:

// Этот скрипт можно использовать для создания кнопок с помощью 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;
        }
    });
})();


Только дайте строку простого открытия окна "about:cfg", у меня этот пункт пока не рабочий.

Отредактировано _zt (18-10-2021 12:41:49)

Отсутствует

 

№1143618-10-2021 12:24:46

EgorSokolov
Участник
 
Группа: Members
Зарегистрирован: 30-12-2006
Сообщений: 123
UA: Firefox 48.0

Re: Настройка внешнего вида Firefox в userChrome.css

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>


Но это у меня почему-то не работает. Подскажите, что я сделал не так? Можете сделать вариант без "=>"? Это, конечно, моя блажь, но просто в целях, так сказать, общего развития :)

Отсутствует

 

№1143718-10-2021 14:20:48

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 94.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

Только дайте строку простого открытия окна "about:cfg"

Изменил, добавил так
СКМ: Открыть about:cfg
ПКМ: Открыть окно about:cfg
Alt+ПКМ: Искать выделенное в окне about:cfg

voqabuhe пишет

чтоб остались только пункты для 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);
    }
});


строку tooltiptext = ... тоже замените на свою

Отсутствует

 

№1143818-10-2021 16:02:32

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Ну например так, если заменить trbn.addEventListener("click", e => { ... });

Дык так пункты для окна about:cfg пропали.

Отредактировано voqabuhe (18-10-2021 16:04:57)

Отсутствует

 

№1143918-10-2021 16:10:26

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 94.0

Re: Настройка внешнего вида Firefox в userChrome.css

voqabuhe
надо сначала обновить было, для окна эти
ПКМ: Открыть окно about:cfg
Alt+ПКМ: Искать выделенное в окне about:cfg

Отредактировано Vitaliy V. (18-10-2021 16:11:04)

Отсутствует

 

№1144018-10-2021 16:27:04

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

надо сначала обновить было, для окна эти
ПКМ: Открыть окно about:cfg
Alt+ПКМ: Искать выделенное в окне about:cfg

Не понял, как их обновить?

Отсутствует

 

№1144118-10-2021 16:40:27

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

В общем для себя так сделал:

скрытый текст

Выделить код

Код:

// Этот скрипт можно использовать для создания кнопок с помощью 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;
        }
    });
})();

Vitaliy V.
Ошибок нет?
Я вообще не понимаю необходимость отдельных openClipboard, разве openSelected где-то иначе работает, чем у меня. У меня он ищет выделенное, если есть, а если нет, то открывает буфер.
   
voqabuhe
Для вас так будет:
скрытый текст

Выделить код

Код:

// Этот скрипт можно использовать для создания кнопок с помощью 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;
        }
    });
})();

Шифты там тоже работают и открывают обычный about:config. лкм+shift - просто, пкм+shift - выделенное / буфер. Просто не записал их в подсказку.

Отсутствует

 

№1144218-10-2021 16:51:20

yuriymos
Участник
 
Группа: Members
Зарегистрирован: 31-07-2017
Сообщений: 43
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

Привет. Перестали работать скрипты *.js
Подскажите, пожалуйста, как исправить. Спасибо

UPD. Сделал по методу 2. https://github.com/Aris-t2/CustomJSforFx

Отредактировано yuriymos (18-10-2021 17:29:33)

Отсутствует

 

№1144318-10-2021 17:00:13

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

Для вас так будет:

Спасибо, почти то что нужно. Теперь у меня три кнопки получилось и со всеми жалко расставаться. :)

Отсутствует

 

№1144418-10-2021 17:16:40

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 94.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

Ошибок нет?

Как то не последовательно подсказка записана 2 ЛКМ 2 ПКМ потом опять ЛКМ, СКМ вообще пропущена
а так нет ошибок

_zt пишет

Я вообще не понимаю необходимость отдельных openClipboard, разве openSelected где-то иначе работает, чем у меня. У меня он ищет выделенное, если есть, а если нет, то открывает буфер.

Так это надо следить чтобы ничего не было выделено или как найти из буфера не убирая выделения?! и т.д.

Отредактировано Vitaliy V. (18-10-2021 17:19:01)

Отсутствует

 

№1144518-10-2021 17:54:32

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
А всё, понял свою ошибку, правил вчерашнюю редакцию вашей кнопки, не заметил, что вы её сегодня отредактировали. Спасибо.

Добавлено 18-10-2021 18:04:30
Vitaliy V., только не хватает ещё, искать в отдельном окне из буфера. Как бы  это на СКМ подвесить?
А, нашёл. :)

Отредактировано voqabuhe (18-10-2021 18:07:38)

Отсутствует

 

№1144618-10-2021 18:12:34

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
СКМ мне не нужна, а последовательность такая: about:config на ЛКМ, about:cfg во вкладке на ПКМ и редко нужные мне окна about:cfg на шифте. Т.е. последовательность по группе + частоте использования мной.
   

Vitaliy V. пишет

Так это надо следить чтобы ничего не было выделено или как найти из буфера не убирая выделения?! и т.д.

Ясно. А я уж подумал что у меня punto или программа истории буфера вмешивается. Мои сценарии работы не предусматривают сохранение выделения.
   
А если вы имели ввиду то что я говорил про контекстное меню, то там можно просто забыть о выделении и в итоге при щелчке по ссылке или картинке в меню будут лишние пункты, причем почти в самом верху контекстного меню. С about:config же такое вряд ли произойдет, это более обдуманное действие, чем почти рефлекторные щелчки на странице.

Отсутствует

 

№1144718-10-2021 19:06:21

igr40
Участник
 
Группа: Members
Зарегистрирован: 03-02-2019
Сообщений: 23
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

Всем здравия . Есть css : tabs_multiple_lines.css

скрытый текст
:root{
  --tabs-lines: 3;
  --tab_min_width_mlt: 100px;
  --tab_max_width_mlt: 200px;
  --tab-min-height_mlt: var(--tab-min-height,32px); /* set own value here, if used without configuration files */
}

#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;
}


Вопрос . Как сделать чтобы вкладки прокручивались строго на высоту вкладки (или две высоты или три если : --tabs-lines: 3 ). Другими словами чтобы не было видно части полосы вкладок .

Отсутствует

 

№1144818-10-2021 21:41:58

ssn09
Участник
 
Группа: Members
Зарегистрирован: 15-10-2021
Сообщений: 9
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Подключил твики aris-t2 к Firefox 78.15.0esr
Все устраивает, кроме стрелочек которые "перелистывают" табы влево/вправо, они белые и их плохо видно.
tab.PNG

Было подключено:
@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";

Подскажите что можно добавить, что-бы стрелки управления табами стали темными, как все остальное?

Отсутствует

 

№1144918-10-2021 22:31:16

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

EgorSokolov пишет

Но это у меня почему-то не работает. Подскажите, что я сделал не так?

скрытый текст

Вообще-то, какой-то необходимости оборачивания кода в функцию
здесь наверно нет, просто привычка из других контекстов.
Можно убрать обёртку (первая и последняя строка) и начать код прямо с
var id = "BMB_viewBookmarksSidebar";


А не работает, если интересно, потому, что при такой записи,
ключевое слово this внутри function будет ссылаться на глобальный объект,
то есть на window, а не на <hbox>, как в случае со стрелочной функцией
(у них нет своего this, где функция родилась — оттуда this и берётся).


Переделать можно, например, так

Выделить код

Код:

(function(id) {
	…
}).call(this, "BMB_viewBookmarksSidebar");

Или без call() — вызов с this напрямую,
и сответственно добавляем именованный аргумент,
а внутри функции меняем все this на его имя.

Отсутствует

 

№1145019-10-2021 00:39:27

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 91.0

Re: Настройка внешнего вида Firefox в userChrome.css

ssn09 пишет

Подскажите что можно добавить, что-бы стрелки управления табами стали темными, как все остальное?

Попробуйте так, должно помочь

скрытый текст

Выделить код

Код:

#scrollbutton-up, #scrollbutton-down {
  fill: black !important;
}

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]