Das wollen die wenigsten, sie wollen ein funktionierendes Skript bzw. CSS Code.
Genau die wollen aber auch sicher ihre bisherige Konfiguration ins neue Skript übernehmen, was bei der Vorgehensweise eben auch erschwert wird.
Das wollen die wenigsten, sie wollen ein funktionierendes Skript bzw. CSS Code.
Genau die wollen aber auch sicher ihre bisherige Konfiguration ins neue Skript übernehmen, was bei der Vorgehensweise eben auch erschwert wird.
ihre bisherige Konfiguration ins neue Skript übernehmen
Darum poste ich auch immer das kompl. Skript. Dann braucht der Nutzer es nur zu kopieren, und in sein Skript wieder einfügen.
Und wenn es ihn wirklich interessiert was geändert wurde, dann fragt er nach und ich sage es ihm.
Ist WinMerge der Quasi-Standard für solche Aufgaben?
Für die "Außerirdischen":
Auf Linux ist das die Anwendung "Meld".
Und wenn man etwas aufwendigere Arbeiten vorhat, nimmt man am besten eh eine komfortable IDE, da ist das alles drin inkl. Versionsmanagment. Bei mir ist das die "NetBeans IDE", läuft auf Win und Linux.
Gibt es ein ChangeLog Deines Skripts?
Ein ChangeLog – Bekanntgabe der Änderung – gibt es ja. Du meinst wohl eher ein Diff bzw. Patch, worin die genaue Historie der Codeänderungen erkennbar ist.
Genau dafür wurden Versionmanagment-Systeme wie z.B. GIT erfunden, und deshalb lade ich meinen Code auf GitLab hoch, da kann man dann jede Änderung leicht verfolgen.
Neues Profil nur mit dem Skript von Seite 1:
Neues Profil, nur das Script von Seite 1, trotzdem nur eine Zeile.
Hattest du es auch in einem neuen Profil getestet, oder hast du sonst noch Scripte/CSS Anpassungen dafür am laufen?
Hattest du es auch in einem neuen Profil getestet
Das hatte ich doch geschrieben, und du jetzt sogar zitiert
Hat das Skript denn vor der Änderung bei dir funktioniert?
Nutzer dieses Skripts, die das Skript nach eigenen Wünschen abwandeln, müssen auch selbst (und in ihrem eigenen Interesse) dafür sorgen, dass da diese Zeilen mit Kommentaren versehen werden.
Mir geht es eher nicht um wirkliche Abwandlungen des Skripts, sondern um die Einstellungen (Anzahl der Tabzeilen, Hintergrundfarben, Schriftart und Textdarstellung, usw.), die das Skript ermöglicht. Wenn ich die jeweils aktualisierte Fassuing des Skripts aus Beitrag #1 nehme, sind diese Einstellungen ja auf die von BrokenHeart eingestellten Standards zurückgesetzt. Correcto?
Grüße Lionsson
Correcto?
Richtig.
Du brauchst doch dann nur aus deinem alten angepassten Skript die Zeilen ab 72 - 172 wieder in das neue aktuelle Skript einfügen.
Die haben ja nichts mit evtl. Funktionsänderungen vom Skript zu tun.
Du musst ja auch keine Kommentare einfügen, es ist nur eine Empfehlung. Was du tust, ist deine Sache. Wenn du bloß Werte änderst und es Kommentare dazu gibt, die angeben, welcher Wert was macht, ist das auch kein Problem. Bei einem Vergleich fällt dann auf, dass die verwendeten Werte von den Standardwerten abweichen.
Das hatte ich doch geschrieben, und du jetzt sogar zitiert
Hat das Skript denn vor der Änderung bei dir funktioniert?
oh, dann habe es falsch aufgefasst.
Das Script hatte vorher funktioniert und mit dem "false" auch.
Danke fürs Testen
von
scrollbox > slot {in
scrollbox[smoothscroll="true"] > slot {Danach wird die eingetellte zweizeilige Tableiste nur noch einzeilig angezeigt,
stellt man es dann auf "false" ist alles wieder ok.
von
scrollbox[smoothscroll="true"] > slot {in
scrollbox[smoothscroll="false"] > slot {wird die eingetellte zweizeilige Tableiste nur noch einzeilig angezeig
Ich verstehe jetzt das Problem nicht mehr. Die zwei Beiträge stellen doch den Sachverhalt vollkommen gegensätzlich dar.
Im 1. Zitat schreibst du, dass das Skript nach der Änderung scrollbox[smoothscroll="true"] vom 16.10. bei dir nicht mehr richtig funktioniert ("nur noch einzeilig").
Im 2. Zitat beschreibst du eine Änderung von 'true' (was der richtige Wert ist) auf 'false' bzw. 'scrollbox' ohne Attribute und sagst auch, dass es jetzt nur noch einzeilig ist.
In deinem 2. Beitrag bestätigst du doch, dass 'smoothscroll' gesetzt werden muss, damit die Anzeige wieder mehrzeilig ist?!
Andere Frage: Welche Windows- und Firefox-Version nutzt du eigentlich?
OT: An Diskussionen zum Skript im Allgemeinen werde ich mich nicht mehr beteiligen. Da ist von meiner Seite schon alles gesagt worden. Ich ziehe mir alle Schuhe an und es gibt ja auch alternative Skripte, die weniger paläontologisch wie dieses hier sind. Wer mit dem "Dinosaurier"-Skript leben kann, für den werde ich noch Fehlerbehebungen durchführen, wer nicht, nutzt eben ein anderes Skript. Jeder wie er will...
@BrokenHeart
du hast recht, hatte mich im zweiten Beitrag verschrieben, habe es eben editiert.
Ich nutze Windows 10 Version 22H2 19045.5011 mit Firefox 131.0.3.
Die Lösung in meinem Fall, nach dem Update des Scriptes vom 16.10.2024, war die scrollbox auf false zu setzen.
Oder den alten Eintrag "scrollbox > slot {" so zu belassen.
Deshalb auch meine Frage im ersten Beitrag, ob das jemand bestätigen kann.
so zu belassen.
Das Skript funktioniert damit auch noch, aber man kann z.B. in den Lesezeichenordnern dann nicht mehr scrollen wenn sie länger sind.
Und damit das wieder geht wurde der Eintrag erweitert.
Das Skript funktioniert damit auch noch, aber man kann z.B. in den Lesezeichenordnern dann nicht mehr scrollen wenn sie länger sind.
Und damit das wieder geht wurde der Eintrag erweitert.
ah, verstehe, Danke für die Info.
Correcto?
Du brauchst doch dann nur aus deinem alten angepassten Skript die Zeilen ab 72 - 172 wieder in das neue aktuelle Skript einfügen.
Die haben ja nichts mit evtl. Funktionsänderungen vom Skript zu tun.
Jau: "User-Settings: Start" und "User-Settings: Ende". So steht es dort. Eigentlich auch leicht zu verstehen. Wenn man es nicht überliest. Vielen Dank an 2002Andreas für den Hinweis und immer wieder an BrokenHeart für das tolle Skript mit seinen fast noch tolleren Erläuterungen.
GL
Die Lösung in meinem Fall, nach dem Update des Scriptes vom 16.10.2024, war die scrollbox auf false zu setzen.
Oder den alten Eintrag "scrollbox > slot {" so zu belassen.
Deshalb auch meine Frage im ersten Beitrag, ob das jemand bestätigen kann.
Was du evtl. mal probieren könntest, ist statt scrollbox[smoothscroll="true"] > slot {... ein anderes Attribut zu benutzen, zB scrollbox[orient="horizontal"] > slot {..., an der entsprechenden Stelle im Skript.
Damit scheinen alle anderen zu arbeiten, wie Aris und Otherguy, Links zu mehr Infos hier.
Was du evtl. mal probieren könntest, ist statt scrollbox[smoothscroll="true"] > slot {... ein anderes Attribut zu benutzen, zB scrollbox[orient="horizontal"] > slot {..., an der entsprechenden Stelle im Skript.
funktioniert auch, Danke.
Neues Update (16.10.2024):
CSSvar bMarkUnreadTab = false; // [true] Kursive Schrift für ungelesene Tabs, [false] ungelesene Tabs werden nicht hervorgehoben [..........] /*Ungelesene Tabs werden markiert */ .tabbrowser-tab[pending] .tab-label, .tabbrowser-tab[notselectedsinceload="true"] { font-style: __strMarkUnreadTab__ !important; }
Hallo BrokenHeart ,
Mit obigem Code-Schnipsel (ab Zeile 486) werden ja ungelesene Tabs kursiv markiert.
Wenn ich nun auf einer aktiven Seite mit Rechts-Klick per "In neuem Tab öffnen" auf einen Link einen weiteren Tab aufrufe, erhält auch dieser die kursive Markierung. Dies bleibt auch so, wenn ich dann auf diesen Tab gehe.
Wie müsste obiger Code angepasst werden, damit auch dieser Tab mit normaler Schrift angezeigt wird, spätestens nachdem man draufgeht?
Ich würde das gerne in meinem Skript so verbessern.
Herzmann :
Das von dir beschriebene Verhalten kann ich nicht nachvollziehen. Es ist doch im Original genau umgekehrt. Ein noch nicht gelesener Tab wird als 'noch nicht gelesen' kursiv markiert und bei Selektion mit normaler Schrift dargestellt. Dieses Verhalten zeigt er allerdings nur bei Tabs nach dem 'Browserstart'. Neue Tabs werden immer mit normaler Schrift dargestellt, egal ob sie im Vordergrund oder im Hintergrund geöffnet werden. Dies ist zwar nicht das korrekte Verhalten, aber noch mehr Komplexität, in dem eh schon riesigen Skript ist von meiner Seite nicht gewünscht..
Du darfst natürlich nicht diesen herausgegriffenen CSS-Code-Schnipsel getrennt von den übrigen CSS-Einstellungen im Skript verwenden. Das funktioniert natürlich nicht (hatten wir hier etwas weiter oben im Thread ja schon)...
Ich hatte eine Zeit lang ein Extra-Skript zur Markierung von gelesenen/ungelesenen-Tabs genutzt, dann aber irgendwann wieder entfernt, da ich es persönlich nicht sehr nützlich fand. 2002Andreas hatte mir vor ein paar Tagen dankenswerter Weise ein Skript zukommen lassen, welches er teilweise angepasst hat (CSS-Code) und wohl eine neuere Version des von mir genutzten, alten Skripts darstellt. Ich habe es noch nicht ausprobiert und du kannst es ja mal damit testen und bei Gefallen in dein neues Skript einbauen (ich denke, er hat nichts dagegen, wenn ich es hier mal poste):
//https://github.com/aminomancer/uc.css.js/blob/master/JS/unreadTabMods.uc.js
// ==UserScript==
// @name Unread Tab Mods
// @version 1.2.5
// @author aminomancer
// @homepageURL https://github.com/aminomancer/uc.css.js
// @long-description
// @description
/*
Modifies some javascript methods so that unread tabs can be styled in CSS, and (optionally) adds new items to the tab context menu so you can manually mark tabs as read or unread.
Normally when you open a new tab without it being selected, it gains the attribute `notselectedsinceload` which could be used to style it. But this attribute doesn't go away when you select the tab, so it doesn't actually mean "unread." It doesn't go away until you navigate to a new page in the tab. But we can change this so it will go away immediately as soon as you click it or otherwise select it.
Also, normally the attribute isn't added until web progress has finished, so unread tab styling won't be applied until after it's finished loading a bit. This doesn't look as good so we're also changing it to add the attribute as soon as the tab is created.
So now all you need to do to style unread tabs is add something like this to your userchrome.css file:
```css
.tabbrowser-tab[notselectedsinceload]:not([pending]),
.tabbrowser-tab[notselectedsinceload][pending][busy] {
font-style: italic !important;
}
```
If you use [duskFox][] (the theme on my repo) you will already have this CSS so there's no need to add it.
[duskFox]: https://github.com/aminomancer/uc.css.js
*/
// @downloadURL https://cdn.jsdelivr.net/gh/aminomancer/uc.css.js@master/JS/unreadTabMods.uc.js
// @updateURL https://cdn.jsdelivr.net/gh/aminomancer/uc.css.js@master/JS/unreadTabMods.uc.js
// @license This Source Code Form is subject to the terms of the Creative Commons Attribution-NonCommercial-ShareAlike International License, v. 4.0. If a copy of the CC BY-NC-SA 4.0 was not distributed with this file, You can obtain one at http://creativecommons.org/licenses/by-nc-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
// ==/UserScript==
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml')
return;
var css =`
/*Ungelesener Tab HG*/
.tabbrowser-tab[notselectedsinceload] stack.tab-stack vbox.tab-background:not([pending]),
.tabbrowser-tab[notselectedsinceload][pending][busy] {
background: red !important;
}
/*Ungelesener Tab Schrift*/
.tabbrowser-tab[notselectedsinceload]:not([pending]),
.tabbrowser-tab[notselectedsinceload][pending][busy] {
font-style: italic !important;
color: white !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);
function modulateAttr(tab, on = false) {
tab._notselectedsinceload = on;
on
? tab.setAttribute("notselectedsinceload", on)
: tab.removeAttribute("notselectedsinceload");
gBrowser._tabAttrModified(tab, ["notselectedsinceload"]);
}
class UnreadTabsBase {
// user preferences and localization. change the strings to match your
// lanugage. write #1 where the number of tabs should go in the sentence.
static config = {
// if set to true, add "Mark Tab as Read" and "Mark Tab as Unread"
// to the tab context menu when appropriate.
"Add Context Menu Items": true,
// the "Mark Tab as Read" context menu label when only one tab is invoked.
"Mark Tab as Read Label": "Mark Tab as Read",
// the "Mark Tab as Unread" context menu label when only one tab is invoked.
"Mark Tab as Unread Label": "Mark Tab as Unread",
// when tabs are multiselected and the tab you right-clicked is one of the
// selected tabs, the context menu will mark multiple tabs instead of just
// one. make sure it still has "#1", that gets replaced dynamically with
// the number of tabs that will be marked. so if you're gonna change the
// label for your language, be sure to put #1 where the number should go.
// for example 見られるようにマーク#1タブ or Marquer #1 onglets comme lu.
"Mark Multiple Tabs as Read Label": "Mark #1 Tabs as Read",
// just like the one above but for marking tabs as unread.
"Mark Multiple Tabs as Unread Label": "Mark #1 Tabs as Unread",
};
constructor() {
if (
gBrowser.tabContainer._handleTabSelect.name !== "uc_handleTabSelect"
) {
eval(
`gBrowser.tabContainer._handleTabSelect = function ${gBrowser.tabContainer._handleTabSelect
.toSource()
.replace(/^\(/, "")
.replace(/\)$/, "")
.replace(/^_handleTabSelect\s*/, "")
.replace(/^function\s*/, "")
.replace(/^(.)/, `uc_handleTabSelect $1`)
.replace(
/selectedTab\._notselectedsinceload = false;/,
"modulateAttr(selectedTab);"
)}`
);
}
if (gBrowser.tabContainer._handleNewTab.name !== "uc_handleNewTab") {
eval(
`gBrowser.tabContainer._handleNewTab = function ${gBrowser.tabContainer._handleNewTab
.toSource()
.replace(/^\(/, "")
.replace(/\)$/, "")
.replace(/^_handleNewTab\s*/, "")
.replace(/^function\s*/, "")
.replace(/^(.)/, `uc_handleNewTab $1`)
.replace(
/\n(\s*)(this\._notifyBackgroundTab\(tab\);)/,
"\n$1modulateAttr(tab, true);\n$1$2"
)}`
);
}
if (UnreadTabsBase.config["Add Context Menu Items"]) {
this.makeMenuItems(this.tabContext);
}
}
get tabContext() {
return (
this._tabContext ||
(this._tabContext = document.getElementById("tabContextMenu"))
);
}
handleEvent(e) {
let tab = TabContextMenu.contextTab;
let tabs = tab.multiselected ? gBrowser.selectedTabs : [tab];
let unreadTabs = this.unreadTabs(tabs);
let readTabs = this.readTabs(tabs);
if (unreadTabs.length) this.markAsReadMenuitem.hidden = false;
else this.markAsReadMenuitem.hidden = true;
if (readTabs.length) this.markAsUnreadMenuitem.hidden = false;
else this.markAsUnreadMenuitem.hidden = true;
this.markAsReadMenuitem.setAttribute(
"label",
unreadTabs.length > 1
? UnreadTabsBase.config["Mark Multiple Tabs as Read Label"].replace(
"#1",
unreadTabs.length.toLocaleString()
)
: UnreadTabsBase.config["Mark Tab as Read Label"]
);
this.markAsUnreadMenuitem.setAttribute(
"label",
readTabs.length > 1
? UnreadTabsBase.config["Mark Multiple Tabs as Unread Label"].replace(
"#1",
readTabs.length.toLocaleString()
)
: UnreadTabsBase.config["Mark Tab as Unread Label"]
);
}
unreadTabs(tabs) {
return tabs.filter(aTab => {
return !(
aTab.getAttribute("pending") ||
!aTab.getAttribute("notselectedsinceload") ||
aTab.selected
);
});
}
readTabs(tabs) {
return tabs.filter(aTab => {
return !(
aTab.getAttribute("pending") ||
aTab.getAttribute("notselectedsinceload") ||
aTab.selected
);
});
}
_onCommand(mode = false) {
let tab = TabContextMenu.contextTab;
if (tab.multiselected) {
gBrowser.selectedTabs.forEach(aTab => {
if (aTab.getAttribute("pending") || aTab.selected) return;
modulateAttr(aTab, mode);
});
} else {
if (tab.getAttribute("pending") || tab.selected) return;
modulateAttr(tab, mode);
}
}
makeMenuItems(context) {
this.markAsReadMenuitem = document.createXULElement("menuitem");
this.markAsReadMenuitem.setAttribute(
"label",
UnreadTabsBase.config["Mark Tab as Read Label"]
);
this.markAsReadMenuitem.setAttribute("id", "context-markAsRead");
this.markAsReadMenuitem.setAttribute(
"oncommand",
`unreadTabMods._onCommand()`
);
context
.querySelector("#context_duplicateTabs")
.after(this.markAsReadMenuitem);
this.markAsUnreadMenuitem = document.createXULElement("menuitem");
this.markAsUnreadMenuitem.setAttribute(
"label",
UnreadTabsBase.config["Mark Tab as Unread Label"]
);
this.markAsUnreadMenuitem.setAttribute("id", "context-markAsUnread");
this.markAsUnreadMenuitem.setAttribute(
"oncommand",
`unreadTabMods._onCommand(true)`
);
this.markAsReadMenuitem.after(this.markAsUnreadMenuitem);
context.addEventListener("popupshowing", this);
}
}
function init() {
window.unreadTabMods = new UnreadTabsBase();
}
document.documentElement.setAttribute("italic-unread-tabs", true);
if (gBrowserInit.delayedStartupFinished) {
init();
} else {
let delayedListener = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" && subject == window) {
Services.obs.removeObserver(delayedListener, topic);
init();
}
};
Services.obs.addObserver(
delayedListener,
"browser-delayed-startup-finished"
);
}
})();
Alles anzeigen
Hallo!
Kann es sein das das Script unter Firefox 131.0.3 (64-Bit) nicht mehr funktioniert oder bin ich einfach zu blöd ? Ich hatte vorher eine sehr viel ältere FF Version am laufen, hier ging alles einwandfrei!
Zum testen habe ich auch extra noch Firefox (auch 131.0.3 ) in einer Virtualbox mit Windows 10 neu installiert und das Script auch dort in den chrome Ordner im Profil kopiert, leider ohne Erfolg
Hat villeicht jemand einen Tipp, oder übersehe ich etwas ?
vielen Dank!
theghostofelvis
das Script auch dort in den chrome Ordner im Profil kopiert
Hast du denn die Vorbereitungen gemacht, um Skripte überhaupt nutzen zu können?
Das Skript funktioniert ansonsten einwandfrei in der aktuellen Fx Version 131.0.3