Mein Appmenü-Skript funktioniert nicht mehr richtig!
Meines schon!
Mein Appmenü-Skript funktioniert nicht mehr richtig!
Meines schon!
Speravir Ach herjeh, da beziehst Du Dich aber auf eine Version, die längst überholt ist.
„Längst überholt“ muss nicht sein. Von Alice gibt es eine Version für Firefox 135+, das ist sehr aktuell.
Speravir Ach herjeh, da beziehst Du Dich aber auf eine Version, die längst überholt ist.
„Längst überholt“ muss nicht sein. Von Alice gibt es eine Version für Firefox 135+, das ist sehr aktuell.
Die hatte ich benutzt, übersetzt und das Kontextmenü, wegen des m.M. nach komischen Fehlers, unscharf geschaltet!
Und wie ich schon schrieb, ist da das Menü etwas merkwürdig!
Der Punkt "Alle Tabs wieder öffnen" erscheint nicht oben im Menü, sondern unten.
Hier noch einmal "meine" Version.
// ==UserScript==
// @name UndoListInTabmenuToo
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description UndoListInTabmenuToo.uc.js
// @include main
// @compatibility Firefox 135
// @author Alice0775
// @version 2025/01/15 fix bug by Mira Bellenbaum (Tooltips deleted because incorrect)
// @version 2025/01/05 remove redundant menuitems
// @version 2025/01/05 fix bug
// @version 2024/12/22 fix Bug 1936336 - Disallow inline event handlers
// @version 2024/08/23 Bug 1690613 - Allow access to url/title/favIconUrl without "tabs" permission in session API
// @version 2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
// @version 2022/05/10 fix ref to context-media-eme-separator
// @version 2021/12/09 remove JSON.parse (Bug 1733425)
// @version 2021/04/25 fix 1689378
// @version 2019/11/14 remove eval
// @version 2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
// @version 2019/06/24 23:00 wait for gBrowser initialized
// @version 2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
// @version 2018/05/10 60
// @version 2017/11/18 nsIPrefBranch to nsIPrefBranch
// @version 2010/09/18 00:00 4.0b7pre
// @version 2009/02/03 13:00 Tooltip zeigt jetzt den Verlauf in Tabs an
// @Note Fügt die UndoClose Tab List für Tabs und Kontextmenüs hinzu
// @OriginalCode Orginalcode aus browser.js für populateUndoSubmenu verwendet
// @version 2018/05/09 15:00 61
// ==/UserScript==
// @version 2010/03/26 13:00 Minefield/3.7a4pre Bug 554991 - allow tab context menu to be modified by normal XUL overlays
// @version 2010/03/15 00:00 Minefield/3.7a4pre Bug 347930 - Tab strip should be a toolbar instead
// @version 2009/09/09 15:00 Mittlere Klickverarbeitung
// @version 2009/09/03 22:00 Firefox3.7a1pre Funktion wurde wieder hergestellt.(Bug 489925. getElementById should not return anonymous nodes)
// @version 2009/08/22 00:00 Firefox3.6 Ändern des stringbandle
// @version 2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
// @version 2008/10/12 18:00 FFx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
// @version 2007/10/05 10:00
var UndoListInTabmenu = {
// -- config --
TABCONTEXTMENU : true , //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
CONTEXTMENU : false, //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
// -- config end--
ss: null,
get tabContext() {
return document.getElementById("tabContextMenu");
},
get navigatorBundle() {
return Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
},
init: function(){
var css =`
#tabContextUndoList :is(menu,menuitem),
#ContextUndoList :is(menu,menuitem) {
min-height: 20px !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
`;
var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
if (this.TABCONTEXTMENU){
//Tabkontextmenü
var tabContext = this.tabContext;
this.makePopup(tabContext, null, "tabContextUndoList");
}
if (this.CONTEXTMENU){
//Hauptkontextmenü
var contextMenu = document.getElementById("contentAreaContextMenu");
var refItem = document.getElementById("context-media-eme-separator");
this.makePopup(contextMenu, refItem, "ContextUndoList");
}
// Geschlossene Tabs dem NS-Sitzungsspeicher entnehmen
this._ss = SessionStore;
},
makePopup: function(popup, refItem, id){
var menu;
//label
const locale = "de";
// "Liste Kürzlich geschlossener Fenster"
menu = document.createXULElement("menu");
menu.setAttribute("id", "historyUndoWindowMenu3");
menu.setAttribute("label", "K\u00FCrzlich geschlossene Fenster");
menu.setAttribute("accesskey", "F");
menu.setAttribute("disabled", "true");
popup.insertBefore(menu, refItem);
menupopup = document.createXULElement("menupopup");
menu.appendChild(menupopup);
menupopup.setAttribute("id", "historyUndoWindowPopup3");
//menu.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoWindowSubmenu(this);");
menupopup.addEventListener("popupshowing", (event) => UndoListInTabmenu.populateUndoWindowSubmenu(event.currentTarget));
//Liste kürzlich geschosener Tabs
const LABELTEXT = "K\u00FCrzlich geschlossene Tabs"; //create menu
menu = document.createXULElement("menu");
menu.setAttribute("label", LABELTEXT);
menu.setAttribute("accesskey", "K");
if (id)
menu.setAttribute("id", id);
//menu.setAttribute("disabled", true);
var menupopup = document.createXULElement("menupopup");
menupopup.addEventListener("popupshowing", () => UndoListInTabmenu.populateUndoSubmenu(menupopup));
//menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
menu.appendChild(menupopup);
popup.insertBefore(menu, refItem);
//Eventlistener hinzufügen
popup.addEventListener('popupshowing',function(event) {
UndoListInTabmenu.toggleRecentlyClosedWindows(document.getElementById("historyUndoWindowMenu3"));
// no restorable tabs, so make sure menu is disabled, and return
if (UndoListInTabmenu._ss.getClosedTabCount(window) == 0) {
menu.setAttribute("disabled", true);
//menu.setAttribute("hidden", true);
return;
}
menu.removeAttribute("disabled");
//menu.setAttribute("hidden", false);
},false);
},
/**
* Auffüllen, wenn das Chronik-Menü geöffnet wird
*/
populateUndoSubmenu: function(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
var utils = RecentlyClosedTabsAndWindowsMenuUtils;
var tabsFragment = utils.getTabsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-tabs"
);
undoPopup.appendChild(tabsFragment);
// populate tab historis for tooltip
// var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
// for (var i = 0; i < undoItems.length; i++) {
// var entries = undoItems[i].state ? undoItems[i].state.entries : undoItems[i].entries;
// var tooltiptext = "";
// for (var j = entries.length - 1; j > -1; j--){
// if (j != entries.length - 1)
// tooltiptext += "\n";
// tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
// }
// undoPopup.childNodes[i + 2/*restore all, sep*/].setAttribute("tooltiptext", tooltiptext);
// }
// "Append Clear undo close tb list"
undoPopup.appendChild(document.createXULElement("menuseparator"));
let m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
m.setAttribute("accesskey", "C");
m.addEventListener("command", () => {
let prefs = Services.prefs;
let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
}, false);
},
toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows(menu) {
// enable/disable the Recently Closed Windows sub menu
// no restorable windows, so disable menu
if (this._ss.getClosedWindowCount() == 0)
menu.setAttribute("disabled", true);
else
menu.removeAttribute("disabled");
},
/**
* Populate when the history menu is opened
*/
populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
let utils = RecentlyClosedTabsAndWindowsMenuUtils;
let windowsFragment = utils.getWindowsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-windows"
);
undoPopup.appendChild(windowsFragment);
undoPopup.firstChild.setAttribute("accesskey", "R");
// "Append Clear undo close window list"
undoPopup.appendChild(document.createXULElement("menuseparator"));
m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der kürzlich geschlossenen Fenster l\u00F6schen");
m.setAttribute("accesskey", "C");
m.addEventListener("command", () => {
for (let i = SessionStore.getClosedWindowCount() -1; i >= 0; i--)
SessionStore.forgetClosedWindow(i);
}, false);
}
};
// Wir sollten die Umleitung nur starten, wenn das Browser-Fenster den Startvorgang abgeschlossen hat.
// Andernfalls sollten wir warten, bis der Startvorgang abgeschlossen ist.
if (gBrowserInit.delayedStartupFinished) {
UndoListInTabmenu.init();
} else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
UndoListInTabmenu.init();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen
FuchsFan Poste doch bitte Diene Version des Appmenüs bitte.
Gibt's denn dafür schon eine Lösung?
Ich habe alle Beiträge dazu gelesen, aber ihr schreibt da ziemlich wild durcheinander.
Hier ist ein altes Script von Dir, das ich umgemodelt habe um die Konsole per Button aufzurufen, mit der strittigen oncommand Zeile:
// Button für Browserwerkzeuge
// browsertoolbox.uc.js von Endor von hier:
// https://www.camp-firefox.de/forum/thema/129954-symbole-zu-kontextmen%C3%BCs-mit-javascript-und-css-hinzuf%C3%BCgen/?postID=1138524#post1138524
//
// 200214: Einbau
// 200215: berechneter Path mit "werkzeuge.png"
(function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
try {
CustomizableUI.createWidget({
id: 'browser-console-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
var buttonicon = "LettersK-1.png"
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var props = {
id: 'browser-console-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Browser Konsole',
tooltiptext: 'Browser-Konsole',
style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
oncommand: '(' + onCommand.toString() + ')()'
};
for (var p in props)
toolbaritem.setAttribute(p, props[p]);
return toolbaritem;
}
});
CustomizableUI.registerToolbarNode(tb);
} catch(e) { };
function onCommand() {
var document = event.target.ownerDocument;
if (!document.getElementById('menu_browserConsole')) {
//let { require } = Cu.import("resource://devtools/shared/loader/Loader.jsm", {});
let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
require("devtools/client/framework/devtools-browser");
};
document.getElementById('menu_browserConsole').click();
};
})();
Alles anzeigen
Poste doch bitte Diene Version des Appmenüs bitte.
Der Punkt "Alle Tabs wieder öffnen" erscheint nicht oben im Menü, sondern unten.
Hier noch einmal "meine" Version.
Danke, kein Problem
Version des Appmenüs
Dieses Appmenu.uc.js mit diesen Korrekturen
Schema F:
Danke!
Hallo Horstmann .
Leider nein.
Mit dem was Speravir hier geschrieben hat, komme ich nicht klar:
Mfg.
Endor
Hallo Horstmann .
Leider nein.Mfg.
Endor
Also, ich hab mal weitergebastelt, und das hier funktioniert bei mir; ob sowas für dein Script anwendbar ist musst du mal testen.
Im Prinzip ist das einfach die unten im Script definierte Funktion namens onCommand() in die erwähnte Formel für addEventListener gepackt.
Übrigens habe ich bei mir onCommand mit Otto ausgetauscht; onCommand zu benutzen scheint mir sehr verwirrend zu sein in dem Zusammenhang, und ist auch in der alten Version nicht nötig als Variable mit dem Namen.
// Button für Browserwerkzeuge
// browsertoolbox.uc.js von Endor von hier:
// https://www.camp-firefox.de/forum/thema/129954-symbole-zu-kontextmen%C3%BCs-mit-javascript-und-css-hinzuf%C3%BCgen/?postID=1138524#post1138524
//
// 200214: Einbau
// 200215: berechneter Path mit "werkzeuge.png"
(function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
try {
CustomizableUI.createWidget({
id: 'browser-console-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
var buttonicon = "LettersK-1.png"
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var props = {
id: 'browser-console-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Browser Konsole',
tooltiptext: 'Browser-Konsole',
style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
//oncommand: '(' + onCommand.toString() + ')()'
};
for (var p in props)
toolbaritem.setAttribute(p, props[p]);
// neu dazu
toolbaritem.addEventListener('click', event => {
if (event.button == 0) {
onCommand()
}
});
// neu dazu Ende
return toolbaritem;
}
});
CustomizableUI.registerToolbarNode(tb);
} catch(e) { };
function onCommand() {
var document = event.target.ownerDocument;
if (!document.getElementById('menu_browserConsole')) {
//let { require } = Cu.import("resource://devtools/shared/loader/Loader.jsm", {});
let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
require("devtools/client/framework/devtools-browser");
};
document.getElementById('menu_browserConsole').click();
};
})();
Alles anzeigen
Nachtrag, für dieses Script brauchts das angehängte Icon im chrome/icons Ordner.
Also, ich hab mal weitergebastelt, und das hier funktioniert bei mir; ob sowas für dein Script anwendbar ist musst du mal testen.
Danke für das Script, agiert fehlerfrei.
Eine Bitte, kannst das Script auch noch für die Browser-Werkzeuge umschreiben, mein jetzt genutztes zeigt Fehler an.
Ich habe schon selbst versucht, aber will mir nicht gelingen.
Edit: Danke, ich habe es doch noch geschafft, und ist auch fehlerfrei.
FuchsFan
Teste mal meines:
// browsertoolbox.uc.js
(function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
try {
CustomizableUI.createWidget({
id: 'browser-toolbox-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_MENUBAR,
onBuild: function(aDocument) {
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var props = {
id: 'browser-toolbox-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Browser-Werkzeuge',
tooltiptext: 'Browser-Werkzeuge',
style: 'list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAdUlEQVQokZVSwRHAIAgLPYfoXs7RCTpG53Avt7APrhaFU8gLMEEJAkEQgFbc7IxkVjt0r6Sp7VIVITumBpKt00FA2ThmjXzkfMMWO8EZFSj8LrUyjsG9b9DaJXq+qAIVxEUxtLHpaXE95dj1NcK2rmbwaGJ4Af0tIg00j/6iAAAAAElFTkSuQmCC)',
};
for (var p in props)
toolbaritem.setAttribute(p, props[p]);
toolbaritem.addEventListener('click', event => {
if (event.button == 0) {
onCommand()
}
});
return toolbaritem;
}
});
} catch(e) { };
function onCommand() {
var document = event.target.ownerDocument;
if (!document.getElementById('menu_browserToolbox')) {
let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
require("devtools/client/framework/devtools-browser");
};
document.getElementById('menu_browserToolbox').click();
};
})();
Alles anzeigen
Dafür hat mir Horstmann doch geholfen.
Nochmals vielen Dank dafür.
Mfg.
Endor
Teste mal meines:
Danke, Endor , werde ich mal probieren, habe meinen Beitrag editiert, doch noch geschafft.
Hallo Horstmann .
Script funktioniert wieder einwandfrei.
Blindes Huhn ==> Korn....
Prima daß es klappt!
Folgendes Skript tut es leider im Nightly auch nicht mehr...
Ich habe mich schon gemäß Sörens Anleitung "Schema F" selbst daran versucht, bekomme es aber nicht gebacken. Kann wer helfen?
Danke schon mal vorab.
// Original-Herkunft:
// ==UserScript==
// @name External-Aplication.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
// @version 20170911.0.0.2 Fix by aborix
// ==/UserScript==
//
var ffjsmenu = {
type: 'menu', //'menu' or 'button'
insertafter: 'menubar-items',
apps: [
{name: 'Ordner Skripte', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte'},
{name: 'separator'},
{name: 'aa VerticalToolbar.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\aa VerticalToolbar.uc.js'},
{name: 'Bottom Toolbar.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\BottomToolbar.uc.js'},
{name: 'RestartFirefox_plus.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\RestartFirefox_plus.uc.js'},
{name: 'space_and_separator_restorer.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\space_and_separator_restorer.uc.js'},
{name: 'Uhr in Statusleiste.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\Uhr in Statusleiste.uc.js'},
{name: 'Versionsanzeige Nightly.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\Versionsanzeige Nightly.uc.js'},
{name: 'separator'},
{name: 'Menü Skripte.uc.js', path: 'C:\\Users\\Ralf\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\3g1tv3o7.NIGHTLY\\chrome\\Skripte\\Menü Skripte.uc.js'},
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'); // das war das Original
var menu = mainmenu.appendChild(document.createXULElement('menu'));
menu.setAttribute('label', 'Skripte'); // Menu = "FF-CSS"
// menu.setAttribute('accesskey', 'f');
menu.setAttribute('id', 'ffjs-menu');
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', 'ffjsmenu.exec(this.path, this.args);');
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', 'ffjsmenu.exec(this.path, this.args);');
item.path = app.path;
item.args = app.args;
return item;
}
};
ffjsmenu.init();
Alles anzeigen
Edit: Das Menü erscheint zwar, aber bei Klick auf einen Eintrag wird das betreffende Skript nicht im Editor geöffnet...
Folgendes Skript tut es leider im Nightly auch nicht mehr...
Das nutze ich:
// ==UserScript==
// @name Thunderbird.uc.js
// @namespace ithinc#mozine.cn
// @description External Applications
// @include main
// @compatibility Firefox 3.5.x
// @author ithinc
// angepasst von @milupo für addEventListener
// @version 20091212.0.0.1 Initial release
// ==/UserScript==
/* :::: External Applications :::: */
var gExternalApplications = {
type: 'button', //'menu' or 'button'
insertafter: 'urlbar-container',
apps: [
{name: 'XP - Spider', path: 'D:\\XP - Spider Solitär\\XP - Spider.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
Du musst dir dann nur ab Zeile 20 deine eigenen Apps wieder eintragen.
Ich nutze das nur für Thunderbird bzw. dem Kartenspiel wie es oben eingetragen ist.
Heißen Dank! Letztendlich reichen mir die Zeilen 116-120. Da habe ich gefunden wo mein Fehler lag. Nu löppt dat wedder - wie man hier so sagt.
Nu löppt dat wedder - wie man hier so sagt.
Letztendlich reichen mir die Zeilen 116-120. Da habe ich gefunden wo mein Fehler lag.
Dachte ich mir schon
Wenn man halt von Java-Script so gar keine Ahnung hat...
Wenn man halt von Java-Script so gar keine Ahnung hat.
Dann sind wir schon zu zweit
Nö, zu dritt.
Denn sonst würde meine Version funktionieren.
Wer mag sich das mal anschauen:
// ==UserScript==
// @name externalApplications.uc.js
// @namespace ithinc#mozine.cn
// @description External Applications
// @include main
// @compatibility Firefox 3.5.x 3.6.x 17.01
// @author ithinc
// @Version Fix by aborix
// @Version 20190108.2.0.0 Frei verschiebbare Schaltflächen von aborix
// @version 20091216.1.0.0 Final release
// @version 20091215.0.0.2 Handle toolbar apps and menu apps separately
// @version 20091212.0.0.1 Initial release
// ==/UserScript==
/* :::: External Applications :::: */
var gExternalApplications = {
toolbar: {
apps: [
{name: 'Photoshop', path: 'C:\\Program Files (x86)\\Adobe\\Adobe Photoshop CS2\\Photoshop.exe'},
{name: 'Wetter', path: 'C:\\Users\\xxx\\Wetter'},
{name: 'Notepad++', path: 'C:\\Program Files\\Notepad++\\notepad++.exe'},
{name: 'Microsoft Outlook', path: 'C:\\Program Files (x86)\\Microsoft Office\\OFFICE14\\Outlook.exe'},
{name: 'Phoenix Hotel', path: 'C:\\Program Files (x86)\\PCS Phoenix\\Phoenix.exe'},
{name: 'Videolan Player', path: 'C:\\Program Files\\VideoLAN\\VLC\\vlc.exe'},
{name: 'Windows Explorer', path: 'C:\\Windows\\explorer.exe'},
{name: 'WinMergeU', path: 'F:\\Adaten\\Downloads\\Freecomander\\WinMerge-2.14.0\\WinMerge-2.16.12-x64-exe\\WinMerge\\WinMergeU.exe'},
{name: 'Filezilla', path: 'F:\\Adaten\\Downloads\\Filezilla\\FileZilla_3.10.3_win64\\FileZilla-3.56.2\\filezilla.exe'},
{name: 'CarotDAV', path: 'F:\\Adaten\\Downloads\\Dropbox\\CarotDAV1.9.9.portable\\CarotDAV\\CarotDAV.exe'},
{name: 'Pickpick', path: 'F:\\Adaten\\Downloads\\picpick\\picpick.exe'},
{name: 'Profilmanager', path: 'F:\\Adaten\\Downloads\\Firefox\\Profile-Manager\\profilemanager.exe'},
{name: 'Profile', path: 'C:\\Users\\xxx\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles'},
{name: 'FreeCommander', path: 'F:\\Adaten\\Downloads\\FreeComander\\FreeCommanderPortable\\FreeCommanderPortable.exe'},
{name: 'TV Browser', path: 'F:\\Adaten\\Downloads\\TVBrowser\\tvbrowser_3.2.1_bin_transportable\\tvbrowser-transportable\\tvbrowser-transportable.exe'},
{name: 'Radio Sure', path: 'F:\\Adaten\\Downloads\\Radio\\RadioSure.exe'},
]
},
// Menü für Firefox Extras - Externe Anwendungen
menu: {
apps: [
{name: 'Notepad', path: 'C:\\WINDOWS\\system32\\notepad.exe'},
{name: 'Rechner', path: 'C:\\WINDOWS\\system32\\calc.exe'},
{name: 'DOS', path: 'C:\\WINDOWS\\system32\\cmd.exe'},
{name: 'separator'},
{name: 'UltraSearch', path: 'F:\\Adaten\\Downloads\\FreeComander\\UltraSearch\\UltraSearch.exe'},
{name: 'CarotDAV', path: 'F:\\Adaten\\Downloads\\Dropbox\\CarotDAV1.9.9.portable\\CarotDAV\\CarotDAV.exe'},
{name: 'Windows Explorer', path: 'c:\\windows\\explorer.exe'},/*x?????*/
{name: 'Internet Explorer', path: 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE', args: ['%u']},
{name: 'Firefox', path: 'F:\\Adaten\\Downloads\\Firefox'},
{name: 'Videos', path: 'F:\\Video'},
{name: 'Videos2', path: 'F:\\Adaten\\Müll'},
],
id: 'ExternalApplicationsMenu',
insertafter: 'menu_openAddons', // 'helpMenu', 'tools-menu' oder 'browserToolsSeparator'
label: 'Externe Anwendungen',
accesskey: 'A'
},
init: function() {
this.handleRelativePath(this.toolbar.apps);
this.handleRelativePath(this.menu.apps);
this.createToolbarbuttons(this.toolbar.apps);
if (this.menu.apps.length > 0) {
var refNode = document.getElementById(this.menu.insertafter);
if (refNode) {
var menu = refNode.parentNode.insertBefore(document.createXULElement('menu'), refNode.nextSibling);
menu.setAttribute('id', this.menu.id);
menu.setAttribute('label', this.menu.label);
menu.setAttribute('accesskey', this.menu.accesskey);
menu.appendChild(this.createMenupopup(this.menu.apps));
}
}
},
handleRelativePath: function(apps) {
for (var i=0; i<apps.length; i++) {
var app = apps[i];
if (app.path) {
app.path = app.path.replace(/\//g, '\\');
var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get('CurProcD', Ci.nsIFile).path;
if (/^(\.)/.test(app.path)) {
app.path = ffdir + '\\' + app.path;
}
else if (/^(\\)/.test(app.path)) {
app.path = ffdir.substr(0,2) + app.path;
}
}
}
},
exec: function(path, args) {
args = 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()) {
Cu.reportError('File Not Found: ' + path);
return;
}
if (!file.isExecutable()) {
file.launch();
}
else {
var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, args, args.length);
}
},
createToolbarbuttons: function(apps) {
for (var i=0; i<apps.length; i++) {
var app = apps[i];
if (app.name != 'separator') {
createButton(app);
}
};
function createButton(app) {
var buttonId = app.name.replace(/ /g, '_').replace(/\+/g, 'Plus') + '-ExtApp-button';
try {
CustomizableUI.createWidget({
id: buttonId,
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var attributes = {
id: buttonId,
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: app.name,
tooltiptext: app.name,
image: 'moz-icon:file:///' + app.path + '?size=16',
//oncommand: 'gExternalApplications.exec(this.path, this.args);',
};
for (var a in attributes) {
toolbaritem.setAttribute(a, attributes[a]);
toolbaritem.addEventListener('click', event => {
if (event.button == 0) {
gExternalApplications.exec(this.path, this.args).click();
}
});
toolbaritem.path = app.path;
toolbaritem.args = app.args;
return toolbaritem;
}
}
});
} catch(e) {};
}
},
createMenupopup: function(apps) {
var menupopup = document.createXULElement('menupopup');
for (var i=0; i<apps.length; i++) {
var app = apps[i];
if (app.name == 'separator') {
menupopup.appendChild(document.createXULElement('menuseparator'));
}
else {
var item = menupopup.appendChild(document.createXULElement('menuitem'));
item.setAttribute('class', 'menuitem-iconic');
item.setAttribute('label', app.name);
item.setAttribute('image', 'moz-icon:file://' + app.path + '?size=16');
item.addEventListener ('command', function (event) {
if (event.button == 0) {
gExternalApplications.exec(this.path, this.args);
}
});
item.path = app.path;
item.args = app.args;
return menupopup;
}
}
};
};
gExternalApplications.init();
Alles anzeigen
Mfg.
Endor