Die Einstellungen werden jetzt aufgerufen
Der Neustart wird mit einer Fehlermeldung quittiert
Ist hier auch so.
Nur noch mal als Bestätigung, es funktioniert in allen Versionen, nur nicht im neuen Nightly.
Danke, für Deinen Einsatz.
Die Einstellungen werden jetzt aufgerufen
Der Neustart wird mit einer Fehlermeldung quittiert
Ist hier auch so.
Nur noch mal als Bestätigung, es funktioniert in allen Versionen, nur nicht im neuen Nightly.
Danke, für Deinen Einsatz.
Das Script funktioniert hier auch in Firefox 136 Nightly von heute Nachmittag einwandfrei.
Neustart kann ja nicht gehen, daher hier auch wieder deaktiviert.
Es wird alles angezeigt und bei Klick auch geöffnet.
Was den Neustart betrifft, setzt der noch das Script: addRestartButton.uc.js voraus.
Danke für diese wichtige Info. Dann wird es natürlich klar, warum es nicht geht.
Nur noch mal als Bestätigung, es funktioniert in allen Versionen, nur nicht im neuen Nightly.
Jetzt weiß ich immer noch nicht genau, ob die angesprochenen Punkte bei dir mit der neuen Version funktionieren oder nicht (Browserwerkzeuge)?
Jetzt weiß ich immer noch nicht genau, ob die angesprochenen Punkte bei dir mit der neuen Version funktionieren oder nicht (Browserwerkzeuge)?
Sorry, dass kann ich Dir noch nicht beantworten, denn ich muss erst alles auf mein Script übertragen. Werde mich dann morgen dazu äußern.
Sorry, dass kann ich Dir noch nicht beantworten, denn ich muss erst alles auf mein Script übertragen.
Alles klar. Nicht hetzen lassen...
Alles klar. Nicht hetzen lassen...
Konnte nicht mehr warten, deshalb hier das Ergebnis.
Wenn ich hoffentlich alles richtig übertragen habe, dann öffnen die Einstellungen, die Browser-Werkzeuge, und es gibt einen Neustart. Neustart aber nur, wenn ich dafür den bisherigen Eintrag einsetze.
if(this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
"Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit,0);"));
Damit wird dann auch aus dem Restart-Script alles übernommen.
Morgen werde ich alles sauber einrichten, dann werden wir weiter sehen.
Danke, Du hast wieder gute Arbeit gemacht.
Was läuft da schief?
Zumindest funktioniert das Skript einwandfrei:
Evtl. funkt dir also eine andere Einstellung/Skript dazwischen
Hat sich erledigt, kleiner Fehler beim kopieren des Scripts, haben 2 Buchstaben gefehlt. Jetzt geht es. Danke.
Gruß
Michael
Das Skript sollte uneingeschränkt funktionieren!
Meines tut es jedenfalls.
Zischenbilanz!
CloseTab.uc.js, SkipToTopAndBottom.uc.js & newTabButtonUndoTabList.uc.js funktionieren.
Wobei newTabButtonUndoTabList.uc.js schon irgendwie merkwürdig reagiert.
Darauf werde ich ein später in einem eigenen Thread irgendwann noch einmal genauer eingehen.
Ob UndoListInTabmenuToo.us.js funktioniert, habe ich noch nicht geprüft!
Aber bei einigen Nutzern scheint es ja so zu sein.
Nun sind bei mir nur noch 4 Skripte offen. (Die "Translate"-Skripte sind ja nahezu gleich)
Und ich bekomme es alleine nicht hin!
Das wäre das erste Skript (Restart item script for Firefox 89+ by Aris),
das Zweite (Tab schließen + Kontextmenü auch in dem Einstellungsfenster),
die beiden "Translate"-Skripte,
und das mir wichtigste, Appmenu_neu2.uc.js.
Link => #133
// ==UserScript==
// @name Jizzmenu.uc.js
// @namespace Appmenu@gmail.com
// @description Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche
// @include main
// @version update for Firefox 68+ by aborix
// @author defpt
// @charset UTF-8
// @version 2019.08.04
// @version 2020.05.27
// @version 2020.07.13 Weitere Menüs und Funktionen ergänzt by bege
// @version 2024.08.10 alle Einstellungen im Abschnitt Konfiguration vornehmen
// @version 2024.08.18 einige Veränderungen am Skript, Symbole, Funktionen & Menüs by Mira Bellenbaum
// ==/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: 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: "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: `${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",
},
],
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 = "Button_groß.png";
let AlternateIcon = "Button_klein-plus.png";
// Wenn Appmenu.isButton true ist, benutze das große Symbol, sonst das kleine
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.height = "21px"; // Feste Höhe für kleines Symbol
}
// Button in die richtige Toolbar einfügen
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();');
/*
key.setAttribute ('command', function (event) {
if (event.button == 0) {
Appmenu.exec(this.path, this.args);
}
});
*/
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 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMchrome { background-image: url('${ProfilePath}/${Icon02}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMCSS { background-image: url('${ProfilePath}/${Icon03}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMJS { background-image: url('${ProfilePath}/${Icon04}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMAddons { background-image: url('${ProfilePath}/${Icon05}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16pxx !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMProgramm { background-image: url('${ProfilePath}/${Icon06}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMCache { background-image: url('${ProfilePath}/${Icon07}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMAnpassen { background-image: url('${ProfilePath}/${Icon11}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMModus { background-image: url('${ProfilePath}/${Icon12}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMKonsole { background-image: url('${ProfilePath}/${Icon13}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMWerkzeuge { background-image: url('${ProfilePath}/${Icon14}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMEntwickler { background-image: url('${ProfilePath}/${Icon15}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMsynchron { background-image: url('${ProfilePath}/${Icon16}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMdaten { background-image: url('${ProfilePath}/${Icon17}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMManager { background-image: url('${ProfilePath}/${Icon18}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMOffline { background-image: url('${ProfilePath}/${Icon19}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
/* Neustart-Button */
#AMreboot {
background-image: url('${ProfilePath}/${ButtonIcon01}');
background-repeat: no-repeat !important;
background-position: 10px 2px !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: #fbc96e !important;
}
/* Beenden-Button */
#AMquit {
background-image: url('${ProfilePath}/${ButtonIcon02}');
background-repeat: no-repeat !important;
background-position: 12px 3px !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
Zeilen 226, 278, 321 & 325 sind m.M. anzupassen. Aber wie?
das Zweite (Tab schließen + Kontextmenü auch in dem Einstellungsfenster),
Haben wir schon:
Kleiner Nachtrag zu newTabButtonUndoTabList.uc.js.
Habe das Verhalten noch einmal überhüpft und festgestellt,
dass es sich ganz normal, also genau wie das Alte verhält.
Dennoch hätte ich Fragen zu dem Skript!
1. Warum muss mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);"); behandelt werden,
als wäre es doch ein "EventListener"? (Das Skript funktioniert sonnt nicht!
// mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
mp.addEventListener('popupshowing', function(event) {
UCT.onpopupshowing(event);
}, true);
2. Weiter "unten" kommt diese Zeile im Code vor:
m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
Daraus wurde Folgendes gemacht:
undoItems.map(function (item, id) {
// m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
let strCommand = 'undoCloseTab(' + id + ')';
m.addEventListener('command', () => {
Function("return " + strCommand)();
}, true);
Nur habe ich vorher schon etwas mit dem Skript auseinandergesetzt und bin auf eine andere Lösung gekommen.
undoItems.map(function (item, index) { // Verwende `index` statt `id`
// m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
m.addEventListener('command', (event) => {
if (event.button == 0) {
undoCloseTab(index); // `index` statt ' + id + ' verwenden
}
Worin bestehen die Vor, bzw. Nachteile der jeweiligen Versionen?
/* ********************************************************************************************************************************************************************* */
das Zweite (Tab schließen + Kontextmenü auch in dem Einstellungsfenster),
Haben wir schon:
[/post]
Oh, da habe ich wohl den Überblick verloren!
Richtig, dieses Skript habe ich schon in korrigierter Fassung.
Ergo sind es nur 3 Skripte, die mir Kopfzerbrechen bereiten
Warum muss mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);"); behandelt werden,
als wäre es doch ein "EventListener"? (Das Skript funktioniert sonnt nicht!
Gegenfrage: Wieso sollte hier etwas anderes gelten?
Worin bestehen die Vor, bzw. Nachteile der jeweiligen Versionen?
Ob du die Variable id oder index nennst, macht keinen Unterschied (um Bezug auf deine Code-Kommentare zu nehmen). Du kannst die nennen, wie du möchtest. Ansonsten, unter der Voraussetzung, dass beides gleich funktioniert (ich habe es nicht getestet), ist der Vorteil deiner Version, dass sie weniger umständlich ist. Es liest sich besser, außerdem wird die Funktion wirklich als Funktion und nicht als String geschrieben (was schon ein Nachteil der Inline-Variante war), womit Syntax-Hervorhebung und Navigation im Code-Editor möglich sind. Und das hilft letztlich dabei, den Code zu verstehen und zu pflegen. Die Bedingung event.button == 0 ist im Übrigen bereits zusätzlicher Code, das gibt es im anderen Code nicht. Lässt du das weg, wird der Unterschied noch deutlicher.
Hallo FuchsFan
if(this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
"Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit,0);"));
Vielen Dank für den Schnipsel.
Habe ich gleich mal eingefügt bzw. ersetzt.
Mfg.
Endor
//
Ich nutze zwar das neue Skript von Mitleser , habe aber mal an diesem Skript versucht es anzupassen...bin aber kläglich gescheitert
(function() {
if(location.href != 'chrome://browser/content/browser.xhtml') return;
try {
CustomizableUI.createWidget({
id: 'menu-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var button = aDocument.createXULElement('toolbarbutton');
var attributes = {
id: 'menu-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
removable: 'true',
label: 'Videos aufnehmen können',
tooltiptext: Services.prefs.getBoolPref('media.mediasource.enabled') ?
'Videos gesperrt' : 'Videos frei',
oncommand: '(' + onCommand.toString() + ')()'
};
for (var a in attributes) {
button.setAttribute(a, attributes[a]);
};
function onCommand() {
var isEnabled = !Services.prefs.getBoolPref('media.mediasource.enabled');
Services.prefs.setBoolPref('media.mediasource.enabled', isEnabled);
/* event.target.ownerGlobal.BrowserReload(); */
event.target.ownerGlobal.BrowserCommands.reload();
var windows = Services.wm.getEnumerator('navigator:browser');
while (windows.hasMoreElements()) {
let button = windows.getNext().document.getElementById('menu-button');
if (isEnabled)
button.setAttribute('tooltiptext', 'Videos gesperrt')
else
button.setAttribute('tooltiptext', 'Videos frei');
};
};
return button;
}
});
} catch(e) { };
if (document.documentElement.hasAttribute('privatebrowsingmode') &&
!Services.prefs.getBoolPref('media.mediasource.enabled'))
{
let button = document.getElementById('menu-button');
button.click();
window.addEventListener('unload', function() {
button.click();
});
};
var css =
'#menu-button[tooltiptext="Videos gesperrt"] {list-style-image: url("file:///C:/Users/weiss/AppData/Roaming/Mozilla/Firefox/Profiles/i3gghgwc.default/chrome/Icons/.2.svg")}' +
'#menu-button[tooltiptext="Videos frei"] {list-style-image: url("file:///C:/Users/weiss/AppData/Roaming/Mozilla/Firefox/Profiles/i3gghgwc.default/chrome/Icons/.1.svg")}';
var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
document.insertBefore(stylesheet, document.documentElement);
})();
Alles anzeigen
Es würde mich freuen, wenn sich das mal jemand ansehen/anpassen könnte, evtl. lerne ich dadurch ja doch etwas.
Worin bestehen die Vor, bzw. Nachteile der jeweiligen Versionen?
Ergänzend zu dem was Sören Hentzschel geschrieben hat:
Die 1.Version mit Function erzeugt aus dem String eine anonyme Funktion die dann zur Laufzeit (und damit auch im Debugger) aufgerufen wird. Das ist besonders bei generischen Funktionen hilfreich, die zur Laufzeit unterschiedliche command-events bekommen, wie wir es z.B. beim extraConfigMenu-Skript der Fall ist. Macht man es so, wie in der zweiten Version, dann müsste man eine Vielzahl von neuen Funktionsaufrufen schreiben oder Funktionen als Parameter übergeben. Im Normalfall
ist es meiner Erachtens gleich, was für eine Version verwendet wird. Da es eigentlich immer nur einen(!) Funktionsaufruf für einen command-event geben sollte. In dieser Funktion wird dann das Ereignis behandelt. In vielen unserer genutzten Skripte steht aber oft schon der halbe Code in dem 'oncommand'-Attribute, was mehr als schlecht zu lesen und verstehen ist.
Vielen Dank für den Schnipsel.
Gerne doch, Endor , aber ich bin nur der Nutzer, nicht der Autor.
Da gab es doch noch ein Problemchen, die Scripte wurden im Submenü zwar angezeigt, konnten aber nicht geöffnet werden.
Nochmals alles verglichen und übertragen, es wird alles angezeigt und funktioniert auch. Einstellungen nutze ich so zwar nicht, weil ich es unter Funktionen extra zur Verfügung habe.
Danke! Wieder eine Hürde genommen.
Es würde mich freuen, wenn sich das mal jemand ansehen/anpassen könnte, evtl. lerne ich dadurch ja doch etwas.
Man sollte "nur von den Besten lernen" ... also nicht von mir . Aber hier mal das Skript. Hoffe es läuft.
Setzt das wirklich nur den mediasource-Eintrag in about:config? Keine Ahnung wozu das gut ist...
(function() {
if(location.href != 'chrome://browser/content/browser.xhtml') return;
try {
CustomizableUI.createWidget({
id: 'menu-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var button = aDocument.createXULElement('toolbarbutton');
var attributes = {
id: 'menu-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
removable: 'true',
label: 'Videos aufnehmen können',
tooltiptext: Services.prefs.getBoolPref('media.mediasource.enabled') ?
'Videos gesperrt' : 'Videos frei'
};
for (var a in attributes) {
button.setAttribute(a, attributes[a]);
};
return button;
}
});
} catch(e) { };
document.getElementById('menu-button').addEventListener('command', function(event) {
var isEnabled = !Services.prefs.getBoolPref('media.mediasource.enabled');
Services.prefs.setBoolPref('media.mediasource.enabled', isEnabled);
event.target.ownerGlobal.BrowserCommands.reload();
var windows = Services.wm.getEnumerator('navigator:browser');
while (windows.hasMoreElements()) {
let button = windows.getNext().document.getElementById('menu-button');
if (isEnabled)
button.setAttribute('tooltiptext', 'Videos gesperrt')
else
button.setAttribute('tooltiptext', 'Videos frei');
};
}, true);
if (document.documentElement.hasAttribute('privatebrowsingmode') &&
!Services.prefs.getBoolPref('media.mediasource.enabled'))
{
let button = document.getElementById('menu-button');
button.click();
window.addEventListener('unload', function() {
button.click();
});
};
var css =
'#menu-button[tooltiptext="Videos gesperrt"] {list-style-image: url("file:///C:/Users/weiss/AppData/Roaming/Mozilla/Firefox/Profiles/i3gghgwc.default/chrome/Icons/.2.svg")}' +
'#menu-button[tooltiptext="Videos frei"] {list-style-image: url("file:///C:/Users/weiss/AppData/Roaming/Mozilla/Firefox/Profiles/i3gghgwc.default/chrome/Icons/.1.svg")}';
var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
document.insertBefore(stylesheet, document.documentElement);
})();
Alles anzeigen
Danke! Wieder eine Hürde genommen.
Gerne. Freut mich, wenn es jetzt läuft...
also nicht von mir
Wenn ich nur 10% deiner Kenntnisse bezüglich Skripte hätte...tcha dann...
Hoffe es läuft.
Perfekt, herzlichen Dank dafür.
nur den mediasource-Eintrag in about:config?
Ja.
Keine Ahnung wozu das gut ist.
Ich nehme sehr viel in den Mediatheken auf, bzw. direkt von den Sendern. Beim ZDF wird mir das Video dann so angezeigt:
Ich brauche es aber .mp4 für meinen TV. Dann muss ich den config Eintrag umschalten, dann wird es eine .mp4 Datei:
Gern geschehen und danke für die Erklärung zum Sinn dieses Skripts.
Sören Hentzschel D.h. ich könnte den Code auch so verwenden?
undoItems.map(function (item, index) { // Verwende `index` statt `id`
// m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
m.addEventListener('command', (event) => {
undoCloseTab(index); // `index` statt ' + id + ' verwenden
}
Und die Variable auch "Sören" nennen?
BrokenHeart Um welches Skript geht es eigentlich genau, bei der Konversation mit FuchsFan ?
Denn vom "Bildchen" her, könnte, wenn der Code funktioniert, eventuell etwas für mein Appmenu_neu2.uc.js abfallen.
Ich brauche es aber .mp4 für meinen TV. Dann muss ich den config Eintrag umschalten, dann wird es eine .mp4 Datei:
In dem Fall klappt das also eher zufällig. Die Unterstützung für WebM könntest du auch über media.webm.enabled steuern. Der Schalter media.mediasource.enabled steuert die Unterstützung sogenannter Media Source Extensions. Dass sich das ausgelieferte Format dadurch ändert, ist eine Entscheidung, die diese Mediathek getroffen hat. Technisch gesehen gibt es da keinen Zusammenhang. Das heißt, es könnte theoretisch irgendwann passieren, dass du doch wieder WebM-Videos bekommst.
D.h. ich könnte den Code auch so verwenden?
Wenn es funktional identisch zur anderen Version sein soll, ja. Wenn diese Abfrage einen Grund hat, kannst du sie natürlich auch belassen.
Und die Variable auch "Sören" nennen?
Umlaute (oder allgemeiner: Nicht-ASCII-Zeichen) sollten vermieden werden. Aber grundsätzlich möglich, ja.