oder soll ich sie schon ungefixt hier "vorstellen"?
Besser sie sind fertig nutzbar.
oder soll ich sie schon ungefixt hier "vorstellen"?
Besser sie sind fertig nutzbar.
Für das Skript hier ein Ersatz.
Ich danke dir, aber wie müsste der Ablauf z.B. für about:about, oder auch Konsole aussehen, bekomme es nicht gebacken.
Ich meine, dass darüber im Forum schon "gesprochen" wurde.
Ja, das schon, aber ich war immer der Meinung, dass meine Scripte funktionieren, leider nicht.
Nicht bei mir
Stimmt, das habe ich nicht in der richtigen Reihenfolge gemacht.
Dann habe ich dieses noch, ist im Aufbau fast deinem ähnlich. Kannst ja mal probieren.
// Button zum Aufruf des Profil-Ordners
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
try {
ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs");
const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
const button_label = "Profil Button (generic)";
const open_in_a_window = false;
CustomizableUI.createWidget({
id: 'Profil-Button',
defaultArea: CustomizableUI.AREA_NAVBAR,
removable: true,
label: button_label,
tooltiptext: button_label,
onClick: function(event) {
const win = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
if(event.button=='0') {
try {
if(open_in_a_window)
window.open("ProfD");
uProfMenu.prefDirOpen('ProfD');
} catch (e) {}
}
},
onCreated: function(button) {
return button;
}
});
// style button icon
const uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent('\
\
#Profil-Button .toolbarbutton-icon {\
list-style-image: url("file:///C:/FoxIcons2/prof.png"); \
}\
\
'), null, null);
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
} catch (e) {
Components.utils.reportError(e);
};
})();
Alles anzeigen
Die Lösung kommt von einem Amateur (mir), und könnte unvorhergesehene, aber von mir noch nicht beobachtete Probleme verursachen.
Gute Lösung, meine ich als absoluter Amateur, deswegen habe ich, so gut ich konnte, meine Scripte nach dieser Vorlage aufgebaut. Einfach und verständlich, und kann auf alle möglichen Button umgeschrieben werden. Außerdem funktionstüchtig in allen Fenstern, und die Konsole ist auch zufrieden.
// ButtonProfilordner.uc.js
// Öffnen des "Profilordners"
(function() {
if (!window.gBrowser)
return;
CustomizableUI.createWidget({
id: 'buttonProfilOrdner',
defaultArea: CustomizableUI.AREA_NAVBAR,
label: 'Profilordner öffnen',
tooltiptext: 'Profilordner öffnen',
onCreated: (button) => {
button.style.listStyleImage = 'url("file:///C:/FoxIcons2/prof.png")';
button.addEventListener('click', () => {
if (event.button == 0) {
uProfMenu.prefDirOpen('ProfD');
}
})
}
});
})();
Alles anzeigen
Hier noch ein Nachtrag. Zum Vergleich mal den Code für das Appmenu.uc.js, dort funktioniert es ohne Probleme, Selektoren fast identisch.
/*rechts der kleine Pfeil / neues Icon*/
#AppMenuButton menupopup#AMpopup menu.menu-iconic::after {
content: "" !important;
background-image: url("..//icons/rechts6.png") !important;
margin-right: 12px !important;
background-size: 18px 18px !important;
}
/*rechts der kleine Pfeil bei hover / neues Icon*/
#AppMenuButton menupopup#AMpopup menu.menu-iconic:hover::after {
content: "" !important;
background-image: url("..//icons/down2.png") !important;
margin-right: 12px !important;
display: block !important;
background-repeat: no-repeat !important;
background-position: 0px 3px !important;
background-size: 14px 14px !important;
}
Alles anzeigen
Nochmal die Frage: an welchem Punkt ist das Problem aufgetreten?
menu::after geht gar nicht
#ExtraConfigMenu-popup :is(#submenu-ucjs,#submenu-css,#submenu-cssweb,#submenu-cssabout,#submenu-cssshadow,#submenu-about,#submenu-extra2,#submenu-extra):hover::after { funktioniert bestens
#ExtraConfigMenu-popup [id^="submenu-"]:hover[open]::after { funktioniert mit kl. Verzögerung
Und ist das Problem das Hovern über dem Sub Popup, nachdem man die Maus aus dem ersten (Haupt) Popup herausbewegt schliesst sich der Sub ohne dort etwas anzuklicken?
....damit:
#ExtraConfigMenu-popup [id^="submenu-"]:hover::after {
Auf deinen Wunsch hin habe ich dieses nochmal aufgeführt. Dass es jetzt solche Ausmaße angenommen hat konnte ich nicht ahnen. Mir ist hier geholfen worden, dafür bedanke ich mich bei allen herzlichst. Ich habe zwei Selektoren die ich einsetzen kann, und bin damit zufrieden (wenn es denn so bleibt).
Test die Version von
Ich glaube, Du bist da eine Zeile verrutscht.
Das kann aber eigentlich nichts mit diesem CSS zu tun haben, ist ja nur zum stylen der Pfeile.
Das sehe ich auch so, aber so funktioniert es nun mal nicht. Einen weiteren Code gibt es nur für das Bereitstellen der Icons, ansonsten keine weiteren Anpassungen. Ich betone nochmals, der Code aus #1 funktioniert bis v138 ohne Probleme, deshalb kann es nur an Änderungen in den folgenden Versionen liegen.
Ja stimmt! Bleibt die Frage ob es überhaupt funktioniert in Nightly?
Leider war die Vorfreude umsonst.
Bei Hover wird zwar das Icon angezeigt, das Submenü öffnet sich, aber sofern mit der Maus das Popup berührt wird verschwindet es . Da werde ich dann doch bei der Lösung von 2002Andreas bleiben. Oder gibt es dazu noch einen Lösungsvorschlag?
Da kann ich auch noch ein Script beisteuern, funktioniert in allen Fenstern, und ohne Fehler in der Konsole.
// Button zum Aufruf des Profil-Ordners
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
try {
ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs");
const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
const button_label = "Profil Button (generic)";
const open_in_a_window = false;
CustomizableUI.createWidget({
id: 'Profil-Button',
defaultArea: CustomizableUI.AREA_NAVBAR,
removable: true,
label: button_label,
tooltiptext: button_label,
onClick: function(event) {
const win = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
if(event.button=='0') {
try {
if(open_in_a_window)
window.open("ProfD");
uProfMenu.prefDirOpen('ProfD');
} catch (e) {}
}
},
onCreated: function(button) {
return button;
}
});
// style button icon
const uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent('\
\
#Profil-Button .toolbarbutton-icon {\
list-style-image: url("file:///C:/FoxIcons2/prof.png"); \
}\
\
'), null, null);
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
} catch (e) {
Components.utils.reportError(e);
};
})();
Alles anzeigen
Geht das im Nightly? Als Kurzfassung?
Super, das funktioniert in dieser Fassung perfekt. Die Schreibweise von Sören Hentzschel ist dann aber wohl die bessere Idee.
Ich danke euch für diesen Ansatz.
Oder nimm gleich passende Icons:
Ja, das funktioniert dann wenigstens. Ich danke Dir!
Bekomme ich mal Deinen Code?
Sorry, habe ich jetzt erst gelesen. Das ist der Code für das Rechtsklick-Kontextmenü, so wie ich ihn verwende (für 139/140).
/*======= Rechtsklick-Kontextmenü =======*/
/* AGENT_SHEET */
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
@-moz-document url(chrome://browser/content/browser.xhtml){
/*==== zusätzliche Anpassungen Rechtsklick-Kontextmenü ====*/
/* Breite des Popup-Menüs begrenzt */
#mainPopupSet menupopup#contentAreaContextMenu{
max-width: 345px !important;
min-width: 345px !important;
}
/* obere Box mit den Icons */
#context-navigation {
appearance: none !important;
background: #99ccff !important;
padding: 8px !important;
margin-bottom: 3px !important;
min-height: 50px !important;
max-height: 50px !important;
max-width: 320px !important;
box-shadow: inset 0.05em 0.05em 0.3em 0.3em #009926 !important;
}
/* Button mit den Icons */
#context-navigation menuitem.menuitem-iconic {
background-color: transparent /* #fae7b5 */ !important;
border: 1px solid royalblue !important;
max-width: 47px !important;
min-width: 47px !important;
min-height: 35px !important;
max-height: 35px !important;
padding-left: 4px !important;
margin-left: 3px !important;
margin-top: 0px !important;
}
/* die aktiven Button oben im Kontextmenü bei hover */
#context-navigation > .menuitem-iconic:not([disabled]):hover{
background-color: #d2f2f8 !important;
border: 1px solid brown !important;
}
/* die inaktiven Button oben im Kontextmenü bei hover */
#context-navigation > .menuitem-iconic[disabled]:hover{
background-color: #ababab !important;
}
/* die inaktiven (kleinen) Button oben im Kontextmenü ausgeblendet */
#context-navigation > .menuitem-iconic[disabled] > hbox > image {
background-color: transparent !important;
}
/* die aktiven (kleinen) Button oben im Kontextmenü ausgeblendet */
#context-navigation > .menuitem-iconic:not([disabled]) > hbox > image {
background-color: transparent !important;
}
/* Vor, Zurück, Stop, Neuladen und Lesezeichen farbig */
#context-back.menuitem-iconic image.menu-icon {
fill: blue !important;
margin-left: 4px !important;
}
#context-back:hover.menuitem-iconic image.menu-icon {
fill: red !important;
}
#context-forward.menuitem-iconic image.menu-icon{
fill: #268e00 !important;
}
#context-forward:hover.menuitem-iconic image.menu-icon{
fill: red !important;
}
/* gehören zum Script SkipToTopAndBottom.uc.js */
#context-to-top.menuitem-iconic image.menu-icon{
margin-right: 0px !important;
}
#context-to-bottom.menuitem-iconic image.menu-icon{
margin-right: 0px !important;
}
#context-reload.menuitem-iconic image.menu-icon{
fill: forestgreen !important;
}
#context-reload:hover.menuitem-iconic image.menu-icon{
fill: red !important;
}
#context-stop.menuitem-iconic image.menu-icon{
fill: red !important;
}
#context-stop:hover.menuitem-iconic image.menu-icon{
fill: #cd0000 !important;
}
#context-bookmarkpage.menuitem-iconic image.menu-icon{
fill: #ff5f25 !important;
margin-right: 4px !important;
}
#context-bookmarkpage:hover.menuitem-iconic image.menu-icon{
fill: brown !important;
}
}
/* =========================== */
/* Skip To Top & Bottom Icons */
/* Einheitliche Icon-Größe */
/* =========================== */
#context-navigation {
> .menuitem-iconic {
/* Gemeinsame Icon-Größe */
> .menu-icon {
width: 34px !important;
height: 34px !important;
max-width: 34px !important;
max-height: 34px !important;
background-size: contain !important; /* für perfekte Skalierung */
object-fit: contain !important; /* falls SVGs oder PNGs verwendet werden */
}
}
}
Alles anzeigen
Bekomme die Farbe nicht geändert, liegt eventuell am Script selbst. Dieses verwende ich:
//SkipToTopAndBottom.uc.js
(function() {
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-to-top';
menuitem.classList.add('menuitem-iconic');
menuitem.setAttribute('tooltiptext' , 'Zum Seitenanfang springen');
menuitem.style.listStyleImage='url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAwIDEwMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwYXRoIGQ9Ik00NjcuNiwyNjMuNEwyNS43LDY2NS4yYy0xOS42LDE3LjktMjEuMSw0OC40LTMuMyw2OC4xYzE4LDE5LjcsNDguNCwyMS4xLDY4LjEsMy4zbDQwOS41LTM3Mi4ybDQwOS4zLDM3Mi4yYzE5LjgsMTcuOSw1MC4zLDE2LjUsNjguMi0zLjNjOC4zLTkuMiwxMi41LTIwLjgsMTIuNS0zMi40YzAtMTMuMS01LjMtMjYuMi0xNS43LTM1LjdMNTMyLjQsMjYzLjRDNTE0LDI0Ni44LDQ4NS45LDI0Ni44LDQ2Ny42LDI2My40eiIvPjwvZz48L3N2Zz4=")';
let refItem = document.getElementById('context-reload');
refItem.parentNode.insertBefore(menuitem, refItem);
//click
menuitem.addEventListener('click', () => {
if (event.button == 0) {
ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,0) ' , false);
}
});
})();
(function() {
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-to-bottom';
menuitem.classList.add('menuitem-iconic');
menuitem.setAttribute('tooltiptext' , 'Zum Seitenende springen');
menuitem.style.listStyleImage='url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAwIDEwMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwYXRoIGQ9Ik01MzIuNCw3MzYuNmw0NDEuOS00MDEuOGMxOS42LTE3LjgsMjEuMS00OC40LDMuMi02Ny45Yy0xNy45LTE5LjgtNDguNC0yMS4zLTY3LjktMy40TDUwMCw2MzUuOEw5MC44LDI2My40Yy0xOS44LTE3LjgtNTAuNC0xNi4zLTY4LjIsMy40Yy04LjQsOS4yLTEyLjYsMjAuOC0xMi42LDMyLjRjMCwxMyw1LjQsMjYuMiwxNS44LDM1LjZsNDQxLjksNDAxLjhDNDg2LjEsNzUzLjIsNTE0LjIsNzUzLjIsNTMyLjQsNzM2LjZ6Ii8+PC9nPjwvc3ZnPg==")';
let refItem = document.getElementById('context-reload');
refItem.parentNode.insertBefore(menuitem, refItem);
//click
menuitem.addEventListener('click', () => {
if (event.button == 0) {
ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,100000) ' , false);
}
});
var cssUri = Services.io.newURI('data:text/css,' + encodeURIComponent(css), null, null);
var SSS = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
SSS.loadAndRegisterSheet(cssUri, SSS.AGENT_SHEET);
})();
Alles anzeigen