1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Mira_Belle

Beiträge von Mira_Belle

  • DNS-Server nur für Firefox ändern

    • Mira_Belle
    • 29. September 2024 um 20:28
    Zitat von grisu2099
    Zitat von Mira_Belle

    z.B. weil der Provider protokolliert, zensiert oder Seiten, im Voraus eilenden Gehorsam, einfach sperrt.

    Hast du eigentlich Beweise für diese Behauptungen???

    Ich persönlich? Wie soll das gehen?

    Aber Gegenfrage, Du kannst Google befragen?
    Gibt doch einfach "Liste der Gesperrte Internetseiten der DNS-Server" in Google ein!
    netzpolitik, Tarnkappe oder auch CCC geben Dir Antworten!
    Warum muss man denn hier immer alles "Vorkauen"? Und nein, ich verlinke nicht, weil da auch "gesperrte" Seiten in Listen auftauchen können, für die Sören abgemahnt werden könnte!

    Aber für Dich: https://netzpolitik.org/2024/cuii-list…der-freiwillig/

    Bitte aber genau lesen! Es sind Seiten dabei, die gesperrt werden, ohne richterlichen Beschluss:!:

    Das nennt man dann Zensur.

  • DNS-Server nur für Firefox ändern

    • Mira_Belle
    • 29. September 2024 um 18:13
    Zitat von Webmark

    ... , zumal er auch keinen Grund für die Umstellung angegeben hat.

    Stimmt. Da war was. Sorry.

  • DNS-Server nur für Firefox ändern

    • Mira_Belle
    • 29. September 2024 um 17:57

    Webmark Du hattest gefragt, ich habe Dir einen Tipp zur "Selbsthilfe" gegeben.
    Aber wenn das Thema für Dich so uninteressant ist, weil ja bei Dir alles funktioniert,
    warum hast Du Dich dann zu Wort gemeldet und eine Frage gestellt?
    Muss ich nicht verstehen und es interessiert mich auch nicht wirklich!
    Andere User habe so ihre Gründe, z.B. weil der Provider protokolliert, zensiert oder Seiten, im Voraus eilenden Gehorsam, einfach sperrt. Oder auch, weil ein anderer DNS-Sever die gewünschten Adressen einfach schneller ausliefert,
    oder auch, weil vorab Werbung ausgeblendet werden soll.
    Und ein Familienadmin könnte auch ein Interesse haben, dass Porn- und/oder andere schmuddeligen Seiten erst gar
    nicht angesurft werden können,
    Ergo, Gründe gibt es viele, warum man einen anderen DNS-Server verwenden möchte,
    als den "vorgegebenen" des Providers. ;)

  • DNS-Server nur für Firefox ändern

    • Mira_Belle
    • 29. September 2024 um 17:03
    Zitat von Webmark

    Ich habe bisher nie Probleme hinsichtlich der Geschwindigkeit bei den Standard DNS-Server feststellen können und es wurde auch nichts blockiert. Zudem sollte man auch bedenken, dass z. B. Google die Nutzung protokolliert und analysiert.

    Äh, außer Google gibt es da noch Alternativen!
    Die weder protokollieren noch zensieren!
    Und auch wenn DU bisher nichts bemerkt hast, ja die DNS-Server z.B. Telekom zensieren und sperren!

    Links werde ich hier jetzt nicht posten, aber gebe doch mal "Liste der Gesperrte Internetseiten der DNS-Server" in Google ein und schaue Dir die gefundenen Links mal genauer an!

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Mira_Belle
    • 25. September 2024 um 02:10

    Ich danke Dir für den schnellen Test.

    Habe den Fehler schon gefunden, werde aber morgen mal etwas ausführlicher testen.

    Dieses Skript sollte nur mit "meinem" zurechtgestutzten Appmenu.uc.js genutzt werden!

    Der Sinn sollte ja sein, die Menüleiste überflüssig zu machen, damit es mehr Platz gibt.
    Und ja, per Javascript und des darin enthaltenen CSS werden die Menüs verschoben, bzw. ausgeblendet!

    Somit wäre die Menüleiste leer! Entweder dann ausblenden, oder mit eigenen Buttons zu kleistern.
    So der Plan.

    Im Übrigen können der Appmenu.uc.js auch wieder all die vermissten Funktionen hinzugefügt werden.
    Aber mir reicht es, die Verzeichnisse und einige wenige Funktionen relativ schnell direkt aus dem Menü aufrufen zu können.
    Eventuell hattest Du ja auch mal einen Screenshot meiner FF gesehen?
    Da sind so einige Buttons in der Menüleiste, sowie auch in der Navigationsleiste (Nav-bar).
    Das wollte ich etwas ausdünnen, auch weil viele Funktionen doppelt und dreifach aufzurufen sind.
    Einiges ist über das "neu" Menü unter "Firefox Funktionen" sowie über "Extras/Weitere Werkzeuge,
    wie auch übers Hamburgermenü erreichbar. Und dann habe ich da eben noch die Buttons!
    Bissel viel, oder?

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Mira_Belle
    • 25. September 2024 um 00:37
    Zitat von bege

    Meine Version sieht so aus, davon gibt es aber noch andere Versionen in diesem Forum. Bei Endor wird es sicher auch eine Version geben.

    JavaScript
    // ==UserScript==
    
    ...
    uProfMenu.init();

    Danke, nur komisch, ich bekomme es nicht zum "laufen".
    Na ja, ist erst einmal nicht so wichtig für mich.

    Habe, so glaube ich, die Fehler mit dem Skript von Jizz behoben!

    Wärst Du so lieb und würdest noch einmal testen?

    2002Andreas Du auch, bitte.

    JavaScript
    (function () {
        setTimeout(async function () {
            // Menüs einfügen 
            var pane1 = document.getElementById('AMpopup');
            var item1 = document.getElementById('tools-menu');
            var item2 = document.getElementById('AMreboot');        
            var mb = document.getElementById('main-menubar');
    
            var toolsMenu = document.getElementById('tools-menu');
            pane1.insertBefore(toolsMenu, item2);
            var helpmenu = document.getElementById('helpMenu');
            pane1.insertBefore(helpmenu, item2);
            var separator = document.createXULElement('menuseparator');
            separator.setAttribute('flex', '1');
            pane1.insertBefore(separator, item2);
    
            // Menüs, die kopiert werden sollen
            const allowedMenus = ['file-menu', 'edit-menu', 'view-menu', 'history-menu', 'bookmarksMenu'];
            
            const menuItems = [...mb.children].filter(m => m.tagName.toLowerCase() === "menu" && allowedMenus.includes(m.id));
    
            menuItems.forEach((m, index) => {
                let cl = m.cloneNode(true);
                let t = cl.querySelector('.menubar-text');
                if (t) cl.removeChild(t);
                item1.parentNode.insertBefore(cl, item1); // Korrekte Positionierung
    
                // Überprüfen und Hinzufügen des Pfeils
                if (cl.id === 'tools-menu' || cl.id === 'helpMenu') {
                    let arrow = document.createXULElement('menupopup');
                    arrow.setAttribute('class', 'menu-arrow');
                    cl.appendChild(arrow);
                }
    
            });
    
            // bind event
            let source = await readSource('chrome://browser/content/browser-menubar.js');
            source = source.replace(/.*let mainMenuBar/is, 'let mainMenuBar')
                           .replace(/},\n\s+{ once: true }.*/is, '')
                           .replace("main-menubar", "AMpopup")
                           .replace('.getElementById("historyMenuPopup")', '.querySelector("#AMpopup #historyMenuPopup")')
                           .replaceAll('getElementById("history-menu")', 'querySelector("#AMpopup #history-menu")')
                           .replace('.getElementById("menu_EditPopup")', '.querySelector("#AMpopup #menu_EditPopup")');
            
            eval(source);
    
            // Funktionen für Event-Listener
    
            // == tools-menu ==
            function onExtraCommand(e) {
                switch (e.target.id) {
                    case 'menu_preferences':
                        openPreferences();
                        break;
                }
            }
            toolsMenu.addEventListener('command', onExtraCommand);
    
            // == helpMenu ==
            function onHelpCommand(e) {
                switch (e.target.id) {
                    case 'menu_openHelp':
                        openHelpLink('firefox-help');
                        break;
                    case 'menu_layout_debugger':
                        toOpenWindowByType('mozapp:layoutdebug', 'chrome://layoutdebug/content/layoutdebug.xhtml');
                        break;
                    case 'feedbackPage':
                        openFeedbackPage();
                        break;
                    case 'helpSafeMode':
                        safeModeRestart();
                        break;
                    case 'troubleShooting':
                        openTroubleshootingPage();
                        break;
                    case 'help_reportSiteIssue':
                        ReportSiteIssue();
                        break;
                    case 'menu_HelpPopup_reportPhishingtoolmenu':
                        openUILink(gSafeBrowsing.getReportURL('Phish'), e, {
                            triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({}),
                        });
                        break;
                    case 'menu_HelpPopup_reportPhishingErrortoolmenu':
                        ReportFalseDeceptiveSite();
                        break;
                    case 'helpSwitchDevice':
                        openSwitchingDevicesPage();
                        break;
                    case 'aboutName':
                        openAboutDialog();
                        break;
                    case 'helpPolicySupport':
                        openTrustedLinkIn(Services.policies.getSupportMenu().URL.href, 'tab');
                        break;
                }
            }
            helpMenu.addEventListener('command', onHelpCommand);
    
            async function readSource(url) {
                return new Promise(resolve => {
                    let xhr = new XMLHttpRequest();
                    xhr.open('GET', url);
                    xhr.onload = function () {
                        resolve(xhr.responseText);
                    };
                    xhr.send();
                });
            }
    
        // 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(`
    
            #tools-menu,
            #helpMenu {
                margin-left: -5px !important;
            }
    
            #tools-menu::after,
            #helpMenu::after { 
                background: url("chrome://global/skin/icons/arrow-right.svg"); !important; 
            	content: '' !important;
    			display: block !important;
    			width: 16px !important;
    			height: 16px !important;
    			background-repeat: no-repeat !important;
    			-moz-context-properties: fill, fill-opacity;
    			fill: currentColor;
            }
    
            #tools-menu::after {
    			margin-left: 119px !important;
    
    		}
    		#helpMenu::after {
    			margin-left: 124px !important;
    		}
    
            /* Menüleiste ausblenden */
            #main-menubar > menu { 
                display: none !important; 
            }
    
    
        `), null, null);
    
        // CSS-Regeln registrieren
        sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    
        }, 300);
    })();
    Alles anzeigen
  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Mira_Belle
    • 24. September 2024 um 15:59

    2002Andreas & bege Erst einmal einen ganz herzlichen Dank an Euch beiden für das Testen!

    Mein Fokus lag wohl auf anderen Dingen, sodass mir diese Fehler gar nicht aufgefallen sind!

    bege Sei so lieb und lass mir mal das Skript "extra-config-menu.us.js" zu kommen.

    Ich werde mich jetzt aber erst einmal daran machen, das Skript von Jizz so zu überarbeiten,
    dass alles richtig kopiert wird und die Menüs auch funktionieren.
    Wie es dann weiter geht, ... wir werden seh'n.

  • Lesezeichen-Symbole (ausblenden)

    • Mira_Belle
    • 24. September 2024 um 12:08
    Zitat von 2002Andreas
    Zitat von Mira_Belle

    Sicher?

    Ja.

    Oh Herr, hilf!
    Es geht, ging die ganze Zeit nur um die Symbole in der Lesezeichenleiste, richtig?
    Und ich habe nach den Symbolen in dem Menü geschaut!! Sorry.
    Ja, der Code tut, was er soll:!:

  • Lesezeichen-Symbole (ausblenden)

    • Mira_Belle
    • 24. September 2024 um 11:22
    Zitat von 2002Andreas

    ...

    Mit einem CSS Code lässt sich das z.B. machen.

    CSS
    .bookmark-item[container] .menu-iconic > .menu-iconic-left > image,
    .bookmark-item[container] > image {
      display: none !important;
    }

    Sicher?

    Das habe, also das Anhängen von > image, auch probiert, nur tut sich da nichts,
    in keinem meiner Profilen!

    Auch Dein CSS bewirkt in keinem meiner Prolilen etwas.
    Aber vielleicht stimmt ja auch bei meinem Firefox irgendetwas nicht. ¯\_(ツ)_/¯

  • Lesezeichen-Symbole (ausblenden)

    • Mira_Belle
    • 24. September 2024 um 09:51

    Ich habe zwei Versuche! Das Ergebnis wird aber wahrscheinlich nicht so sein, wie Du Dir das vorgestellt hast!

    Versuch 1:

    CSS
    .bookmark-item {
      &[container] {
        list-style-image: url("chrome://global/skin/icons/nix.svg")  !important;
      }
    }

    Versuch 2:

    CSS
    .bookmark-item[container] {
      fill: transparent !important;
    }

    Was Besseres fiel mir gerade nicht ein, aber keine Sorge Andreas wird das schon richten. ;)

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Mira_Belle
    • 23. September 2024 um 20:29

    So, hier erst einmal die "neuen" Buttons.
    Besser bekomme ich sie nicht hin!

    Dann habe ich auch entsprechend das Skript angepasst:

    Code
            // Symbole
            let DefaultIcon = "Button_groß.png";
            let AlternateIcon = "Button_klein-plus.png";

    Ich denke, ich mache hier an dieser Stelle erst einmal Pause.

    Mit Grafiken, dass diese auch wirklich schön aussehen, hab ich es nicht so.

    Es wäre echt schön, wenn da jemand bessere beisteuern könnte.

  • Google Maps Funktion wieder in Google Suche einbinden

    • Mira_Belle
    • 23. September 2024 um 17:33

    Na ja.
    Gib mal "wahl brandenburg" ein. Nach den "Schlagzeilen" braucht man im Grunde keine Nachrichtenseite mehr aufrufen.
    Ich finde das gegenüber den Nachrichtenseiten unfair. Aber wie ich schon schrieb, .... darf, kann und soll ...

  • Suchleiste funktioniert nicht mehr ohne Eingabe

    • Mira_Belle
    • 23. September 2024 um 16:52

    Aha, Danke.

    Jeder wie er mag. ;)

  • Suchleiste funktioniert nicht mehr ohne Eingabe

    • Mira_Belle
    • 23. September 2024 um 14:21

    So wirklich verstehe ich diese Diskussion nicht!

    Da kann ich doch VOR der Suche auswählen!

    :/

  • Google Maps Funktion wieder in Google Suche einbinden

    • Mira_Belle
    • 23. September 2024 um 14:12

    Sören Hentzschel Du hast definitiv recht! Aber genau deshalb schrieb ich, "viel Werbung und Unnützes". ;)
    Was für mich unnütz ist, entscheide ich und muss noch lange nicht für andere zutreffen!

    Google ist für mich eine Suchmaschine und hat mir außer Links nicht weiter anzuzeigen!
    Wenn ich genauere Infos haben möchte, steuere ich entsprechende Seiten an.
    Diese "Zusammenfassungen" auf http://www.google.com sind ja nicht wirklich gut und manches Mal
    steht da auch Stuss, deshalb mag ich das nicht!
    Und auch "geklaute" Inhalte von seriösen Seiten, mag ich nicht unterstützen!
    Aber wie immer, kann, darf ein jeder handhaben wie er will.

  • Google Maps Funktion wieder in Google Suche einbinden

    • Mira_Belle
    • 23. September 2024 um 11:41
    Zitat von captain chaos
    Zitat von Mira_Belle

    Ich rufe das ganze direkt über das "Adressfeld" auf!
    Für die Suche habe ich, damit ich nicht so viel Werbung und Unnützes angezeigt bekomme,
    &udm=14 als Standardsuchmaschine eingetragen.

    Klingt interessant, wo trage ich das ein?

    Z.B. Einstellungen / "Suche" ganz nach unten skrollen und auf "Weitere Suchmaschinen hinzufügen" klicken.
    Dann einfach "https://udm14.com/" als neue "Suchseite" eintragen.


    Zitat von 2002Andreas
    Zitat von Mira_Belle

    Ich habe das

    Ok, das blendet den Button zwar wieder ein, erklärt aber nicht, warum ein Klick auf die Karte nicht funktioniert wie bei Sören und mir.:/

    Stimmt! Da ist noch was im Busch!
    Zumal er ja auch das gleiche Problem hat, wenn er Google direkt aufruft! :/


    captain chaos Hast Du noch weitere Erweiterungen in Gebrauch? Wenn ja, deaktiviere mal alle manuell
    und gehe auf die Suche, welche Dir da zwischen funkt.

  • Google Maps Funktion wieder in Google Suche einbinden

    • Mira_Belle
    • 23. September 2024 um 11:31

    2002Andreas Oh, stimmt da war ja noch was!

    Ich habe das => https://addons.mozilla.org/de/firefox/add…ch-maps-button/

    Installiert!

  • Google Maps Funktion wieder in Google Suche einbinden

    • Mira_Belle
    • 23. September 2024 um 11:02

    :/

    Ich rufe das ganze direkt über das "Adressfeld" auf!
    Für die Suche habe ich, damit ich nicht so viel Werbung und Unnützes angezeigt bekomme,
    &udm=14 als Standardsuchmaschine eingetragen.

    Das Ergebnis schaut dann so aus:

    Wenn ich nun auf den Button "Maps" klicke, .... Tada, die Karte und wie Sören schon beschrieben hat, ...


    Nachtrag!

    Wenn ich direkt Google (http://www.google.de) aufrufe, dann sieht es bei mir auch genau so aus wie bei Sören.

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Mira_Belle
    • 22. September 2024 um 19:27

    Und wieder ein kleiner Fix!
    Den beiden Ordnern "Firefox Verzeichnisse" und "Firefox Funktionen" können nun Symbole
    von der eigenen Festplatte zugeordnet werden.

    JavaScript
    // ==/UserScript==
    
        // Definiere den Profilpfad
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
    
    var Appmenu = {
        // Beginn der Konfiguration ------------------
        
        // 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: 0,  // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar
        isButton: 0,  // 0: Hamburger,klein; 1: Firefox,groß,
        // Hotkey zum Öffnen des Appmenüs oder leer ('')
        hotkey: 'x',
        hotkeyModifier: 'alt', 
        
        // Ende der Konfiguration --------------------
    
        // 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: "data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJjb250ZXh0LWZpbGwgIzBiMGIwYiI+CiAgPHBhdGggZD0iTTE0IDNIOC4xNUw2LjU4IDEuNTRBMiAyIDAgMCAwIDUuMjIgMUgyYTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjVhMiAyIDAgMCAwLTItMnpNNS4yMiAzbDEuMDcgMUgyVjN6TTE0IDEzSDJWNWg2di0uMDFsLjE1LjAxSDE0eiIvPgo8L3N2Zz4K"
                image: `${ProfilePath}/default-browser-red.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
                },
                {
                name: 'Firefox Funktionen',
            //    image: "data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljDQogICAtIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMNCiAgIC0gZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4gLS0+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZmlsbD0iY29udGV4dC1maWxsIiA+DQogIDxwYXRoIGQ9Ik0xOTAuMzY4IDE1MC41OTFjMC4xNTcgMC4wMDkgMC4wNzkgMC4wMDMgMCAwem0tNTcuODc0LTI4LjkzM2MwLjE1OCAwLjAwOCAwLjA3OSAwLjAwMyAwIDB6bTM0Ni4yMjggNDQuNjc0Yy0xMC40NDUtMjUuMTIzLTMxLjYtNTIuMjQ4LTQ4LjIxMS02MC44MiAxMy41MiAyNi41IDIxLjM0NSA1My4wOTMgMjQuMzM1IDcyLjkzNSAwIDAuMDQgMC4wMTUgMC4xMzYgMC4wNDcgMC40LTI3LjE3NS02Ny43MzItNzMuMjU0LTk1LjA0Ny0xMTAuODg2LTE1NC41MTItMS45LTMuMDA4LTMuODA1LTYuMDIyLTUuNjYxLTkuMmE3My4yMzcgNzMuMjM3IDAgMCAxLTIuNjQ2LTQuOTcyIDQzLjc1NyA0My43NTcgMCAwIDEtMy41ODUtOS41IDAuNjI1IDAuNjI1IDAgMCAwLTAuNTQ2LTAuNjQ0IDAuOCAwLjggMCAwIDAtMC40NTEgMGMtMC4wMzMgMC4wMTEtMC4wODQgMC4wNTEtMC4xMTkgMC4wNjUtMC4wNTMgMC4wMi0wLjEyIDAuMDY5LTAuMTc2IDAuMDk1IDAuMDI2LTAuMDM2IDAuMDgzLTAuMTE3IDAuMS0wLjEzNS01My40MzcgMzEuMy03NS41ODcgODYuMDkzLTgxLjI4MiAxMjAuOTdhMTI4LjA1NyAxMjguMDU3IDAgMCAwLTQ3LjYyNCAxMi4xNTMgNi4xNDQgNi4xNDQgMCAwIDAtMy4wNDEgNy42MyA2LjAzNCA2LjAzNCAwIDAgMCA4LjE5MiAzLjUyNSAxMTYuMTc1IDExNi4xNzUgMCAwIDEgNDEuNDgxLTEwLjgyNmMwLjQ2OC0wLjAzMyAwLjkzNy0wLjA2MiAxLjQwNS0wLjFhMTE3LjYyNCAxMTcuNjI0IDAgMCAxIDUuOTMyLTAuMjExIDEyMC44MzEgMTIwLjgzMSAwIDAgMSAzNC40OTEgNC43NzdjMC42NTQgMC4xOTIgMS4yOTUgMC40MTQgMS45NDYgMC42MTZhMTIwLjE1IDEyMC4xNSAwIDAgMSA1LjUzOSAxLjg0MiAxMjEuODUyIDEyMS44NTIgMCAwIDEgMy45OTIgMS41NjRjMS4wNzQgMC40MzQgMi4xNDggMC44NjggMy4yMDYgMS4zMzFhMTE4LjQ1MyAxMTguNDUzIDAgMCAxIDQuOSAyLjMwN2MwLjc0MyAwLjM2OCAxLjQ4NSAwLjczNSAyLjIxNyAxLjExN2ExMjAuNTM1IDEyMC41MzUgMCAwIDEgNC42NzUgMi41ODcgMTA3Ljc4NSAxMDcuNzg1IDAgMCAxIDIuOTUyIDEuNzc2IDEyMy4wMTggMTIzLjAxOCAwIDAgMSA0Mi4wMjggNDMuNDc3Yy0xMi44MzMtOS4wMTUtMzUuODEtMTcuOTE4LTU3Ljk0Ny0xNC4wNjggODYuNDQxIDQzLjIxNCA2My4yMzQgMTkyLjAyNy01Ni41NDUgMTg2LjQwOGExMDYuNyAxMDYuNyAwIDAgMS0zMS4yNzEtNi4wMzEgMTMyLjQ2MSAxMzIuNDYxIDAgMCAxLTcuMDU5LTIuODg2Yy0xLjM1Ni0wLjYxOC0yLjcxMS0xLjI0My00LjA1MS0xLjkzNS0yOS4zNDktMTUuMTY4LTUzLjU4My00My44MzMtNTYuNjExLTc4LjY0MyAwIDAgMTEuMDkzLTQxLjMzNSA3OS40MzMtNDEuMzM1IDcuMzg4IDAgMjguNTA4LTIwLjYxNCAyOC45LTI2LjU5My0wLjA5LTEuOTUzLTQxLjkxNy0xOC41OS01OC4yMjMtMzQuNjU2LTguNzE0LTguNTg1LTEyLjg1MS0xMi43MjMtMTYuNTE0LTE1LjgyOWE3MS43IDcxLjcgMCAwIDAtNi4yMjUtNC43IDExMS4zMzUgMTExLjMzNSAwIDAgMS0wLjY3NS01OC43MzNjLTI0LjY4NyAxMS4yNDItNDMuODkgMjkuMDExLTU3Ljg0OSA0NC43aC0wLjExMWMtOS41MjgtMTIuMDY3LTguODU1LTUxLjg3My04LjMxMi02MC4xODQtMC4xMTQtMC41MTYtNy4xMDcgMy42My04LjAyNCA0LjI1NGExNzUuMjEgMTc1LjIxIDAgMCAwLTIzLjQ4NiAyMC4xMiAyMTAuNSAyMTAuNSAwIDAgMC0yMi40NDMgMjYuOTEzYzAgMC4wMTItMC4wMDcgMC4wMjUtMC4wMTEgMC4wMzcgMC0wLjAxMiAwLjAwNy0wLjAyNSAwLjAxMS0wLjAzOGEyMDIuODM3IDIwMi44MzcgMCAwIDAtMzIuMjQ0IDcyLjgxYy0wLjA1OCAwLjI2NS0yLjI5IDEwLjA1NC0zLjkyIDIyLjE0N2EyNjUuNzk0IDI2NS43OTQgMCAwIDAtMC43NjkgNS42NTFjLTAuNTU4IDMuNjM2LTAuOTkyIDcuNi0xLjQyIDEzLjc2Ny0wLjAxOSAwLjIzOS0wLjAzMSAwLjQ3NC0wLjA0OCAwLjcxMmE1OTEuMTUyIDU5MS4xNTIgMCAwIDAtMC40ODEgNy45OTVjMCAwLjQxMS0wLjAyNSAwLjgxNi0wLjAyNSAxLjIyNyAwIDEzMi43MDkgMTA3LjYgMjQwLjI5IDI0MC4zMjQgMjQwLjI5IDExOC44NjUgMCAyMTcuNTU5LTg2LjI4OCAyMzYuODgyLTE5OS42MyAwLjQwNy0zLjA3NSAwLjczMi02LjE2OCAxLjA5Mi05LjI3IDQuNzc3LTQxLjIxLTAuNTMtODQuNTI1LTE1LjU4OC0xMjAuNzQ3em0tMTY0LjA2OCA3Mi4xeiIvPg0KPC9zdmc+"
                image: `${ProfilePath}/default-browser-red.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
                },  
                {
                    name: 'separator',
                }, 
            ],
    
        apps: [  /*  Directories  */
    
            // Untermenü Firefox Verzeichnisse
            {
            name: 'Profil-Verzeichniss',
            id: 'AMProfil',
            root: 'ProfD',
            path: '\\',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Chrome-Ordner',
            id: 'AMchrome',
            root: 'ProfD',
            path: '\\chrome',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'CSS-Ordner',
            id: 'AMCSS',
            root: 'ProfD',
            path: '\\chrome\\css',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'JS-Ordner',
            id: 'AMJS',
            root: 'ProfD',
            path: '\\chrome\\scripts',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Addon-Verzeichniss',
            id: 'AMAddons',
            root: 'ProfD',
            path: '\\extensions',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Programm-Verzeichniss',
            id: 'AMProgramm',
            root: 'CurProcD',
            path: '\\',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Startup-Cache',
            id: 'AMCache',
            root: 'ProfLD',
            path: '\\startupCache',
            subdir: 'Firefox Verzeichnisse',
            },
        ],
    
        configs: [
    
            // Untermenü Firefox Funktionen
            {
            name: 'Anpassen',
            id: 'AMAnpassen',
            command: "gCustomizeMode.enter()",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Neustart im abgesicherten Modus',
            id: 'AMModus',
            command: "safeModeRestart();",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Browser-Konsole',
            id: 'AMKonsole',
            command: "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager');\
                    BrowserConsoleManager.openBrowserConsoleOrFocus();",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Browser-Werkzeuge',
            id: 'AMWerkzeuge',
            command: "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();",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Web-Entwickler',
            id: 'AMEntwickler',
            command: "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());",    
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Firefox synchronisieren',
            id: 'AMsynchron',
            command: "gSync.openPrefs('menubar');",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Zugangsdaten und Passwörter',
            id: 'AMdaten',
            command: "LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' })",
            tooltiptext: 'about:logins',
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Task Manager',
            id: 'AMManager',
            command: "switchToTabHavingURI('about:processes', true)",
            tooltiptext: 'about:processes',
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Offline arbeiten',
            id: 'AMOffline',
            command: "BrowserOffline.toggleOfflineStatus();",
            subdir: 'Firefox Funktionen',
            },
            /*
            {
            name: 'separator',
            },
            */
            {
            name: 'Neustart',
            id: 'AMreboot',
            tooltiptext: 'userChrome.js-Cache wird geleert',
    		command: 'Services.appinfo.invalidateCachesOnRestart(); \
                    Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);',
            },
            {
            name: 'Beenden',
            id: 'AMquit',
            command: "goQuitApplication(event);",
            },
        ]
        },
    
        _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.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 = "DefaultIcon.png";
            let AlternateIcon = "AlternateIcon.png";
    
            if (Appmenu.isButton) {
                ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`;
                ExternalAppBtn.style.width = "6%";
                ExternalAppBtn.style.height = "1%";
                ExternalAppBtn.style.backgroundSize = "cover"; // Sorgt dafür, dass das Bild die gesamte Fläche des Buttons einnimmt.
              } else {
                ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`;
                ExternalAppBtn.style.width = "3%";
                ExternalAppBtn.style.height = "1%";
                ExternalAppBtn.style.backgroundSize = "cover"; // Sorgt dafür, dass das Bild die gesamte Fläche des Buttons einnimmt.
                
              }
            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.setAttribute('id', 'AMpopup');
        this._externalAppPopup = ExternalAppPopup;
        ExternalAppBtn.appendChild(ExternalAppPopup);
        Appmenu.onpopupshowing();
        
          // Menü mit Tastaturkürzel öffnen
        let key = document.createXULElement('key');
        key.id = 'key_AppMenuPopup';
     //   key.setAttribute('key', 'X');
        key.setAttribute('key', Appmenu.hotkey);
            if (Appmenu.hotkeyModifier)
     //   key.setAttribute('modifiers', 'alt');
        key.setAttribute('modifiers', Appmenu.hotkeyModifier);
        key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();');
        document.getElementById('mainKeyset').appendChild(key);
        },
    
    
    
            /* ****** NEU ****** */     
    
        onpopupshowing: function() {
            if (this._isready)
                return;
            if (this._externalAppPopup === null)
                return;
            var ExternalAppPopup = this._externalAppPopup;
    
            // Funktion zum Erstellen eines Menüs mit Untermenüs
            function createMenuItem(parentPopup, item) {
                var menuItem;
                if (item.name == 'separator') {
                    menuItem = document.createXULElement('menuseparator');
                    parentPopup.appendChild(menuItem);
                } else if (item.submenu && item.submenu.length > 0) {
                    menuItem = document.createXULElement('menu');
                    var subMenuPopup = document.createXULElement('menupopup');
                    menuItem.appendChild(subMenuPopup);
                    menuItem.setAttribute('class', 'menu-iconic');
                    menuItem.setAttribute('label', item.name);
                    menuItem.setAttribute('image', item.image);
                    parentPopup.appendChild(menuItem);
                    for (let subItem of item.submenu) {
                        createMenuItem(subMenuPopup, subItem);
                    }
                } else {
                    menuItem = document.createXULElement('menuitem');
                    menuItem.setAttribute('class', 'menuitem-iconic');
                    menuItem.setAttribute('label', item.name);
                    menuItem.setAttribute('image', item.image);
                    if (item.command) {
                        menuItem.setAttribute('oncommand', item.command);
                    } else if (item.path) {
                        menuItem.setAttribute('oncommand', "Appmenu.exec(this.path, this.args);");
                        menuItem.path = item.path;
                        menuItem.args = item.args;
                    }
                    menuItem.setAttribute('tooltiptext', item.tooltiptext || item.name);
                    menuItem.setAttribute('id', item.id || "");
                    parentPopup.appendChild(menuItem);
                }
            }
    
            // Verarbeitung der Subdirs
            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;
                }
            }
    
            // Verarbeitung der Apps
            for (let app of this.toolbar.apps) {
                if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) {
                    createMenuItem(Appmenu.subdirPopupHash[app.subdir], app);
                } else {
                    createMenuItem(ExternalAppPopup, app);
                }
            }
    
            // Verarbeitung der Configs
            for (let config of this.toolbar.configs) {
                if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) {
                    createMenuItem(Appmenu.subdirPopupHash[config.subdir], config);
                } else {
                    createMenuItem(ExternalAppPopup, config);
                }
            }
    
            if (this.autohideEmptySubDirs) {
                for (let key in Appmenu.subdirPopupHash) {
                    if (Appmenu.subdirPopupHash[key].hasChildNodes()) {
                        continue;
                    } else {
                        Appmenu.subdirMenuHash[key].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;
        },
    
    
        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() {
    
        // Definiere den Profilpfad für die Symbole
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
    
        // Standard-Symbol-Dateiname
        let ButtonIcon01 = "restart.svg";
        let ButtonIcon02 = "quit.svg";
    
        let Icon01 = "profile.svg";
        let Icon02 = "chrome.svg";
        let Icon03 = "css3.svg";
        let Icon04 = "js.svg";
        let Icon05 = "addons.svg";
        let Icon06 = "folder.svg";
        let Icon07 = "folder-1.svg";
    
        let Icon11 = "Themes.svg";
        let Icon12 = "debugging-workers.svg";
        let Icon13 = "command-console.svg";
        let Icon14 = "window-dev-tools.svg";
        let Icon15 = "developer.svg";
        let Icon16 = "sync.svg";
        let Icon17 = "passwords.svg";
        let Icon18 = "performance.svg";
        let Icon19 = "plug-disconnected.svg";
    
    
        // 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(`
    
    
            #AMProfil   { background-image: url('${ProfilePath}/${Icon01}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMchrome   { background-image: url('${ProfilePath}/${Icon02}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMCSS      { background-image: url('${ProfilePath}/${Icon03}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMJS       { background-image: url('${ProfilePath}/${Icon04}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMAddons   { background-image: url('${ProfilePath}/${Icon05}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16pxx !important; /* Größe des Symbols anpassen */ 
                          }
            #AMProgramm { background-image: url('${ProfilePath}/${Icon06}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMCache    { background-image: url('${ProfilePath}/${Icon07}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
    
            #AMAnpassen     { background-image: url('${ProfilePath}/${Icon11}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMModus        { background-image: url('${ProfilePath}/${Icon12}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMKonsole      { background-image: url('${ProfilePath}/${Icon13}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMWerkzeuge    { background-image: url('${ProfilePath}/${Icon14}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }
            #AMEntwickler   { background-image: url('${ProfilePath}/${Icon15}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMsynchron     { background-image: url('${ProfilePath}/${Icon16}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }
            #AMdaten        { background-image: url('${ProfilePath}/${Icon17}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }        
            #AMManager      { background-image: url('${ProfilePath}/${Icon18}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }
            #AMOffline      { background-image: url('${ProfilePath}/${Icon19}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
    
    
    
    
    
    
    
    
            /* Neustart-Button */
            #AMreboot { 
                background-image: url('${ProfilePath}/${ButtonIcon01}');
                background-repeat: no-repeat !important;
                background-position: 7px 5px !important;
                background-size: 20px 20px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: red !important;
            }
    
            /* Beenden-Button */
            #AMquit { 
                background-image: url('${ProfilePath}/${ButtonIcon02}');
                background-repeat: no-repeat !important;
                background-position: 9px 8px !important;
                background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: red !important;
            }
    
            /* Menüleiste ausblenden */
            #main-menubar > menu { 
                display: none !important; 
            }
    
        `), null, null);
    
        // CSS-Regeln registrieren
        sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    
    })();
    
    if (window.gBrowser)
    Appmenu.init();
    Alles anzeigen

    Nun wird es eine kleine "Skriptpause" geben!
    Ich werde neu Buttons, welche dann hoffentlich nicht mehr "unscharf" sind, versuchen zu erstellen.

    Dazu brauche ich Zeit.

    Nachtrag!
    Ja, auch das Symbol für den Chromordner muss noch erstellt werden.
    Das Symbol, dass ja gerade Verwendung findet, ist zwar eindeutig, aber nicht wirklich passend.

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Mira_Belle
    • 21. September 2024 um 13:36

    Update!

    Das erste Skript überarbeitet und die Zuordnung der Symbole in den CSS-Teil geschafft!
    Bekomme aber das mit den Ordnern noch nicht hin.
    Die Symbole für den Button selbst werde ich später nachliefern.
    Muss diese neu erstellen.

    JavaScript
    // ==/UserScript==
    
        // Definiere den Profilpfad
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'image'));
    
    var Appmenu = {
        // Beginn der Konfiguration ------------------
        
        // 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: 0,  // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar
        isButton: 0,  // 0: Hamburger,klein; 1: Firefox,groß,
        // Hotkey zum Öffnen des Appmenüs oder leer ('')
        hotkey: 'x',
        hotkeyModifier: 'alt', 
        
        // Ende der Konfiguration --------------------
    
        // 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: "data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJjb250ZXh0LWZpbGwgIzBiMGIwYiI+CiAgPHBhdGggZD0iTTE0IDNIOC4xNUw2LjU4IDEuNTRBMiAyIDAgMCAwIDUuMjIgMUgyYTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjVhMiAyIDAgMCAwLTItMnpNNS4yMiAzbDEuMDcgMUgyVjN6TTE0IDEzSDJWNWg2di0uMDFsLjE1LjAxSDE0eiIvPgo8L3N2Zz4K"
                image: `${ProfilePath}/default-browser-red.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
                },
                {
                name: 'Firefox Funktionen',
            //    image: "data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljDQogICAtIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMNCiAgIC0gZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4gLS0+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZmlsbD0iY29udGV4dC1maWxsIiA+DQogIDxwYXRoIGQ9Ik0xOTAuMzY4IDE1MC41OTFjMC4xNTcgMC4wMDkgMC4wNzkgMC4wMDMgMCAwem0tNTcuODc0LTI4LjkzM2MwLjE1OCAwLjAwOCAwLjA3OSAwLjAwMyAwIDB6bTM0Ni4yMjggNDQuNjc0Yy0xMC40NDUtMjUuMTIzLTMxLjYtNTIuMjQ4LTQ4LjIxMS02MC44MiAxMy41MiAyNi41IDIxLjM0NSA1My4wOTMgMjQuMzM1IDcyLjkzNSAwIDAuMDQgMC4wMTUgMC4xMzYgMC4wNDcgMC40LTI3LjE3NS02Ny43MzItNzMuMjU0LTk1LjA0Ny0xMTAuODg2LTE1NC41MTItMS45LTMuMDA4LTMuODA1LTYuMDIyLTUuNjYxLTkuMmE3My4yMzcgNzMuMjM3IDAgMCAxLTIuNjQ2LTQuOTcyIDQzLjc1NyA0My43NTcgMCAwIDEtMy41ODUtOS41IDAuNjI1IDAuNjI1IDAgMCAwLTAuNTQ2LTAuNjQ0IDAuOCAwLjggMCAwIDAtMC40NTEgMGMtMC4wMzMgMC4wMTEtMC4wODQgMC4wNTEtMC4xMTkgMC4wNjUtMC4wNTMgMC4wMi0wLjEyIDAuMDY5LTAuMTc2IDAuMDk1IDAuMDI2LTAuMDM2IDAuMDgzLTAuMTE3IDAuMS0wLjEzNS01My40MzcgMzEuMy03NS41ODcgODYuMDkzLTgxLjI4MiAxMjAuOTdhMTI4LjA1NyAxMjguMDU3IDAgMCAwLTQ3LjYyNCAxMi4xNTMgNi4xNDQgNi4xNDQgMCAwIDAtMy4wNDEgNy42MyA2LjAzNCA2LjAzNCAwIDAgMCA4LjE5MiAzLjUyNSAxMTYuMTc1IDExNi4xNzUgMCAwIDEgNDEuNDgxLTEwLjgyNmMwLjQ2OC0wLjAzMyAwLjkzNy0wLjA2MiAxLjQwNS0wLjFhMTE3LjYyNCAxMTcuNjI0IDAgMCAxIDUuOTMyLTAuMjExIDEyMC44MzEgMTIwLjgzMSAwIDAgMSAzNC40OTEgNC43NzdjMC42NTQgMC4xOTIgMS4yOTUgMC40MTQgMS45NDYgMC42MTZhMTIwLjE1IDEyMC4xNSAwIDAgMSA1LjUzOSAxLjg0MiAxMjEuODUyIDEyMS44NTIgMCAwIDEgMy45OTIgMS41NjRjMS4wNzQgMC40MzQgMi4xNDggMC44NjggMy4yMDYgMS4zMzFhMTE4LjQ1MyAxMTguNDUzIDAgMCAxIDQuOSAyLjMwN2MwLjc0MyAwLjM2OCAxLjQ4NSAwLjczNSAyLjIxNyAxLjExN2ExMjAuNTM1IDEyMC41MzUgMCAwIDEgNC42NzUgMi41ODcgMTA3Ljc4NSAxMDcuNzg1IDAgMCAxIDIuOTUyIDEuNzc2IDEyMy4wMTggMTIzLjAxOCAwIDAgMSA0Mi4wMjggNDMuNDc3Yy0xMi44MzMtOS4wMTUtMzUuODEtMTcuOTE4LTU3Ljk0Ny0xNC4wNjggODYuNDQxIDQzLjIxNCA2My4yMzQgMTkyLjAyNy01Ni41NDUgMTg2LjQwOGExMDYuNyAxMDYuNyAwIDAgMS0zMS4yNzEtNi4wMzEgMTMyLjQ2MSAxMzIuNDYxIDAgMCAxLTcuMDU5LTIuODg2Yy0xLjM1Ni0wLjYxOC0yLjcxMS0xLjI0My00LjA1MS0xLjkzNS0yOS4zNDktMTUuMTY4LTUzLjU4My00My44MzMtNTYuNjExLTc4LjY0MyAwIDAgMTEuMDkzLTQxLjMzNSA3OS40MzMtNDEuMzM1IDcuMzg4IDAgMjguNTA4LTIwLjYxNCAyOC45LTI2LjU5My0wLjA5LTEuOTUzLTQxLjkxNy0xOC41OS01OC4yMjMtMzQuNjU2LTguNzE0LTguNTg1LTEyLjg1MS0xMi43MjMtMTYuNTE0LTE1LjgyOWE3MS43IDcxLjcgMCAwIDAtNi4yMjUtNC43IDExMS4zMzUgMTExLjMzNSAwIDAgMS0wLjY3NS01OC43MzNjLTI0LjY4NyAxMS4yNDItNDMuODkgMjkuMDExLTU3Ljg0OSA0NC43aC0wLjExMWMtOS41MjgtMTIuMDY3LTguODU1LTUxLjg3My04LjMxMi02MC4xODQtMC4xMTQtMC41MTYtNy4xMDcgMy42My04LjAyNCA0LjI1NGExNzUuMjEgMTc1LjIxIDAgMCAwLTIzLjQ4NiAyMC4xMiAyMTAuNSAyMTAuNSAwIDAgMC0yMi40NDMgMjYuOTEzYzAgMC4wMTItMC4wMDcgMC4wMjUtMC4wMTEgMC4wMzcgMC0wLjAxMiAwLjAwNy0wLjAyNSAwLjAxMS0wLjAzOGEyMDIuODM3IDIwMi44MzcgMCAwIDAtMzIuMjQ0IDcyLjgxYy0wLjA1OCAwLjI2NS0yLjI5IDEwLjA1NC0zLjkyIDIyLjE0N2EyNjUuNzk0IDI2NS43OTQgMCAwIDAtMC43NjkgNS42NTFjLTAuNTU4IDMuNjM2LTAuOTkyIDcuNi0xLjQyIDEzLjc2Ny0wLjAxOSAwLjIzOS0wLjAzMSAwLjQ3NC0wLjA0OCAwLjcxMmE1OTEuMTUyIDU5MS4xNTIgMCAwIDAtMC40ODEgNy45OTVjMCAwLjQxMS0wLjAyNSAwLjgxNi0wLjAyNSAxLjIyNyAwIDEzMi43MDkgMTA3LjYgMjQwLjI5IDI0MC4zMjQgMjQwLjI5IDExOC44NjUgMCAyMTcuNTU5LTg2LjI4OCAyMzYuODgyLTE5OS42MyAwLjQwNy0zLjA3NSAwLjczMi02LjE2OCAxLjA5Mi05LjI3IDQuNzc3LTQxLjIxLTAuNTMtODQuNTI1LTE1LjU4OC0xMjAuNzQ3em0tMTY0LjA2OCA3Mi4xeiIvPg0KPC9zdmc+"
                image: "${ProfilePath}/default-browser-red.svg", // Der Pfad wird direkt verwendet, ohne `url()`
                },  
                {
                    name: 'separator',
                }, 
            ],
    
        apps: [  /*  Directories  */
    
            // Untermenü Firefox Verzeichnisse
            {
            name: 'Profil-Verzeichniss',
            id: 'AMProfil',
            root: 'ProfD',
            path: '\\',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Chrome-Ordner',
            id: 'AMchrome',
            root: 'ProfD',
            path: '\\chrome',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'CSS-Ordner',
            id: 'AMCSS',
            root: 'ProfD',
            path: '\\chrome\\css',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'JS-Ordner',
            id: 'AMJS',
            root: 'ProfD',
            path: '\\chrome\\scripts',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Addon-Verzeichniss',
            id: 'AMAddons',
            root: 'ProfD',
            path: '\\extensions',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Programm-Verzeichniss',
            id: 'AMProgramm',
            root: 'CurProcD',
            path: '\\',
            subdir: 'Firefox Verzeichnisse',
            },
            {
            name: 'Startup-Cache',
            id: 'AMCache',
            root: 'ProfLD',
            path: '\\startupCache',
            subdir: 'Firefox Verzeichnisse',
            },
        ],
    
        configs: [
    
            // Untermenü Firefox Funktionen
            {
            name: 'Anpassen',
            id: 'AMAnpassen',
            command: "gCustomizeMode.enter()",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Neustart im abgesicherten Modus',
            id: 'AMModus',
            command: "safeModeRestart();",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Browser-Konsole',
            id: 'AMKonsole',
            command: "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager');\
                    BrowserConsoleManager.openBrowserConsoleOrFocus();",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Browser-Werkzeuge',
            id: 'AMWerkzeuge',
            command: "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();",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Web-Entwickler',
            id: 'AMEntwickler',
            command: "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());",    
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Firefox synchronisieren',
            id: 'AMsynchron',
            command: "gSync.openPrefs('menubar');",
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Zugangsdaten und Passwörter',
            id: 'AMdaten',
            command: "LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' })",
            tooltiptext: 'about:logins',
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Task Manager',
            id: 'AMManager',
            command: "switchToTabHavingURI('about:processes', true)",
            tooltiptext: 'about:processes',
            subdir: 'Firefox Funktionen',
            },
            {
            name: 'Offline arbeiten',
            id: 'AMOffline',
            command: "BrowserOffline.toggleOfflineStatus();",
            subdir: 'Firefox Funktionen',
            },
            /*
            {
            name: 'separator',
            },
            */
            {
            name: 'Neustart',
            id: 'AMreboot',
            tooltiptext: 'userChrome.js-Cache wird geleert',
    		command: 'Services.appinfo.invalidateCachesOnRestart(); \
                    Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);',
            },
            {
            name: 'Beenden',
            id: 'AMquit',
            command: "goQuitApplication(event);",
            },
        ]
        },
    
        _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.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 = "DefaultIcon.png";
            let AlternateIcon = "AlternateIcon.png";
    
            if (Appmenu.isButton) {
                ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`;
                ExternalAppBtn.style.width = "6%";
                ExternalAppBtn.style.height = "1%";
                ExternalAppBtn.style.backgroundSize = "cover"; // Sorgt dafür, dass das Bild die gesamte Fläche des Buttons einnimmt.
              } else {
                ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`;
                ExternalAppBtn.style.width = "3%";
                ExternalAppBtn.style.height = "1%";
                ExternalAppBtn.style.backgroundSize = "cover"; // Sorgt dafür, dass das Bild die gesamte Fläche des Buttons einnimmt.
                
              }
            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.setAttribute('id', 'AMpopup');
        this._externalAppPopup = ExternalAppPopup;
        ExternalAppBtn.appendChild(ExternalAppPopup);
        Appmenu.onpopupshowing();
        
          // Menü mit Tastaturkürzel öffnen
        let key = document.createXULElement('key');
        key.id = 'key_AppMenuPopup';
     //   key.setAttribute('key', 'X');
        key.setAttribute('key', Appmenu.hotkey);
            if (Appmenu.hotkeyModifier)
     //   key.setAttribute('modifiers', 'alt');
        key.setAttribute('modifiers', Appmenu.hotkeyModifier);
        key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();');
        document.getElementById('mainKeyset').appendChild(key);
        },
    
    
    
            /* ****** NEU ****** */     
    
        onpopupshowing: function() {
            if (this._isready)
                return;
            if (this._externalAppPopup === null)
                return;
            var ExternalAppPopup = this._externalAppPopup;
    
            // Funktion zum Erstellen eines Menüs mit Untermenüs
            function createMenuItem(parentPopup, item) {
                var menuItem;
                if (item.name == 'separator') {
                    menuItem = document.createXULElement('menuseparator');
                    parentPopup.appendChild(menuItem);
                } else if (item.submenu && item.submenu.length > 0) {
                    menuItem = document.createXULElement('menu');
                    var subMenuPopup = document.createXULElement('menupopup');
                    menuItem.appendChild(subMenuPopup);
                    menuItem.setAttribute('class', 'menu-iconic');
                    menuItem.setAttribute('label', item.name);
                    menuItem.setAttribute('image', item.image);
                    parentPopup.appendChild(menuItem);
                    for (let subItem of item.submenu) {
                        createMenuItem(subMenuPopup, subItem);
                    }
                } else {
                    menuItem = document.createXULElement('menuitem');
                    menuItem.setAttribute('class', 'menuitem-iconic');
                    menuItem.setAttribute('label', item.name);
                    menuItem.setAttribute('image', item.image);
                    if (item.command) {
                        menuItem.setAttribute('oncommand', item.command);
                    } else if (item.path) {
                        menuItem.setAttribute('oncommand', "Appmenu.exec(this.path, this.args);");
                        menuItem.path = item.path;
                        menuItem.args = item.args;
                    }
                    menuItem.setAttribute('tooltiptext', item.tooltiptext || item.name);
                    menuItem.setAttribute('id', item.id || "");
                    parentPopup.appendChild(menuItem);
                }
            }
    
            // Verarbeitung der Subdirs
            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;
                }
            }
    
            // Verarbeitung der Apps
            for (let app of this.toolbar.apps) {
                if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) {
                    createMenuItem(Appmenu.subdirPopupHash[app.subdir], app);
                } else {
                    createMenuItem(ExternalAppPopup, app);
                }
            }
    
            // Verarbeitung der Configs
            for (let config of this.toolbar.configs) {
                if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) {
                    createMenuItem(Appmenu.subdirPopupHash[config.subdir], config);
                } else {
                    createMenuItem(ExternalAppPopup, config);
                }
            }
    
            if (this.autohideEmptySubDirs) {
                for (let key in Appmenu.subdirPopupHash) {
                    if (Appmenu.subdirPopupHash[key].hasChildNodes()) {
                        continue;
                    } else {
                        Appmenu.subdirMenuHash[key].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;
        },
    
    
        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() {
    
        // Definiere den Profilpfad für die Symbole
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
    
        // Standard-Symbol-Dateiname
        let ButtonIcon01 = "restart.svg";
        let ButtonIcon02 = "quit.svg";
    
        let Icon01 = "profile.svg";
        let Icon02 = "chrome.svg";
        let Icon03 = "css3.svg";
        let Icon04 = "js.svg";
        let Icon05 = "addons.svg";
        let Icon06 = "folder.svg";
        let Icon07 = "folder-1.svg";
    
        let Icon11 = "Themes.svg";
        let Icon12 = "debugging-workers.svg";
        let Icon13 = "command-console.svg";
        let Icon14 = "window-dev-tools.svg";
        let Icon15 = "developer.svg";
        let Icon16 = "sync.svg";
        let Icon17 = "passwords.svg";
        let Icon18 = "performance.svg";
        let Icon19 = "plug-disconnected.svg";
    
    
        // 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(`
    
    
            #AMProfil   { background-image: url('${ProfilePath}/${Icon01}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMchrome   { background-image: url('${ProfilePath}/${Icon02}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMCSS      { background-image: url('${ProfilePath}/${Icon03}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMJS       { background-image: url('${ProfilePath}/${Icon04}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMAddons   { background-image: url('${ProfilePath}/${Icon05}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16pxx !important; /* Größe des Symbols anpassen */ 
                          }
            #AMProgramm { background-image: url('${ProfilePath}/${Icon06}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
            #AMCache    { background-image: url('${ProfilePath}/${Icon07}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 7px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          }
    
            #AMAnpassen     { background-image: url('${ProfilePath}/${Icon11}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMModus        { background-image: url('${ProfilePath}/${Icon12}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMKonsole      { background-image: url('${ProfilePath}/${Icon13}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMWerkzeuge    { background-image: url('${ProfilePath}/${Icon14}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }
            #AMEntwickler   { background-image: url('${ProfilePath}/${Icon15}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
            #AMsynchron     { background-image: url('${ProfilePath}/${Icon16}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }
            #AMdaten        { background-image: url('${ProfilePath}/${Icon17}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }        
            #AMManager      { background-image: url('${ProfilePath}/${Icon18}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important; 
                              background-size: 16px 16px !important;
                            }
            #AMOffline      { background-image: url('${ProfilePath}/${Icon19}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 7px !important;
                              background-size: 16px 16px !important;
                            }
    
    
    
    
    
    
    
    
            /* Neustart-Button */
            #AMreboot { 
                background-image: url('${ProfilePath}/${ButtonIcon01}');
                background-repeat: no-repeat !important;
                background-position: 7px 5px !important;
                background-size: 20px 20px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: red !important;
            }
    
            /* Beenden-Button */
            #AMquit { 
                background-image: url('${ProfilePath}/${ButtonIcon02}');
                background-repeat: no-repeat !important;
                background-position: 9px 8px !important;
                background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: red !important;
            }
    
            /* Menüleiste ausblenden */
            #main-menubar > menu { 
                display: none !important; 
            }
    
        `), null, null);
    
        // CSS-Regeln registrieren
        sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    
    })();
    
    if (window.gBrowser)
    Appmenu.init();
    Alles anzeigen

    Das zweite Skript habe ich dahingehend überarbeitet,
    dass nun ein Separator das "gespiegelte" Menü abgrenzt.

    JavaScript
    (function () {
        setTimeout(async function () {
            // Menüs einfügen 
            var pane1 = document.getElementById('AMpopup');
            var item2 = document.getElementById('AMreboot');        
            var mb = document.getElementById('main-menubar');
            // clone menues
            const menuItems = [...mb.children].filter(m => m.tagName.toLowerCase() === "menu");
    
            menuItems.forEach((m, index) => {
                let cl = m.cloneNode(true);
                let t = cl.querySelector('.menubar-text');
                if (t) cl.removeChild(t);
                cl = item2.parentNode.insertBefore(cl, item2);
    
                // Nur nach dem letzten Eintrag einen Separator einfügen
                if (index === menuItems.length - 1) {
                    var separator = document.createXULElement('menuseparator');
                    separator.setAttribute('flex', '1');
                    pane1.insertBefore(separator, item2);
                }
            });
    
            // bind event
            let source = await readSource('chrome://browser/content/browser-menubar.js');
            source = source.replace(/.*let mainMenuBar/is, 'let mainMenuBar')
                           .replace(/},\n\s+{ once: true }.*/is, '')
                           .replace("main-menubar", "AMpopup")
                           .replace('.getElementById("historyMenuPopup")', '.querySelector("#AMpopup #historyMenuPopup")')
                           .replaceAll('getElementById("history-menu")', 'querySelector("#AMpopup #history-menu")')
                           .replace('.getElementById("menu_EditPopup")', '.querySelector("#AMpopup #menu_EditPopup")');
            
            eval(source);
    
            async function readSource(url) {
                return new Promise(resolve => {
                    let xhr = new XMLHttpRequest();
                    xhr.open('GET', url);
                    xhr.onload = function () {
                        resolve(xhr.responseText);
                    };
                    xhr.send();
                });
            }
        }, 300);
    })();
    Alles anzeigen

    Alle Symbole icons.zip

    Falls jemand ein neues Symbol für den Chome-Ordner erstellen mag,
    ich hätte da nichts dagegen. 8o
    Ich dachte da an einen Ordner (nur obere Hälfte) wo ein Schriftzug "chome" integriert ist.
    Wäre echt toll. :*

    Für die Symbole der "gespiegelten" (geklonten) Menüleiste, wird es dann noch eine separate Datei geben!
    Aber das wird noch etwas dauern.

Unterstütze uns!

Jährlich (2026)

69,4 %

69,4% (538,17 von 775 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon