Beiträge von Mira_Belle
-
-
-
Speravir
Die vier neuen Einträge:
"prefs.js", "user.js", "userChromeShadow.css" & "userChrome.js"dafür hat Mira_Belle vorausschauender Weise, bereits im Script ab Zeile 107
entsprechende Optionen, true anzeigen false nicht anzeigen eingefügt.
Nun müsste man nur noch entscheiden was Standard sein soll true oder false?
Was meinst Du dazu?Hach, bei all der Kritik habe ich DA gar nicht mehr daran gedacht!
Also sind diese "Dinge" ja optional!
Aber wie Endor schon gefragt hat, was soll Standard sein soll true oder false?
Ich hatte mich an dem "Original" orientiert, da sind die "... bearbeiten" Schaltflächen eingeblendet, also "true". -
SperavirIch habe ja nur das Style-Loader-Menü erweitert.
"userChrome.css bearbeiten" & "userContent.css bearbeiten" waren ja schon vorhanden!
Da machte es für mich Sinn, auch noch weitere wichtige Dateien direkt bearbeiten zu können.
Also fügte ich ""prefs.js", "user.js", "userChromeShadow.css" & "userChrome.js" hinzu.Das ist aber auch schon alles.
-
Mh, also ein klassisches Missverständnis, denn Du bezogst Dich ja auf meinen Beitrag!
schau Dir doch mal mein Appmenü-Skript an
Und das läuft auch auf Linux?
...Das könntest Du ja mal testen.
-
-
Das Script vom 30-9-25
Verstehe ich jetzt nicht! Erste Beitrag ist vom 29. August 2025 und mehr oder weniger das Skript auch.
Dann habe ich die nächste Version am 11. September 2025 reingestellt.
Diese kopiert aus dem UserLoader-Skript Funktionen, bzw, ruft diese auf, weshalb auch dieses Skript vorhanden sein muss.Die nächste Version, die ich dann neu reinstellte, kam am 2025.10.05! Das war dann aber nur ein zwischen Release,
wenn man so will. -
Huh? Nicht am Mac...
Nein Windows 10.
Und Leiste ist vorhanden, aber eben grau und abgelegte Buttons sind auch nicht mehr zusehen.Das mit dem Player muss ich dann noch testen.
Test abgeschlossen, Youtube Player im Vollbildmodus ohne störende Elemente.
Zum Skript, es ist bei einem Neustart des FF sichtbar, immer.
Wäre es nicht schön,
1. es würde sich den letzten Zustand merken
und/oder 2. man könnte eine Zeit definieren und die Leise würde wieder weg scrollen. -
AH, jetzt ja!
Vollbildmodus, da verschwinden die abgelegten "Buttons"!Auch wird sie grau, die Leiste.
-
Mitleser Ich kann Dir da mit dem Skript nicht helfen, aber schau Dir doch mal mein Appmenü-Skript an.
In der neuen Version habe ich so einige Funktionen übernommen, eventuell hilft Dir das ja weiter.
Oder Du zerlegst "mein" Skript, wenn es denn funktioniert, und schaust, ob Du da Code übernehmen kannst. -
Boersenfeger Ich glaube eher, dass es an Deine Formulierung liegt.
Ich z.B. verstehe nicht, was genau Du möchtest.
-
Dein Skript aus #22 funktioniert hier einwandfrei!
Auch im max. Modus. Wie teste ich den Vollbildmodus?FF Version 143.0.4 (64-Bit)
-
Horstmann Könntest Du mal ein Gif oder Video mit dem 115esr machen.
Möchte ungern einfach so ein Skript installieren, wenn es doch eh nicht funktioniert. -
EDIT: Bei XenForo hat man ca 5 Minuten Zeit, bevor der entsprechende Beitrag selbständig als editiert markiert wird. Finde ich gut gelöst...
Kann man so machen, muss man aber nicht!
Ich wurde erst "jetzt" auf grobe Rechtschreibfehler in meinen Skripten hingewiesen.
Da es hier jederzeit möglich ist, ältere Beiträge zu editieren, konnte ich dies schleunigst berichtigen.Ist ja peinlich, wenn jemand eins meiner Skripte nutz und denkt ich sei irgendwie doof!
Ok, bin ich manchmal, aber das ist was anderes. -
Mh, es gibt nicht die eine gute Lösung! Man könnte das nachträgliche Editieren eines Beitrags sperren,
wenn darauf schon geantwortet wurde.
Aber so richtig pralle finde ich das auch nicht. -
Ich bin fertig, aber sowas von!
Da habe ich mich aber gestern und heute ganz schön was von verbissen!
Also hier nun die derzeitige finale Version meines Appmenü-Skripts.
Ich habe es erweitert um die Möglichkeit, die aus dem CSSLoader-Skript bekannt sein dürfte.
Man kann CSS-Dateien laden und auch wieder entladen.
Dann habe ich noch die Möglichkeit geschaffen, verschiedene wichtige Konfigurationsdateien,
wie userChrome.css, userChromeShadow.css, userContent.css, userChrome.js, prefs.js und user.js
direkt, in einem beliebigen Editor, zu bearbeiten.
Und dann gibt es noch ein weiteres feature, man kann diverse "about"-Seiten aufrufen.JavaScript
Alles anzeigen// ==UserScript== // @name Appmenu.uc.js // @namespace Appmenu@gmail.com // @description Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche // @include main // @author defpt // @charset UTF-8 // @version 2025.10.05 mit integriertem CSS-Loader-Menü und Konfiguration-Menü, // @version zum dirkten bearbeiten verschiedener Dateien. // @version Sowie der Möglichkeit direkt verschiedene "about:"-Seiten aufrüfen zu können. // ==/UserScript== // Definiere den Profilpfad für die Symbole let ProfilePath = PathUtils.toFileURI( PathUtils.join(PathUtils.profileDir, 'chrome', 'icons') ); // Standard-Symbol-Dateiname let ButtonIcon01 = 'restart.svg'; // Neustart let ButtonIcon02 = 'quit.svg'; // Beenden let Icon01 = 'profile.svg'; // Profil-Verzeichnis let Icon02 = 'chrome.svg'; // Chrome-Ordner let Icon03 = 'css4.svg'; // CSS-Ordner let Icon04 = 'js.svg'; // JS-Ordner let Icon05 = 'folder-plus.svg'; // Icons-Ordner let Icon06 = 'addons.svg'; // Addon-Verzeichnis let Icon07 = 'folder.svg'; // Programm-Verzeichnis let Icon08 = 'folder-1.svg'; // Startup-Cache let Icon11 = 'Themes.svg'; // Anpassen let Icon12 = 'debugging-workers.svg'; // Neustart im abgesicherten Modus let Icon13 = 'command-console.svg'; // Browser-Konsole let Icon14 = 'window-dev-tools.svg'; // Browser-Werkzeuge let Icon15 = 'developer.svg'; // Web-Entwickler let Icon16 = 'sync.svg'; // Firefox synchronisieren let Icon17 = 'passwords.svg'; // Zugangsdaten und Passwörter let Icon18 = 'performance.svg'; // Task Manager let Icon19 = 'plug-disconnected.svg'; // Offline arbeiten let Icon21 = 'firefox.svg'; // about:about let Icon22 = 'info.svg'; // about:cache let Icon23 = 'settings.svg'; // about:config let Icon24 = 'warning.svg'; // about:crashes let Icon25 = 'downloads.svg'; // about:downloads let Icon26 = 'home.svg'; // about:home let Icon27 = 'passwords.svg'; // about:logins let Icon28 = 'debugging-workers.svg'; // about:support let Icon29 = 'settings.svg'; // about:preferences let Icon30 = 'profile.svg'; // about:profiles var Appmenu = { // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Editor mit angegebenem Pfad verwenden // editor: 'C:\\Program Files\\Notepad++\\notepad++.exe', editor: "C:\\Program Files\\Microsoft VS Code\\Code.exe", // oder // in 'view_source.editor.path' eingetragenen Editor verwenden // editor: Services.prefs.getCharPref('view_source.editor.path'), // Dateimanager mit angegebenem Pfad verwenden oder leer ('') wenn System-Dateimanager verwenden //fileManager: 'C:\\Program files\\FreeCommander XE\\FreeCommander.exe', fileManager: "", // Parameter für Dateimanager oder leer ('') //FMParameter: '/T', FMParameter: "", // Submenüs ohne Inhalt im Hauptmenü automatisch ausblenden autohideEmptySubDirs: true, // Submenüs im Hauptmenü nach unten verschieben moveSubDirstoBottom: false, // Ort und Aussehen des Menü-Buttons einstellen // isUrlbar: 1, // 0: TabsToolbar; 1: navbar, isUrlbar: 2, // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar isButton: 0, // 0: Hamburger,klein; 1: Firefox,groß, // Hotkey zum Öffnen des Appmenüs oder leer ('') hotkey: "f", hotkeyModifier: "alt", // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Submenüs im Hauptmenü nach unten verschieben subdirPopupHash: [], subdirMenuHash: [], // CSS-Loader-Funktionen (integriert) cssLoader: { AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET, USER_SHEET: Ci.nsIStyleSheetService.USER_SHEET, AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET, readCSS: {}, get prefs() { delete this.prefs; return this.prefs = Services.prefs.getBranch("UserCSSLoader."); }, get disabled_list() { try { return JSON.parse(this.prefs.getCharPref("disabled_css_list")) || []; } catch (e) { return []; } }, set disabled_list(list) { this.prefs.setCharPref("disabled_css_list", JSON.stringify(list)); }, get FOLDER() { let aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile); aFolder.appendRelativePath("CSS"); if (!aFolder.exists() || !aFolder.isDirectory()) { aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664); } delete this.FOLDER; return this.FOLDER = aFolder; }, initCSSLoader: function() { this.rebuildCSSMenu(); }, rebuildCSSMenu: function() { let ext = /\.css$/i; let not = /\.uc\.css/i; let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator); let popup = Appmenu.subdirPopupHash["CSS-Loader-Menü"]; // Vorhandene Einträge löschen while (popup && popup.firstChild) { popup.removeChild(popup.firstChild); } // Neue Einträge erstellen while (files.hasMoreElements()) { let file = files.getNext().QueryInterface(Ci.nsIFile); if (!ext.test(file.leafName) || not.test(file.leafName)) continue; let CSS = this.loadCSS(file); let menuitem = document.createElementNS( "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem" ); menuitem.setAttribute("label", file.leafName); menuitem.setAttribute("id", "appmenu-css-" + file.leafName); menuitem.setAttribute("class", "menuitem-iconic"); menuitem.setAttribute("type", "checkbox"); menuitem.setAttribute("autocheck", "false"); menuitem.setAttribute("checked", CSS.enabled); // Icon basierend auf dem Zustand setzen if (CSS.enabled) { menuitem.setAttribute("image", ""); // Standard-Häkchen (kein Icon) } else { menuitem.setAttribute("image", `${ProfilePath}/stop_smal_red.svg`); // Rotes Stop-Icon } menuitem.setAttribute("tooltiptext", "Linksklick: an/aus, Mittelklick: an/aus (Menü bleibt offen), Rechtsklick: bearbeiten"); menuitem.addEventListener("command", () => this.toggleCSS(file.leafName)); menuitem.addEventListener("click", (event) => this.cssItemClick(event, file.leafName)); if (popup) { popup.appendChild(menuitem); } } }, loadCSS: function(aFile) { let CSS = this.readCSS[aFile.leafName]; if (!CSS) { CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile); // Standardmäßig aktiviert, außer sie ist in disabled_list CSS.enabled = !this.disabled_list.includes(aFile.leafName); } return CSS; }, toggleCSS: function(aLeafName) { let CSS = this.readCSS[aLeafName]; if (!CSS) return; CSS.enabled = !CSS.enabled; // Aktualisiere disabled_list let currentDisabledList = this.disabled_list; if (CSS.enabled) { currentDisabledList = currentDisabledList.filter(name => name !== aLeafName); } else { if (!currentDisabledList.includes(aLeafName)) { currentDisabledList.push(aLeafName); } } this.disabled_list = currentDisabledList; // Aktualisiere das Häkchen im Menü let menuitem = document.getElementById("appmenu-css-" + aLeafName); if (menuitem) { menuitem.setAttribute("checked", CSS.enabled); if (CSS.enabled) { menuitem.setAttribute("image", ""); // Standard-Häkchen } else { menuitem.setAttribute("image", `${ProfilePath}/stop_smal_red.svg`); // Rotes Stop-Icon } } }, cssItemClick: function(event, aLeafName) { event.preventDefault(); event.stopPropagation(); if (event.button === 0) { return; } else if (event.button === 1) { this.toggleCSS(aLeafName); } else if (event.button === 2) { let file = this.getFileFromLeafName(aLeafName); this.editCSS(file); } }, getFileFromLeafName: function(aLeafName) { let f = this.FOLDER.clone(); f.QueryInterface(Ci.nsIFile); f.appendRelativePath(aLeafName); return f; }, editCSS: function(aFile) { let editor = cssLoaderConfig.Editor || Services.prefs.getCharPref("view_source.editor.path"); if (!editor) { alert('Kein Editor konfiguriert! Bitte in about:config unter "view_source.editor.path" einen Editor eintragen.'); return; } try { let UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().includes("win") ? "Shift_JIS" : "UTF-8"; let path = UI.ConvertFromUnicode(aFile.path); let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); app.initWithPath(editor); let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } catch (e) { console.error("Fehler beim Öffnen des Editors:", e); } }, }, toolbar: { subdirs: [ { name: 'Firefox Verzeichnisse', image: `${ProfilePath}/folder_currentColor.svg`, }, { name: 'Firefox Funktionen', image: `${ProfilePath}/settings_currentColor.svg`, }, { name: 'separator', }, { name: 'CSS-Loader-Menü', // CSS-Loader-Menü image: `${ProfilePath}/css4_currentColor.svg`, }, { name: 'Konfiguration', image: `${ProfilePath}/Hammer-wrench_currentColor.svg`, }, { name: '"about:"-Seiten', image: `${ProfilePath}/firefox_currentColor.svg`, }, ], apps: [ { name: 'Profil-Verzeichnis', id: 'AMProfil', root: 'ProfD', path: '\\', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon01}`, }, { name: 'Chrome-Ordner', id: 'AMchrome', root: 'ProfD', path: '\\chrome', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon02}`, }, { name: 'CSS-Ordner', id: 'AMCSS', root: 'ProfD', path: '\\chrome\\css', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon03}`, }, { name: 'JS-Ordner', id: 'AMJS', root: 'ProfD', path: '\\chrome\\scripts', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon04}`, }, { name: 'Icons-Ordner', id: 'AMICO', root: 'ProfD', path: '\\chrome\\icons', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon05}`, }, { name: 'Addon-Verzeichnis', id: 'AMAddons', root: 'ProfD', path: '\\extensions', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon06}`, }, { name: 'Programm-Verzeichnis', id: 'AMProgramm', root: 'CurProcD', path: '\\', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon07}`, }, { name: 'Startup-Cache', id: 'AMCache', root: 'ProfLD', path: '\\startupCache', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon08}`, }, ], configs: [ { name: 'Anpassen', id: 'AMAnpassen', command: 'gCustomizeMode.enter()', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon11}`, }, { name: 'Neustart im abgesicherten Modus', id: 'AMModus', command: 'safeModeRestart();', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon12}`, }, { name: 'Browser-Konsole', id: 'AMKonsole', command: 'goKonsole', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon13}`, }, { name: 'Browser-Werkzeuge', id: 'AMWerkzeuge', command: 'goWerkzeuge', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon14}`, }, { name: 'Web-Entwickler', id: 'AMEntwickler', command: 'goEntwickler', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon15}`, }, { name: 'Firefox synchronisieren', id: 'AMsynchron', command: 'gSync', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon16}`, }, { name: 'Zugangsdaten und Passwörter', id: 'AMdaten', command: 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })', tooltiptext: 'about:logins', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon17}`, }, { name: 'Task Manager', id: 'AMManager', command: 'switchToTabHavingURI("about:processes", true)', tooltiptext: 'about:processes', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon18}`, }, { name: 'Offline arbeiten', id: 'AMOffline', command: 'BrowserOffline.toggleOfflineStatus();', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon19}`, }, { name: 'Neustart', id: 'AMreboot', tooltiptext: 'userChrome.js-Cache wird geleert', command: 'goReeboot', image: `${ProfilePath}/${ButtonIcon01}`, }, { name: 'Beenden', id: 'AMquit', command: 'goQuitApplication(event);', image: `${ProfilePath}/${ButtonIcon02}`, }, // uProfMenu-Funktionen unter Menüeintrag "Konfiguration" { name: 'userChrome.css bearbeiten', id: 'AMuserChromeCss', command: () => Appmenu.edit(0, 'userChrome.css'), subdir: 'Konfiguration', image: `${ProfilePath}/css4.svg`, }, { name: 'userChromeShadow.css bearbeiten', id: 'AMuserChromeShadowCss', command: () => Appmenu.edit(0, 'userChromeShadow.css'), subdir: 'Konfiguration', image: `${ProfilePath}/css4.svg`, }, { name: 'userContent.css bearbeiten', id: 'AMuserContentCss', command: () => Appmenu.edit(0, 'userContent.css'), subdir: 'Konfiguration', image: `${ProfilePath}/css4.svg`, }, { name: 'userChrome.js bearbeiten', id: 'AMuserChromeJs', command: () => Appmenu.edit(0, 'userChrome.js'), subdir: 'Konfiguration', image: `${ProfilePath}/js.svg`, }, { name: 'prefs.js bearbeiten', id: 'AMprefsJs', command: () => Appmenu.edit(1, 'prefs.js'), subdir: 'Konfiguration', image: `${ProfilePath}/js.svg`, }, { name: 'user.js bearbeiten', id: 'AMuserJs', command: () => Appmenu.edit(1, 'user.js'), subdir: 'Konfiguration', image: `${ProfilePath}/js.svg`, }, // about:-Seiten { name: 'about:about', id: 'AMaboutAbout', command: () => openTrustedLinkIn("about:about", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon21}`, }, { name: 'about:cache', id: 'AMaboutCache', command: () => openTrustedLinkIn("about:cache", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon22}`, }, { name: 'about:config', id: 'AMaboutConfig', command: () => openTrustedLinkIn("about:config", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon23}`, }, { name: 'about:crashes', id: 'AMaboutCrashes', command: () => openTrustedLinkIn("about:crashes", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon24}`, }, { name: 'about:downloads', id: 'AMaboutDownloads', command: () => openTrustedLinkIn("about:downloads", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon25}`, }, { name: 'about:home', id: 'AMaboutHome', command: () => openTrustedLinkIn("about:home", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon26}`, }, { name: 'about:logins', id: 'AMaboutLogins', command: 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon27}`, }, { name: 'about:support', id: 'AMaboutSupport', command: () => openTrustedLinkIn("about:support", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon28}`, }, { name: 'about:preferences', id: 'AMaboutPreferences', command: () => openTrustedLinkIn("about:preferences", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon29}`, }, { name: 'about:profiles', id: 'AMaboutProfiles', command: () => openTrustedLinkIn("about:profiles", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon30}`, }, ] }, _externalAppPopup: null, _isready: false, // uProfMenu-Funktionen (bereits integriert) getDirSep: function() { var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS; var dirsep = "/"; switch(osString) { case "WINNT": dirsep = "\\"; break; case "Darwin": dirsep = "/"; break; } return dirsep; }, getPrefDirectoryPath: function(str) { var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get(str, Components.interfaces.nsIFile); if (str == 'CurProcD') { file = file.parent; } return file.path; }, edit: function(OpenMode, Filename) { var Path = ""; var dSep = this.getDirSep(); switch (OpenMode) { case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break; case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break; } this.launch(this.editor, Path); }, launch: function(RanPath, OpenPath) { var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile); var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); var args = [OpenPath]; file.initWithPath(RanPath); if (!file.exists()) { var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); RanPath = pref.getCharPref("view_source.editor.path"); file.initWithPath(RanPath); } proc.init(file); proc.run(false, args, args.length); }, init: function() { this.handleRelativePath(this.toolbar.apps); const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; var ExternalAppBtn = document.createElementNS(XULNS, 'toolbarbutton'); ExternalAppBtn.id = 'AppMenuButton'; ExternalAppBtn.setAttribute('label', 'AppButton'); ExternalAppBtn.addEventListener('click', event => { event.preventDefault(); event.stopPropagation(); }); ExternalAppBtn.setAttribute('tooltiptext', 'Firefox Menü'); ExternalAppBtn.setAttribute('type', 'menu'); ExternalAppBtn.setAttribute('removable', 'true'); let ProfilePath = PathUtils.toFileURI( PathUtils.join(PathUtils.profileDir, 'chrome', 'image') ); let DefaultIcon = 'Button_groß.png'; let AlternateIcon = 'Button_klein-5.png'; if (Appmenu.isButton) { ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`; ExternalAppBtn.style.width = '94px'; ExternalAppBtn.style.height = '24px'; } else { ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`; ExternalAppBtn.style.width = '48px'; ExternalAppBtn.style.height = '21px'; } if (Appmenu.isUrlbar === 1) { var navBar = document.getElementById('nav-bar-customization-target'); navBar.insertBefore(ExternalAppBtn, navBar.firstChild); } else if (Appmenu.isUrlbar === 2) { var menubar = document.getElementById('toolbar-menubar'); menubar.insertBefore(ExternalAppBtn, menubar.firstChild); } else { var TabsToolbar = document.getElementById('TabsToolbar'); TabsToolbar.insertBefore(ExternalAppBtn, TabsToolbar.firstChild); } var ExternalAppPopup = document.createElementNS(XULNS, 'menupopup'); ExternalAppPopup.addEventListener('click', event => { event.stopPropagation(); }); ExternalAppPopup.setAttribute('id', 'AMpopup'); this._externalAppPopup = ExternalAppPopup; ExternalAppBtn.appendChild(ExternalAppPopup); Appmenu.onpopupshowing(); // CSS-Loader initialisieren this.cssLoader.initCSSLoader(); // Menü mit Tastaturkürzel öffnen if (Appmenu.hotkey) { let key = document.createXULElement('key'); key.id = 'key_AppMenuPopup'; key.setAttribute('key', Appmenu.hotkey); if (Appmenu.hotkeyModifier) key.setAttribute('modifiers', Appmenu.hotkeyModifier); key.addEventListener('command', function () { document.getElementById('AMpopup').openPopup(); }); document.getElementById('mainKeyset').appendChild(key); } }, onpopupshowing: function() { if (this._isready) return; if (this._externalAppPopup === null) return; var ExternalAppPopup = this._externalAppPopup; for (let subdir of this.toolbar.subdirs) { if (subdir.name == 'separator') { ExternalAppPopup.appendChild(document.createXULElement('menuseparator')); } else { var subdirItem = ExternalAppPopup.appendChild(document.createXULElement('menu')); var subdirItemPopup = subdirItem.appendChild(document.createXULElement('menupopup')); subdirItem.setAttribute('class', 'menu-iconic'); subdirItem.setAttribute('label', subdir.name); subdirItem.setAttribute('image', subdir.image); Appmenu.subdirPopupHash[subdir.name] = subdirItemPopup; Appmenu.subdirMenuHash[subdir.name] = subdirItem; // CSS-Loader-Menüeinträge für "CSS-Loader-Menü" if (subdir.name === "CSS-Loader-Menü") { Appmenu.cssLoader.rebuildCSSMenu(); } } } for (let app of this.toolbar.apps) { var appItem; if (app.name == 'separator') { appItem = document.createXULElement('menuseparator'); } else { appItem = document.createXULElement('menuitem'); appItem.setAttribute('class', 'menuitem-iconic'); appItem.setAttribute('label', app.name); appItem.setAttribute('image', app.image); appItem.addEventListener('command', function () { Appmenu.exec(this.path, this.args); }); appItem.setAttribute('tooltiptext', app.name); appItem.path = app.path; appItem.args = app.args; } if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) Appmenu.subdirPopupHash[app.subdir].appendChild(appItem); else ExternalAppPopup.appendChild(appItem); } for (let config of this.toolbar.configs) { var configItem; if (config.name == 'separator') { configItem = document.createXULElement('menuseparator'); } else { configItem = ExternalAppPopup.appendChild(document.createXULElement('menuitem')); configItem.setAttribute('class', 'menuitem-iconic'); configItem.setAttribute('label', config.name); configItem.setAttribute('image', config.image); configItem.addEventListener('command', () => { if (typeof config.command === 'function') { config.command(); } else { Appmenu.executeCommand(config.command); } }); if (config.tooltiptext) { configItem.setAttribute('tooltiptext', config.tooltiptext); } else { configItem.setAttribute('tooltiptext', config.name); } configItem.setAttribute('id', config.id); } if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) { Appmenu.subdirPopupHash[config.subdir].appendChild(configItem); } else { ExternalAppPopup.appendChild(configItem); } } if (this.autohideEmptySubDirs) { for (let i = 0; i < Appmenu.subdirPopupHash.length; i++) { if (Appmenu.subdirPopupHash[i].hasChildNodes()) { continue; } else { Appmenu.subdirMenuHash[i].setAttribute('hidden', 'true'); } } } if (this.moveSubDirstoBottom) { let i = ExternalAppPopup.childNodes.length; while (ExternalAppPopup.firstChild.getAttribute('class') != 'menuitem-iconic' && i-- != 0) { ExternalAppPopup.appendChild(ExternalAppPopup.firstChild); } } this._isready = true; }, executeCommand: function(command) { const commandMap = { 'gCustomizeMode.enter()': () => gCustomizeMode.enter(), 'safeModeRestart();': () => safeModeRestart(), 'goKonsole': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager'); BrowserConsoleManager.openBrowserConsoleOrFocus(); }, 'goWerkzeuge': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs'); BrowserToolboxLauncher.init(); }, 'goEntwickler': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser'); gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, performance.now()); }, 'gSync': () => gSync.openPrefs('menubar'), 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })': () => LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' }), 'switchToTabHavingURI("about:processes", true)': () => switchToTabHavingURI('about:processes', true), 'BrowserOffline.toggleOfflineStatus();': () => BrowserOffline.toggleOfflineStatus(), 'goReeboot': () => { Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); }, 'goQuitApplication(event);': () => goQuitApplication(event), }; if (commandMap[command]) { commandMap[command](); } else { console.warn('Unbekannter Befehl: ', command); } }, handleRelativePath: function(apps) { for (let app of apps) { if (app.path) { app.path = app.path.replace(/\//g, '\\'); var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get(app.root, Ci.nsIFile).path; if (/^(\\)/.test(app.path)) { app.path = ffdir + app.path; } } } }, exec: function(path, args) { args = args || []; var args_t = args.slice(0); for (let arg of args_t) { arg = arg.replace(/%u/g, gBrowser.currentURI.spec); } var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); file.initWithPath(path); if (!file.exists()) { alert('Datei nicht gefunden: ' + path); return; } if (file.isExecutable() && !path.endsWith('.js')) { var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(file); process.run(false, args_t, args_t.length); } else if (file.isFile()) { if (this.editor) { let UI = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().includes('win') ? 'Shift_JIS' : 'UTF-8'; let path = UI.ConvertFromUnicode(file.path); let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); app.initWithPath(this.editor); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } else { file.launch(); } } else if (file.isDirectory()) { if (this.fileManager) { let args=[this.FMParameter,path]; let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); app.initWithPath(this.fileManager); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, args, args.length); } else { file.launch(); } } }, }; /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ /* ***************************************************************************************************************************** */ // CSSEntry-Klasse (aus UserCSSLoader) function CSSEntry(aFile) { this.path = aFile.path; this.leafName = aFile.leafName; this.lastModifiedTime = 1; this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? Ci.nsIStyleSheetService.AGENT_SHEET : /\.author\.css$/i.test(this.leafName) ? Ci.nsIStyleSheetService.AUTHOR_SHEET : Ci.nsIStyleSheetService.USER_SHEET; } CSSEntry.prototype = { sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), _enabled: false, get enabled() { return this._enabled; }, set enabled(isEnable) { let aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); aFile.initWithPath(this.path); let isExists = aFile.exists(); let lastModifiedTime = isExists ? aFile.lastModifiedTime : 0; let isForced = this.lastModifiedTime != lastModifiedTime; let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile); let uri = Services.io.newURI(fileURL, null, null); if (this.sss.sheetRegistered(uri, this.SHEET)) { if (!isEnable || !isExists) { this.sss.unregisterSheet(uri, this.SHEET); } else if (isForced) { this.sss.unregisterSheet(uri, this.SHEET); this.sss.loadAndRegisterSheet(uri, this.SHEET); } } else { if (isEnable && isExists) { this.sss.loadAndRegisterSheet(uri, this.SHEET); } } this.lastModifiedTime = lastModifiedTime; return this._enabled = isEnable; }, }; (function () { let sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService); let uri = Services.io.newURI( 'data:text/css;charset=utf-8,' + encodeURIComponent(` menuitem[label="Profil-Verzeichnis"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="Chrome-Ordner"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="CSS-Ordner"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="JS-Ordner"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="Icons-Ordner"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="Addon-Verzeichnis"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="Programm-Verzeichnis"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label="Startup-Cache"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMAnpassen { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMModus { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMKonsole { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMWerkzeuge { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMEntwickler { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMsynchron { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMdaten { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMManager { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMOffline { -moz-context-properties: fill, fill-opacity; fill: currentColor; } /* Neustart-Button */ #AMreboot { -moz-context-properties: fill, fill-opacity !important; fill: #fbc96e !important; padding-left: 10px !important; } #AMreboot > img:nth-child(1) { width: 20px !important; height: 20px !important; } /* Beenden-Button */ #AMquit { -moz-context-properties: fill, fill-opacity !important; fill: red !important; } /* about:-Seiten */ #AMaboutAbout { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutCache { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutConfig { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutCrashes { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutDownloads { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutHome { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutLogins { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutSupport { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutPreferences { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutProfiles { -moz-context-properties: fill, fill-opacity; fill: currentColor; } /* uProfMenu-Einträge */ #AMuserChromeCss { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserChromeShadowCss { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserContentCss { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserChromeJs { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMprefsJs { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserJs { -moz-context-properties: fill, fill-opacity; fill: currentColor; } /* 1 */ menuitem[subdir="CSS-Loader-Menü"] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #appmenu-css-CSS-Ordner-öffnen { -moz-context-properties: fill, fill-opacity; fill: currentColor; } `), null, null ); sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET); })(); if (window.gBrowser) Appmenu.init();
Funktioniert sogar in der Nightly 145.0a1 (2025-10-05) ohne Fehlermeldungen in der Konsole.
-
Hat doch etwas gedauert.
JavaScript
Alles anzeigen// ==UserScript== // @name Appmenu.uc.js // @namespace Appmenu@gmail.com // @description Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche // @include main // @author defpt // @charset UTF-8 // @version 2025.10.07 Integrierte uProfMenu-Funktionen in Menüeintrag "Konfiguration" // ==/UserScript== // Definiere den Profilpfad für die Symbole let ProfilePath = PathUtils.toFileURI( PathUtils.join(PathUtils.profileDir, 'chrome', 'icons') ); // Standard-Symbol-Dateiname let ButtonIcon01 = 'restart.svg'; // Neustart let ButtonIcon02 = 'quit.svg'; // Beenden let Icon01 = 'profile.svg'; // Profil-Verzeichnis let Icon02 = 'chrome.svg'; // Chrome-Ordner let Icon03 = 'css4.svg'; // CSS-Ordner let Icon04 = 'js.svg'; // JS-Ordner let Icon05 = 'folder-plus.svg'; // Icons-Ordner let Icon06 = 'addons.svg'; // Addon-Verzeichnis let Icon07 = 'folder.svg'; // Programm-Verzeichnis let Icon08 = 'folder-1.svg'; // Startup-Cache let Icon11 = 'Themes.svg'; // Anpassen let Icon12 = 'debugging-workers.svg'; // Neustart im abgesicherten Modus let Icon13 = 'command-console.svg'; // Browser-Konsole let Icon14 = 'window-dev-tools.svg'; // Browser-Werkzeuge let Icon15 = 'developer.svg'; // Web-Entwickler let Icon16 = 'sync.svg'; // Firefox synchronisieren let Icon17 = 'passwords.svg'; // Zugangsdaten und Passwörter let Icon18 = 'performance.svg'; // Task Manager let Icon19 = 'plug-disconnected.svg'; // Offline arbeiten let Icon21 = 'firefox.svg'; // about:about let Icon22 = 'info.svg'; // about:cache let Icon23 = 'settings.svg'; // about:config let Icon24 = 'warning.svg'; // about:crashes let Icon25 = 'downloads.svg'; // about:downloads let Icon26 = 'home.svg'; // about:home let Icon27 = 'passwords.svg'; // about:logins let Icon28 = 'debugging-workers.svg'; // about:support let Icon29 = 'settings.svg'; // about:preferences let Icon30 = 'profile.svg'; // about:profiles var Appmenu = { // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Editor mit angegebenem Pfad verwenden // editor: 'C:\\Program Files\\Notepad++\\notepad++.exe', editor: "C:\\Program Files\\Microsoft VS Code\\Code.exe", // oder // in 'view_source.editor.path' eingetragenen Editor verwenden editor: Services.prefs.getCharPref('view_source.editor.path'), // Dateimanager mit angegebenem Pfad verwenden oder leer ('') wenn System-Dateimanager verwenden //fileManager: 'C:\\Program files\\FreeCommander XE\\FreeCommander.exe', fileManager: "", // Parameter für Dateimanager oder leer ('') //FMParameter: '/T', FMParameter: "", // Submenüs ohne Inhalt im Hauptmenü automatisch ausblenden autohideEmptySubDirs: true, // Submenüs im Hauptmenü nach unten verschieben moveSubDirstoBottom: false, // Ort und Aussehen des Menü-Buttons einstellen // isUrlbar: 1, // 0: TabsToolbar; 1: navbar, isUrlbar: 2, // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar isButton: 0, // 0: Hamburger,klein; 1: Firefox,groß, // Hotkey zum Öffnen des Appmenüs oder leer ('') hotkey: "f", hotkeyModifier: "alt", TextOpenExe: 'C:\\Program Files\\Microsoft VS Code\\Code.exe', // Pfad zum Editor (aus uProfMenu) // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Submenüs im Hauptmenü nach unten verschieben subdirPopupHash: [], subdirMenuHash: [], toolbar: { subdirs: [ { name: 'Firefox Verzeichnisse', image: `${ProfilePath}/folder_currentColor.svg`, }, { name: 'Firefox Funktionen', image: `${ProfilePath}/settings_currentColor.svg`, }, { name: 'separator', }, { name: '1', image: `${ProfilePath}/1.svg`, }, { name: 'Konfiguration', image: `${ProfilePath}/Hammer-wrench_currentColor.svg`, }, { name: '"about:"-Seiten', image: `${ProfilePath}/firefox_currentColor.svg`, }, ], apps: [ { name: 'Profil-Verzeichnis', id: 'AMProfil', root: 'ProfD', path: '\\', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon01}`, }, { name: 'Chrome-Ordner', id: 'AMchrome', root: 'ProfD', path: '\\chrome', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon02}`, }, { name: 'CSS-Ordner', id: 'AMCSS', root: 'ProfD', path: '\\chrome\\css', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon03}`, }, { name: 'JS-Ordner', id: 'AMJS', root: 'ProfD', path: '\\chrome\\scripts', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon04}`, }, { name: 'Icons-Ordner', id: 'AMICO', root: 'ProfD', path: '\\chrome\\icons', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon05}`, }, { name: 'Addon-Verzeichnis', id: 'AMAddons', root: 'ProfD', path: '\\extensions', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon06}`, }, { name: 'Programm-Verzeichnis', id: 'AMProgramm', root: 'CurProcD', path: '\\', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon07}`, }, { name: 'Startup-Cache', id: 'AMCache', root: 'ProfLD', path: '\\startupCache', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon08}`, }, ], configs: [ { name: 'Anpassen', id: 'AMAnpassen', command: 'gCustomizeMode.enter()', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon11}`, }, { name: 'Neustart im abgesicherten Modus', id: 'AMModus', command: 'safeModeRestart();', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon12}`, }, { name: 'Browser-Konsole', id: 'AMKonsole', command: 'goKonsole', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon13}`, }, { name: 'Browser-Werkzeuge', id: 'AMWerkzeuge', command: 'goWerkzeuge', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon14}`, }, { name: 'Web-Entwickler', id: 'AMEntwickler', command: 'goEntwickler', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon15}`, }, { name: 'Firefox synchronisieren', id: 'AMsynchron', command: 'gSync', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon16}`, }, { name: 'Zugangsdaten und Passwörter', id: 'AMdaten', command: 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })', tooltiptext: 'about:logins', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon17}`, }, { name: 'Task Manager', id: 'AMManager', command: 'switchToTabHavingURI("about:processes", true)', tooltiptext: 'about:processes', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon18}`, }, { name: 'Offline arbeiten', id: 'AMOffline', command: 'BrowserOffline.toggleOfflineStatus();', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon19}`, }, { name: 'Neustart', id: 'AMreboot', tooltiptext: 'userChrome.js-Cache wird geleert', command: 'goReeboot', image: `${ProfilePath}/${ButtonIcon01}`, }, { name: 'Beenden', id: 'AMquit', command: 'goQuitApplication(event);', image: `${ProfilePath}/${ButtonIcon02}`, }, // uProfMenu-Funktionen unter Menüeintrag "Konfiguration" { name: 'userChrome.css bearbeiten', id: 'AMuserChromeCss', command: () => Appmenu.edit(0, 'userChrome.css'), subdir: 'Konfiguration', image: `${ProfilePath}/css4.svg`, }, { name: 'userChromeShadow.css bearbeiten', id: 'AMuserChromeShadowCss', command: () => Appmenu.edit(0, 'userChromeShadow.css'), subdir: 'Konfiguration', image: `${ProfilePath}/css4.svg`, }, { name: 'userContent.css bearbeiten', id: 'AMuserContentCss', command: () => Appmenu.edit(0, 'userContent.css'), subdir: 'Konfiguration', image: `${ProfilePath}/css4.svg`, }, { name: 'userChrome.js bearbeiten', id: 'AMuserChromeJs', command: () => Appmenu.edit(0, 'userChrome.js'), subdir: 'Konfiguration', image: `${ProfilePath}/js.svg`, }, { name: 'prefs.js bearbeiten', id: 'AMprefsJs', command: () => Appmenu.edit(1, 'prefs.js'), subdir: 'Konfiguration', image: `${ProfilePath}/js.svg`, }, { name: 'user.js bearbeiten', id: 'AMuserJs', command: () => Appmenu.edit(1, 'user.js'), subdir: 'Konfiguration', image: `${ProfilePath}/js.svg`, }, // about:-Seiten { name: 'about:about', id: 'AMaboutAbout', command: () => openTrustedLinkIn("about:about", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon21}`, }, { name: 'about:cache', id: 'AMaboutCache', command: () => openTrustedLinkIn("about:cache", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon22}`, }, { name: 'about:config', id: 'AMaboutConfig', command: () => openTrustedLinkIn("about:config", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon23}`, }, { name: 'about:crashes', id: 'AMaboutCrashes', command: () => openTrustedLinkIn("about:crashes", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon24}`, }, { name: 'about:downloads', id: 'AMaboutDownloads', command: () => openTrustedLinkIn("about:downloads", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon25}`, }, { name: 'about:home', id: 'AMaboutHome', command: () => openTrustedLinkIn("about:home", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon26}`, }, { name: 'about:logins', id: 'AMaboutLogins', command: 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon27}`, }, { name: 'about:support', id: 'AMaboutSupport', command: () => openTrustedLinkIn("about:support", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon28}`, }, { name: 'about:preferences', id: 'AMaboutPreferences', command: () => openTrustedLinkIn("about:preferences", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon29}`, }, { name: 'about:profiles', id: 'AMaboutProfiles', command: () => openTrustedLinkIn("about:profiles", "tab"), subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon30}`, }, ] }, _externalAppPopup: null, _isready: false, // uProfMenu-Funktionen (integriert) getDirSep: function() { var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS; var dirsep = "/"; switch(osString) { case "WINNT": dirsep = "\\"; break; case "Darwin": dirsep = "/"; break; } return dirsep; }, getPrefDirectoryPath: function(str) { var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get(str, Components.interfaces.nsIFile); if (str == 'CurProcD') { file = file.parent; } return file.path; }, edit: function(OpenMode, Filename) { var Path = ""; var dSep = this.getDirSep(); switch (OpenMode) { case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break; case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break; } this.launch(this.TextOpenExe, Path); // this.launch(this.editor, Path); }, launch: function(RanPath, OpenPath) { var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile); var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); var args = [OpenPath]; file.initWithPath(RanPath); if (!file.exists()) { var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); RanPath = pref.getCharPref("view_source.editor.path"); file.initWithPath(RanPath); } proc.init(file); proc.run(false, args, args.length); }, init: function() { this.handleRelativePath(this.toolbar.apps); const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; var ExternalAppBtn = document.createElementNS(XULNS, 'toolbarbutton'); ExternalAppBtn.id = 'AppMenuButton'; ExternalAppBtn.setAttribute('label', 'AppButton'); ExternalAppBtn.addEventListener('click', event => { event.preventDefault(); event.stopPropagation(); }); ExternalAppBtn.setAttribute('tooltiptext', 'Firefox Menü'); ExternalAppBtn.setAttribute('type', 'menu'); ExternalAppBtn.setAttribute('removable', 'true'); let ProfilePath = PathUtils.toFileURI( PathUtils.join(PathUtils.profileDir, 'chrome', 'image') ); let DefaultIcon = 'Button_groß.png'; let AlternateIcon = 'Button_klein-5.png'; if (Appmenu.isButton) { ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`; ExternalAppBtn.style.width = '94px'; ExternalAppBtn.style.height = '24px'; } else { ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`; ExternalAppBtn.style.width = '48px'; ExternalAppBtn.style.height = '21px'; } if (Appmenu.isUrlbar === 1) { var navBar = document.getElementById('nav-bar-customization-target'); navBar.insertBefore(ExternalAppBtn, navBar.firstChild); } else if (Appmenu.isUrlbar === 2) { var menubar = document.getElementById('toolbar-menubar'); menubar.insertBefore(ExternalAppBtn, menubar.firstChild); } else { var TabsToolbar = document.getElementById('TabsToolbar'); TabsToolbar.insertBefore(ExternalAppBtn, TabsToolbar.firstChild); } var ExternalAppPopup = document.createElementNS(XULNS, 'menupopup'); ExternalAppPopup.addEventListener('click', event => { event.stopPropagation(); }); ExternalAppPopup.setAttribute('id', 'AMpopup'); this._externalAppPopup = ExternalAppPopup; ExternalAppBtn.appendChild(ExternalAppPopup); Appmenu.onpopupshowing(); if (Appmenu.hotkey) { let key = document.createXULElement('key'); key.id = 'key_AppMenuPopup'; key.setAttribute('key', Appmenu.hotkey); if (Appmenu.hotkeyModifier) key.setAttribute('modifiers', Appmenu.hotkeyModifier); key.addEventListener('command', function () { document.getElementById('AMpopup').openPopup(); }); document.getElementById('mainKeyset').appendChild(key); } }, onpopupshowing: function() { if (this._isready) return; if (this._externalAppPopup === null) return; var ExternalAppPopup = this._externalAppPopup; for (let subdir of this.toolbar.subdirs) { if (subdir.name == 'separator') { ExternalAppPopup.appendChild(document.createXULElement('menuseparator')); } else { var subdirItem = ExternalAppPopup.appendChild(document.createXULElement('menu')); var subdirItemPopup = subdirItem.appendChild(document.createXULElement('menupopup')); subdirItem.setAttribute('class', 'menu-iconic'); subdirItem.setAttribute('label', subdir.name); subdirItem.setAttribute('image', subdir.image); Appmenu.subdirPopupHash[subdir.name] = subdirItemPopup; Appmenu.subdirMenuHash[subdir.name] = subdirItem; } } for (let app of this.toolbar.apps) { var appItem; if (app.name == 'separator') { appItem = document.createXULElement('menuseparator'); } else { appItem = document.createXULElement('menuitem'); appItem.setAttribute('class', 'menuitem-iconic'); appItem.setAttribute('label', app.name); appItem.setAttribute('image', app.image); appItem.addEventListener('command', function () { Appmenu.exec(this.path, this.args); }); appItem.setAttribute('tooltiptext', app.name); appItem.path = app.path; appItem.args = app.args; } if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) Appmenu.subdirPopupHash[app.subdir].appendChild(appItem); else ExternalAppPopup.appendChild(appItem); } for (let config of this.toolbar.configs) { var configItem; if (config.name == 'separator') { configItem = document.createXULElement('menuseparator'); } else { configItem = ExternalAppPopup.appendChild(document.createXULElement('menuitem')); configItem.setAttribute('class', 'menuitem-iconic'); configItem.setAttribute('label', config.name); configItem.setAttribute('image', config.image); configItem.addEventListener('command', () => { if (typeof config.command === 'function') { config.command(); } else { Appmenu.executeCommand(config.command); } }); if (config.tooltiptext) { configItem.setAttribute('tooltiptext', config.tooltiptext); } else { configItem.setAttribute('tooltiptext', config.name); } configItem.setAttribute('id', config.id); } if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) { Appmenu.subdirPopupHash[config.subdir].appendChild(configItem); } else { ExternalAppPopup.appendChild(configItem); } } if (this.autohideEmptySubDirs) { for (let i = 0; i < Appmenu.subdirPopupHash.length; i++) { if (Appmenu.subdirPopupHash[i].hasChildNodes()) { continue; } else { Appmenu.subdirMenuHash[i].setAttribute('hidden', 'true'); } } } if (this.moveSubDirstoBottom) { let i = ExternalAppPopup.childNodes.length; while (ExternalAppPopup.firstChild.getAttribute('class') != 'menuitem-iconic' && i-- != 0) { ExternalAppPopup.appendChild(ExternalAppPopup.firstChild); } } this._isready = true; }, executeCommand: function(command) { const commandMap = { 'gCustomizeMode.enter()': () => gCustomizeMode.enter(), 'safeModeRestart();': () => safeModeRestart(), 'goKonsole': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager'); BrowserConsoleManager.openBrowserConsoleOrFocus(); }, 'goWerkzeuge': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs'); BrowserToolboxLauncher.init(); }, 'goEntwickler': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser'); gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, performance.now()); }, 'gSync': () => gSync.openPrefs('menubar'), 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })': () => LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' }), 'switchToTabHavingURI("about:processes", true)': () => switchToTabHavingURI('about:processes', true), 'BrowserOffline.toggleOfflineStatus();': () => BrowserOffline.toggleOfflineStatus(), 'goReeboot': () => { Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); }, 'goQuitApplication(event);': () => goQuitApplication(event), }; if (commandMap[command]) { commandMap[command](); } else { console.warn('Unbekannter Befehl: ', command); } }, handleRelativePath: function(apps) { for (let app of apps) { if (app.path) { app.path = app.path.replace(/\//g, '\\'); var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get(app.root, Ci.nsIFile).path; if (/^(\\)/.test(app.path)) { app.path = ffdir + app.path; } } } }, exec: function(path, args) { args = args || []; var args_t = args.slice(0); for (let arg of args_t) { arg = arg.replace(/%u/g, gBrowser.currentURI.spec); } var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); file.initWithPath(path); if (!file.exists()) { alert('Datei nicht gefunden: ' + path); return; } if (file.isExecutable() && !path.endsWith('.js')) { var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(file); process.run(false, args_t, args_t.length); } else if (file.isFile()) { if (this.editor) { let UI = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().includes('win') ? 'Shift_JIS' : 'UTF-8'; let path = UI.ConvertFromUnicode(file.path); let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); app.initWithPath(this.editor); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } else { file.launch(); } } else if (file.isDirectory()) { if (this.fileManager) { let args=[this.FMParameter,path]; let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); app.initWithPath(this.fileManager); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, args, args.length); } else { file.launch(); } } }, }; (function () { let sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService); let uri = Services.io.newURI( 'data:text/css;charset=utf-8,' + encodeURIComponent(` menuitem[label='Profil-Verzeichnis'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Chrome-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='CSS-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='JS-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Icons-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Addon-Verzeichnis'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Programm-Verzeichnis'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Startup-Cache'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMAnpassen { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMModus { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMKonsole { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMWerkzeuge { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMEntwickler { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMsynchron { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMdaten { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMManager { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMOffline { -moz-context-properties: fill, fill-opacity; fill: currentColor; } /* Neustart-Button */ #AMreboot { -moz-context-properties: fill, fill-opacity !important; fill: #fbc96e !important; padding-left: 10px !important; } #AMreboot > img:nth-child(1) { width: 20px !important; height: 20px !important; } /* Beenden-Button */ #AMquit { -moz-context-properties: fill, fill-opacity !important; fill: red !important; } /* about:-Seiten */ #AMaboutAbout { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutCache { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutConfig { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutCrashes { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutDownloads { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutHome { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutLogins { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutSupport { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutPreferences { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutProfiles { -moz-context-properties: fill, fill-opacity; fill: currentColor; } /* uProfMenu-Einträge */ #AMuserChromeCss { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserChromeShadowCss { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserContentCss { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserChromeJs { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMprefsJs { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMuserJs { -moz-context-properties: fill, fill-opacity; fill: currentColor; } `), null, null ); sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET); })(); if (window.gBrowser) Appmenu.init();
-
Bei "Anpassungen", dachte ich immer an, "Symbolleisten anpassen ..." und im Menü "Firefox Funktionen" heißt gleich der
erste Eintrag "Anpassen".
Da bin ich gedanklich ständig hängen geblieben, aber "Konfiguration" finde ich recht gut.
Danke.
Die neuere Version kommt dann auch so gleich. -
2002Andreas Wird noch besser.
Ich sitze nun schon eine ganze weile hier und mir fällt kein "Oberberbegriff" für die Dateien
userChrome.css, userChromeShadow.css, userContent.css, userChrome.js, prefs.js und user.js ein.
Denn ich möchte ja den Platzhalter "2" irgendwie benennen.
Mit der Funktion bin ich eigentlich fertig
Die Menüschaltfläche "2" öffnet ein Submenü und man zeigt eben diese "Dateien" an,
und beim Draufklicken öffnet sich der eingestellte "Editor" zum direkten Bearbeiten der ausgewählten Datei. -
Habe es noch einmal etwas überarbeitet, d.h. Kommentare eingefügt
und für mich das CSS inkl. Symbole angepasst.JavaScript
Alles anzeigen// ==UserScript== // @name Appmenu.uc.js // @namespace Appmenu@gmail.com // @description Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche // @include main // @author defpt // @charset UTF-8 // @version 2025.10.05 // ==/UserScript== // Definiere den Profilpfad für die Symbole let ProfilePath = PathUtils.toFileURI( PathUtils.join(PathUtils.profileDir, 'chrome', 'icons') ); // Standard-Symbol-Dateiname let ButtonIcon01 = 'restart.svg'; // Neustart let ButtonIcon02 = 'quit.svg'; // Beenden let Icon01 = 'profile.svg'; // Profil-Verzeichnis let Icon02 = 'chrome.svg'; // Chrome-Ordner let Icon03 = 'css4.svg'; // CSS-Ordner let Icon04 = 'js.svg'; // JS-Ordner let Icon05 = 'folder-plus.svg'; // Icons-Ordner let Icon06 = 'addons.svg'; // Addon-Verzeichnis let Icon07 = 'folder.svg'; // Programm-Verzeichnis let Icon08 = 'folder-1.svg'; // Startup-Cache let Icon11 = 'Themes.svg'; // Anpassen let Icon12 = 'debugging-workers.svg'; // Neustart im abgesicherten Modus let Icon13 = 'command-console.svg'; // Browser-Konsole let Icon14 = 'window-dev-tools.svg'; // Browser-Werkzeuge let Icon15 = 'developer.svg'; // Web-Entwickler let Icon16 = 'sync.svg'; // Firefox synchronisieren let Icon17 = 'passwords.svg'; // Zugangsdaten und Passwörter let Icon18 = 'performance.svg'; // Task Manager let Icon19 = 'plug-disconnected.svg'; // Offline arbeiten let Icon21 = 'firefox.svg'; // about:about let Icon22 = 'info.svg'; // about:cache let Icon23 = 'settings.svg'; // about:config let Icon24 = 'warning.svg'; // about:crashes let Icon25 = 'downloads.svg'; // about:downloads let Icon26 = 'home.svg'; // about:home let Icon27 = 'passwords.svg'; // about:logins let Icon28 = 'debugging-workers.svg'; // about:support let Icon29 = 'settings.svg'; // about:preferences let Icon30 = 'profile.svg'; // about:profiles var Appmenu = { // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Editor mit angegebenem Pfad verwenden // editor: 'C:\\Program Files\\Notepad++\\notepad++.exe', editor: "C:\\Program Files\\Microsoft VS Code\\Code.exe", // oder // in 'view_source.editor.path' eingetragenen Editor verwenden editor: Services.prefs.getCharPref('view_source.editor.path'), // Dateimanager mit angegebenem Pfad verwenden oder leer ('') wenn System-Dateimanager verwenden //fileManager: 'C:\\Program files\\FreeCommander XE\\FreeCommander.exe', fileManager: "", // Parameter für Dateimanager oder leer ('') //FMParameter: '/T', FMParameter: "", // Submenüs ohne Inhalt im Hauptmenü automatisch ausblenden autohideEmptySubDirs: true, // Submenüs im Hauptmenü nach unten verschieben moveSubDirstoBottom: false, // Ort und Aussehen des Menü-Buttons einstellen // isUrlbar: 1, // 0: TabsToolbar; 1: navbar, isUrlbar: 2, // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar isButton: 0, // 0: Hamburger,klein; 1: Firefox,groß, // Hotkey zum Öffnen des Appmenüs oder leer ('') hotkey: "f", hotkeyModifier: "alt", // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Submenüs im Hauptmenü nach unten verschieben subdirPopupHash: [], subdirMenuHash: [], toolbar: { // Submenüs des Hauptmenüs definieren; Separator einfügen mit {name: 'separator'} subdirs: [ { name: 'Firefox Verzeichnisse', image: `${ProfilePath}/folder_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()` }, { name: 'Firefox Funktionen', image: `${ProfilePath}/settings_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne 'url()' }, { name: 'separator', }, { name: '1', image: `${ProfilePath}/1.svg`, // Der Pfad wird direkt verwendet, ohne 'url()' }, { name: '2', image: `${ProfilePath}/2.svg`, // Der Pfad wird direkt verwendet, ohne 'url()' }, { name: '"about:"-Seiten', image: `${ProfilePath}/firefox_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne 'url()' }, ], apps: [ // Untermenü Firefox Verzeichnisse { name: 'Profil-Verzeichnis', id: 'AMProfil', root: 'ProfD', path: '\\', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon01}`, }, { name: 'Chrome-Ordner', id: 'AMchrome', root: 'ProfD', path: '\\chrome', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon02}`, }, { name: 'CSS-Ordner', id: 'AMCSS', root: 'ProfD', path: '\\chrome\\css', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon03}`, }, { name: 'JS-Ordner', id: 'AMJS', root: 'ProfD', path: '\\chrome\\scripts', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon04}`, }, { name: 'Icons-Ordner', id: 'AMICO', root: 'ProfD', path: '\\chrome\\icons', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon05}`, }, { name: 'Addon-Verzeichnis', id: 'AMAddons', root: 'ProfD', path: '\\extensions', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon06}`, }, { name: 'Programm-Verzeichnis', id: 'AMProgramm', root: 'CurProcD', path: '\\', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon07}`, }, { name: 'Startup-Cache', id: 'AMCache', root: 'ProfLD', path: '\\startupCache', subdir: 'Firefox Verzeichnisse', image: `${ProfilePath}/${Icon08}`, }, ], configs: [ // Untermenü Firefox Funktionen { name: 'Anpassen', id: 'AMAnpassen', command: 'gCustomizeMode.enter()', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon11}`, }, { name: 'Neustart im abgesicherten Modus', id: 'AMModus', command: 'safeModeRestart();', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon12}`, }, { name: 'Browser-Konsole', id: 'AMKonsole', command: 'goKonsole', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon13}`, }, { name: 'Browser-Werkzeuge', id: 'AMWerkzeuge', command: 'goWerkzeuge', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon14}`, }, { name: 'Web-Entwickler', id: 'AMEntwickler', command: 'goEntwickler', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon15}`, }, { name: 'Firefox synchronisieren', id: 'AMsynchron', command: 'gSync', subdir: 'Firefox Funktione', image: `${ProfilePath}/${Icon16}`, }, { name: 'Zugangsdaten und Passwörter', id: 'AMdaten', command: 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })', tooltiptext: 'about:logins', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon17}`, }, { name: 'Task Manager', id: 'AMManager', command: 'switchToTabHavingURI("about:processes", true)', tooltiptext: 'about:processes', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon18}`, }, { name: 'Offline arbeiten', id: 'AMOffline', command: 'BrowserOffline.toggleOfflineStatus();', subdir: 'Firefox Funktionen', image: `${ProfilePath}/${Icon19}`, }, /* { name: 'separator', }, */ { name: 'Neustart', id: 'AMreboot', tooltiptext: 'userChrome.js-Cache wird geleert', command: 'goReeboot', image: `${ProfilePath}/${ButtonIcon01}`, }, { name: 'Beenden', id: 'AMquit', command: 'goQuitApplication(event);', image: `${ProfilePath}/${ButtonIcon02}`, }, // about:-Seiten { name: 'about:about', id: 'AMaboutAbout', command: 'openTrustedLinkIn("about:about", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon21}`, }, { name: 'about:cache', id: 'AMaboutCache', command: 'openTrustedLinkIn("about:cache", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon22}`, }, { name: 'about:config', id: 'AMaboutConfig', command: 'openTrustedLinkIn("about:config", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon23}`, }, { name: 'about:crashes', id: 'AMaboutCrashes', command: 'openTrustedLinkIn("about:crashes", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon24}`, }, { name: 'about:downloads', id: 'AMaboutDownloads', command: 'openTrustedLinkIn("about:downloads", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon25}`, }, { name: 'about:home', id: 'AMaboutHome', command: 'openTrustedLinkIn("about:home", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon26}`, }, { name: 'about:logins', id: 'AMaboutLogins', command: 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon27}`, }, { name: 'about:support', id: 'AMaboutSupport', command: 'openTrustedLinkIn("about:support", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon28}`, }, { name: 'about:preferences', id: 'AMaboutPreferences', command: 'openTrustedLinkIn("about:preferences", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon29}`, }, { name: 'about:profiles', id: 'AMaboutProfiles', command: 'openTrustedLinkIn("about:profiles", "tab")', subdir: '"about:"-Seiten', image: `${ProfilePath}/${Icon30}`, }, ] }, _externalAppPopup: null, _isready: false, init: function() { this.handleRelativePath(this.toolbar.apps); const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; var ExternalAppBtn = document.createElementNS(XULNS, 'toolbarbutton'); ExternalAppBtn.id = 'AppMenuButton'; ExternalAppBtn.setAttribute('label', 'AppButton'); //ExternalAppBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();"); ExternalAppBtn.addEventListener('click', event => { event.preventDefault(); event.stopPropagation(); }); ExternalAppBtn.setAttribute('tooltiptext', 'Firefox Menü'); ExternalAppBtn.setAttribute('type', 'menu'); ExternalAppBtn.setAttribute('removable', 'true'); // Definiere den Profilpfad let ProfilePath = PathUtils.toFileURI( PathUtils.join(PathUtils.profileDir, 'chrome', 'image') ); // Symbole let DefaultIcon = 'Button_groß.png'; let AlternateIcon = 'Button_klein-5.png'; if (Appmenu.isButton) { ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`; // Großes Symbol ExternalAppBtn.style.width = '94px'; // Feste Breite für großes Symbol ExternalAppBtn.style.height = '24px'; // Feste Höhe für großes Symbol } else { ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`; // Kleines Symbol //ExternalAppBtn.style.width = "16px"; // Feste Breite für kleines Symbol ExternalAppBtn.style.width = '48px'; ExternalAppBtn.style.height = '21px'; // Feste Höhe für kleines Symbol } if (Appmenu.isUrlbar === 1) { var navBar = document.getElementById('nav-bar-customization-target'); navBar.insertBefore(ExternalAppBtn, navBar.firstChild); } else if (Appmenu.isUrlbar === 2) { var menubar = document.getElementById('toolbar-menubar'); menubar.insertBefore(ExternalAppBtn, menubar.firstChild); } else { var TabsToolbar = document.getElementById('TabsToolbar'); TabsToolbar.insertBefore(ExternalAppBtn, TabsToolbar.firstChild); } var ExternalAppPopup = document.createElementNS(XULNS, 'menupopup'); //ExternalAppPopup.setAttribute('onpopupshowing', 'event.stopPropagation(); Appmenu.onpopupshowing();'); ExternalAppPopup.addEventListener('click', event => { event.stopPropagation(); }); ExternalAppPopup.setAttribute('id', 'AMpopup'); this._externalAppPopup = ExternalAppPopup; ExternalAppBtn.appendChild(ExternalAppPopup); Appmenu.onpopupshowing(); // Menü mit Tastaturkürzel öffnen if (Appmenu.hotkey) { let key = document.createXULElement('key'); key.id = 'key_AppMenuPopup'; key.setAttribute('key', Appmenu.hotkey); if (Appmenu.hotkeyModifier) key.setAttribute('modifiers', Appmenu.hotkeyModifier); // key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();'); key.addEventListener('command', function () { document.getElementById('AMpopup').openPopup(); }); document.getElementById('mainKeyset').appendChild(key); } }, onpopupshowing: function() { if (this._isready) return; if (this._externalAppPopup === null) return; var ExternalAppPopup = this._externalAppPopup; for (let subdir of this.toolbar.subdirs) { if (subdir.name == 'separator') { ExternalAppPopup.appendChild(document.createXULElement('menuseparator')); } else { var subdirItem = ExternalAppPopup.appendChild(document.createXULElement('menu')); var subdirItemPopup = subdirItem.appendChild(document.createXULElement('menupopup')); subdirItem.setAttribute('class', 'menu-iconic'); subdirItem.setAttribute('label', subdir.name); subdirItem.setAttribute('image', subdir.image); Appmenu.subdirPopupHash[subdir.name] = subdirItemPopup; Appmenu.subdirMenuHash[subdir.name] = subdirItem; } } for (let app of this.toolbar.apps) { var appItem; if (app.name == 'separator') { appItem = document.createXULElement('menuseparator'); } else { appItem = document.createXULElement('menuitem'); appItem.setAttribute('class', 'menuitem-iconic'); appItem.setAttribute('label', app.name); appItem.setAttribute('image', app.image); //appItem.setAttribute('oncommand', "Appmenu.exec(this.path, this.args);"); appItem.addEventListener('command', function () { Appmenu.exec(this.path, this.args); }); appItem.setAttribute('tooltiptext', app.name); appItem.path = app.path; appItem.args = app.args; } if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) Appmenu.subdirPopupHash[app.subdir].appendChild(appItem); else ExternalAppPopup.appendChild(appItem); } for (let config of this.toolbar.configs) { var configItem; if (config.name == 'separator') { configItem = document.createXULElement('menuseparator'); } else { configItem = ExternalAppPopup.appendChild(document.createXULElement('menuitem')); configItem.setAttribute('class', 'menuitem-iconic'); configItem.setAttribute('label', config.name); configItem.setAttribute('image', config.image); //configItem.setAttribute('oncommand', config.command); // configItem.addEventListener('command', () => { // eval(config.command); // }); configItem.addEventListener('command', () => { Appmenu.executeCommand(config.command); }); if (config.tooltiptext) { configItem.setAttribute('tooltiptext', config.tooltiptext); } else { configItem.setAttribute('tooltiptext', config.name); } configItem.setAttribute('id', config.id); } if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) { Appmenu.subdirPopupHash[config.subdir].appendChild(configItem); } else { ExternalAppPopup.appendChild(configItem); } } if (this.autohideEmptySubDirs) { for (let i = 0; i < Appmenu.subdirPopupHash.length; i++) { if (Appmenu.subdirPopupHash[i].hasChildNodes()) { continue; } else { Appmenu.subdirMenuHash[i].setAttribute('hidden', 'true'); } } } if (this.moveSubDirstoBottom) { let i = ExternalAppPopup.childNodes.length; while (ExternalAppPopup.firstChild.getAttribute('class') != 'menuitem-iconic' && i-- != 0) { ExternalAppPopup.appendChild(ExternalAppPopup.firstChild); } } this._isready = true; }, executeCommand: function(command) { const commandMap = { 'gCustomizeMode.enter()': () => gCustomizeMode.enter(), 'safeModeRestart();': () => safeModeRestart(), 'goKonsole': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager'); BrowserConsoleManager.openBrowserConsoleOrFocus(); }, 'goWerkzeuge': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs'); BrowserToolboxLauncher.init(); }, 'goEntwickler': () => { var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {}); var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser'); gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now()); }, 'gSync': () => gSync.openPrefs('menubar'), 'LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" })': () => LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' }), 'switchToTabHavingURI("about:processes", true)': () => switchToTabHavingURI('about:processes', true), 'BrowserOffline.toggleOfflineStatus();': () => BrowserOffline.toggleOfflineStatus(), 'goReeboot': () => { Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); }, 'goQuitApplication(event);': () => goQuitApplication(event), 'openTrustedLinkIn("about:about", "tab")': () => openTrustedLinkIn("about:about", "tab"), 'openTrustedLinkIn("about:cache", "tab")': () => openTrustedLinkIn("about:cache", "tab"), 'openTrustedLinkIn("about:config", "tab")': () => openTrustedLinkIn("about:config", "tab"), 'openTrustedLinkIn("about:crashes", "tab")': () => openTrustedLinkIn("about:crashes", "tab"), 'openTrustedLinkIn("about:downloads", "tab")': () => openTrustedLinkIn("about:downloads", "tab"), 'openTrustedLinkIn("about:home", "tab")': () => openTrustedLinkIn("about:home", "tab"), 'openTrustedLinkIn("about:support", "tab")': () => openTrustedLinkIn("about:support", "tab"), 'openTrustedLinkIn("about:preferences", "tab")': () => openTrustedLinkIn("about:preferences", "tab"), 'openTrustedLinkIn("about:profiles", "tab")': () => openTrustedLinkIn("about:profiles", "tab"), }; if (commandMap[command]) { commandMap[command](); } else { console.warn('Unbekannter Befehl: ', command); } }, handleRelativePath: function(apps) { for (let app of apps) { if (app.path) { app.path = app.path.replace(/\//g, '\\'); var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get(app.root, Ci.nsIFile).path; if (/^(\\)/.test(app.path)) { app.path = ffdir + app.path; } } } }, exec: function(path, args) { args = args || []; var args_t = args.slice(0); for (let arg of args_t) { arg = arg.replace(/%u/g, gBrowser.currentURI.spec); } var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); file.initWithPath(path); if (!file.exists()) { //Cu.reportError('Datei nicht gefunden: ' + path); alert('Datei nicht gefunden: ' + path); return; } if (file.isExecutable() && !path.endsWith('.js')) { var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(file); process.run(false, args_t, args_t.length); } else if (file.isFile()) { if (this.editor) { let UI = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().includes('win') ? 'Shift_JIS' : 'UTF-8'; let path = UI.ConvertFromUnicode(file.path); let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); app.initWithPath(this.editor); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } else { file.launch(); } } else if (file.isDirectory()) { if (this.fileManager) { let args=[this.FMParameter,path]; let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); app.initWithPath(this.fileManager); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, args, args.length); } else { file.launch(); } } }, }; (function () { // StyleSheetService zum Hinzufügen der CSS-Regeln let sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService); let uri = Services.io.newURI( 'data:text/css;charset=utf-8,' + encodeURIComponent(` menuitem[label='Profil-Verzeichnis'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Chrome-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='CSS-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='JS-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Icons-Ordner'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Addon-Verzeichnis'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Programm-Verzeichnis'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } menuitem[label='Startup-Cache'] { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMAnpassen { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMModus { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMKonsole { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMWerkzeuge { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMEntwickler { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMsynchron { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMdaten { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMManager { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMOffline { -moz-context-properties: fill, fill-opacity; fill: currentColor; } /* Neustart-Button */ #AMreboot { -moz-context-properties: fill, fill-opacity !important; fill: #fbc96e !important; padding-left: 10px !important; } #AMreboot > img:nth-child(1) { width: 20px !important; height: 20px !important; } /* Beenden-Button */ #AMquit { -moz-context-properties: fill, fill-opacity !important; fill: red !important; } #AMaboutAbout { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutCache { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutConfig { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutCrashes { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutDownloads { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutHome { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutLogins { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutSupport { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutPreferences { -moz-context-properties: fill, fill-opacity; fill: currentColor; } #AMaboutProfiles { -moz-context-properties: fill, fill-opacity; fill: currentColor; } `), null, null ); // CSS-Regeln registrieren sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET); })(); if (window.gBrowser) Appmenu.init();
2002Andreas Es ging mir eher um die "about"-Seiten, bzw, deren Aufruf.