Hier übrigens die Version des Skripts
Perfekt, gleich mal für alle meine Profile und Versionen übernommen
Herzlichen Dank auch hier wieder.
Funzt das?
Teilweise.
So passt es wieder für mich:
Hier übrigens die Version des Skripts
Perfekt, gleich mal für alle meine Profile und Versionen übernommen
Herzlichen Dank auch hier wieder.
Funzt das?
Teilweise.
So passt es wieder für mich:
So, erstmal ganz herzlichen Dank an alle die hier wirklich erstklassige Hilfe gegeben haben, hat mich sehr gefreut
Ich habe jetzt alle Skripte im Nightly ausgetauscht, und bis auf dieses funktioniert alles wieder einwandfrei
Das ist wohl das letzte bei mir was noch angepasst werden müsste:
// ==UserScript==
// @name Thunderbird.uc.js
// @namespace ithinc#mozine.cn
// @description External Applications
// @include main
// @compatibility Firefox 3.5.x
// @author ithinc
// @version 20091212.0.0.1 Initial release
// ==/UserScript==
/* :::: External Applications :::: */
var gExternalApplications = {
type: 'button', //'menu' or 'button'
insertafter: 'urlbar-container',
apps: [
{name: 'Thunderbird', path: 'C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe'},
],
init: function() {
for (var i=0; i<this.apps.length; i++) {
if (!this.apps[i].path) continue;
if (!this.apps[i].args) this.apps[i].args = [];
this.apps[i].path = this.apps[i].path.replace(/\//g, '\\');
var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get('CurProcD', Ci.nsIFile).path;
if (/^(\\)/.test(this.apps[i].path)) {
this.apps[i].path = ffdir.substr(0,2) + this.apps[i].path;
}
else if (/^(\.)/.test(this.apps[i].path)) {
this.apps[i].path = ffdir + '\\' + this.apps[i].path;
}
}
if (this.type == 'menu') {
var mainmenu = document.getElementById('main-menubar');
var menu = mainmenu.appendChild(document.createXULElement('menu'));
menu.setAttribute('label', 'Start');
menu.setAttribute('accesskey', 'a');
var menupopup = menu.appendChild(document.createXULElement('menupopup'));
for (var i=0; i<this.apps.length; i++) {
menupopup.appendChild(this.createMenuitem(this.apps[i]));
}
}
else {
var menubarItems = document.getElementById(this.insertafter);
var toolbaritem = menubarItems.parentNode.insertBefore(document.createXULElement('toolbaritem'), menubarItems.nextSibling);
toolbaritem.id = 'ExtAppButtons';
toolbaritem.setAttribute("class", "chromeclass-toolbar-additional");
toolbaritem.setAttribute("orient", "horizontal");
for (var i=0; i<this.apps.length; i++) {
toolbaritem.appendChild(this.createButton(this.apps[i]));
}
}
},
exec: function(path, args) {
for (var i=0; i<args.length; i++) {
args[i] = args[i].replace(/%u/g, gBrowser.currentURI.spec);
}
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath(path);
if (!file.exists()) {
throw 'File Not Found: ' + path;
}
if (!file.isExecutable() || args.length==0) {
file.launch();
}
else {
var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess);
process.init(file);
process.run(false, args, args.length);
}
},
createButton: function(app) {
if (app.name == 'separator')
return document.createXULElement('toolbarseparator');
var item = document.createXULElement('toolbarbutton');
item.setAttribute('class', 'toolbarbutton-1 chromeclass-toolbar-additional');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file:///' + app.path + '?size=16');
item.setAttribute('oncommand', 'gExternalApplications.exec(this.path, this.args);');
// item.setAttribute('tooltiptext', app.name);
item.path = app.path;
item.args = app.args;
return item;
},
createMenuitem: function(app) {
if (app.name == 'separator')
return document.createXULElement('menuseparator');
var item = document.createXULElement('menuitem');
item.setAttribute('class', 'menuitem-iconic');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file:///' + app.path + '?size=16');
item.setAttribute('oncommand', 'gExternalApplications.exec(this.path, this.args);');
item.path = app.path;
item.args = app.args;
return item;
}
};
gExternalApplications.init();
Alles anzeigen
Damit wird ein Button erstellt der nach Klick den Thunderbird startet.
Wobei man in Zeile 19 auch jede andere beliebige .exe Datei eintragen kann. Ich nutze das z.B. dann als weiteres Skript für das Kartenspiel von MS mit diesem Eintrag:
{name: 'XP - Spider', path: 'D:\\XP - Spider Solitär\\XP - Spider.exe'},
So sieht das mit den beiden Button dann hier aus:
Evtl. hat ja jemand auch dafür noch eine Lösung.
Vielen Dank wie immer vorweg.
2002Andreas Ist nur ein Versuch!
// ==UserScript==
// @name Thunderbird.uc.js
// @namespace ithinc#mozine.cn
// @description External Applications
// @include main
// @compatibility Firefox 3.5.x
// @author ithinc
// @version 20091212.0.0.1 Initial release
// ==/UserScript==
/* :::: External Applications :::: */
var gExternalApplications = {
type: 'button', //'menu' or 'button'
insertafter: 'urlbar-container',
apps: [
{name: 'Thunderbird', path: 'C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe'},
],
init: function() {
for (var i=0; i<this.apps.length; i++) {
if (!this.apps[i].path) continue;
if (!this.apps[i].args) this.apps[i].args = [];
this.apps[i].path = this.apps[i].path.replace(/\//g, '\\');
var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get('CurProcD', Ci.nsIFile).path;
if (/^(\\)/.test(this.apps[i].path)) {
this.apps[i].path = ffdir.substr(0,2) + this.apps[i].path;
}
else if (/^(\.)/.test(this.apps[i].path)) {
this.apps[i].path = ffdir + '\\' + this.apps[i].path;
}
}
if (this.type == 'menu') {
var mainmenu = document.getElementById('main-menubar');
var menu = mainmenu.appendChild(document.createXULElement('menu'));
menu.setAttribute('label', 'Start');
menu.setAttribute('accesskey', 'a');
var menupopup = menu.appendChild(document.createXULElement('menupopup'));
for (var i=0; i<this.apps.length; i++) {
menupopup.appendChild(this.createMenuitem(this.apps[i]));
}
}
else {
var menubarItems = document.getElementById(this.insertafter);
var toolbaritem = menubarItems.parentNode.insertBefore(document.createXULElement('toolbaritem'), menubarItems.nextSibling);
toolbaritem.id = 'ExtAppButtons';
toolbaritem.setAttribute("class", "chromeclass-toolbar-additional");
toolbaritem.setAttribute("orient", "horizontal");
for (var i=0; i<this.apps.length; i++) {
toolbaritem.appendChild(this.createButton(this.apps[i]));
}
}
},
exec: function(path, args) {
for (var i=0; i<args.length; i++) {
args[i] = args[i].replace(/%u/g, gBrowser.currentURI.spec);
}
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath(path);
if (!file.exists()) {
throw 'File Not Found: ' + path;
}
if (!file.isExecutable() || args.length==0) {
file.launch();
}
else {
var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess);
process.init(file);
process.run(false, args, args.length);
}
},
createButton: function(app) {
if (app.name == 'separator')
return document.createXULElement('toolbarseparator');
var item = document.createXULElement('toolbarbutton');
item.setAttribute('class', 'toolbarbutton-1 chromeclass-toolbar-additional');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file:///' + app.path + '?size=16');
//item.setAttribute('oncommand', 'gExternalApplications.exec(this.path, this.args);');
item.setAttribute('oncommand', function(event) {
gExternalApplications.exec(this.path, this.args);
}, true);
// item.setAttribute('tooltiptext', app.name);
item.path = app.path;
item.args = app.args;
return item;
},
createMenuitem: function(app) {
if (app.name == 'separator')
return document.createXULElement('menuseparator');
var item = document.createXULElement('menuitem');
item.setAttribute('class', 'menuitem-iconic');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file:///' + app.path + '?size=16');
//item.setAttribute('oncommand', 'gExternalApplications.exec(this.path, this.args);');
item.setAttribute('oncommand', function(event) {
gExternalApplications.exec(this.path, this.args);
}, true)
item.path = app.path;
item.args = app.args;
return item;
}
};
gExternalApplications.init();
Alles anzeigen
Wenn sich jemand meiner Skripte annehmen würde, bitte.
Wichtig für mich wäre jenes, welches im ZIP ist!
Und die Liste ist ja auch schon etwas kleiner, es sind ja nur noch 6 Stück.
Wo bei zwei im Prinzip gleich sind, als fünf, quasi.
Ist nur ein Versuch!
Hallo Mira, danke dafür, aber funktioniert leider nicht
2002Andreas Diese Version scheint zu klappen:
// ==UserScript==
// @name Thunderbird.uc.js
// @namespace ithinc#mozine.cn
// @description External Applications
// @include main
// @compatibility Firefox 3.5.x
// @author ithinc
// @version 20091212.0.0.1 Initial release
// ==/UserScript==
/* :::: External Applications :::: */
var gExternalApplications = {
type: 'button', //'menu' or 'button'
insertafter: 'urlbar-container',
apps: [
{name: 'Thunderbird', path: 'C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe'},
],
init: function() {
for (var i=0; i<this.apps.length; i++) {
if (!this.apps[i].path) continue;
if (!this.apps[i].args) this.apps[i].args = [];
this.apps[i].path = this.apps[i].path.replace(/\//g, '\\');
var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get('CurProcD', Ci.nsIFile).path;
if (/^(\\)/.test(this.apps[i].path)) {
this.apps[i].path = ffdir.substr(0,2) + this.apps[i].path;
}
else if (/^(\.)/.test(this.apps[i].path)) {
this.apps[i].path = ffdir + '\\' + this.apps[i].path;
}
}
if (this.type == 'menu') {
var mainmenu = document.getElementById('main-menubar');
var menu = mainmenu.appendChild(document.createXULElement('menu'));
menu.setAttribute('label', 'Start');
menu.setAttribute('accesskey', 'a');
var menupopup = menu.appendChild(document.createXULElement('menupopup'));
for (var i=0; i<this.apps.length; i++) {
menupopup.appendChild(this.createMenuitem(this.apps[i]));
}
}
else {
var menubarItems = document.getElementById(this.insertafter);
var toolbaritem = menubarItems.parentNode.insertBefore(document.createXULElement('toolbaritem'), menubarItems.nextSibling);
toolbaritem.id = 'ExtAppButtons';
toolbaritem.setAttribute("class", "chromeclass-toolbar-additional");
toolbaritem.setAttribute("orient", "horizontal");
for (var i=0; i<this.apps.length; i++) {
toolbaritem.appendChild(this.createButton(this.apps[i]));
}
}
},
exec: function(path, args) {
for (var i=0; i<args.length; i++) {
args[i] = args[i].replace(/%u/g, gBrowser.currentURI.spec);
}
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath(path);
if (!file.exists()) {
throw 'File Not Found: ' + path;
}
if (!file.isExecutable() || args.length==0) {
file.launch();
}
else {
var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess);
process.init(file);
process.run(false, args, args.length);
}
},
createButton: function(app) {
if (app.name == 'separator')
return document.createXULElement('toolbarseparator');
var item = document.createXULElement('toolbarbutton');
item.setAttribute('class', 'toolbarbutton-1 chromeclass-toolbar-additional');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file:///' + app.path + '?size=16');
// item.setAttribute('oncommand', 'gExternalApplications.exec(this.path, this.args);');
item.addEventListener ('command', function (event) {
if (event.button == 0) {
gExternalApplications.exec(this.path, this.args);
}
});
// item.setAttribute('tooltiptext', app.name);
item.path = app.path;
item.args = app.args;
return item;
},
createMenuitem: function(app) {
if (app.name == 'separator')
return document.createXULElement('menuseparator');
var item = document.createXULElement('menuitem');
item.setAttribute('class', 'menuitem-iconic');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file:///' + app.path + '?size=16');
// item.setAttribute('oncommand', 'gExternalApplications.exec(this.path, this.args);');
item.addEventListener ('command', function (event) {
if (event.button == 0) {
gExternalApplications.exec(this.path, this.args);
}
});
item.path = app.path;
item.args = app.args;
return item;
}
};
gExternalApplications.init();
Alles anzeigen
Mal noch eine Frage. Wo taucht denn der Menüeintrag auf?
Diese Version scheint zu klappen:
Bingo...herzlichen Dank dafür
Wo taucht denn der Menüeintrag auf?
Den habe ich hier auch nicht, k.A. wo der sein sollte
2002Andreas Schau mal Zeile 115, da hat milupo ein i vergessen.
Nicht tem.addEventListener ('command', function (event) {, sondern item.addEventListener ('command', function (event) {
müsste das heißen.
milupo Wie bist Du denn auf
item.addEventListener ('command', function (event) {
if (event.button == 0) {
gExternalApplications.exec(this.path, this.args);
} ,anstatt
item.setAttribute('oncommand', function(event) {
gExternalApplications.exec(this.path, this.args);
}, true) gekommen?
In Zeile 14 muss man bei type button in menu ändern. Dadurch hat man dann das Menü Start am Ende der Menüleiste. Aber: Bitte korrigiere im Skript am Ende tem.addEventListener in item.addEventlistener, sonst funktioniert der Aufruf per Menü nicht. Habe vergessen den Buchstaben „i“ zu kopieren. War ein blöder Kopierfehler.
da hat milupo ein i vergessen.
Genau.
Habe es im Code-Kasten oben geändert.
Schau mal Zeile 115
War ein blöder Kopierfehler.
Danke für den Hiweis, habe ich geändert. Kann doch mal passieren.
Funktioniert hat es trotzdem.
In Zeile 14 muss man bei type button in menu ändern
Alles klar, hätte mir ja auch auffallen können
Aber ich nutze nur jeweils den Button in beiden Skripten.
Funktioniert hat es trotzdem.
Ja, weil es nur das Menü betraf. Der Code für das Symbol war ja korrekt.
Der Code für das Symbol war ja korrekt.
Leuchtet ein, danke für den Hinweis.
Somit funktionieren 15 Skripte dank eurer Hilfe wieder einwandfrei
Somit funktionieren 15 Skripte dank eurer Hilfe wieder einwandfrei
Na, das ist doch was. Und Spider Solitär ist auch wieder erreichbar.
Somit funktionieren 15 Skripte dank eurer Hilfe wieder einwandfrei
Und mir fehlen noch 5
und ich bekomme es selber einfach nicht hin.
newTabButtonUndoTabList.uc.js & SkipToTopAndBottom.uc.js funktionieren jetzt ja.
Also bleiben noch,
das Erste (Restart item script for Firefox 89+ by Aris),
das Zweite (Tab schließen + Kontextmenü auch in dem Einstellungsfenster),
die "Translate"-Skripte,
UndoListInTabmenuToo.uc.js
und Appmenu_neu2.uc.js,
die noch nicht funktionieren.
Und Spider Solitär ist auch wieder erreichbar.
Soll ich dir mal etwas verrücktes sagen
Wegen dem Spiel, und dem Spiel Solitär, würde ich nicht auf ein anderes System wie Windows wechseln.
Und meine Frau schon mal gar nicht.
Happy wife...happy life..sie bekommt darum auch einen neuen Laptop mit Win11, und diesen beiden Spielen. Die habe ich mir damals aus Win98 kopiert und in alle anderen Windows Versionen wieder eingefügt.
Und mir fehlen noch 5
Gedulde dich bitte einfach. Für die vielen Helfer war das bis jetzt ja auch eine Menge Arbeit schon. Es wird sich auch für deine 5 Skripte noch eine Lösung finden.
Wie bist Du denn auf
item.addEventListener ('command', function (event) {
if (event.button == 0) {
gExternalApplications.exec(this.path, this.args);
} ,anstattitem.setAttribute('oncommand', function(event) {
gExternalApplications.exec(this.path, this.args);
}, true) gekommen?
Du könntest schwere Fragen stellen.
Was du bisher noch nicht so richtig verstanden hast: Es gibt keine Inline-Eventhandler mehr. Diese beginnen mit on- und danach den entsprechenden Befehl, also z. B. oncommand, onclick, ondblclick. Stattdessen kann jetzt nur noch die Methode addEventlistener verwendet werden, die den Eventhandler dem Skript sozusagen bekannt macht. Der Eventhandler ist dabei ohne vorgesetztes on, also nur command, click, dblclick. Die Methode addEventListener hat noch einen zweiten Parameter und das ist noch so ein Rätsel für mich. Wenn im auszuführenden Code event vorkommt, kann man offensichtlich event => verwenden. Aber dieser zweite Parameter kann auch eine Funktion sein. Und hier wird ja eine Funktion ausgeführt. Deswegen habe ich einfach function (event) genommen, in der Hoffnung, es funktioniert. Es hat funktioniert, Glück gehabt.
und diesen beiden Spielen
So lange wie sie auf einem neueren Windows noch laufen …
milu War dann in meinem Versuch einfach nur den Fehler doch "oncommand" zu benutzen?
Und hätte :
item.setAttribute('command', function(event) {
gExternalApplications.exec(this.path, this.args);
}, true)
funktionieren können?
Es gibt doch noch ein Problem mit: Tab schließen.uc.js
Starte ich den Fx und mache einen Rechtsklick, dann sieht das so aus:
und der Button funktioniert auch.
Öffne ich dann z.B. das Einstellungsfenster, dann sieht es so aus:
Kein Eintrag vorhanden.
Gehe ich wieder auf den anderen Tab, dann fehlt auch dort der Eintrag
Erst nach einem Neustart wird er wieder angezeigt.
Das ist das neue Skript dazu:
// JavaScript Document
// M_contentAreaContextMenuCloseTab.uc.js
(function() {
if (!window.gBrowser)
return;
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const id = 'context-closetab-test'; // ID des neuen menuitems
const label = 'Tab schließen'; // Bezeichnung des neuen menuitems
const tooltiptext = 'Tab schließen';
// Icon-------------------------------------------------------
const icon = 'objects_065.gif'; // [Name.Dateiendung] des anzuzeigenden Symbols
const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
const iconColor = 'currentColor'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColor keine Funktion)
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
//----
if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
}
//----
var contextMenu = document.getElementById('contentAreaContextMenu');
var menuseparator = document.createXULElement('menuseparator');
menuseparator.id = 'context-sep-closetab';
contextMenu.append(menuseparator);
var menuitem = document.createXULElement('menuitem');
menuitem.id = id;
menuitem.setAttribute('label', label);
menuitem.setAttribute('tooltiptext', tooltiptext);
menuitem.style.MozContextProperties = 'fill';
menuitem.style.fill = iconColor;
menuitem.classList.add('menuitem-iconic');
menuitem.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
menuitem.addEventListener('click', () => {
BrowserCommands.closeTabOrWindow();
});
contextMenu.append(menuitem);
//Feld in die Iconleiste
//let ref = document.getElementById('context-bookmarkpage');
//ref.parentNode.insertBefore(menuitem, ref.nextSibling);
var appcontent = document.getElementById('tabbrowser-tabbox');
appcontent.addEventListener('contextmenu', event => {
setTimeout(() => {
if (gContextMenu && !gContextMenu.shouldDisplay) {
for (let string of 'back forward reload bookmarkpage'.split(' ')) {
document.getElementById('context-' + string).removeAttribute('hidden');
}
document.getElementById('context-stop').setAttribute('hidden', 'true');
const A = 'navigation sep-navigation savepage sep-paste selectall sep-viewsource viewsource viewinfo sep-bidi inspect-a11y inspect sep-closetab closetab'.split(' ');
for (let node of contextMenu.childNodes) {
if (A.includes(node.id.substring(8)))
node.removeAttribute('hidden');
else
node.setAttribute('hidden', 'true');
}
contextMenu.openPopupAtScreen(event.screenX, event.screenY, true, event);
}
}, 50);
});
})();
Alles anzeigen
Kann sich das bitte mal jemand ansehen, vielen Dank dafür.
einfach nur den Fehler doch "oncommand" zu benutzen?
Nein, so einfach geht es eben nicht. Du musst addEventListener verwenden, nicht setAttribute. Die Parameter command und function (event) gehören zu addEventListener. Davor steht das Objekt (hier item), in den Skripten ist das meist eine Variable, die vorher mit var oder let definiert wird.
Mit setAttribute wurde vorher oncommand als Attribut definiert (setAttribute = setze Attribut soundso). Da es keine Inline-Eventhandler mehr gibt, geht es nicht mehr diese als Attribut zu definieren.
Also sieht es so aus: objekt.addEventListener('command', function (event) { … }); Zwischen den geschweiften Klammern steht der auszuführende Code, der leider auch oft umgebaut werden muss.
Oh neinIch bin sooo doof
Bein herumexperimentieren habe ich mir newTabButtonUndoTabList.uc.js zerschossen
und nun weiß ich nicht mehr, wie ich Zeile 40 korrigiert hatte.
Oh man, ich sollte mal eine Pause machen!
In #109 steht doch die Lösung!!
Oh man, ich sollte mal eine Pause machen!
In #109 steht doch die Lösung!!
Nicht, dass du dich da wunderst: onpopupshowing ist in dem Skript kein Inline-Eventhandler, der hätte ersetzt werden müssen. Da hätte sich der Autor des Skriptes eigentlich an die Standardschreibweise halten müssen: onPopupshowing, hat er aber nicht, so sieht es wie ein Inline-Eventhandler aus, obwohl es keiner ist.
2002Andreas Kannst du mal das Skript ohne Änderung einstellen? Möglicherweise wurde beim Ändern ein Fehler eingebaut. Auf jeden Fall kann ich das bestätigen. Der Witz dabei ist, ich habe hier eine andere Version, da funktioniert es nun wieder nur in about:preferences. Allerdings ist mir das wurscht. Denn der Eintrag „Tab schließen“ als Eintrag im Kontextmenü eines Tabs ist schon seit langem Standard.