Hallo Rob,
zum Sammelskript: Ersetze in Zeile 31 browser.xul durch browser.xhtml.
Starte Firefox neu. Schaue dann in das Anpassen-Fenster, ob sich die Symbole dort befinden.
Hallo Rob,
zum Sammelskript: Ersetze in Zeile 31 browser.xul durch browser.xhtml.
Starte Firefox neu. Schaue dann in das Anpassen-Fenster, ob sich die Symbole dort befinden.
Ich nutze das Mehrzeilenscript für Firefox, zu dem ich mir schon eine Hilfestellung holte um die überweite zu beschränken.
Welches Skript? Bitte Code einstellen.
Hallo zusammen.
So habe eben das ganze Script aktualisiert.
Nun sollte alles wieder funktionieren in Firefox 69.
https://github.com/Endor8/userChr…oxbuttons.uc.js
Mfg.
Endor
Danke Endor.
Da hat sich ja meine Experimentiererei wohl erledigt. Ich habe das Skript in der Fassung von Rob auch zum Laufen gebracht, das Einzige was wirklich nicht mehr funktioniert, ist der Aufruf des Cookie-Fensters, denn die Datei cookies.xul gibt es nicht mehr. Das sollte eigentlich auch im neuen Skript so sein (Zeile 154 - 174). Überprüfe das bitte nochmal.
Ansonsten ist deine neue Fassung umfangreicher.
Es funktioniert alles im neuen Sammelskript, außer wie gesagt, das Teilskript Cookies anzeigen in den Zeilen 154 bis 174. Aber die Cookies werden ja auch mit dem Teilskript Cookies und Websitedaten verwalten ebenfalls angezeigt.
Hallo milupo.
Danke für das Testen.
Ja Cookies anzeigen geht leider nicht mehr.
Da warte ich immer noch auf ein Update von eigentlichen Autor.
Obige Version ist ja vom 12.06.2019.
Mal sehen ob und wann er das macht.
Mfg.
Endor
Ich danke euch beiden erst einmal! Da ich das Cookie Quick Manager Addon nutze ist mir dieser Button nicht so wichtig, da er quasi ersetzt ist.
Hatte leider tatsächlich vergessen das Multirow Skript anzuhängen, obwohl ich es noch in der Zwischenablage hatte.
// ==UserScript==
// @name zzzz-MultiRowTab_LiteforFx48.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Experimentelle CSS Version für Mehrzeilige Tableiste
// @include main
// @compatibility Firefox 67
// @author Alice0775
// @version 2016/08/05 00:00 Firefox 48
// @version 2016/05/01 00:01 hide favicon if busy
// @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
// @version 2016/02/09 00:01 workaround css for lwt
// @version 2016/02/09 00:00
// ==/UserScript==
"user strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
var css =`
/* Windows 10 und Firefox Standardtheme, Fensterausenlinie in weiß.
Anpassung für Titelleistenschaltflächen wenn sie in den Hintergrund verschoben sind
#main-window:not([lwtheme="true"]) #window-controls toolbarbutton,
#main-window:not([lwtheme="true"]) .titlebar-buttonbox .titlebar-button {
color: rgb(24, 25, 26) !important;
}
#main-window:not([lwtheme="true"]) #window-controls toolbarbutton:not([id="close-button"]):hover,
#main-window:not([lwtheme="true"]) .titlebar-buttonbox .titlebar-button:not([class="titlebar-button titlebar-close"]):hover {
background-color: var(--lwt-toolbarbutton-hover-background, hsla(0,0%,70%,.4)) !important;
} */
/* Tableiste unter Adressleiste verschieben
#titlebar { -moz-box-ordinal-group: 2; -moz-appearance: none !important; } */
/* Symbolleisten - Reihenfolge ändern
#navigator-toolbox:not([style^="margin-top:"])[style=""] #window-controls,
[tabsintitlebar="true"] .titlebar-buttonbox-container { position: fixed; right:0; }
[tabsintitlebar="true"][sizemode="normal"] .titlebar-buttonbox-container { top: 1px; }
[tabsintitlebar="true"][sizemode="maximized"] .titlebar-buttonbox-container { top: 8px; }
#navigator-toolbox:not([style^="margin-top:"])[style=""] #window-controls { top: 0; }
[tabsintitlebar="true"][sizemode="maximized"] #navigator-toolbox { padding-top: 8px !important; } */
/* auf der rechten Seite Platz für die Schaltflächen der Titelleiste einfügen, damit die
Schaltflächen der Titelleiste und der Navigationsleiste nicht verdeckt werden */
[tabsintitlebar="true"]:not([sizemode="fullscreen"]) #TabsToolbar { padding-right: 129px !important; }
[sizemode="fullscreen"] #TabsToolbar { padding-right: 109px !important; }
tabs tab[fadein]:not([pinned]) {
flex-grow: 1 !important;
min-width: 110px !important;/* Minimale Tabbreite 76px */
max-width: 190px !important;/* Maximale Tabbreite 225px */
}
/* Mehrzeilige Tableiste */
tabs>arrowscrollbox{display:block;}
tabs arrowscrollbox>scrollbox {
display:flex;flex-wrap:wrap;
max-height: calc(var(--tab-min-height) * 5); /* Anzahl der Tabzeilen */
overflow-x:hidden;overflow-y:auto;
}
[tabsintitlebar="true"] tabs scrollbar{-moz-window-dragging:no-drag;}
/* Bei Überschreitung der angegebenen Zeilenanzahl, mit der Maus,
über die dann eingeblendetet Scrolleiste zu Zeile wechseln */
tabs tab[fadein]:not([pinned]){flex-grow:1;}
tabs tab,.tab-background {
height: var(--tab-min-height);
overflow: hidden;
z-index: 1 !important;
}
tab>.tab-stack{width:100%;}
[sizemode="fullscreen"] #TabsToolbar>#window-controls,
.titlebar-buttonbox-container>.titlebar-buttonbox{display:block;}
/* Drag-Bereich auf der linken und rechten Seite der
Tab-Leiste auslenden - verstecken
Links und rechts → hbox.titlebar-spacer
links → hbox.titlebar-spacer[type="pre-tabs"]
rechts → hbox.titlebar-spacer[type="post-tabs"] */
hbox.titlebar-spacer,
/* Ausblenden - Verstecken */
#alltabs-button,tabs [class^="scrollbutton"],tabs spacer,[autohide="true"][inactive="true"] .titlebar-buttonbox { display: none; }
`;
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.AGENT_SHEET);
var style = ' \
tabs tab:not(stack) { \
border-left: solid 1px hsla(0,0%,50%,.5) !important; \
border-right: solid 1px hsla(0,0%,50%,.5) !important; \
} \
tabs tab:after,tabs tab:before{display:none!important;} \
';
var sspi = document.createProcessingInstruction('xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"');
document.insertBefore(sspi, document.documentElement);
gBrowser.tabContainer._animateTabMove = function(event){}
gBrowser.tabContainer._finishAnimateTabMove = function(event){}
gBrowser.tabContainer.lastVisibleTab = function() {
var tabs = this.children;
for (let i = tabs.length - 1; i >= 0; i--){
if (!tabs[i].hasAttribute("hidden"))
return i;
}
return -1;
};
gBrowser.tabContainer.clearDropIndicator = function() {
var tabs = this.children;
for (let i = 0, len = tabs.length; i < len; i++){
let tab_s= tabs[i].style;
tab_s.removeProperty("border-left-color");
tab_s.removeProperty("border-right-color");
}
};
gBrowser.tabContainer.addEventListener("dragleave",gBrowser.tabContainer.clearDropIndicator, false);
gBrowser.tabContainer._onDragOver = function(event) {
event.preventDefault();
event.stopPropagation();
this.clearDropIndicator();
var newIndex = this._getDropIndex(event);
if (newIndex == null)
return;
if (newIndex < this.children.length) {
this.children[newIndex].style.setProperty("border-left-color","red","important");
} else {
newIndex = gBrowser.tabContainer.lastVisibleTab();
if (newIndex >= 0)
this.children[newIndex].style.setProperty("border-right-color","red","important");
}
};
gBrowser.tabContainer.addEventListener("dragover", gBrowser.tabContainer._onDragOver, false);
gBrowser.tabContainer._getDropIndex = function(event, isLink) {
var tabs = this.children;
var tab = this._getDragTargetTab(event, isLink);
if (!RTL_UI) {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++)
if (event.screenX < tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
&& event.screenY < tabs[i].screenY + tabs[i].getBoundingClientRect().height) // multirow fix
return i;
} else {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++)
if (event.screenX > tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
&& event.screenY > tabs[i].screenY + tabs[i].getBoundingClientRect().height) // multirow fix
return i;
}
return tabs.length;
}
gBrowser.tabContainer.onDrop = function(event) {
this.clearDropIndicator();
var dt = event.dataTransfer;
var draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (!draggedTab)
return;
}
this._tabDropIndicator.collapsed = true;
event.stopPropagation();
if (draggedTab && draggedTab.parentNode == this) {
let newIndex = this._getDropIndex(event, false);
if (newIndex > draggedTab._tPos)
newIndex--;
gBrowser.moveTabTo(draggedTab, newIndex);
}
};
gBrowser.tabContainer.addEventListener("drop",gBrowser.tabContainer.onDrop, false);
}
Alles anzeigen
Danke noch einmal.
Noch eine andere Frage: Addons werden ja erst verzögert geladen im neuen Firefox, besteht die Möglichkeit:
a) die Verzögerung abzuschalten oder
b) Seiten (inklusive Startseiten) erst nach dem Laden der Addons zu laden?
Hallo Rob.
Ich gehe mal davon aus dass Du Firefox 69 verwendest,
Teste diese aktuelle Version von Multirow Skript:
// ==UserScript==
// @name zzzz-MultiRowTab_LiteforFx48.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Experimentelle CSS Version für Mehrzeilige Tableiste
// @include main
// @compatibility Firefox 69
// @author Alice0775
// @version 2016/08/05 00:00 Firefox 48
// @version 2016/05/01 00:01 hide favicon if busy
// @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
// @version 2016/02/09 00:01 workaround css for lwt
// @version 2016/02/09 00:00
// ==/UserScript==
"use strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
/* Symbolleisten und Menüleiste von der Titelleiste in die Navigator-Toolbox verschieben */
document.getElementById("navigator-toolbox").appendChild(document.getElementById("toolbar-menubar"));
var css =` @-moz-document url-prefix("chrome://browser/content/browser.xhtml") {
/* Symbolleiste Sortieren */
#toolbar-menubar { -moz-box-ordinal-group: 1 !important; }
#nav-bar { -moz-box-ordinal-group: 2 !important; }
#PersonalToolbar { -moz-box-ordinal-group: 3 !important; }
#titlebar { -moz-box-ordinal-group: 4 !important; }
/* Windows 10 und Firefox Standardtheme, Fensterausenlinie in weiß.
Anpassung für Titelleistenschaltflächen wenn sie in den Hintergrund verschoben sind */
#main-window:not([lwtheme="true"]) #window-controls toolbarbutton,
#main-window:not([lwtheme="true"]) .titlebar-buttonbox .titlebar-button {
color: rgb(24, 25, 26) !important; }
#main-window:not([lwtheme="true"]) #window-controls toolbarbutton:not([id="close-button"]):hover,
#main-window:not([lwtheme="true"]) .titlebar-buttonbox .titlebar-button:not([class="titlebar-button titlebar-close"]):hover {
background-color: var(--lwt-toolbarbutton-hover-background, hsla(0,0%,70%,.4)) !important; }
/* Tableiste unter Adressleiste verschieben */
#nav-bar { z-index: 2 !important; }
[tabsintitlebar="true"][sizemode="maximized"] #navigator-toolbox { padding-top: 8px !important; }
[tabsintitlebar="true"][sizemode="maximized"] #titlebar { -moz-appearance: none !important; }
[tabsintitlebar="true"] #toolbar-menubar { height: 32px; }
/* Anpassung für Titelleistenschaltflächen */
#navigator-toolbox:not([style^="margin-top:"])[style=""] #window-controls,
[tabsintitlebar="true"] .titlebar-buttonbox-container { position: fixed; z-index: 3 !important; right:0; }
[tabsintitlebar="true"][sizemode="normal"] .titlebar-buttonbox-container { top: 1px; }
[tabsintitlebar="true"][sizemode="maximized"] .titlebar-buttonbox-container { top: 8px; }
#navigator-toolbox:not([style^="margin-top:"])[style=""] #window-controls { top: 0; }
/* auf der rechten Seite Platz für die Schaltflächen der Titelleiste einfügen, damit die
Schaltflächen der Titelleiste und der Navigationsleiste nicht verdeckt werden */
[tabsintitlebar="true"]:not([sizemode="fullscreen"]) #nav-bar { padding-right: 139px !important; }
[sizemode="fullscreen"] #nav-bar { padding-right: 109px !important; }
/* Mehrzeilige Tableiste */
tabs>arrowscrollbox{display:block;}
tabs arrowscrollbox>scrollbox {
display:flex;display:-webkit-box;flex-wrap:wrap;
max-height: calc(var(--tab-min-height) * 5); /* Anzahl der Tabzeilen */
overflow-x:hidden;overflow-y:auto; }
[tabsintitlebar="true"] tabs scrollbar{-moz-window-dragging:no-drag;}
/* Bei Überschreitung der angegebenen Zeilenanzahl, mit der Maus,
über die dann eingeblendetet Scrolleiste zu Zeile wechseln
tabs tab[fadein]:not([pinned]){flex-grow:1;}
tabs tab,.tab-background {
height: var(--tab-min-height);
overflow: hidden;
z-index: 1 !important; }
tab>.tab-stack{width:100%;}
/* Drag-Bereich auf der linken und rechten Seite der
Tab-Leiste auslenden - verstecken
Links und rechts → hbox.titlebar-spacer
links → hbox.titlebar-spacer[type="pre-tabs"]
rechts → hbox.titlebar-spacer[type="post-tabs"] */
hbox.titlebar-spacer
/* Ausblenden - Verstecken */
,#alltabs-button,tabs [class^="scrollbutton"],tabs spacer,#toolbar-menubar .titlebar-buttonbox { display: none; }
} `;
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.AGENT_SHEET);
var style = ' \
tabs tab:not(stack) { \
border-left: solid 1px hsla(0,0%,50%,.5) !important; \
border-right: solid 1px hsla(0,0%,50%,.5) !important; \
} \
tabs tab:after,tabs tab:before{display:none!important;} \
';
var sspi = document.createProcessingInstruction('xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"');
document.insertBefore(sspi, document.documentElement);
gBrowser.tabContainer.lastVisibleTab = function() {
var tabs = this.allTabs;
for (let i = tabs.length - 1; i >= 0; i--) {
if (!tabs[i].hasAttribute("hidden")) {
return i;
}
}
return -1;
}
gBrowser.tabContainer.clearDropIndicator = function() {
var tabs = this.allTabs;
for (let i = 0, len = tabs.length; i < len; i++) {
let tab_s= tabs[i].style;
tab_s.removeProperty("border-left-color");
tab_s.removeProperty("border-right-color");
}
}
gBrowser.tabContainer.addEventListener("dragleave", gBrowser.tabContainer.clearDropIndicator, true);
gBrowser.tabContainer.on_dragover = function(event) {
var effects = this._getDropEffectForTabDrag(event);
var ind = this._tabDropIndicator;
if (effects == "" || effects == "none") {
ind.hidden = true;
return;
}
event.preventDefault();
event.stopPropagation();
var arrowScrollbox = this.arrowScrollbox;
// autoscroll the tab strip if we drag over the scroll
// buttons, even if we aren't dragging a tab, but then
// return to avoid drawing the drop indicator
var pixelsToScroll = 0;
if (this.getAttribute("overflow") == "true") {
var targetAnonid = event.originalTarget.getAttribute("anonid");
switch (targetAnonid) {
case "scrollbutton-up":
pixelsToScroll = arrowScrollbox.scrollIncrement * -1;
break;
case "scrollbutton-down":
pixelsToScroll = arrowScrollbox.scrollIncrement;
break;
}
if (pixelsToScroll) {
arrowScrollbox.scrollByPixels(
(RTL_UI ? -1 : 1) * pixelsToScroll,
true
);
}
}
/*
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container
) {
ind.hidden = true;
if (!this._isGroupTabsAnimationOver()) {
// Wait for grouping tabs animation to finish
return;
}
this._finishGroupSelectedTabs(draggedTab);
if (effects == "move") {
this._animateTabMove(event);
return;
}
}
this._finishAnimateTabMove();
*/
if (effects == "link") {
let tab = this._getDragTargetTab(event, true);
if (tab) {
if (!this._dragTime) {
this._dragTime = Date.now();
}
if (Date.now() >= this._dragTime + this._dragOverDelay) {
this.selectedItem = tab;
}
ind.hidden = true;
return;
}
}
var rect = arrowScrollbox.getBoundingClientRect();
var newMargin;
if (pixelsToScroll) {
// if we are scrolling, put the drop indicator at the edge
// so that it doesn't jump while scrolling
let scrollRect = arrowScrollbox.scrollClientRect;
let minMargin = scrollRect.left - rect.left;
let maxMargin = Math.min(
minMargin + scrollRect.width,
scrollRect.right
);
if (RTL_UI) {
[minMargin, maxMargin] = [
this.clientWidth - maxMargin,
this.clientWidth - minMargin,
];
}
newMargin = pixelsToScroll > 0 ? maxMargin : minMargin;
} else {
let newIndex = this._getDropIndex(event, effects == "link");
let children = this.allTabs;
if (newIndex == children.length) {
let tabRect = children[newIndex - 1].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.left;
} else {
newMargin = tabRect.right - rect.left;
}
} else {
let tabRect = children[newIndex].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.right;
} else {
newMargin = tabRect.left - rect.left;
}
}
this.clearDropIndicator();
if (newIndex < children.length) {
children[newIndex].style.setProperty("border-left-color","red","important");
} else {
newIndex = gBrowser.tabContainer.lastVisibleTab();
if (newIndex >= 0)
children[newIndex].style.setProperty("border-right-color","red","important");
}
}
ind.hidden = false;
newMargin += ind.clientWidth / 2;
if (RTL_UI) {
newMargin *= -1;
}
ind.style.transform = "translate(" + Math.round(newMargin) + "px)";
ind.style.marginInlineStart = -ind.clientWidth + "px";
}
gBrowser.tabContainer.on_drop = function(event) {
this.clearDropIndicator();
var dt = event.dataTransfer;
var dropEffect = dt.dropEffect;
var draggedTab;
let movingTabs;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
// tab copy or move
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
// not our drop then
if (!draggedTab) {
return;
}
movingTabs = draggedTab._dragData.movingTabs;
draggedTab.container._finishGroupSelectedTabs(draggedTab);
}
this._tabDropIndicator.hidden = true;
event.stopPropagation();
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event, false);
let draggedTabCopy;
for (let tab of movingTabs) {
let newTab = gBrowser.duplicateTab(tab);
gBrowser.moveTabTo(newTab, newIndex++);
if (tab == draggedTab) {
draggedTabCopy = newTab;
}
}
if (draggedTab.container != this || event.shiftKey) {
this.selectedItem = draggedTabCopy;
}
} else if (draggedTab && draggedTab.container == this) {
let oldTranslateX = Math.round(draggedTab._dragData.translateX);
let tabWidth = Math.round(draggedTab._dragData.tabWidth);
let translateOffset = oldTranslateX % tabWidth;
let newTranslateX = oldTranslateX - translateOffset;
if (oldTranslateX > 0 && translateOffset > tabWidth / 2) {
newTranslateX += tabWidth;
} else if (oldTranslateX < 0 && -translateOffset > tabWidth / 2) {
newTranslateX -= tabWidth;
}
let dropIndex =
"animDropIndex" in draggedTab._dragData &&
draggedTab._dragData.animDropIndex;
let incrementDropIndex = true;
if (dropIndex && dropIndex > movingTabs[0]._tPos) {
dropIndex--;
incrementDropIndex = false;
}
let animate = gBrowser.animationsEnabled;
if (oldTranslateX && oldTranslateX != newTranslateX && animate) {
for (let tab of movingTabs) {
tab.setAttribute("tabdrop-samewindow", "true");
tab.style.transform = "translateX(" + newTranslateX + "px)";
let onTransitionEnd = transitionendEvent => {
if (
transitionendEvent.propertyName != "transform" ||
transitionendEvent.originalTarget != tab
) {
return;
}
tab.removeEventListener("transitionend", onTransitionEnd);
tab.removeAttribute("tabdrop-samewindow");
this._finishAnimateTabMove();
if (dropIndex !== false) {
gBrowser.moveTabTo(tab, dropIndex);
if (incrementDropIndex) {
dropIndex++;
}
}
gBrowser.syncThrobberAnimations(tab);
};
tab.addEventListener("transitionend", onTransitionEnd);
}
} else {
this._finishAnimateTabMove();
if (dropIndex !== false) {
for (let tab of movingTabs) {
gBrowser.moveTabTo(tab, dropIndex);
if (incrementDropIndex) {
dropIndex++;
}
}
}
}
let newIndex = this._getDropIndex(event, false);
if (newIndex > draggedTab._tPos) {
newIndex--;
}
gBrowser.moveTabTo(draggedTab, newIndex);
} else if (draggedTab) {
let newIndex = this._getDropIndex(event, false);
let newTabs = [];
for (let tab of movingTabs) {
let newTab = gBrowser.adoptTab(tab, newIndex++, tab == draggedTab);
newTabs.push(newTab);
}
// Restore tab selection
gBrowser.addRangeToMultiSelectedTabs(
newTabs[0],
newTabs[newTabs.length - 1]
);
} else {
// Pass true to disallow dropping javascript: or data: urls
let links;
try {
links = browserDragAndDrop.dropLinks(event, true);
} catch (ex) {}
if (!links || links.length === 0) {
return;
}
let inBackground = Services.prefs.getBoolPref(
"browser.tabs.loadInBackground"
);
if (event.shiftKey) {
inBackground = !inBackground;
}
let targetTab = this._getDragTargetTab(event, true);
let userContextId = this.selectedItem.getAttribute("usercontextid");
let replace = !!targetTab;
let newIndex = this._getDropIndex(event, true);
let urls = links.map(link => link.url);
let csp = browserDragAndDrop.getCSP(event);
let triggeringPrincipal = browserDragAndDrop.getTriggeringPrincipal(
event
);
(async () => {
if (
urls.length >=
Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn")
) {
// Sync dialog cannot be used inside drop event handler.
let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs(
urls.length,
window
);
if (!answer) {
return;
}
}
gBrowser.loadTabs(urls, {
inBackground,
replace,
allowThirdPartyFixup: true,
targetTab,
newIndex,
userContextId,
triggeringPrincipal,
csp,
});
})();
}
if (draggedTab) {
delete draggedTab._dragData;
}
}
gBrowser.tabContainer._getDropIndex = function(event, isLink) {
var tabs = this.allTabs;
var tab = this._getDragTargetTab(event, isLink);
if (!RTL_UI) {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 &&
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width
) {
return i + 1;
}
}
}
} else {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width &&
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i + 1;
}
}
}
}
return tabs.length;
}
}
Alles anzeigen
Mfg.
Endor
Hallo Rob.
Ich gehe mal davon aus dass Du Firefox 69 verwendest,
Teste diese aktuelle Version von Multirow Skript:
Mfg.
Endor
Dies führt lediglich dazu, dass die Tableiste unter der Adressleiste ist, doch darüber ist sie mir tatsächlich am liebsten. Aber auch in dem Fall gibt es eine Verschiebung im Skin, nur nach unten anstatt nach links, siehe hier.
Hallo Rob.
Bitte nochmal testen, diese Version dürfte jetzt nur die Mehrzeilige Tableiste
machen. Sonst nichts.
// ==UserScript==
// @name zzzz-MultiRowTab_LiteforFx48.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Experimentelle CSS Version für Mehrzeilige Tableiste
// @include main
// @compatibility Firefox 69
// @author Alice0775
// @version 2016/08/05 00:00 Firefox 48
// @version 2016/05/01 00:01 hide favicon if busy
// @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
// @version 2016/02/09 00:01 workaround css for lwt
// @version 2016/02/09 00:00
// ==/UserScript==
"user strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
var css =` @-moz-document url-prefix("chrome://browser/content/browser.xhtml") {
/* Mehrzeilige Tableiste */
tabs>arrowscrollbox{display:block;}
tabs arrowscrollbox>scrollbox{display:flex;flex-wrap:wrap;}
tabs tab[fadein]:not([pinned]){flex-grow:1;}
tabs tab,.tab-background {
height: var(--tab-min-height);
z-index: 1 !important; }
tab>.tab-stack{width:100%;}
[sizemode="fullscreen"] #TabsToolbar>#window-controls,
.titlebar-buttonbox-container>.titlebar-buttonbox{display:block;}
/* Drag-Bereich auf der linken und rechten Seite der
Tab-Leiste auslenden - verstecken
Links und rechts → hbox.titlebar-spacer
links → hbox.titlebar-spacer[type="pre-tabs"]
rechts → hbox.titlebar-spacer[type="post-tabs"] */
/* Ausblenden - Verstecken */
#alltabs-button,tabs [class^="scrollbutton"],tabs spacer,tabs tab:not([fadein]),[autohide="true"][inactive="true"] .titlebar-buttonbox { display: none; }
} `;
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.AGENT_SHEET);
var style = ' \
tabs tab { \
border-left: solid 1px hsla(0,0%,50%,.5) !important; \
border-right: solid 1px hsla(0,0%,50%,.5) !important; \
} \
tabs tab:after,tabs tab:before{display:none!important;} \
';
var sspi = document.createProcessingInstruction('xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"');
document.insertBefore(sspi, document.documentElement);
gBrowser.tabContainer.lastVisibleTab = function() {
var tabs = this.allTabs;
for (let i = tabs.length - 1; i >= 0; i--) {
if (!tabs[i].hasAttribute("hidden")) {
return i;
}
}
return -1;
}
gBrowser.tabContainer.clearDropIndicator = function() {
var tabs = this.allTabs;
for (let i = 0, len = tabs.length; i < len; i++) {
tabs[i].style.removeProperty("border-left-color");
tabs[i].style.removeProperty("border-right-color");
}
}
gBrowser.tabContainer.addEventListener("dragleave", gBrowser.tabContainer.clearDropIndicator, true);
gBrowser.tabContainer.on_dragover = function(event) {
this.clearDropIndicator();
var effects = this._getDropEffectForTabDrag(event);
var ind = this._tabDropIndicator;
if (effects == "" || effects == "none") {
ind.hidden = true;
return;
}
event.preventDefault();
event.stopPropagation();
var arrowScrollbox = this.arrowScrollbox;
// autoscroll the tab strip if we drag over the scroll
// buttons, even if we aren't dragging a tab, but then
// return to avoid drawing the drop indicator
var pixelsToScroll = 0;
if (this.getAttribute("overflow") == "true") {
var targetAnonid = event.originalTarget.getAttribute("anonid");
switch (targetAnonid) {
case "scrollbutton-up":
pixelsToScroll = arrowScrollbox.scrollIncrement * -1;
break;
case "scrollbutton-down":
pixelsToScroll = arrowScrollbox.scrollIncrement;
break;
}
if (pixelsToScroll) {
arrowScrollbox.scrollByPixels(
(RTL_UI ? -1 : 1) * pixelsToScroll,
true
);
}
}
/*
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container
) {
ind.hidden = true;
if (!this._isGroupTabsAnimationOver()) {
// Wait for grouping tabs animation to finish
return;
}
this._finishGroupSelectedTabs(draggedTab);
if (effects == "move") {
this._animateTabMove(event);
return;
}
}
this._finishAnimateTabMove();
*/
if (effects == "link") {
let tab = this._getDragTargetTab(event, true);
if (tab) {
if (!this._dragTime) {
this._dragTime = Date.now();
}
if (Date.now() >= this._dragTime + this._dragOverDelay) {
this.selectedItem = tab;
}
ind.hidden = true;
return;
}
}
var rect = arrowScrollbox.getBoundingClientRect();
var newMargin;
if (pixelsToScroll) {
// if we are scrolling, put the drop indicator at the edge
// so that it doesn't jump while scrolling
let scrollRect = arrowScrollbox.scrollClientRect;
let minMargin = scrollRect.left - rect.left;
let maxMargin = Math.min(
minMargin + scrollRect.width,
scrollRect.right
);
if (RTL_UI) {
[minMargin, maxMargin] = [
this.clientWidth - maxMargin,
this.clientWidth - minMargin,
];
}
newMargin = pixelsToScroll > 0 ? maxMargin : minMargin;
} else {
let newIndex = this._getDropIndex(event, effects == "link");
let children = this.allTabs;
if (newIndex == children.length) {
let tabRect = children[newIndex - 1].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.left;
} else {
newMargin = tabRect.right - rect.left;
}
} else {
let tabRect = children[newIndex].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.right;
} else {
newMargin = tabRect.left - rect.left;
}
}
if (newIndex < children.length) {
children[newIndex].style.setProperty("border-left-color","red","important");
} else {
newIndex = gBrowser.tabContainer.lastVisibleTab();
if (newIndex >= 0) {
children[newIndex].style.setProperty("border-right-color","red","important");
}
}
}
ind.hidden = false;
newMargin += ind.clientWidth / 2;
if (RTL_UI) {
newMargin *= -1;
}
ind.style.transform = "translate(" + Math.round(newMargin) + "px)";
ind.style.marginInlineStart = -ind.clientWidth + "px";
}
gBrowser.tabContainer.on_drop = function(event) {
this.clearDropIndicator();
var dt = event.dataTransfer;
var dropEffect = dt.dropEffect;
var draggedTab;
let movingTabs;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
// tab copy or move
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
// not our drop then
if (!draggedTab) {
return;
}
movingTabs = draggedTab._dragData.movingTabs;
draggedTab.container._finishGroupSelectedTabs(draggedTab);
}
this._tabDropIndicator.hidden = true;
event.stopPropagation();
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event, false);
let draggedTabCopy;
for (let tab of movingTabs) {
let newTab = gBrowser.duplicateTab(tab);
gBrowser.moveTabTo(newTab, newIndex++);
if (tab == draggedTab) {
draggedTabCopy = newTab;
}
}
if (draggedTab.container != this || event.shiftKey) {
this.selectedItem = draggedTabCopy;
}
} else if (draggedTab && draggedTab.container == this) {
let oldTranslateX = Math.round(draggedTab._dragData.translateX);
let tabWidth = Math.round(draggedTab._dragData.tabWidth);
let translateOffset = oldTranslateX % tabWidth;
let newTranslateX = oldTranslateX - translateOffset;
if (oldTranslateX > 0 && translateOffset > tabWidth / 2) {
newTranslateX += tabWidth;
} else if (oldTranslateX < 0 && -translateOffset > tabWidth / 2) {
newTranslateX -= tabWidth;
}
// let dropIndex =
// "animDropIndex" in draggedTab._dragData &&
// draggedTab._dragData.animDropIndex;
let newIndex = this._getDropIndex(event, false);
let incrementDropIndex = true;
if (newIndex && newIndex > movingTabs[0]._tPos) {
newIndex--;
incrementDropIndex = false;
}
let animate = gBrowser.animationsEnabled;
if (oldTranslateX && oldTranslateX != newTranslateX && animate) {
for (let tab of movingTabs) {
tab.setAttribute("tabdrop-samewindow", "true");
tab.style.transform = "translateX(" + newTranslateX + "px)";
let onTransitionEnd = transitionendEvent => {
if (
transitionendEvent.propertyName != "transform" ||
transitionendEvent.originalTarget != tab
) {
return;
}
tab.removeEventListener("transitionend", onTransitionEnd);
tab.removeAttribute("tabdrop-samewindow");
this._finishAnimateTabMove();
if (newIndex !== false) {
gBrowser.moveTabTo(tab, newIndex);
if (incrementDropIndex) {
newIndex++;
}
}
gBrowser.syncThrobberAnimations(tab);
};
tab.addEventListener("transitionend", onTransitionEnd);
}
} else {
this._finishAnimateTabMove();
if (newIndex !== false) {
for (let tab of movingTabs) {
gBrowser.moveTabTo(tab, newIndex);
if (incrementDropIndex) {
newIndex++;
}
}
}
}
} else if (draggedTab) {
let newIndex = this._getDropIndex(event, false);
let newTabs = [];
for (let tab of movingTabs) {
let newTab = gBrowser.adoptTab(tab, newIndex++, tab == draggedTab);
newTabs.push(newTab);
}
// Restore tab selection
gBrowser.addRangeToMultiSelectedTabs(
newTabs[0],
newTabs[newTabs.length - 1]
);
} else {
// Pass true to disallow dropping javascript: or data: urls
let links;
try {
links = browserDragAndDrop.dropLinks(event, true);
} catch (ex) {}
if (!links || links.length === 0) {
return;
}
let inBackground = Services.prefs.getBoolPref(
"browser.tabs.loadInBackground"
);
if (event.shiftKey) {
inBackground = !inBackground;
}
let targetTab = this._getDragTargetTab(event, true);
let userContextId = this.selectedItem.getAttribute("usercontextid");
let replace = !!targetTab;
let newIndex = this._getDropIndex(event, true);
let urls = links.map(link => link.url);
let csp = browserDragAndDrop.getCSP(event);
let triggeringPrincipal = browserDragAndDrop.getTriggeringPrincipal(
event
);
(async () => {
if (
urls.length >=
Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn")
) {
// Sync dialog cannot be used inside drop event handler.
let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs(
urls.length,
window
);
if (!answer) {
return;
}
}
gBrowser.loadTabs(urls, {
inBackground,
replace,
allowThirdPartyFixup: true,
targetTab,
newIndex,
userContextId,
triggeringPrincipal,
csp,
});
})();
}
if (draggedTab) {
delete draggedTab._dragData;
}
}
gBrowser.tabContainer._getDropIndex = function(event, isLink) {
var tabs = this.allTabs;
var tab = this._getDragTargetTab(event, isLink);
if (!RTL_UI) {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 &&
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width
) {
return i + 1;
}
}
}
} else {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width &&
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i + 1;
}
}
}
}
return tabs.length;
}
}
Alles anzeigen
Mfg.
Endor
Hallo Endor,
ich fange vermutlich an zu nerven, aber das führt halt zu meinem ursprünglichen Problem, dass die Fenster Buttons oben rechts verdeckt werden. Deshalb hatte ich ja das Tabs-Toolbar padding right eingefügt. Nur habe ich auf eine schönere Lösung gehofft, die mir nicht die Skins zerschießt. Theoretisch sollen die Tabs einen Abstand nach rechts halten, ohne die Tableiste zu beschränken.
Keine Ahnung ob das wirklich möglich ist oder es eine ganz andere Methode bedarf.
€: Ich habe es einigermaßen hinbekommen. Ich habe die neue Version 4 deines Multirow Scripts genommen und ein wenig herum experimentiert. Hab schließlich herausgefunden, dass die Reihenfolge nicht mehr an der Stelle des Kommentars verändert wird sondern schon gleich zu Anfang in Zeilen 20-24, zuvor musste ich bloß beim Kommentar zur Adressleistenposition den darauf folgenden Code auskommentieren. Mit dem Abstand in Titlebar anstatt wie vorher der tab-toolbar wird auch der Skin nicht mehr seitlich verschoben.Die Höhenverschiebung konnte ich durch setzen von 0px ist Zeile 42 stark reduzieren, aber eine minimale Verschiebung ist noch immer vorhanden. Mir ist nur nicht klar wo ich diese noch los werden kann. Nichts desto trotz eine deutliche Besserung, mit der ich auch ohne weiteres klar komme, falls es dazu keine Ideen mehr gibt. Danke noch einmal.
// ==UserScript==
// @name zzzz-MultiRowTab_LiteforFx48.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Experimentelle CSS Version für Mehrzeilige Tableiste
// @include main
// @compatibility Firefox 69
// @author Alice0775
// @version 2016/08/05 00:00 Firefox 48
// @version 2016/05/01 00:01 hide favicon if busy
// @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
// @version 2016/02/09 00:01 workaround css for lwt
// @version 2016/02/09 00:00
// ==/UserScript==
"user strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
/* Symbolleisten und Menüleiste von der Titelleiste in die Navigator-Toolbox verschieben */
document.getElementById("navigator-toolbox").appendChild(document.getElementById("toolbar-menubar"));
var css =` @-moz-document url-prefix("chrome://browser/content/browser.xhtml") {
/* Symbolleiste Sortieren */
#toolbar-menubar { -moz-box-ordinal-group: 1 !important; }
#nav-bar { -moz-box-ordinal-group: 3 !important; }
#PersonalToolbar { -moz-box-ordinal-group: 4 !important; }
#titlebar { -moz-box-ordinal-group: 2 !important; }
/* Windows 10 und Firefox Standardtheme, Fensterausenlinie in weiß.
Anpassung für Titelleistenschaltflächen wenn sie in den Hintergrund verschoben sind */
#main-window:not([lwtheme="true"]) #window-controls toolbarbutton,
#main-window:not([lwtheme="true"]) .titlebar-buttonbox .titlebar-button {
color: rgb(24, 25, 26) !important; }
#main-window:not([lwtheme="true"]) #window-controls toolbarbutton:not([id="close-button"]):hover,
#main-window:not([lwtheme="true"]) .titlebar-buttonbox .titlebar-button:not([class="titlebar-button titlebar-close"]):hover {
background-color: var(--lwt-toolbarbutton-hover-background, hsla(0,0%,70%,.4)) !important; }
/* Tableiste unter Adressleiste verschieben */
#nav-bar { z-index: 2 !important; }
[tabsintitlebar="true"][sizemode="maximized"] #navigator-toolbox { padding-top: 6px !important; }
[tabsintitlebar="true"][sizemode="maximized"] #titlebar { -moz-appearance: none !important; }
[tabsintitlebar="true"] #toolbar-menubar { height: 32px; }
/* Anpassung für Titelleistenschaltflächen */
#navigator-toolbox:not([style^="margin-top:"])[style=""] #window-controls,
[tabsintitlebar="true"] .titlebar-buttonbox-container { position: fixed; z-index: 3 !important; right:0; }
[tabsintitlebar="true"][sizemode="normal"] .titlebar-buttonbox-container { top: 0px; }
[tabsintitlebar="true"][sizemode="maximized"] .titlebar-buttonbox-container { top: 0px; }
#navigator-toolbox:not([style^="margin-top:"])[style=""] #window-controls { top: 0; }
/* auf der rechten Seite Platz für die Schaltflächen der Titelleiste einfügen, damit die
Schaltflächen der Titelleiste und der Navigationsleiste nicht verdeckt werden */
[tabsintitlebar="true"]:not([sizemode="fullscreen"]) #titlebar { padding-right: 128px !important; }
[sizemode="fullscreen"] #nav-bar { padding-right: 109px !important; }
/* Mehrzeilige Tableiste */
tabs>arrowscrollbox{display:block;}
tabs arrowscrollbox>scrollbox {
display:flex;display:-webkit-box;flex-wrap:wrap;
max-height: calc(var(--tab-min-height) * 5); /* Anzahl der Tabzeilen */
overflow-x:hidden;overflow-y:auto; }
[tabsintitlebar="true"] tabs scrollbar{-moz-window-dragging:no-drag;}
/* Bei Überschreitung der angegebenen Zeilenanzahl, mit der Maus,
über die dann eingeblendetet Scrolleiste zu Zeile wechseln */
tabs tab[fadein]:not([pinned]){flex-grow:1;}
tabs tab,.tab-background {
height: var(--tab-min-height);
overflow: hidden;
z-index: 1 !important; }
tab>.tab-stack{width:100%;}
/*Drag-Bereich auf der linken und rechten Seite der
Tab-Leiste auslenden - verstecken
Links und rechts → hbox.titlebar-spacer
links → hbox.titlebar-spacer[type="pre-tabs"]
rechts → hbox.titlebar-spacer[type="post-tabs"] */
hbox.titlebar-spacer
/* Ausblenden - Verstecken */
,#alltabs-button,tabs [class^="scrollbutton"],tabs spacer,#toolbar-menubar .titlebar-buttonbox { display: none; }
} `;
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.AGENT_SHEET);
var style = ' \
tabs tab:not(stack) { \
border-left: solid 1px hsla(0,0%,50%,.5) !important; \
border-right: solid 1px hsla(0,0%,50%,.5) !important; \
} \
tabs tab:after,tabs tab:before{display:none!important;} \
';
var sspi = document.createProcessingInstruction('xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"');
document.insertBefore(sspi, document.documentElement);
gBrowser.tabContainer._animateTabMove = function(event){}
gBrowser.tabContainer._finishAnimateTabMove = function(){}
gBrowser.tabContainer.lastVisibleTab = function() {
var tabs = this.allTabs;
for (let i = tabs.length - 1; i >= 0; i--){
if (!tabs[i].hasAttribute("hidden"))
return i;
}
return -1;
}
gBrowser.tabContainer.clearDropIndicator = function() {
var tabs = this.allTabs;
for (let i = 0, len = tabs.length; i < len; i++){
let tab_s= tabs[i].style;
tab_s.removeProperty("border-left-color");
tab_s.removeProperty("border-right-color");
}
}
gBrowser.tabContainer.addEventListener("dragleave",gBrowser.tabContainer.clearDropIndicator, false);
gBrowser.tabContainer._onDragOver = function(event) {
event.preventDefault();
event.stopPropagation();
this.clearDropIndicator();
var newIndex = this._getDropIndex(event);
if (newIndex == null)
return;
let children = this.allTabs;
if (newIndex < children.length) {
children[newIndex].style.setProperty("border-left-color","red","important");
} else {
newIndex = gBrowser.tabContainer.lastVisibleTab();
if (newIndex >= 0)
children[newIndex].style.setProperty("border-right-color","red","important");
}
}
gBrowser.tabContainer.addEventListener("dragover", gBrowser.tabContainer._onDragOver, false);
gBrowser.tabContainer.onDrop = function(event) {
this.clearDropIndicator();
var dt = event.dataTransfer;
var draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (!draggedTab) {
return;
}
}
this._tabDropIndicator.hidden = true
event.stopPropagation();
if (draggedTab && draggedTab.container == this) {
let newIndex = this._getDropIndex(event, false);
if (newIndex > draggedTab._tPos)
newIndex--;
gBrowser.moveTabTo(draggedTab, newIndex);
}
}
gBrowser.tabContainer.addEventListener("drop",gBrowser.tabContainer.onDrop, false);
gBrowser.tabContainer._getDragTargetTab = function(event, isLink) {
let tab = event.target;
while (tab && tab.localName != "tab") {
tab = tab.parentNode;
}
if (tab && isLink) {
let { width } = tab.getBoundingClientRect();
if (
event.screenX < tab.screenX + width * 0.25 ||
event.screenX > tab.screenX + width * 0.75
) {
return null;
}
}
return tab;
}
gBrowser.tabContainer._getDropIndex = function(event, isLink) {
var tabs = this.allTabs;
var tab = this._getDragTargetTab(event, isLink);
if (!RTL_UI) {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 &&
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width
) {
return i + 1;
}
}
}
} else {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width &&
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i + 1;
}
}
}
}
return tabs.length;
}
}
Alles anzeigen
Nö du nervst überhaupt nicht.
Es ist halt so, der Autor hat mittlerweile 8 verschiedene Versionen von diesem Script
für Firefox 69 gemacht, da dann die passende für dich zu finden dauert halt etwas.
Mir fehlt im Moment die Zeit dazu alle zu übersetzen und bei mir in Github hoch zu laden.
Er hat erst gestern wieder alle Aktualisiert.
Mal sehen.
Mfg.
Endor
Bitte teste noch mal diese Version:
// ==UserScript==
// @name zzzz-MultiRowTab_LiteforFx48.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Experimentelle CSS Version für Mehrzeilige Tableiste
// @include main
// @compatibility Firefox 69
// @author Alice0775
// @version 2016/08/05 00:00 Firefox 48
// @version 2016/05/01 00:01 hide favicon if busy
// @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
// @version 2016/02/09 00:01 workaround css for lwt
// @version 2016/02/09 00:00
// ==/UserScript==
"user strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
var css =` @-moz-document url-prefix("chrome://browser/content/browser.xhtml") {
/* Mehrzeilige Tableiste */
tabs>arrowscrollbox{display:block;}
tabs arrowscrollbox>scrollbox{display:flex;flex-wrap:wrap;}
tabs tab[fadein]:not([pinned]){flex-grow:1;}
tabs tab,.tab-background {
height: var(--tab-min-height);
z-index: 1 !important; }
tab>.tab-stack{width:100%;}
[sizemode="fullscreen"] #TabsToolbar>#window-controls,
.titlebar-buttonbox-container>.titlebar-buttonbox{display:block;}
/* Drag-Bereich auf der linken und rechten Seite der
Tab-Leiste auslenden - verstecken
Links und rechts → hbox.titlebar-spacer
links → hbox.titlebar-spacer[type="pre-tabs"]
rechts → hbox.titlebar-spacer[type="post-tabs"] */
/* Ausblenden - Verstecken */
hbox.titlebar-spacer[type="post-tabs"],
#alltabs-button,tabs [class^="scrollbutton"],tabs spacer,tabs tab:not([fadein]),[autohide="true"][inactive="true"] .titlebar-buttonbox { display: none; }
} `;
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.AGENT_SHEET);
var style = ' \
tabs tab { \
border-left: solid 1px hsla(0,0%,50%,.5) !important; \
border-right: solid 1px hsla(0,0%,50%,.5) !important; \
} \
tabs tab:after,tabs tab:before{display:none!important;} \
';
var sspi = document.createProcessingInstruction('xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"');
document.insertBefore(sspi, document.documentElement);
gBrowser.tabContainer.lastVisibleTab = function() {
var tabs = this.allTabs;
for (let i = tabs.length - 1; i >= 0; i--) {
if (!tabs[i].hasAttribute("hidden")) {
return i;
}
}
return -1;
}
gBrowser.tabContainer.clearDropIndicator = function() {
var tabs = this.allTabs;
for (let i = 0, len = tabs.length; i < len; i++) {
tabs[i].style.removeProperty("border-left-color");
tabs[i].style.removeProperty("border-right-color");
}
}
gBrowser.tabContainer.addEventListener("dragleave", gBrowser.tabContainer.clearDropIndicator, true);
gBrowser.tabContainer.on_dragover = function(event) {
this.clearDropIndicator();
var effects = this._getDropEffectForTabDrag(event);
var ind = this._tabDropIndicator;
if (effects == "" || effects == "none") {
ind.hidden = true;
return;
}
event.preventDefault();
event.stopPropagation();
var arrowScrollbox = this.arrowScrollbox;
// autoscroll the tab strip if we drag over the scroll
// buttons, even if we aren't dragging a tab, but then
// return to avoid drawing the drop indicator
var pixelsToScroll = 0;
if (this.getAttribute("overflow") == "true") {
var targetAnonid = event.originalTarget.getAttribute("anonid");
switch (targetAnonid) {
case "scrollbutton-up":
pixelsToScroll = arrowScrollbox.scrollIncrement * -1;
break;
case "scrollbutton-down":
pixelsToScroll = arrowScrollbox.scrollIncrement;
break;
}
if (pixelsToScroll) {
arrowScrollbox.scrollByPixels(
(RTL_UI ? -1 : 1) * pixelsToScroll,
true
);
}
}
/*
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container
) {
ind.hidden = true;
if (!this._isGroupTabsAnimationOver()) {
// Wait for grouping tabs animation to finish
return;
}
this._finishGroupSelectedTabs(draggedTab);
if (effects == "move") {
this._animateTabMove(event);
return;
}
}
this._finishAnimateTabMove();
*/
if (effects == "link") {
let tab = this._getDragTargetTab(event, true);
if (tab) {
if (!this._dragTime) {
this._dragTime = Date.now();
}
if (Date.now() >= this._dragTime + this._dragOverDelay) {
this.selectedItem = tab;
}
ind.hidden = true;
return;
}
}
var rect = arrowScrollbox.getBoundingClientRect();
var newMargin;
if (pixelsToScroll) {
// if we are scrolling, put the drop indicator at the edge
// so that it doesn't jump while scrolling
let scrollRect = arrowScrollbox.scrollClientRect;
let minMargin = scrollRect.left - rect.left;
let maxMargin = Math.min(
minMargin + scrollRect.width,
scrollRect.right
);
if (RTL_UI) {
[minMargin, maxMargin] = [
this.clientWidth - maxMargin,
this.clientWidth - minMargin,
];
}
newMargin = pixelsToScroll > 0 ? maxMargin : minMargin;
} else {
let newIndex = this._getDropIndex(event, effects == "link");
let children = this.allTabs;
if (newIndex == children.length) {
let tabRect = children[newIndex - 1].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.left;
} else {
newMargin = tabRect.right - rect.left;
}
} else {
let tabRect = children[newIndex].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.right;
} else {
newMargin = tabRect.left - rect.left;
}
}
if (newIndex < children.length) {
children[newIndex].style.setProperty("border-left-color","red","important");
} else {
newIndex = gBrowser.tabContainer.lastVisibleTab();
if (newIndex >= 0) {
children[newIndex].style.setProperty("border-right-color","red","important");
}
}
}
ind.hidden = false;
newMargin += ind.clientWidth / 2;
if (RTL_UI) {
newMargin *= -1;
}
ind.style.transform = "translate(" + Math.round(newMargin) + "px)";
ind.style.marginInlineStart = -ind.clientWidth + "px";
}
gBrowser.tabContainer.on_drop = function(event) {
this.clearDropIndicator();
var dt = event.dataTransfer;
var dropEffect = dt.dropEffect;
var draggedTab;
let movingTabs;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
// tab copy or move
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
// not our drop then
if (!draggedTab) {
return;
}
movingTabs = draggedTab._dragData.movingTabs;
draggedTab.container._finishGroupSelectedTabs(draggedTab);
}
this._tabDropIndicator.hidden = true;
event.stopPropagation();
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event, false);
let draggedTabCopy;
for (let tab of movingTabs) {
let newTab = gBrowser.duplicateTab(tab);
gBrowser.moveTabTo(newTab, newIndex++);
if (tab == draggedTab) {
draggedTabCopy = newTab;
}
}
if (draggedTab.container != this || event.shiftKey) {
this.selectedItem = draggedTabCopy;
}
} else if (draggedTab && draggedTab.container == this) {
let oldTranslateX = Math.round(draggedTab._dragData.translateX);
let tabWidth = Math.round(draggedTab._dragData.tabWidth);
let translateOffset = oldTranslateX % tabWidth;
let newTranslateX = oldTranslateX - translateOffset;
if (oldTranslateX > 0 && translateOffset > tabWidth / 2) {
newTranslateX += tabWidth;
} else if (oldTranslateX < 0 && -translateOffset > tabWidth / 2) {
newTranslateX -= tabWidth;
}
// let dropIndex =
// "animDropIndex" in draggedTab._dragData &&
// draggedTab._dragData.animDropIndex;
let newIndex = this._getDropIndex(event, false);
let incrementDropIndex = true;
if (newIndex && newIndex > movingTabs[0]._tPos) {
newIndex--;
incrementDropIndex = false;
}
let animate = gBrowser.animationsEnabled;
if (oldTranslateX && oldTranslateX != newTranslateX && animate) {
for (let tab of movingTabs) {
tab.setAttribute("tabdrop-samewindow", "true");
tab.style.transform = "translateX(" + newTranslateX + "px)";
let onTransitionEnd = transitionendEvent => {
if (
transitionendEvent.propertyName != "transform" ||
transitionendEvent.originalTarget != tab
) {
return;
}
tab.removeEventListener("transitionend", onTransitionEnd);
tab.removeAttribute("tabdrop-samewindow");
this._finishAnimateTabMove();
if (newIndex !== false) {
gBrowser.moveTabTo(tab, newIndex);
if (incrementDropIndex) {
newIndex++;
}
}
gBrowser.syncThrobberAnimations(tab);
};
tab.addEventListener("transitionend", onTransitionEnd);
}
} else {
this._finishAnimateTabMove();
if (newIndex !== false) {
for (let tab of movingTabs) {
gBrowser.moveTabTo(tab, newIndex);
if (incrementDropIndex) {
newIndex++;
}
}
}
}
} else if (draggedTab) {
let newIndex = this._getDropIndex(event, false);
let newTabs = [];
for (let tab of movingTabs) {
let newTab = gBrowser.adoptTab(tab, newIndex++, tab == draggedTab);
newTabs.push(newTab);
}
// Restore tab selection
gBrowser.addRangeToMultiSelectedTabs(
newTabs[0],
newTabs[newTabs.length - 1]
);
} else {
// Pass true to disallow dropping javascript: or data: urls
let links;
try {
links = browserDragAndDrop.dropLinks(event, true);
} catch (ex) {}
if (!links || links.length === 0) {
return;
}
let inBackground = Services.prefs.getBoolPref(
"browser.tabs.loadInBackground"
);
if (event.shiftKey) {
inBackground = !inBackground;
}
let targetTab = this._getDragTargetTab(event, true);
let userContextId = this.selectedItem.getAttribute("usercontextid");
let replace = !!targetTab;
let newIndex = this._getDropIndex(event, true);
let urls = links.map(link => link.url);
let csp = browserDragAndDrop.getCSP(event);
let triggeringPrincipal = browserDragAndDrop.getTriggeringPrincipal(
event
);
(async () => {
if (
urls.length >=
Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn")
) {
// Sync dialog cannot be used inside drop event handler.
let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs(
urls.length,
window
);
if (!answer) {
return;
}
}
gBrowser.loadTabs(urls, {
inBackground,
replace,
allowThirdPartyFixup: true,
targetTab,
newIndex,
userContextId,
triggeringPrincipal,
csp,
});
})();
}
if (draggedTab) {
delete draggedTab._dragData;
}
}
gBrowser.tabContainer._getDropIndex = function(event, isLink) {
var tabs = this.allTabs;
var tab = this._getDragTargetTab(event, isLink);
if (!RTL_UI) {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 &&
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width
) {
return i + 1;
}
}
}
} else {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width &&
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i + 1;
}
}
}
}
return tabs.length;
}
}
Alles anzeigen
Mfg.
Endor
Wenn das auch nicht passt, dann teste diese Version auch mal:
// ==UserScript==
// @name zzzz-MultiRowTab_LiteforFx48.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Experimentelle CSS Version für Mehrzeilige Tableiste
// @include main
// @compatibility Firefox 69
// @author Alice0775
// @version 2016/08/05 00:00 Firefox 48
// @version 2016/05/01 00:01 hide favicon if busy
// @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
// @version 2016/02/09 00:01 workaround css for lwt
// @version 2016/02/09 00:00
// ==/UserScript==
"use strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
var css =` @-moz-document url-prefix("chrome://browser/content/browser.xhtml") {
/* Mehrzeilige Tableiste */
tabs>arrowscrollbox{display:block;}
tabs arrowscrollbox>scrollbox {
display:flex;display:-webkit-box;flex-wrap:wrap;
max-height: calc(var(--tab-min-height) * 5); /* Anzahl der Tabzeilen */
overflow-x:hidden;overflow-y:auto; }
tabs tab[fadein]:not([pinned]){flex-grow:1;}
tabs tab,.tab-background {
height: var(--tab-min-height);
overflow: hidden;
z-index: 1 !important; }
tab>.tab-stack{width:100%;}
[sizemode="fullscreen"] #TabsToolbar>#window-controls,
.titlebar-buttonbox-container>.titlebar-buttonbox{display:block;}
/* auf der rechten Seite Platz für die Schaltflächen der Titelleiste einfügen, damit die
Schaltflächen der Titelleiste und der Navigationsleiste nicht verdeckt werden */
[tabsintitlebar="true"] tabs scrollbar{-moz-window-dragging:no-drag;}
/* Drag-Bereich auf der linken und rechten Seite der
Tab-Leiste auslenden - verstecken
Links und rechts → hbox.titlebar-spacer
links → hbox.titlebar-spacer[type="pre-tabs"]
rechts → hbox.titlebar-spacer[type="post-tabs"] */
hbox.titlebar-spacer
/* Ausblenden - Verstecken */
,#alltabs-button,tabs [class^="scrollbutton"],tabs spacer,tabs tab:not([fadein]),[autohide="true"][inactive="true"] .titlebar-buttonbox { display: none; }
} `;
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.AGENT_SHEET);
var style = ' \
tabs tab { \
border-left: solid 1px hsla(0,0%,50%,.5) !important; \
border-right: solid 1px hsla(0,0%,50%,.5) !important; \
} \
tabs tab:after,tabs tab:before{display:none!important;} \
';
var sspi = document.createProcessingInstruction('xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"');
document.insertBefore(sspi, document.documentElement);
gBrowser.tabContainer.lastVisibleTab = function() {
var tabs = this.allTabs;
for (let i = tabs.length - 1; i >= 0; i--) {
if (!tabs[i].hasAttribute("hidden")) {
return i;
}
}
return -1;
}
gBrowser.tabContainer.clearDropIndicator = function() {
var tabs = this.allTabs;
for (let i = 0, len = tabs.length; i < len; i++) {
tabs[i].style.removeProperty("border-left-color");
tabs[i].style.removeProperty("border-right-color");
}
}
gBrowser.tabContainer.addEventListener("dragleave", gBrowser.tabContainer.clearDropIndicator, true);
gBrowser.tabContainer.on_dragover = function(event) {
this.clearDropIndicator();
var effects = this._getDropEffectForTabDrag(event);
var ind = this._tabDropIndicator;
if (effects == "" || effects == "none") {
ind.hidden = true;
return;
}
event.preventDefault();
event.stopPropagation();
var arrowScrollbox = this.arrowScrollbox;
// autoscroll the tab strip if we drag over the scroll
// buttons, even if we aren't dragging a tab, but then
// return to avoid drawing the drop indicator
var pixelsToScroll = 0;
if (this.getAttribute("overflow") == "true") {
var targetAnonid = event.originalTarget.getAttribute("anonid");
switch (targetAnonid) {
case "scrollbutton-up":
pixelsToScroll = arrowScrollbox.scrollIncrement * -1;
break;
case "scrollbutton-down":
pixelsToScroll = arrowScrollbox.scrollIncrement;
break;
}
if (pixelsToScroll) {
arrowScrollbox.scrollByPixels(
(RTL_UI ? -1 : 1) * pixelsToScroll,
true
);
}
}
/*
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container
) {
ind.hidden = true;
if (!this._isGroupTabsAnimationOver()) {
// Wait for grouping tabs animation to finish
return;
}
this._finishGroupSelectedTabs(draggedTab);
if (effects == "move") {
this._animateTabMove(event);
return;
}
}
this._finishAnimateTabMove();
*/
if (effects == "link") {
let tab = this._getDragTargetTab(event, true);
if (tab) {
if (!this._dragTime) {
this._dragTime = Date.now();
}
if (Date.now() >= this._dragTime + this._dragOverDelay) {
this.selectedItem = tab;
}
ind.hidden = true;
return;
}
}
var rect = arrowScrollbox.getBoundingClientRect();
var newMargin;
if (pixelsToScroll) {
// if we are scrolling, put the drop indicator at the edge
// so that it doesn't jump while scrolling
let scrollRect = arrowScrollbox.scrollClientRect;
let minMargin = scrollRect.left - rect.left;
let maxMargin = Math.min(
minMargin + scrollRect.width,
scrollRect.right
);
if (RTL_UI) {
[minMargin, maxMargin] = [
this.clientWidth - maxMargin,
this.clientWidth - minMargin,
];
}
newMargin = pixelsToScroll > 0 ? maxMargin : minMargin;
} else {
let newIndex = this._getDropIndex(event, effects == "link");
let children = this.allTabs;
if (newIndex == children.length) {
let tabRect = children[newIndex - 1].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.left;
} else {
newMargin = tabRect.right - rect.left;
}
} else {
let tabRect = children[newIndex].getBoundingClientRect();
if (RTL_UI) {
newMargin = rect.right - tabRect.right;
} else {
newMargin = tabRect.left - rect.left;
}
}
if (newIndex < children.length) {
children[newIndex].style.setProperty("border-left-color","red","important");
} else {
newIndex = gBrowser.tabContainer.lastVisibleTab();
if (newIndex >= 0) {
children[newIndex].style.setProperty("border-right-color","red","important");
}
}
}
ind.hidden = false;
newMargin += ind.clientWidth / 2;
if (RTL_UI) {
newMargin *= -1;
}
ind.style.transform = "translate(" + Math.round(newMargin) + "px)";
ind.style.marginInlineStart = -ind.clientWidth + "px";
}
gBrowser.tabContainer.on_drop = function(event) {
this.clearDropIndicator();
var dt = event.dataTransfer;
var dropEffect = dt.dropEffect;
var draggedTab;
let movingTabs;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
// tab copy or move
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
// not our drop then
if (!draggedTab) {
return;
}
movingTabs = draggedTab._dragData.movingTabs;
draggedTab.container._finishGroupSelectedTabs(draggedTab);
}
this._tabDropIndicator.hidden = true;
event.stopPropagation();
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event, false);
let draggedTabCopy;
for (let tab of movingTabs) {
let newTab = gBrowser.duplicateTab(tab);
gBrowser.moveTabTo(newTab, newIndex++);
if (tab == draggedTab) {
draggedTabCopy = newTab;
}
}
if (draggedTab.container != this || event.shiftKey) {
this.selectedItem = draggedTabCopy;
}
} else if (draggedTab && draggedTab.container == this) {
let oldTranslateX = Math.round(draggedTab._dragData.translateX);
let tabWidth = Math.round(draggedTab._dragData.tabWidth);
let translateOffset = oldTranslateX % tabWidth;
let newTranslateX = oldTranslateX - translateOffset;
if (oldTranslateX > 0 && translateOffset > tabWidth / 2) {
newTranslateX += tabWidth;
} else if (oldTranslateX < 0 && -translateOffset > tabWidth / 2) {
newTranslateX -= tabWidth;
}
// let dropIndex =
// "animDropIndex" in draggedTab._dragData &&
// draggedTab._dragData.animDropIndex;
let newIndex = this._getDropIndex(event, false);
let incrementDropIndex = true;
if (newIndex && newIndex > movingTabs[0]._tPos) {
newIndex--;
incrementDropIndex = false;
}
let animate = gBrowser.animationsEnabled;
if (oldTranslateX && oldTranslateX != newTranslateX && animate) {
for (let tab of movingTabs) {
tab.setAttribute("tabdrop-samewindow", "true");
tab.style.transform = "translateX(" + newTranslateX + "px)";
let onTransitionEnd = transitionendEvent => {
if (
transitionendEvent.propertyName != "transform" ||
transitionendEvent.originalTarget != tab
) {
return;
}
tab.removeEventListener("transitionend", onTransitionEnd);
tab.removeAttribute("tabdrop-samewindow");
this._finishAnimateTabMove();
if (newIndex !== false) {
gBrowser.moveTabTo(tab, newIndex);
if (incrementDropIndex) {
newIndex++;
}
}
gBrowser.syncThrobberAnimations(tab);
};
tab.addEventListener("transitionend", onTransitionEnd);
}
} else {
this._finishAnimateTabMove();
if (newIndex !== false) {
for (let tab of movingTabs) {
gBrowser.moveTabTo(tab, newIndex);
if (incrementDropIndex) {
newIndex++;
}
}
}
}
} else if (draggedTab) {
let newIndex = this._getDropIndex(event, false);
let newTabs = [];
for (let tab of movingTabs) {
let newTab = gBrowser.adoptTab(tab, newIndex++, tab == draggedTab);
newTabs.push(newTab);
}
// Restore tab selection
gBrowser.addRangeToMultiSelectedTabs(
newTabs[0],
newTabs[newTabs.length - 1]
);
} else {
// Pass true to disallow dropping javascript: or data: urls
let links;
try {
links = browserDragAndDrop.dropLinks(event, true);
} catch (ex) {}
if (!links || links.length === 0) {
return;
}
let inBackground = Services.prefs.getBoolPref(
"browser.tabs.loadInBackground"
);
if (event.shiftKey) {
inBackground = !inBackground;
}
let targetTab = this._getDragTargetTab(event, true);
let userContextId = this.selectedItem.getAttribute("usercontextid");
let replace = !!targetTab;
let newIndex = this._getDropIndex(event, true);
let urls = links.map(link => link.url);
let csp = browserDragAndDrop.getCSP(event);
let triggeringPrincipal = browserDragAndDrop.getTriggeringPrincipal(
event
);
(async () => {
if (
urls.length >=
Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn")
) {
// Sync dialog cannot be used inside drop event handler.
let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs(
urls.length,
window
);
if (!answer) {
return;
}
}
gBrowser.loadTabs(urls, {
inBackground,
replace,
allowThirdPartyFixup: true,
targetTab,
newIndex,
userContextId,
triggeringPrincipal,
csp,
});
})();
}
if (draggedTab) {
delete draggedTab._dragData;
}
}
gBrowser.tabContainer._getDropIndex = function(event, isLink) {
var tabs = this.allTabs;
var tab = this._getDragTargetTab(event, isLink);
if (!RTL_UI) {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 &&
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width
) {
return i + 1;
}
}
}
} else {
for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) {
if (
event.screenY <
tabs[i].screenY + tabs[i].getBoundingClientRect().height
) {
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width &&
event.screenX >
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i;
}
if (
event.screenX <
tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2
) {
return i + 1;
}
}
}
}
return tabs.length;
}
}
Alles anzeigen
Mfg.
Endor
Leider überdeckt diese Version ebenfalls vollständig die Fenster Buttons. Aber wie ich in meinem überarbeiteten Post von vorhin schrieb, bin ich jetzt mit der aktuellen Version 4 des Multirow Skripts deiner Repo fast am Ziel. Nur noch diese Kleinigkeit gilt es zu korrigieren, falls möglich.
Nur zur Info der aktuelle Autor hat seine Scripte heute nochmals aktualisiert.
Es sind wie gesagt mittlerweile 8 verschiedene für Firefox 69 mal sehen bis
wann ich mir die anschauen und übersetzen kann.
Mfg.
Endor
Bis jetzt nutze ich FF60ESR mit UserChromeJS im Programmordner - funktioniert super. Bin am Testen von FF68ESR und habe dazu die Scripte geändert, also browser.xul nach browser.xhtml. Leider funktioniert kein einziges Script mehr, z.B.:
// ImageToggle.uc.js
// Keine Bilder laden = user_pref("permissions.default.image", 2);
// Keine externen Bilder von Drittanbietern laden = 3
(function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
try {
CustomizableUI.createWidget({
id: 'toolbar-button-img',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var attributes = {
id: 'toolbar-button-img',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
removable: 'true',
label: 'Bilder ein-/ausschalten',
tooltiptext: (Services.prefs.getIntPref('permissions.default.image')==1) ?
'Bilder sind eingeschaltet' : 'Bilder sind ausgeschaltet',
oncommand: '(' + onCommand.toString() + ')()'
};
for (var a in attributes) {
button.setAttribute(a, attributes[a]);
};
function onCommand() {
var isEnabled = Services.prefs.getIntPref('permissions.default.image') ^ 3;
Services.prefs.setIntPref('permissions.default.image', isEnabled);
var windows = Services.wm.getEnumerator('navigator:browser');
while (windows.hasMoreElements()) {
let button = windows.getNext().document.getElementById('toolbar-button-img');
if (isEnabled==1)
button.setAttribute('tooltiptext', 'Bilder sind eingeschaltet')
else
button.setAttribute('tooltiptext', 'Bilder sind ausgeschaltet');
};
BrowserReload();
};
return button;
}
});
} catch(e) { };
var css =
'#toolbar-button-img[tooltiptext="Bilder sind eingeschaltet"] {list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAA9klEQVQ4jdXUP0pDQRDH8U8SUDs9g4iFpTZWrzNHsPQKnkHPkBNYegStAw9yBbFKZQgiJMSkMBZvHsj7p/EFwR8Mu8v89rvDDCz/WSdIsShEGrmNdIwR1jUxCk9JnVj7OPxyvsL5N4+muIv9Gs94gGvMG6r5acyDZbwFWB5jWDYYprjFGU5jP23wL8kmV5V8id4W1Y9c1Z1FHfADgwpYrkF4SsBuzYUVhg3AYXhKqgNC7ze5OuAukgZgEp6SOrIe7lXk3nCJV8xkPTvAPu5jLeq9Ixv1TkM1m2jVxWRLMJj0ZNNKtK9yhpv8M7jAUUvgEx5bMv5An2W8eRjCNuiQAAAAAElFTkSuQmCC");}' +
'#toolbar-button-img[tooltiptext="Bilder sind ausgeschaltet"] {list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAABt0lEQVQ4ja3UPWgVQRQF4O/9GCXIM4Qklv6yELUzkKBgFy3WOliIgq1CbIKmVREECyOikCIQO0ULQYJEsRCUNBFbC00hohKiKP5gisRibuDxeLui5MBlZ+69c5idM2cqeZ5bT1TXle0vhHswh18tMRe1fyLMMI1BbGqJwahl7RbW43sYO1GJ+QkMlOx+IEhvx3wVbzFbxyguo7OEoB2GItbwE+NVjP0HWTt0YqyK3pKmz7go/eJ+XMBSSX9vHSsFxUUcx2xT7jU6cL5gzWq9qIC7LWQ7MIFhzOM3GtjXvLCIcBnPm+Z9uI9unMSDIOzGKUmHvjJCqDWNL2G7pOp7dOFTkFzFO9xCo+hib8ShGPfgKK7gDabwCGcxg3O4g6eole1wBPfwVRJiJvILUdsrGWEh8i+Q1xXbb4vkhFfR8y3y8zFuSO54GfnvWKlK16MIW3EkyPslL5/BBjyT7Ho6evuxWMuybFk6r44S4ookwBQ+Btk4fkhibMYNTFfigR3G7hLCLsklNyXvN2ObdNY9OLAmyuOIMizhOg7iSex0F3LpVozgQ5nKrZiUBBrFMelcv+AhrkkC+QNeOFpOVB/U5gAAAABJRU5ErkJggg==");}';
var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
document.insertBefore(stylesheet, document.documentElement);
})();
Alles anzeigen
Ersatzweise habe ich statt der alten UserChromeJS-Variante nach einer Neu-Installation auch die mit userChrome.xml und Änderung der userChrome.css getestet - ohne Erfolg. Ist da noch irgendwas zu beachten?
also browser.xul nach browser.xhtml
Das betrifft erst Firefox 69, und nicht die ESR 68.
Also bitte wieder ändern, dann funktioniert das Script auch in ESR 68
Anstelle von
'chrome://browser/content/browser.xhtml'
bzw.
'chrome://browser/content/browser.xul'
kann man auch
AppConstants.BROWSER_CHROME_URL
nehmen.
Das funktioniert dann in allen Fx-Versionen.
Achtung, das gilt nur für Skripte, nicht für CSS-Codes.
Anstelle von
Herzlichen Dank dafür, das habe ich geich mal überall geändert